Lekce 4 - UML - Doménový model
V předešlém cvičení, Řešené úlohy k 3. lekci UML, jsme si procvičili nabyté zkušenosti z předchozích lekcí.
Dostáváme se k tzv. doménovému modelu. Doménový model se vytváří spolu s Use Case diagramem v počáteční fázi vývoje softwaru. Jedná se o formu class diagramu, tedy diagramu tříd. Asi nemusím zmiňovat, že systém bude programován objektově a proto bude i tak navrhován. Základní entitou je třída.
Třídy v doménovém modelu jsou však značně zjednodušené, neobsahují metody a mají pouze důležité atributy. Názvy tříd, atributů a další identifikátory můžeme psát s diakritikou. Doménový model je tedy jakýsi náčrt základních entit systému a vztahů mezi nimi. Je platformově nezávislý (není určen pro konkrétní programovací jazyk) a atributy nemají datové typy.
Při tvorbě doménového modelu vycházíme ze zadání klienta. Z něj identifikujeme klíčové entity a vztahy mezi nimi. Tyto entity zakreslíme do modelu jako třídy.
Grafická notace třídy je obdélník rozdělený vodorovně na 3 části.
V první je zapsané jméno třídy, v druhé jsou její atributy a ve třetí části nalezneme metody. Pro doménový model budeme uvádět jen zjednodušenou notaci s názvem třídy a atributy. Kompletní třídu si představíme příště, u Class diagramu.
Třídy jsou mezi sebou propojeny pomocí vztahů.
Vztahy
UML nabízí několik druhů vztahů, ty základní si vyjmenujeme.
Asociace (Association)
Asociace určuje základní vztah mezi dvěma entitami. Ty mohou existovat nezávisle na sobě. Zakreslujeme ji jako jednoduchou plnou čáru.
Příklad jednoduché asociace mezi 2 entitami může být Auto a Řidič. Vztah by se znázornil takto:
Jako výchozí je směr na obě strany, tedy že první entita má odkaz na druhou, a naopak druhá na první. Toto chování můžeme změnit přidáním jednoduché šipky, která směr specifikuje a způsobí, že odkaz si uchovává pouze ta instance, ze které směřuje šipka.
Je možné vytvořit asociaci i mezi 3 třídami, ale tím se nebudeme zabývat.
Agregace (Aggregation)
Agregace reprezentuje vztah typu celek - část. Zakreslujeme ji jako plnou čáru, zakončenou na jedné straně prázdným kosočtvercem. Ten je umístěn u té entity, která reprezentuje celek (např. sekce s články). Z hlediska implementace je to tak entita, která drží kolekci prvků. Entita reprezentující část může existovat sama o sobě a být součástí i jiných kolekcí.
Příkladem agregace může být již zmíněná sekce, obsahující články. Čísla na konci vazby znamenají tzv. multiplicitu, přesněji, že sekce obsahuje libovolný počet článků a článek patří alespoň do 1 sekce.
Multiplicitě se ještě budeme dále věnovat.
Kompozice (Composition)
Kompozice je podobná agregaci, avšak reprezentuje silnější vztah. Entita části nemá bez celku smysl. Pokud zanikne celek, zanikají automaticky i jeho části.
Kompozici zakreslujeme stejně jako agregaci, kosočtverec je ovšem plný. U entity reprezentující celek musí být multiplicita vždy 1. Tato vazba bývá matoucí a doporučil bych se jí spíše vyhýbat a nahradit ji agregací.
Příkladem může být Objednávka a Položka objednávky. Zatímco článek z minulého příkladu dává bez sekce ještě nějaký smysl, položka objednávky bez objednávky smysl nedává. Proto je zde použita kompozice.
Generalizace (Generalization)
Posledním vztahem, který si zde uvedeme, je generalizace. Z hlediska implementace se jedná o dědičnost. Jedna entita dědí vlastnosti a chování jiné. S touto vazbou jsme se již setkali u Use Case diagramu.
Generalizaci zakreslujeme jako plnou čáru, zakončenou na jedné straně prázdnou uzavřenou šipkou (nebo chcete-li trojúhelníkem). Šipka je na straně entity, ze které se dědí.
Příkladem může být třída Tvar, ze které dědí třídy Čtverec a Kruh.
Multiplicita
Vraťme se ještě k multiplicitě (neboli násobnosti). Multiplicitu můžeme uvést u vazeb asociace, agregace a kompozice (zde pouze z jedné strany).
Vraťme se k příkladu sekce - článek:
Multiplicitu zde čteme takto: Sekce může mít libovolný počet článků (to poznáme podle hvězdičky u třídy Článek). Článek patří do 1 až libovolně sekcí (to poznáme podle 1..* u Sekce). Pojďme si nyní uvést jednotlivé možné zápisy multiplicity:
- 1 (číslo) - Označuje konkrétní hodnotu (zde právě 1).
- * (hvězdička) - Označuje libovolný počet (tedy i 0). Místo hvězdičky můžeme v některých materiálech nalézt symbol N.
- 1..* (interval) - Pomocí 2 teček můžeme označit interval. Do něj vkládáme nám již známé symboly, např.: 2..6 nebo 1..* nebo 0..1.
Zápisy můžeme dokonce i slučovat, např. takto: 1, 2, 3, 7..*. Tento zápis označuje multiplicitu 1, 2, 3 nebo 7 a více.
Pokud není multiplicita uvedena, označuje to výchozí hodnotu 1.
Příklad
Pokračujme v našem návrhu ITnetwork, zamysleme se nad základními entitami a propojme je vztahy. Mohli bychom dospět k podobnému výsledku (uvedl jsem i atributy, což však není vůbec nutné):
Všimněte si, že v doménovém diagramu vazby ještě dodatečně popisujeme, v Class diagramu to již zpravidla neděláme. Vyplněná šipka označuje směr, ve kterém čteme popisek vazby, např. redaktor píše článek. Mohl by zde být obrácený směr šipky a popis "byl napsán", i když to nezní tak přirozeně.
V následujícím kvízu, Kvíz - Use Case diagram a doménový model v UML, si vyzkoušíme nabyté zkušenosti z předchozích lekcí.