SOFTVERSKO INŽENJERSTVO Vježbe 10: Oblikovanje veza...
Transcript of SOFTVERSKO INŽENJERSTVO Vježbe 10: Oblikovanje veza...
SOFTVERSKO INŽENJERSTVO
Vježbe 10: Oblikovanje veza,agregacije i kompozicije
Robert Manger
Sveučilište u Zagrebu
PMF-Matematički odsjek
Akademska godina 2019/2020.
V-10 Softversko inženjerstvo 2
Sadržaj Vježbi 10
Općenito o oblikovanju veza
Svojstva agregacije i kompozicije
Postupak profinjavanja veza dobivenih u analizi
Profinjavanje asocijacije jedan-naprama-jedan
Profinjavanje asocijacije mnogo-naprama-jedan
Profinjavanje asocijacije jedan-naprama-mnogo
Profinjavanje asocijacije mnogo naprama mnogo
Profinjavanje dvosmjerne asocijacije
Profinjavanje asocijacijske klase
V-10 Softversko inženjerstvo 3
Općenito o oblikovanju veza (1) Veze koje smo uočili u analizi potrebno je profiniti u veze
na razini oblikovanja, dakle takve veze koje se lagano
mogu implementirati.
Najveću pažnju posvećujemo profinjavanju asocijacija
između klasa. U postupku profinjavanja koji vodi do
dobrih imlementacija važnu ulogu imaju veze agregacije
odnosno kompozicije.
Pokazuje se da se asocijacije s multiplicitetima: jedan-naprama-jedan,
mnogo-naprama-jedan,
jedan-naprama-mnogo
mogu relativno jednostavno implementirati nakon što ih
profinimo u agregacije ili kompozicije.
V-10 Softversko inženjerstvo 4
Općenito o oblikovanju veza (2)
Pokazuje se da je znatno teže implementirati: asocijacije s multiplicitetom mnogo-naprama-mnogo,
dvosmjerne asocijacije,
asocijacijske klase.
Takve složenije asocijacije profinjavamo uvođenjem
novih klasa, te svođenjem na nekoliko
jednostavnijih agregacija i kompozicija.
U nastavku ovih vježbi najprije se upoznajemo sa
svojstvima agregacije i kompozicije, zatim ugrubo
opisujemo postupak profinjavanja, te na kraju
detaljno analiziramo načine za profinjavanje
pojedinih vrsta asocijacija.
V-10 Softversko inženjerstvo 5
Agregacija i kompozicija (1) Riječ je o vezama koje opisuju odnos između cjeline i
dijelova. Objekti jedne klase predstavljaju cjelinu, a
objekti druge klase su dijelovi.
Cjelina koristi usluge dijelova; dijelovi obrađuju zahtjeve cjeline.
Cjelina obično ima kontrolu; dijelovi su obično pasivni.
Navigabilnost je jednosmjerna, od cjeline do dijela.
Semantička razlika između agregacije i kompozicije je u
sljedećem.
Agregacija je labava vrsta veze, gdje dijelovi mogu postojati
neovisno o cjelini. Primjer: računalo i njegove periferijske jedinice.
Kompozicija je čvrsta veza, gdje dijelovi ne mogu postojati bez
cjeline. Primjer: stablo i njegovi listovi.
I agregacija i kompozicija su tranzitivne veze:
ako je C dio od B a B dio od A, tada je i C dio od A.
V-10 Softversko inženjerstvo 6
Agregacija i kompozicija (2)
Obje vrste veza crtaju se na class dijagramu kao strelice
od klase-cjeline do klase-dijela s rombom na početku
strelice. Pritom je: Kod agregacije romb prazan,
Kod kompozicije romb ispunjen.
Obje vrste veze su
asimetrične. Cjelina nikad ne
može biti dio same
sebe, ni posredno ni
neposredno.
Niz veza od cjeline
prema dijelu ne smije
zatvarati ciklus.
V-10 Softversko inženjerstvo 7
Detaljnije o agregaciji
Kod agregacije cjelina koji put može postojati
neovisno o dijelovima, koji put ne (ovisno o
aplikaciji).
Dijelovi uvijek mogu postojati neovisno o cjelini.
Cjelina je obično u nekom smislu nepotpuna ako
joj nedostaju dijelovi.
Moguće je da jedan te isti dio bude uključen u
više cjelina.
V-10 Softversko inženjerstvo 8
Jednostavni primjer agregacije
Dijagram prikazuje agregaciju između računala i pisača.
Računalo može imati spojeno 0 ili više pisača.
U jednom trenutku, jedan pisač može biti spojen na 0 ili 1
računalo.
Tijekom vremena, razna računala mogu koristiti jedan te isti pisač.
Pisač može postojati čak i ako nije spojen na računalo.
V-10 Softversko inženjerstvo 9
Složeniji primjer agregacije Dijagram prikazuje stolno računalo.
Ono se sastoji od miša, tipkovnice, središnje jedinice, monitora i dva
zvučnika.
Središnja jedinica je sastavljena od RAM-a, diskova i drugih dijelova.
V-10 Softversko inženjerstvo 10
Primjer refleksivne agregacije (1) Na lijevom dijelu slike vidi se class dijagram s
refleksivnom agregacijom koja klasu Product povezuje
samu sa sobom.
V-10 Softversko inženjerstvo 11
Primjer refleksivne agregacije (2)
Agregacija kaže da jedan složeniji proizvod može
biti sastavljen od više jednostavnijih proizvoda.
Na desnom dijelu prethodne slike vidi se
odgovarajući object dijagram s poveznicama
između objekata.
Object dijagram je korektan ako prikazuje različite
objekte i pritom poveznice ne zatvaraju ciklus.
Naime, mora se čuvati asimetričnost agregacije.
V-10 Softversko inženjerstvo 12
Detaljnije o kompoziciji
Kod kompozicije, dio ne može postojati bez cjeline.
U jednom trenutku jedan dio može pripadati samo
jednoj cjelini. Kompozicije uvijek grade hijerarhiju.
Cjelina je odgovorna za stvaranje i uništavanje svojih
dijelova.
Jedna cjelina može otpustiti svoj dio, ali tako da ga
preda u nadležnost drugoj cjelini.
Ako jedna cjelina mora nestati, ona mora uništiti sve
svoje dijelove, ili ih mora predati u nadležnost drugoj
cjelini.
V-10 Softversko inženjerstvo 13
Jednostavni primjer kompozicije
Dijagram prikazuje da miš kao cjelina uključuje i tipke
kao svoje sastavne dijelove.
Tipka ne može postojati nezavisno od miša. Ako
uništimo miša, uništili smo i sve njegove tipke.
Jedna tipka pripada samo jednom mišu.
V-10 Softversko inženjerstvo 14
Kompozicija i atributi Semantika kompozicije vrlo je slična semantici
atributa. Dio cjeline ekvivalentan je atributu te cjeline.
Postavlja se pitanje da li je u modelima uopće
potrebno koristiti kompoziciju, ili je bolje klase-dijelove
proglasiti atributima klase-cjeline. Odgovor ovisi o
situaciji.
Eksplicitnu kompoziciju treba koristiti onda kad su dijelovi
sami za sebe važni i zanimljivi.
Atribute treba koristiti onda kad su dijelovi sami za sebe
nezanimljivi, ili je riječ o primitivnim tipovima koji nisu klase.
V-10 Softversko inženjerstvo 15
Postupak profinjavanja veza (1) Sad ćemo detaljnije opisati postupak profinjavanja
veza uočenih u analizi, kojim dobivamo veze na razini
oblikovanja.
U analizi se obično pojavljuju asocijacije s nejasno
određenom semantikom i nepoznatim multiplicitetima.
U oblikovanju moramo biti što precizniji i konkretniji.
Kad god je to moguće, asocijaciju nastojimo
interpretirati kao agregaciju ili kompoziciju.
Nakon što smo procijenili da je moguće koristiti
agregaciju ili kompoziciju, daljnji postupak je sljedeći. Dodajemo multiplicitete i imena uloga ukoliko nedostaju.
Odlučujemo koja strana asocijacije predstavlja cjelinu, a koja
dio.
V-10 Softversko inženjerstvo 16
Postupak profinjavanja veza (2) Gledamo multiplicitet na strani cjeline: ukoliko je on 0..1 ili
točno 1, moguće je koristiti kompoziciju, inače moramo
koristiti agregaciju.
Zadajemo jednosmjernu navigabilnost od cjeline prema
dijelovima.
Ovisno o multiplicitetima, predlažemo daljnje profinjavanje
odnosno odgovarajuću implementaciju.
Načini kako se pojedina asocijacija može profiniti i
implementirati bitno ovise o njezinim multiplicitetima.
Ti multipliciteti mogu biti:
jedan-naprama-jedan,
mnogo-naprama-jedan,
jedan-naprama-mnogo,
mnogo-naprama-mnogo.
V-10 Softversko inženjerstvo 17
Asocijacija jedan-naprama-jedan (1) Asocijacija s multiplicitetima jedan-naprama-jedan
predstavlja vrlo čvrst odnos između dviju klasa.
Postoje tri načina kako se ona može profiniti i
dovesti u oblik pogodan za implementaciju:
sažimanje dviju klasa u jednu,
pretvaranje u kompoziciju,
pretvaranje jedne klase u atribut druge klase.
U slučaju pretvaranja u kompoziciju, veza će na
kraju implementirati tako da objekt-cjelina sadrži
referencu na jedinstveni objekt-dio.
V-10 Softversko inženjerstvo 18
Asocijacija jedan-naprama-jedan (2)
Sljedeća slika prikazuje asocijaciju koju smo
interpretirali kao kompoziciju.
V-10 Softversko inženjerstvo 19
Asocijacija jedan-naprama-jedan (3) Sljedeća slika prikazuje drugi način profinjavanja iste
asocijacije, gdje smo jednu klasu pretvorili u atribut druge
klase.
V-10 Softversko inženjerstvo 20
Asocijacija mnogo-naprama-jedan (1) Promatramo asocijaciju za koju nam se čini da bi je
mogli interpretirati kao agregaciju. Pritom je multiplicitet
na strani cjeline “mnogo”, a multiplicitet na strani dijela
je 1.
Budući da isti dio može biti uključen u više cjelina,
jasno je da tu ne može biti riječ o kompoziciji.
Potrebno je provjeriti da li poveznice među objektima
mogu zatvoriti ciklus.
Ako nema ciklusa, tada asocijaciju zaista možemo
profiniti u agregaciju. To znači da će asocijacija na
kraju biti implementirana tako da objekt-cjelina sadrži
referencu na objekt-dio.
V-10 Softversko inženjerstvo 21
Asocijacija mnogo-naprama-jedan (2) Sljedeća slika prikazuje vezu između novčanih iznosa i
valuta u kojoj su ti iznosi. Veza je na opisani način
profinjena u agregaciju.
V-10 Softversko inženjerstvo 22
Asocijacija jedan-naprama-mnogo (1) Promatramo asocijaciju za koju nam opet se čini da bi je
mogli interpretirati kao agregaciju. No sada postoji cijela
kolekcija objekata koji su dijelovi jedne cjeline.
Profinjenje se svodi na uvođenje nove klase koja
predstavlja kolekciju objekata-dijelova. U konačnoj
implementaciji cjelina će imati referencu na kolekciju.
Objektno-orijentirani jezici razlikuju se po tome u kojoj
mjeri podržavaju rad s kolekcijama. Neki nude samo polja, dakle tjeraju nas da kolekciju prikažemo kao
indeksirani niz referenci na objekte-dijelove. To je nefleksibilno
rješenje jer je veličina polja unaprijed ograničena.
Neki imaju implementirane takozvane kolekcijske klase, na primjer
redove, stogove, rječnike, … To je znatno fleksibilnije rješenje gdje
nema ograničenja na veličinu kolekcije, a moguće je i odabrati
razne načine ponašanja kolekcije (sortiranost, duplikati, …)
V-10 Softversko inženjerstvo 23
Asocijacija jedan-naprama-mnogo (2) Općenito, kolekcijska klasa je takva klasa čiji objekti
predstavljaju kolekcije drugih objekata. Kolekcijska
klasa raspolaže operacijama za:
dodavanje ili izbacivanje objekta iz kolekcije,
pronalaženje objekta u kolekciji sa zadanim svojstvima,
prolazak kroz kolekciju i dohvaćanje svih objekata od prvog do
zadnjeg.
Sljedeća slika prikazuje asocijaciju jedan-naprama-
mnogo između narudžbi (Order) i redaka narudžbi
(OrderLine). Ta asocijacija je profinjena korištenjem
kolekcijske klase Vector koja je standardna u Javi.
Umjesto polazne veze, pojavljuju se dvije nove veze:
V-10 Softversko inženjerstvo 24
Asocijacija jedan-naprama-mnogo (3)
Veza između cjeline (Order) i kolekcijske klase (Vector) je svakako
kompozicija.
Veza između kolekcijske klase (Vector) i dijelova (OrderLIne) može
biti ili agregacija ili kompozicija. Odlučili smo se za kompoziciju.
V-10 Softversko inženjerstvo 25
Asoc mnogo-naprama-mnogo (1) Sad promatramo asocijaciju s multiplicitetom mnogo-
naprama-mnogo. Kad bi takvu vezu interpretirali kao
agregaciju, tada bi jedna cjelina imala mnogo dijelova, a
jedan te isti dio bio bi uključen u mnogo cjelina.
Današnji objektno-orijentirani jezici ne daju izravnu
podršku za prikaz odnosa mnogo-naprama-mnogo.
Kolekcijske klase ne pomažu jer bi s njima svaka cjelina
stvorila svoju kolekciju gdje bi se na nekoordinirani način
pojavljivale kopije istih dijelova.
Asocijaciju mnogo-naprama-mnogo profinjavamo
takozvanim postupkom reifikacije (making real). Uvodimo novu klasu za uređene parove povezanih objekata.
Uvodimo dvije nove asocijacije, između nove klase i starih klasa.
Te nove asocijacije imaju jednostavniji multiplicitet, pa se mogu
implementiranti na načine koje smo prethodno opisali.
V-10 Softversko inženjerstvo 26
Asoc mnogo-naprama-mnogo (2) Sljedeća slika prikazuje asocijaciju allocation između
poslova (Task) i resursa (Resource). Jednom poslu može
biti dodijeljeno više resursa, a jedan resurs može biti
dodijeljen raznim poslovima.
V-10 Softversko inženjerstvo 27
Asoc mnogo-naprama-mnogo (3) Asocijacija se profinjuje tako da uvedemo klasu Allocation.
Njeni objekti su uređeni parovi (posao, resurs) takvi da je
dotični resurs dodijeljen dotičnom poslu. Polazna
asocijacija pretvorila se u dvije agregacije.
Odlučili smo da je Resource cjelina a Task dio. To je zato što
se u zahtjevima tražila obrada koja kreće od resursa. U
skladu s usmjerenošću na resurse, odlučili smo da će
objekt tipa Resource imati odgovornost stvaranja i
uništavanja objekata tipa Allocation. Zato smo vezu između
Resource i Allocation proglasili kompozicijom.
Ako bi se u zahtjevima tražila jednaka usmjerenost i na
resurse i na poslove, tada bi morali uvesti još jednu klasu:
AllocationManager. Objekt iz te klase održavao bi kolekciju
objekata tipa Allocation.
V-10 Softversko inženjerstvo 28
Dvosmjerna asocijacija (1)
Česte su situacije kad neki objekt a iz klase A koristi
uslugu nekog objekta b iz klase B, nakon čega b mora
odgovoriti tako da pozove uslugu objekta a. Na
primjer, a može biti GUI prozor, a b gumb unutar tog
prozora.
Takva situacija u analizi bi se opisala kao dvosmjerna
veza između klasa A i B.
No budući da današnji objektno-orijentirani jezici ne
daju pravu podršku za dvosmjernost, dvosmjerna
asocijacija se u oblikovanju mora profiniti u dvije
jednosmjerne. To je ilustrirano na sljedećem
dijagramu.
V-10 Softversko inženjerstvo 29
Dvosmjerna asocijacija (2)
Jedna od jednosmjernih asocijacija može biti proglašena
agregacijom ili čak kompozicijom. No da bi osigurali
asimetričnost, drugi smjer mora ostati neprofinjena
asocijacija, ili čak može biti pretvoren u ovisnost.
V-10 Softversko inženjerstvo 30
Asocijacijske klase (1) Asocijacijske klase se pojavljuju u analizi, no moraju se
ukloniti u oblikovanju budući da ih današnji programski
jezici ne mogu izravno implementirati.
Asocijacijsku klasu uklanjamo postupkom reifikacije koji
je sličan onom kojeg smo koristili za vezu mnogo-
naprama-mnogo. Dakle uvodimo novu klasu koja zamjenjuje asocijacijsku klasu.
Objekt nove klase predstavlja uređeni par povezanih objekata, te
također sadrži i atribute veze.
Uvodimo nove asocijacije između starih klasa i nove klase. Te
nove asocijacije imaju multiplicitet jedan-naprama-mnogo ili
mnogo-naprama-jedan, a mogu se proglasiti agregacijom ili
kompozicijom.
Na gornjem dijelu sljedećeg dijagrama vidi se
asocijacijska klasa Job s atributom salary koja povezuje
klase Company i Person.
V-10 Softversko inženjerstvo 31
Asocijacijske klase (2)
V-10 Softversko inženjerstvo 32
Asocijacijske klase (3) Ta asocijacijska klasa bilježi da neki ljudi rade poslove za neke
kompanije i za to dobivaju određenu plaću.
Pritom jedan čovjek može raditi za više kompanija, a jedna kompanija
može zapošljavati više ljudi.
Određeni čovjek za određenu kompaniju radi samo jedan posao.
Na donjem dijelu dijagrama vidi se rezultat reifikacije.
Umjesto asocijacijske klase sad imamo pravu klasu Job s
atributom salary i dvije agregacije. Prva agregacija je shvaćena kao kompozicija.
U konačnoj implementaciji poslovi će se pripisivati uz kompaniju.
Pritom će svaki posao imati referencu na odgovarajuću osobu.
Reifikacijom asocijacijske klase gubi se dio njene semantike. U prethodnom primjeru, prelaskom na pravu klasu postalo je moguće
da isti čovjek za istu kompaniju obavlja više poslova.
Ako želimo da polazna semantika i dalje vrijedi, tada to moramo
naglasiti dodavanjem primjedbe (note) s ograničenjem.