UPOZORNĚNÍ

Zkoušky OCUP Fundamental a OCUP Intermediate již není možné absolvovat. Nově jsou k dispozici OCUP 2 Foundation a OCUP 2 Intermediate. Texty uvedené na těchto neodpovídají plně novým zkouškám. Aktuální text najdete na nových stránkách.

Testy znalostí UML

Chcete si kdykoliv před, při nebo po čtení těchto stránek udělat test znalostí UML? Máte možnost absolvovat takový, který připravil autor těchto stránek. Vše podstatné najdete na http://www.kurzy-uml.cz.

Diagramy složených struktur (Composite Structure Diagrams)

Tato část je obsažena v 15 % testových otázek.
Závislost mezi balíky

Diagram složených struktur spadá do kategorie strukturálních diagramů. Zobrazují vnitřní strukturu klasifikátoru a poskytují tak další informace, které se pomocí jiných typů diagramů modelují hůře (např. z pohledu čitelnosti).

Prvků, které se v diagramech složených struktur používají, není mnoho. Navíc po zapamatování si základních pravidel poskytují silný mechanismus, jak dát čtenáři vědět, co daný klasifikátor umožňuje. Přesto jsem v praxi nezaznamenal jejich výrazné použití (což u zkoušky neomlouvá).

Než představím složenou strukturu, podívejme se na diagram, který můžete znát z přípravy na předchozí úroveň. Na něm si pak ukážeme smysl složených struktur a seznámím vás se základními pojmy.

Příklad: Loď a auto
Tento obrázek v naší mysli jasně vyvodí závěr, že tu máme třídy Loď, které přihodíme Motor a Lodní šroub, a Auto, kterému dáme Motor a nějaká vhodná Kola. Jenže uvedený obrázek umožňuje i jiné kombinace. Podívejte se na níže uvedený objektový diagram.
Instance tříd Loď a auto 1.

Vzhledem ke vztahům uvedených v diagramu tříd je naprosto správně (a kdo jste někdy jel ve Fordu, tak se asi ani divit nebudete). Stejně tak je správný následující příklad:
Instance tříd Loď a auto 2.

Z pohledu znalosti reálného světa to ale úplně dobře není. Jak si s tím poradit? Jednou z možností je použít omezení (constraints). Jenže čím více tříd, tím více omezení a tím horší čitelnost. Vhodným řešením jsou právě diagramy složených struktur:
Příklad kompozitních struktur Auto a Loď


Na uvedeném obrázku vidíme, jak je složena třída Auto a jak třída Loď. Auto má svůj motor spojený s předními koly (takže je mimo jiné vidět, na která kola má náhon), Loď pak má Motor spojený s Lodním šroubem. „Obdélníky“ v jednotlivých třídách nazýváme jejími (sou)částmi (anglicky parts), vazby mezi nimi pak konektory (connectors).

První, čeho si zřejmě všimnete, je přerušovaná čára kolem kol. Podívejte se znovu na původní obrázek tříd, kde ne všechny vazby jsou stejně silné. Někde je obyčejná asociace, někde agregace, někde je použitá kompozice. Anglický název diagramů složených struktur – Composite Structure Diagram – nám k vysvětlení pomůže. Ty části, které třída vlastní díky kompozici, jsou ohraničeny plnou čarou, všechny ostatní přerušovanou.

Nyní však pojďme přistoupit ke složeným strukturám společně s UML standardem. V této kapitole doporučuji více než jindy pročíst si ji alespoň dvakrát, pokud nejste s diagramy složených struktur obeznámeni. Nejprve představím jednotlivé třídy a pak ukážu, jak společně pracují.

Strukturovaný klasifikátor (třída StructuredClassifer)

třídy Structured Classifier

Strukturovaný klasifikátor (třída StructuredClassifier) je dle standardu abstraktní metatřída, která reprezentuje libovolný klasifikátor, jehož chování může být plně nebo částečně popsáno pomocí spolupráce instancí (tedy nikoliv tříd!). Tyto instance může klasifikátor buďto vlastnit nebo mít na ně odkaz (referenci).

