![]() |
Classes diagram of the Kernel package |
Asociace (třída Association) je množina n-tic typových instancí. Instance třídy Association je nazývána link. Link je pak n-tice, ve které každý konec asociace má právě jednu hodnotu. Každá tato hodnota je instance typu daného konce asociace.
Asociace má alespoň dva konce (binární asociace).
Násobnost asociace říká, s kolika instancemi protilehlé třídy může být třída v asociaci. Pokud toto číslo není pevné, určujeme minimální a maximální počet. Minimum je 0 a říká, že vztah je volitelný (tj. vztah existuje, ale počet elementů je 0).
Notace a sémantika
Asociace se znázorňuje plnou (nepřerušovanou) linkou mezi asociace se účastnících vlastností (properties). Asociace se účastní minimálně dvě vlastnosti (properties) – viz vazba mezi Property a Association.
![]() |
Příklad: Notace asociace |
Každá asociace může být pojmenovaná.
U jména může být uvedena i šipka, která napomáhá pochopit název asociace (určuje směr, kterým vztah číst). Rozhodně však neříká nic o směru navigace (viz dále)!
Na každém konci asociace může být uveden název role, který pojmenovává roli vlastnosti u daného konce asociace. Tyto role jsou jména vlastností (Property) – např. atributů třídy – které jsou součástí asociace nebo jedné ze zúčastněných tříd.
K názvu role lze uvést i viditelnost.
Jelikož role je třída Property, je takto také využívána (např. v programovacích jazycích jde typicky o atribut třídy). Na předchozím obrázku tedy např. třída Klient může mít atribut účet typu Bankovní účet.
n-ární asociace – pokud má asociace více zakončení, zakresluje se kosočtvercem a plné čáry vedou ke všem třídám účastnících se asociace.
![]() |
Příklad: n-ární asociace |
Tento zápis lze samozřejmě použít i pro binární asociaci, ale nemá to valný význam.
![]() |
Příklad: Dvojí notace binární asociace |
Kosočtvercovou notaci však nelze použít pro agregace ani kompozice (viz dále).
Řetězec vlastností (Property string)
Vlastnost (property) může mít řetězec vlastností {union} a {subsets <property>}.
![]() |
Příklad: {union} a {subset <property>} |
Generalisace asociací
Asociace lze generalizovat (je totiž specializací třídy Classifier). Platí pro ni však další pravidla.
Počet asociačních konců v potomkovi musí zůstat zachován a odpovídající třídy musí být kompatibilní, tj. musí jít o tytéž třídy nebo jsou přímými či nepřímými potomky těchto tříd.
Násobnost potomka asociace může být pouze omezena, nikoliv rozšířena.
![]() |
Příklad: Generalisace asociace |
Orientovaná asociace, směrování
Orientovaná asociace je asociace, pomocí které je možné se dostat z jedné účastnické role do další.
Asociace je s určením směru (navigable), pokud vlastnost (property) konce je vlastněna třídou na jejím zakončení nebo je součástí atributu asociace nazvaném navigableOwnedEnd.
![]() |
Příklad: Jednosměrný vztah |
Šipka se kreslí u té třídy, do které se lze navigovat (směr navigace).
Zápis násobnosti a názvu role lze uvést i u třídy, do které se navigovat nelze. V takovém případě pak jde o atribut (property) asociace, nikoliv třídy.
Pokud chceme explicitně říct, že zakončení asociace nemá směrování, pak na jejím konci (ta strana, kam nelze směrovat) zakreslíme křížek.
Interpretace notace
- Pokud jsou uvedeny šipky i křížky, pak je notací navigace jasně znázorněna.
- Pokud nejsou uvedeny ani šipky, ano křížky, pak nám zápis o navigaci neříká nic.
- Pokud máme uvedeny pouze šipky, pak navigace je sice specifikovaná, ale interpretace není jednoznačná.
![]() |
Příklad: Navigability |
- A a B: asociace bez určení navigability.
- C a D: asociace s jedním zakončením schopným navigace, druhé zakončení není specifiková-no.
- E a F: asociace se dvěma zakončeními schopnými navigace.
- G a H: asociace s jedním zakončením schopným navigace a druhým navigace neschopným.
- I a J: asociace s oběma zakončeními neschopných navigace.
Pokud je vztah jednosměrný (případ tříd G a H), pak třída G ví o třídě H, ale třída H o třídě G nikoliv.
V případě vztahu obousměrného (třídy E a F, případně příklad níže) o sobě třídy vědí. Tedy např. Fakulta zná své Studenty a Studenti vědí, na které Fakultě studují.
![]() |
Příklad: Obousměrný vztah |
Agregace a komposice
Agregace je binární asociace rozšířená o (nezávaznou) informaci, že účastnící se třídy nemají rovno-cenný vztah, ale jde o hierarchii typu celek-část. Používá se pro znázornění, jak je celek logicky pospojován ze svých částí.
Kompozice je přísnější forma agregace. Existence jednotlivých částí plně závisí na celku: celek své části vlastní.
![]() |
Agregace a kompozice |
![]() |
Příklad: Agregace: Společnost |
Agregace resp. komposice je atribut (property) třídy Property. Typem atributu je výčtový typ AggregationKind s hodnotami:
- none – nejde ani o agregaci, ani o komposici
- shared – jde o agregaci
- composite – jde o kompozici
![]() |
Příklad: Agregace motoru |
Na tomto obrázku může mít jeden konkrétní motor (tutéž instanci objektu) auto i loď (motor sdílejí). V reálu tedy nesmysl.
![]() |
Příklad: Kompozice motoru |
Zde již jedna konkrétní instance motoru je vlastněna autem či lodí, ale hlavně je motor namontován buďto v autě nebo lodi. Není ale problém motor (jednu konkrétní instanci) vzít a přemontovat z lodi do auta. Instance motoru tak změní svého vlastníka.
Pokud je násobnost částí celku proměnná (např. 1..*), pak jednotlivé části nemusí vznikat najednou, ale mohou být vytvořeny později. Stejně tak k zániku částí může dojít kdykoliv během života vlastněného objektu.
Vlastněná část v případě kompozice nesmí vzniknout dříve než instance celku a stejně tak část nemůže zaniknout po zániku vlastníka. Pozor, pokud instanci části předám jinému vlastníku, pak samozřejmě tato část může žít déle, než původní vlastník (právě proto, že původní vlastník jej již nevlastní).
Pozor! Agregace i kompozice se týkají pouze binárních asociací.
Agregace a kompozice mohou tvořit pouze acyklický graf.
Kompozit (část) je dán atributem isComposite třídy Property.
Směr čtení versus směr navigace
Směr čtení s navigabilitou naprosto nesouvisí. Směr čtení napomáhá pochopit název asociace, kdežto směrování (navigabilita) říká, který objekt přistupuje ke kterému.
![]() |
Příklad: Směr čtení versus směr navigace |
Žádné komentáře:
Okomentovat