4. díl - UML - Doménový model

Návrhové vzory UML UML - Doménový model

V minulém dílu UML tutoriálů jsme dokončili Use Case diagram. 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. 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.

Notace třídy v doménovém 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 2mi entitami může být Auto a Řidič. Vztah by se znázornil takto:

UML notace vztahu asociace mezi třídami v doménovém diagramu

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, na kterou nesměřuje šipka.

Je možné vytvořit asociaci i mezi 3mi třídami, ale tím se nebudeme zabývat.

Agregace (Aggregation)

Agregace reprezentuje vztah typu celek - část. Znázorňuje se jako jednoduchá plná čára, zakončená 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. 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.

UML notace vztahu agregace mezi třídami v doménovém diagramu

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ý. Tato vazba bývá matoucí a doporučil bych se jí spíše vyhýbat a nahradit ji agregací. U entity reprezentující celek musí být multiplicita vždy 1.

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.

UML notace vztahu kompozice mezi třídami v doménovém diagramu

Generalizace (Generalization)

Posledním vztahem, který si zde uvedeme, je generazilizace. 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.

UML notace vztahu generalizace mezi třídami v doménovém diagramu

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 devbooku, 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é):

Doménový model redakčního systému v UML

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ě.

Příště se podíváme na Class diagram.


 

  Aktivity (1)

Článek pro vás napsal David Čápka
Avatar
Autor pracuje jako softwarový architekt a pedagog na projektu ITnetwork.cz (a jeho zahraničních verzích). Velmi si váží svobody podnikání v naší zemi a věří, že když se člověk neštítí práce, tak dokáže úplně cokoli.
Unicorn College Autor se informační technologie naučil na Unicorn College - prestižní soukromé vysoké škole IT a ekonomie.

Jak se ti líbí článek?
Celkem (10 hlasů) :
4.84.84.84.84.8


 


Miniatura
Předchozí článek
UML - Use Case Specifikace
Miniatura
Všechny články v sekci
UML
Miniatura
Následující článek
UML - Class diagram

 

 

Komentáře
Zobrazit starší komentáře (1)

Avatar
David Čápka
Tým ITnetwork
Avatar
David Čápka:

Díky, pokud bude zájem, budu se zde UML ještě věnovat :)

Odpovědět 28.10.2012 20:00
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
ondra
Neregistrovaný
Avatar
ondra:

Pěkný článek, pouze bych chtěl upozornit na menší chybku - příklad doménového modelu úplně dole by neměl obsahovat určení datových typů, což je také zmíněno v úvodu článku ;).

 
Odpovědět 26.1.2013 23:23
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovědět 27.1.2013 7:18
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Akimi Mei
Neregistrovaný
Avatar
Akimi Mei:

skvělý článek :D

 
Odpovědět 12.4.2013 16:08
Avatar
Mannerheim
Neregistrovaný
Avatar
Mannerheim:

Opravdu jsou svislé šipky v pravé části posledního obrázku dobře?

 
Odpovědět 20.6.2013 14:47
Avatar
Iwitrag
Člen
Avatar
Iwitrag:

Ahoj, pokud u agregace je část soběstačná (může existovat sama o sobě), neměla by být multiplicita 0..* ? Jakože článek nemusí být v žádné sekci (může být jen samotný sám o sobě) - takové články samozřejmě existují (např. nějaká oznámení, která nemají svou vlastní kategorii).

Odpovědět 5.2.2014 16:24
Učím se ostře vidět.
Avatar
MrPabloz
Člen
Avatar
Odpovídá na Iwitrag
MrPabloz:

Je jedno jestli tam je 0..* nbo 1..* záleží pouze jak si to sám definuješ. Takže tam muže oboje být.

Odpovědět  +1 5.2.2014 20:20
Harmonie těla a duše, to je to, oč se snažím! :)
Avatar
Iwitrag
Člen
Avatar
Odpovídá na MrPabloz
Iwitrag:

Aha, díky :) Já jen jestli to není v rozporu s tou soběstačností... ale když nad tím popřemýšlím, tím 1..* tu soběstačnost nijak neporuším, jen tím budu vyžadovat, aby žádný článek nebyl bez sekce :)
Díky

Odpovědět 6.2.2014 11:21
Učím se ostře vidět.
Avatar
Ondřej Krsička
Redaktor
Avatar
Ondřej Krsička:

Nemá být mezi článkem a sekcí místo asociace agregace?

 
Odpovědět 13. března 0:37
Avatar
Filistin
Člen
Avatar
Odpovídá na Ondřej Krsička
Filistin:

Podle toho jak je to uvedeno nahoře v článku, bych řekl že jo :D

 
Odpovědět 28. června 20:37
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 11. Zobrazit vše