Notace strukturovaného klasifikátoru je stejná jako notace starého známého klasifikátoru (Kernel::Classifier) pouze s tím rozdílem, že obsahuje jeden oddíl (compartment) navíc právě pro zobrazení vnitřní struktury.

Strukturovaný klasifikátor vlastní jednak atributy (asociace s třídou Property) a jednak konektory (asociace s třídou Connector). Důležitý je i vztah, kde je role u třídy Property nazvaná part. O něm jsem se již zmínil v úvodu kapitoly. Jedná se o části strukturovaného klasifikátoru, tedy všechny vlastnosti (properties) určující instance, které jsou klasifikátorem vlastněné pomocí kompozice.

Vazbu mezi strukturovaným klasifikátorem a spojitelným elementem (třída ConnectableElement) nazýváme rolí. Je to role, kterou instance může hrát v tomto klasifikátoru.

Třída Class

Třída Class rozšiřuje metatřídu Kernel::Class o možnost mít interní strukturu a porty. Sama o sobě není příliš zajímavá, ale ve standardu se popisuje jeden vzor použití třídy – instance a závislosti typu použití – který za zmínění stojí:
Příklad: Třída, instance, závislost

Závislost je zde mezi konstruktorem třídy a instancí třídy Window. Klientem je konstruktor, což je operace vracející stejný typ, jaký má vlastnící třída. Vytvořená instance je pak poskytovatel. Všimněte si i stereotypu «create», který je použit pro označení konstruktoru. Tento stereotyp je definován i ve standardních stereotypech standardu, který jej používá i v některých příkladech.

Třída ConnectableElement

Spojitelný element (třída ConnectableElement) je abstraktní metatřída vyjadřující množinu instancí, které hrají nějakou roli ve strukturovaném klasifikátoru. Konkrétní sémantika a notace jsou dány až specifikacemi této třídy (např. třída Property, viz dále). V UML byla zavedena jako základní prvek se schopností být spojen s jinými prvky pomocí konektoru (třída Connector).

Třída Connector
Třídy Connectors

Konektor je propojení (anglicky link), které umožňuje komunikovat mezi dvěma či více instancemi. Propojením může být instance asociace (která se zove link) nebo může jít o instance, které třída jinak zná (např. jako parametry nebo proměnné ve slotech). Link může být v programovacím jazyce implementován např. jako odkaz (pointer) nebo síťové spojení.

Každý konektor je připojený minimálně ke dvěma spojitelným elementům (třída ConnectableElement), každý reprezentující množinu instancí. Každý konec konektoru hraje odlišitelnou roli v komunikaci mezi propojenými instancemi. Každý konec konektoru má také své zakončení (třída ConnectorEnd), které napojuje konektor na vlastní spojitelný element.

Notace: konektor je kreslen stejně jako asociace. Volitelný je název konektoru, u kterého může být uveden i název třídy, která identifikuje danou instanci (viz obrázek v úvodu). Případný stereotyp se pak uvádí nad nebo před jméno konektoru.

Třída ConnectorEnd

Zakončení konektoru (třída ConnectorEnd) je koncový bod konektoru, který napojuje konektor na spojitelný element. Jedná se o specializaci třídy Kernel::MultiplicityElement. Násobnost zde říká počet instancí, které mohou být napojeny na instance vlastností na dalším konci konektoru. Vše záhy vysvětlím na příkladu.

Třída Property

Třída Property slouží k uchování množiny instancí, které jsou vlastněny instancí klasifikátoru. V případě, že jsou některé instance vlastněny díky kompozitní vazbě, pak se na ně odkazujeme jako na (sou)části klasifikátoru. Znovu poukazuji na to, že části nejsou třídou, ale koncem asociace (viz diagram u třídy StructuredClassifier). Instance součástí jsou vytvářeny společně s instancí klasifikátoru nebo později a rušeny jsou nejpozději při rušení instance vlastnícího klasifikátoru.

