![]() |
Dependencies of the Activity packages |
Z balíku Activities::BasicActivities se zkouší tyto oblasti:
- Uzly (Nodes)
- Hrany (Edges)
- Akce (Actions, pouze základní)
- Řídící uzly (Control Nodes)
Nutno však podotknout, že např. importem z Actions::BasicActions získáme generalizaci pinů, proto zde uvedu i některé informace z tohoto balíku. Výslovně bude uvedeno, o které jde. Zbytek se pak týká tříd z Activities::BasicActivities.
Aktivita (Třída Activity)
![]() | ||
Fundamental nodes |
![]() |
Elements |
Aktivita popisuje sekvenci akcí (actions), které jsou této aktivitě podřízené a jejichž činnost aktivita řídí. K tomu používá model předávání řízení a objektů (viz předešlá kapitola).
Existují akce, které vyvolávají jiné aktivity (buďto přímo jako CallBehavorAction či nepřímo jako CallOperationAction).
Tok řízení běhu aktivity je předáván pomocí hran mezi uzly aktivity. Uzlem může být běh podřízené-ho chování (např. aritmetický výpočet), volání operace nebo manipulace s obsahem objektu.
Aktivita taktéž může obsahovat uzly řídící tok, např. synchronizační uzly (nejsou součástí zkoušky Fundamental), uzly rozhodování a další.
V objektově orientovaném modelu není aktivita volána přímo, ale nepřímo např. jako metoda přiřa-zená k operaci nějakého objektu.
Aktivita může představovat výpočet nějakého složitějšího problému, ale stejně tak ji lze použít pro modelování nějakého obchodního procesu.
Pokud atribut aktivity isReadOnly je nastaven na true, pak aktivita nesmí provádět žádné změny dat mimo tuto aktivitu.
Příklad:
![]() |
Příklad: Aktivita |
Třída Activity je nepřímá specializace třídy Class.
Aktivita může mít parametry (díky dědění z třídy Behavior), které se zakreslují do obdélníků a dále jsou také v seznamu pod názvem aktivity. Pro každý parametr je pak použita třída ActivityParameterNode (viz dále).
Klasifikátor (Classifier), pokud je nějaký daný, je používán jako kontext aktivity. To znamená, že za běhu má aktivita přístup k atributům a operacím svého kontextu (a potažmo tedy i k objektům přilinkovaným k tomuto kontextu). Aktivita, pokud má daný kontext, nesmí být spuštěna, dokud není tento kontext instanciován (tj. není vytvořena instance třídy).
Aktivita má také podmínky:
• Pre-condition: podmínky, které musí být splněny před spuštěním aktivity.
• Post-condition: podmínky, které jsou splněny v době dokončení aktivity.
Notace
Použití notace aktivit a akcí, která je uvedena ve standardu, je čistě dobrovolná záležitost. Namísto toho je možné použít textový zápis. To ale neznamená, že notaci nemusí pro zkoušku znát. Naopak.
Notace pro aktivitu je kombinace notace uzlu a hrany. Dle standardu platí:
- Aktivita je zobrazena jako obdélník se zakulacenými rohy.
- Název aktivity je v levém horním rohu.
- Parametry aktivit jsou zakresleny na hranici aktivity.
- Pre- a Post-conditions (mj. převzaté z třídy Behavior) jsou zobrazeny společně s klíčovým slovem «preconditon» a «postcondition». Tyto podmínky platí pro všechny běhy aktivity.
- Aktivita může být zobrazena i jako třída:
![]() |
Příklad: Notace aktivity jako třídy |
Tok tokenů
Sémantika aktivit je založena na toku tokenů (do češtiny se víceméně nepřekládá, představit si jej můžeme jako jakýsi míček či známého peška). To znamená, že běh jednoho uzlu v aktivitě je ovlivňován během jiného uzlu a stejně tak ovlivňuje běh dalšího uzlu.
Token (resp. tokeny) putuje (putují) po aktivitě a tím, kde se zrovna nachází, určuje (určují) stav aktivity.
Tokeny jsou od sebe jasně odlišené, byť by nesly tutéž informaci.
Uzel může být proveden, jakmile jsou splněny všechny podmínky nutné pro spuštění (pre-conditions) a ze všech či z jedné hrany připutoval token. Jakmile je běh uzlu dokončen, je token poslán po jedné či po všech výstupních hranách (viz pravidla u jednotlivých uzlů, která říkají, zda stačí, aby připutoval jeden token nebo tokeny ze všech vstupních hran. Stejně tak pak pro výstupní hrany.)
Parametr aktivity (třída ActivityParameterNode)
Parametr aktivity je objektový uzel, který slouží pro vstup a výstup parametrů z/do aktivity.
Notace a sémantika
Parametr aktivity je obdélník obsahující typ parametru a volitelně jeho stav. Aktivita může mít libo-volný počet parametrů. Jakmile je aktivita zavolána, objektové tokeny jsou k disposici na všech vstupních parametrech. To znamená, že pokud má aktivita více parametrů, pak objektový token vybíhá ze všech parametrů současně. V takovém případě není třeba použít počáteční uzel (třída InitialNode).
![]() |
Příklad: Parametry aktivity |
Jakmile je aktivita ukončována, objektový token je na všech výstupních parametrech. Pokud odpovídající objekt neexistuje, vytvoří se tzv. nulový token (null token nebo také zero token), který může být použit pro libovolný objektový typ.
Akce (třída Action)
Akce (třída Action) je abstraktní třída, přičemž UML definuje i konkrétní specializace:
- Volání chování (např. jiné aktivity)
- Volání operace
- Vyslání a přijmutí signálu
- Vytvoření, smazání a změna objektu
Příkladem může být CallBehaviorAction, dalším např. CreateObjectAction. Jejich znalost ale spadá do zkoušky úrovně Intermediate.
Akce jako taková je dále nedělitelná. Na druhou stranu je naprosto běžné, že akce může volat jinou aktivitu, která se skládá z jiných akcí.
Někdy dochází k nepochopení, co to znamená nedělitelnost akce. Ta se totiž vztahuje pro daný model, který vytváříme. Např. pokud chceme modelovat běžný chod domácnosti, může být jako nedělitelná akce vysávání. Pokud jsme ovšem výrobci vysavačů, pak to pro nás znamená naopak složitá aktivita, ke které ve vysavači dochází a je spuštěna tlačítkem vysavače. Proto se vždy ptejte: je to, co potřebuji modelovat, v daném kontextu nedělitelné, tj. je to černá skříňka, u které mě nezajímá, co se děje uvnitř?
Následující diagram je v balíku Actions::BasicActions:
![]() |
Basic actions |
K prostudování také doporučuji již uvedený diagram Fundamental Nodes. BasicActions definuje Action jako přímého potomka třídy NamedElements, kdežto BasicActivities mezi ně ještě vkládá ActivityNode.
Akce může mít vstupní a výstupní piny (viz dále). Stejně tak akce může mít definován kontext.
Tok tokenů v akci
![]() |
Příklad: Vstupní a výstupní hrany |
Akce nebude spuštěna, dokud:
- Nebudou splněny všechny podmínky pro spuštění (pre-conditions).
- Nepřiputuje token ze všech vstupních hran.
- Všechny vstupní piny mají token nesoucí objekt.
Token putuje z akce do další, pokud:
- Token je dostupný na všech výstupních hranách.
- Objekt je dostupný na všech výstupních pinech.
- Cílová akce je připravena token přijmout.
- Pravidla umožní hraně token přijmout.
Notace
Použití notace akce je nepovinné. Namísto ní lze použít textový zápis.
Akce je zobrazována jako obdélník se zakulacenými rohy.
Piny (třídy Pin, InputPin a OutputPin)
Následující diagram je v balíku Actions::BasicActions:
![]() |
Basic pins |
Pin je typový a násobný element, který poskytuje vstupní hodnoty (objekty) akci a volanému výsledek akce. Piny akcí jsou setříděné. Pin je mj. potomek ObjectNode (viz diagram Nodes).
Pin je vždy vlastněn akcí. Pin je abstraktní třída. Její specializací jsou InputPin, OutputPin a ValuePin. Akce může mít libovolné množství pinů.
Akce nemůže býti spuštěna, pokud vstupní pin (třída InputPin) nemá alespoň tolik hodnot, kolik nařizuje dolní hranice násobnosti pinu. Horní hranice násobnosti pinu určuje maximální počet hodnot, které dokáže akce zpracovat.
Akce nemůže býti dokončena, pokud výstupní pin (třída OutputPin) má méně hodnot než je dolní mezní hranice. Akce nemůže vložit do pinu více hodnot, než je horní hranice násobnosti pinu.
Notace
Pin je zobrazen jako obdélník (dle standardu, ovšem většinou se zobrazuje jako čtverec), který je připojen k akci. Jméno objektu a jeho stav je uveden poblíž pinu. Název pinu není nijak omezen, ale často se zapisuje typ objektu, který do pinu vstupuje.
![]() |
Příklad: Piny |
Typ objektu a jeho stav nemusí být identický v odchozím (výstupním) a příchozím (vstupním) pinu. Na druhou stranu by bylo vhodné, aby existovala převoditelnost. Je to vidět na příkladu parametrů aktivity, kdy z akce Založ Osobní účet vychází objekt Osobní účet, ale ve výstupního parametru aktivity je již pouze Účet. Z toho můžeme vyvodit (ne nutně správný závěr), že Osobní účet je specializací Účtu.
U pinu lze uvádět kromě názvu objektu i jeho typ a/nebo stav.
![]() |
Příklad: Notace pinu |
InputPin nemusí mít příchozí hranu, stejně tak z odchozího nemusí žádná hrana vést. To nastává v případech, kdy je vstupní parametr nepovinný resp. s výstupním nehodláte nijak dál pracovat. Takové piny mohou obsahovat v sobě šipku. Vstupní pin ji má směrem do akce, výstupní směrem od akce.
![]() |
Příklad: Vstupní a výstupní piny bez hran |
Specializací vstupního pinu je třída ValuePin. V notaci se přidává specifikaci hodnoty (třída ValueSpecification) vedle pinu. Specifikace hodnoty popisuje nějakou hodnotu v modelu, typicky konstantu.
![]() |
Příklad: ValuePin |
To, jak se chovají piny k tokenům, je uvedeno v další kapitole.
Žádné komentáře:
Okomentovat