softversko inŽenjerstvo vježbe 5: veze, nasljeđivanje...
TRANSCRIPT
SOFTVERSKO INŽENJERSTVO
Vježbe 5: Veze, nasljeđivanje, polimorfizam
Robert Manger
Sveučilište u Zagrebu
PMF-Matematički odsjek
Akademska godina 2019/2020.
V-05 Softversko inženjerstvo 2
Sadržaj Vježbi 5 Općenito o vezama, vrste veza
Poveznice među objektima, object dijagram
Asocijacije među klasama, class dijagram
Imena asocijacije i uloga, multiplicitet, navigabilnost
Asocijacija i atributi, asocijacijske klase
Ovisnosti, stereotipi
Generalizacija i specijalizacija
Nasljeđivanje, polimorfizam
Generalizacijski skupovi
V-05 Softversko inženjerstvo 3
Općenito o vezama
Veze služe za povezivanje elemenata u UML modelu.
Veza između dva elementa znači da su ti elementi u
nekom semantičkom odnosu.
Na dijagramu se veze crtaju kao spojnice ili strelice.
U prethodnim poglavljima već smo vidjeli neke vrste
veza.
Interakcija između aktera i use case-ova.
Generalizacija aktera ili use case-ova.
Uključivanje jednog use case-a u drugi pomoću <<include>>.
Ovisnost <<instantiate>> objekta o pripadnoj klasi.
U ovim vježbama uglavnom se bavimo vezama
između objekata te vezama između klasa.
V-05 Softversko inženjerstvo 4
Vrste veza Poveznica (link) je veza između objekata koja nastaje kad
jedan objekt ima referencu (pointer) na drugi objekt.
Asocijacija (association) je veza između klasa koja kaže
da između objekata iz dotičnih klasa postoje poveznice.
Ovisnost (dependency) između klijenta i dobavljača znači
da klijent na neki način ovisi o dobavljaču.
Generalizacija (generalization) je vrsta ovisnosti koja se
uspostavlja između pod-klase i nad-klase.
Agregacija (aggregation) i kompozicija (composition) su
vrste asocijacije koje kažu da objekti jedne klase
predstavljaju cjelinu, a objekti druge klase se pojavljuju
kao dijelovi u toj cjelini.
U ovim vježbama obradit ćemo prve četiri vrste veza
budući da se one koriste u analizi. Ostale veze ćemo
obraditi kad budemo govorili o oblikovanju.
V-05 Softversko inženjerstvo 5
Poveznice među objektima Poveznica (link) nastaje onda kad jedan objekt ima
referencu (pointer) na drugi objekt.
Poveznica omogućuje suradnju objekata:
jedan objekt šalje poruku drugom objektu,
taj drugi objekt reagira na poruku tako da izvrši odgovarajuću
operaciju.
Poveznica može biti dvosmjerna i jednosmjerna,
ovisno o tome mogu li oba objekta slati poruku
drugom, ili to može raditi samo jedan od njih.
Jedna poveznica obično povezuje točno dva objekta.
Postoje (no rijetko se koriste) višestruke poveznice
koje povezuju tri ili više objekata.
V-05 Softversko inženjerstvo 6
Object dijagram Pokazuje objekte i poveznice među njima.
Jednostruka dvosmjerna poveznica se na dijagramu se
crta kao spojnica, a višestruka kao romb sa zrakastim
spojnicama. Jednostruka jednosmjerna spojnica crta se
kao strelica.
Uz spojnicu mogu biti označene uloge koje objekti igraju
jedan prema drugom.
U objektnom sustavu objekti mogu nastajati i nestajati, a
isto tako i poveznice među njima.
Zato dijagram treba shvaćati kao “fotografiju” koja bilježi
stanje sustava u jednom trenutku.
V-05 Softversko inženjerstvo 7
Primjeri object dijagrama (1) Na dijagramu je prikazan klub i njegovi članovi. Trenutno
ila igra ulogu predsjednice, erica je tajnica itd. Ako se
kasnije te uloge promijene, morali bi crtati novi dijagram.
Na sljedećem dijagramu komunikacija između objekata
dozvoljena samo u jednom smjeru.
V-05 Softversko inženjerstvo 8
Primjeri object dijagrama (2) Ako na dijagramu ima više spojnica, tada postoji nekoliko
načina njihovog crtanja: ortogonalni stil: horizontalni i vertikalni segmenti,
kosi stil: kosi segmenti,
zakrivljeni stil: krivulje.
Prethodni dijagram o klubu bio je nacrtan u kosom stilu.
Isti dijagram može se ovako preraditi tako da bude u
ortogonalnom stilu.
V-05 Softversko inženjerstvo 9
Asocijacije među klasama Asocijacija je veza između klasa, koja kaže da između
objekata iz tih klasa mogu postojati poveznice.
Ako postoji poveznica između dva objekta, tada mora
postojati asocijacija između odgovarajućih klasa.
Poveznice se mogu shvatiti kao primjerci (instance)
asocijacije, slično kao što su objekti instance klasa:
Za svaku asocijaciju može se zadati njeno ime, imena
uloga za klase, multiplicitet za klase, te navigabilnost.
V-05 Softversko inženjerstvo 10
Class dijagram Pokazuje klase i veze među njima.
Te veze mogu biti asocijacije, ali i razne druge vrste
veza poput ovisnosti, generalizacije, …
Sama klasa (pravokutnik) može biti prikazana na
više ili manje opširan način. Obavezno je jedino ime
klase.
Ovisno o navigabilnosti, asocijacija se crta kao
spojnica ili kao strelica. Na toj crti može biti
označeno ime asocijacije, imena uloga i multiplicitet.
V-05 Softversko inženjerstvo 11
Primjeri class dijagrama Dijagrami prikazuju samo klase i asocijacije. Označena su
imena asocijacija ili uloga, multiplicitet, navigabilnost.
V-05 Softversko inženjerstvo 12
Refleksivna asocijacija kaže da objekti iz dotične klase mogu imati
poveznice prema drugim objektima iz iste klase.
Na slici je class dijagram koji opisuje odnos direktorija i datoteki, te
odgovarajući object dijagram.
Primjer class i pripadnog object dijag
V-05 Softversko inženjerstvo 13
Imena asocijacija i uloga Ime asocijacije pobliže određuje smisao same asocijacije.
Treba biti glagol, piše se u lowerCamelCase.
Ime asocijacije se na dijagramu stavlja na sredinu crte
koja predstavlja tu asocijaciju. Može kao prefiks ili
postfiks imati crnu strelicu koja pokazuje smjer čitanja.
Ime uloge odnosi se na jednu od klasa u asocijaciji, te
određuje ulogu koju odgovarajući objekti igraju u
poveznicama. Treba biti imenica, piše se u
lowerCamelCase.
Ime uloge se na dijagramu stavlja na jedan kraj crte koja
predstavlja asocijaciju, uz odgovarajuću klasu.
Treba koristiti ili ime asocijacije ili imena uloga, oboje bi
bilo previše.
V-05 Softversko inženjerstvo 14
Multiplicitet za asocijacije Multiplicitet se odnosi na jednu od klasa u asocijaciji. On
određuje broj objekata te klase koji mogu na osnovi
asocijacije biti povezani s jednim te istim objektom druge
klase.
Objekti i poveznice mogu se pojavljivati i nestajati, no
ograničenja zadana multiplicitetom stalno moraju biti
zadovoljena.
Multiplicitet se zadaje kao lista pojedinačnih cjelobrojnih
vrijednosti ili intervala odvojenih zarezima. Jedan interval
zadaje se donjom i gornjom ogradom koje su odijeljene s
dvije točke. Primjer multipliciteta: 0..1,3..5,8
Multiplicitet se na dijagramu stavlja na jedan kraj crte
koja predstavlja asocijaciju, uz odgovarajuću klasu.
Ako multiplicitet nije prikazan smatra se da on nije ni
određen (ne postoji default).
V-05 Softversko inženjerstvo 15
Primjeri za multiplicitet Neki tipični primjeri vide se u tablici.
Daljnji primjeri nalaze se na prethodnim class dijagramima.
V-05 Softversko inženjerstvo 16
Navigabilnost za asocijacije Navigabilnost određuje može li se od objekta iz jedne klase
pristupiti povezanim objektima iz druge klase.
Navigabilnost zapravo znači da objekt prve klase sadrži
reference na povezane objekte iz druge klase. Ovisno o
multiplicitetu, to može biti jedna referenca ili cijela kolekcija.
Postoji više dogovora kako da se navigabilnost pročita s
dijagrama. Mi prihvaćamo uobičajeni način: asocijacija u obliku spojnice bez strelica se smatra navigabilnom u
oba smjera,
asocijacija sa strelicom je navigabilna samo u smjeru strelice.
Navigabilnost se nastoji ograničiti zato da bi se postigla što
manja povezanost (low coupling) između klasa.
Ako asocijacija nije navigabilna u nekom smjeru, tada je
pristup u tom smjeru otežan i moguć samo uz veliku
računsku cijenu.
V-05 Softversko inženjerstvo 17
Ako ipak za zadani proizvod želimo pronaći odgovarajuće
narudžbe, to možemo učiniti jedino tako da pretražimo
sve postojeće narudžbe, što može dugo trajati.
Narudžba sadrži listu
proizvoda. Iz zadane
narudžbe možemo
lako doći do svakog
od naručenih
proizvoda. No iz
odabranog proizvoda
ne možemo lako doći
do svih narudžbi gdje
je taj proizvod
naručen.
Primjer za navigabilnost
V-05 Softversko inženjerstvo 18
Asocijacije i atributi (1)
Kod automatskog generiranja koda iz UML modela,
mnogi alati pretvorit će 1-1 asocijaciju u pravi atribut. Na
primjer za dijagram s prethodne slike dobili bi ovakav kod.
Jednosmjerna asocijacija između polazne i dolazne klase
zapravo znači da objekti polazne klase imaju reference
na objekte dolazne klase.
Te reference mogu se ovako tumačiti kao pseudo-atributi:
V-05 Softversko inženjerstvo 19
Ako je multiplicitet na dolaznoj strani >1, tada se asocijacija
može shvatiti kao atribut čiji tip je kolekcija ili polje.
Što je bolje imati u modelu: asocijaciju ili atribut? Odgovor: Asocijaciju koristimo onda kad je dolazna klasa važan dio modela.
Inače treba koristiti atribut.
Asocijacije i atributi (2)
V-05 Softversko inženjerstvo 20
Asocijacijske klase (1) Kod asocijacija s multiplicitetom mnogo-mnogo pojavljuju
se atributi koji se ne mogu uklopiti ni u jednu od klasa.
Npr, pretpostavimo sa svaka osoba može raditi za više
kompanija, a svaka kompanija može zaposliti više osoba.
No kako zapisati plaću koju osoba dobiva od kompanije? Plaća ne može biti atribut od Person jer ista osoba može raditi za
više kompanija i od svake dobivati drukčiji iznos.
Plaća također ne može biti atribut od Company, jer ista kompanija
zapošljava mnogo osoba i svakoj daje drukčiji iznos.
Jedini ispravni način je da se plaća shvati kao atribut same
asocijacije. Za svaki par objekata koji su u vezi pamti se
posebna vrijednost atributa.
V-05 Softversko inženjerstvo 21
Asocijacijske klase (2)
Opisano rješenje s asocijacijskom klasom je bilo
izvedivo zato što je jedna osoba mogla imati samo jedan
posao kod jedne kompanije.
Odgovarajuća tvorevina se u UML-u naziva asocijacijska
klasa. To je asocijacija koja je također i klasa. Ona
povezuje dvije klase poput obične asocijacije, no također
ima i svoje atribute i operacije.
Asocijacijska klasa se na dijagramu prikazuje ovako.
V-05 Softversko inženjerstvo 22
Asocijacijske klase (3) Ako sad dopustimo da jedna osoba može imati više
poslova za istu kompaniju, tada umjesto asocijacijske
klase moramo uvesti novu (pravu) klasu, a mnogo-
mnogo asocijaciju razbiti na dvije jedan-mnogo
asocijacije. To izgleda ovako.
Pretvorba mnogo-mnogo asocijacije u posebnu klasu
naziva se reificiranje (reifying, making real) asocijacije.
V-05 Softversko inženjerstvo 23
Ovisnosti (1) Ovisnost je veza između dva elementa u UML modelu koja
kaže da prvi element – klijent (client) na neki način ovisi o
drugom elementu – dobavljaču (supplier).
Točnije rečeno, promjena u dobavljaču može utjecati na
informacije koje su potrebne klijentu.
Ovisnost se crta kao isprekidana strelica od klijenta do
dobavljača.
Klijenti i dobavljači ne moraju biti isključivo klase. Na
primjer, postoje ovisnosti između: paketa i paketa,
objekata i klase,
klase i klase.
Sljedeća slika prikazuje različite vrste ovisnosti između
raznih tipova elemenata.
V-05 Softversko inženjerstvo 24
Ovisnost između dviju klasa ne mora biti asocijacija,
jer se ne mora svoditi na poveznice između objekata
u sustavu.
Ovisnosti (2)
V-05 Softversko inženjerstvo 25
Ovisnosti (3) Na primjer, ovisnost između klasa može se svoditi na to
da objekt iz klase-klijenta poziva operaciju iz klase-
dobavljača, i to na internom privremenom objektu.
Sljedeća slika prikazuje takvu ovisnost između klasa.
Ovisnost je svakako općenitija vrsta veze od asocijacije.
V-05 Softversko inženjerstvo 26
Stereotipi za ovisnost Budući da je ovisnost vrlo općenita tvorevina koja može
značiti svašta, njena semantika se nastoji pobliže odrediti
korištenjem stereotipa.
Stereotip se prikazuje na dijagramu kao riječ unutar <<…>>
priljubljena uz isprekidanu strelicu.
Postoji velik broj standardnih stereotipa od kojih ćemo
spomenuti samo neke. <<use>> - klijent na neki način koristi dobavljača, nismo odredili
kako. Ovo je default ako ništa ne piše.
<<call>> - klijentova operacija poziva dobavljačevu operaciju.
<<parameter>> - dobavljač je parametar ili povratna vrijednost u
klijentovoj operaciji.
<<instantiate>> - klijent je instanca dobavljača.
<<substitute>> - klijent može u run-time-u služiti kao zamjena za
dobavljača.
<<refine>> - klijent je profinjena verzija dobavljača.
V-05 Softversko inženjerstvo 27
Generalizacija i specijalizacija Generalizacija je veza između posebnije i općenitije stvari.
Specijalizacija je ista veza pročitana u suprotnom smjeru.
Posebna stvar je konzistentna u svakom pogledu s
općenitom stvari.
Posebna stvar može se podmetnuti tamo gdje se očekuje
općenita stvar (substitutability principle).
Generalizacija se obično primjenjuje na klase, no moguće
ju je primijeniti i na druge klasifikatore, te na još neke
elemente za modeliranje (npr na aktere ili use case-ove).
Generalizacijsku hijerarhiju gradimo tako da
generaliziramo posebne stvari, ili da specijaliziramo
općenite stvari.
Stvari na istoj razini u hijerarhiji trebale bi biti na istoj razini
apstrakcije.
V-05 Softversko inženjerstvo 28
Primjer generalizacije/specijalizacije Class dijagram prikazuje generalizacijsku hijerarhiju koja
se sastoji od klasa Shape, Square, Circle i Triangle.
Veze generalizacije nacrtane su u ortogonalnom stilu.
V-05 Softversko inženjerstvo 29
Nasljeđivanje među klasama Nasljeđivanje se događa onda kad među klasama postoji
veza generalizacije.
Pod-klasa nasljeđuje sljedeće osobine od nad-klase: atribute,operacije, veze, ograničenja.
Pod-klasa može: Dodati nove osobine,
Redefinirati naslijeđenu operaciju tako da definira novu operaciju
s istom signaturom.
U nad-klasi mogu postojati apstraktne operacije koje
nemaju implementaciju. One služe kao obrasci.
Svaka konkretna pod-klasa ih mora implementirati (redefinirati).
Apstraktna klasa je ona koja sadrži apstraktnu operaciju. Takva klasa se ne može instancirati.
Takva klasa definira skup apstraktnih operacija koje svaka
konkretna pod-klasa mora implementirati.
V-05 Softversko inženjerstvo 30
Na ovom
dijagramu
pod-klase
Square i
Circle
nasljeđuju
sve
atribute,
operacije i
ograničenja
od nad-
klase Shape.
Primjer nasljeđivanja
V-05 Softversko inženjerstvo 31
Primjer apstraktne klase i operacija Na sljedećem dijagramu operacije draw() i getArea() u nad-
klasi Shape su apstraktne, što se označava pisanjem u
kurzivu (italics). Klasa Shape je isto apstraktna, pa je i njeno
ime u kurzivu. Konkretne pod-klase Square i Circle moraju
implementirati apstraktne operacije, svaka na svoj način.
V-05 Softversko inženjerstvo 32
Polimorfizam Polimorfizam (više oblika) je važan princip u objektnom
modeliranju. Uz enkapsulaciju i nasljeđivanje to je
jedan od tri glavna stupa objektnog pristupa.
Polimorfizam se ostvarujemo tako da najprije
definiramo apstraktnu klasu, a zatim dodamo više
konkretnih pod-klasa. Tako građeni sustavi su vrlo
fleksibilni i lako se proširuju dodavanjem novih
konkretnih pod-klasa.
Polimorfizam se zasniva na pojavi polimorfnih
operacija. Polimorfna operacija je ona koja ima više
implementacija. Različite klase implementiraju istu
polimorfnu operaciju na različite načine.
Polimorfizam dozvoljava da objekti iz različitih klasa
odgovaraju na istu poruku na različite načine.
V-05 Softversko inženjerstvo 33
Dijagram
prikazuje
klasu
Canvas
koja
održava
kolekciju
objekata
iz klase
Shape.
Budući da je Shape apstraktna klasa, za nju se ne mogu
stvoriti instance. No mogu se stvoriti instance njenih
konkretnih pod-klasa, pa se prema substitutability principu
te instance mogu umetnuti tamo gdje se očekuje Shape.
Primjer za polimorfizam (1)
V-05 Softversko inženjerstvo 34
Ovaj object
dijagram
odgovara
prethodnom
class dijagramu.
Makar objekt tipa Canvas sadrži
kolekciju objekata tipa Shape, jedini
objekti koje tu zaista možemo
staviti su oni tipa Square ili Circle.
Ako objekt :Canvas svim objektima u kolekciji pošalje poruku
draw(), tada svaki od njih drukčije odgovara na poruku
pozivajući svoju implementaciju za draw(). Objekti iz klase
Square crtaju kvadrate, a oni iz Circle crtaju krugove.
Primjer za polimorfizam (2)
V-05 Softversko inženjerstvo 35
Generalizacijski skupovi
Generalizacijski skup je skup pod-klasa koji je
organiziran u skladu s određenim pravilom ili načinom
specijalizacije.
Na generalizacijski skup mogu se primijeniti sljedeća
ograničenja. {complete} – generalizacijski skup sadrži sve moguće pod-klase.
{incomplete} – generalizacijski skup ne sadrži sve moguće pod-
klase.
{disjoint} – objekt može biti instanca od najviše jedne pod-klase.
{overlapping} – objekt može biti instanca od dvije ili više pod-
klasa.
Default je {incomplete,disjoint}.
V-05 Softversko inženjerstvo 36
Primjer za generalizacijske skupove
Vidimo da se imena generalizacijskih skupova pišu u
lowerCamelCase. Također je vidljiv način zadavanja
ograničenja.
Za klasu Shape promatramo šest pod-klasa, koje su
grupirane u dva generalizacijska skupa. Prvi skup threeDShape sadrži pod-klase za 3-dimenzionalne oblike.
Drugi skup twoDShape sadrži pod-klase za 2-dimenzionalne oblike.