Notace: součást je zobrazována v obdélníku s nepřerušovaným okrajem. Vlastnost (property) vyjadřující instanci nevlastněnou klasifikátorem je zobrazována v obdélníku s přerušovaným okrajem. V obdélníku pak zobrazujeme pouze název podle pravidel uvedených u třídy Kernel::Property. Zkráceně to lze zapsat jako:

název [':' klasifikátor]

kde název je název vlastnosti a klasifikátor je název typu. Není-li typ uveden, pak mluvíme o anonymní třídě. Násobnost se pak zobrazuje buďto v pravém horním rohu nebo za klasifikátor.
Příklad notace Property

V případě specifikace instance se pak používá notace:


{ ['/' ] | '/' } [':' [',' ]*]

Tj. název specifikace instance může být následován názvem role, kterou instance hraje (příklady viz dále).

Jak to funguje celé dohromady

Doposud jsme o mnoha třídách mluvili víceméně odděleně, ale oni spolu hodně spolupracují. Ještě jednou si připomeňme jeden z úvodních obrázků a ukažme si, kde je která třída použita:

Příklad kompozitní struktury
  • Třída Auto je zde instancí některé specializace metatřídy StructuredClassifier (zde třídy Class). Má v sobě oddíl pro složenou strukturu.
  • V oddílu pro složenou strukturu vidíme tři vlastnosti, tj. instance třídy Property (která je mj. specializací třídy ConnectableElement): motor, zadní kolo a přední kolo. Z toho pouze motor můžeme nazývat částí, neboť jej Auto vlastní (ostatní vlastnosti má pouze v užívání). Všechny části mají název a klasifikátor. U kol je navíc uvedena násobnost.
  • Dále tam je instance třídy Connector a to mezi motorem a předním kolem. Je nazvaná hřídel a má uveden i klasifikátor.
  • Nakonec je zde na každém konci konektoru instance třídy ConnectorEnd. Má zobrazenou násobnost.
Instance, násobnost, části a konektory

Násobnost částí a zakončení konektorů nám říká počet instancí (tj. objektů a linků), které mohou být v rámci instance složeného klasifikátoru vytvořeny nebo spravovány. V UML jsou uvedeny dva vzory pro vytváření instancí.

Vzor Hvězda

První vzor říká, že pro každou instanci hrající roli ve vnitřní struktuře bude vytvořeno přesně tolik linků, kolik určuje násobnost u protilehlého konce konektoru. Na následujícím příkladu vidíme, že vznikly čtyři instance konektorů.
Vzor Hvězda

Vzor Řada

Vzor řada říká, že link bude vytvořen pro každou instanci hrající ve spojení roli. Linků je vytvořeno do minima násobnosti dle pořadí.
Vzor Řada

Další příklady

Zůstaňme u auta a kol, jen si to celé trochu upravíme. Řekněme, že stále bude platit, že auto má čtyři kola, přičemž přední jsou spojené osou a stejně tak zadní. Budeme mít třídy Auto a Kolo:
Příklad: Auto a Kolo

Jeden z možných modelů vypadá následovně:

Příklad: Auto, 4 kola, osy, varianta 1

Můžeme však vytvořit podobný model s toutéž sémantikou, ale využijeme přitom násobnosti:

Příklad: Auto, 4 kola, osy, varianta 2

Pokud si první obrázek promítneme do diagramu instancí, dostaneme toto:

Příklad: Auto

Konečně pokud se vrátíme k obrázku uvedeného u třídy Class, můžeme vše zapsat tímto způsobem:
Příklad: Třída Auto s konstruktorem

Žádné komentáře:

Okomentovat

Líbila se vám právě přečtená kapitola?

Líbil se vám článek? Přinesl vám užitek? Pokud ano, můžete mi zaslat pár drobných, čímž jednak dáte najevo, že se vám tu opravdu líbilo, a jednak mi ukážete, že má práce není zbytečná. Informace o darovací platbě zde.