Jak funguje element „deep history“ v UML autor RNDr. Ilja Kraval, http://www.objects.cz březen 2007 firma Object Consulting s.r.o.
Úvod Již několikrát jsem v internetových diskusích a při školeních narazil na otázku, co je typ prvku „deep history“ v UML? Tento článek se zabývá vysvětlením tohoto elementu.
Typ prvku History obecně Typ prvku History se používá ve stavových diagramech, kde se vyskytuje tzv. skládání stavů do vyšších stavů a kdy opouštíme přechodem stav vyšší z hranice tohoto stavu, tj. například takto:
© Ilja Kraval, 2007, http://www.objects.cz
STAVOVÝDIAGRAM SEMAFORU
Aktivní
Zelená
Červená
Vypnutí
Neaktivní
obrázek 1 Opuštění stavu z hranice Uvedený diagram stavového stroje semaforu znamená následující: 1. Stav Aktivní u semaforu se skládá ze dvou vnitřních („nižších stavů“), Červená a Zelená, v něm se tyto dva stavy „střídají“, počáteční je stav Červená. 2. Na událost Vypnutí se semafor přepne do stavu Neaktivní nezávisle na tom, v jakém nižším stavu je stav Aktivní, zda je ve stavu Červená nebo Zelená. Mimochodem to znamená, že přepínání mezi stavy Červená a Zelená bude probíhat tak dlouho, dokud se neprovede vypnutí, a proto uvnitř stavu Aktivní není koncový stav. Nyní chceme znázornit tu skutečnost, že se semafor vrátí zapnutím do stavu aktivní. Existují dvě možnosti, co by mohlo nastat a musíme vybrat tu variantu, jak chceme, aby se „naprogramovaný semafor“ choval: Buď se semafor při přechodu do stavu Aktivní začne opět od počátečního stavu („od černého kolečka“), v tom případě namalujeme diagram takto:
strana 2
© Ilja Kraval, 2007, http://www.objects.cz
STAVOVÝDIAGRAM SEMAFORU
Aktivní
Červená
Zelená
Vypnutí
Zapnutí
Neaktivní
obrázek 2 Vést přechod na hranu vyššího stavu znamená začít implicitním stavem, tj. „černým kolečkem" Druhou možnou variantou je, že budeme chtít vyjádřit tu skutečnost, že se semafor vrátí do toho stavu, který při vypnutí opustil, tj. semafor si „pamatuje“ tento stav při opuštění. K tomu slouží element History - ten se chová jako ona paměť, kam se odloží aktuální nižší stav, když se opouští vyšší stav. Vést přechod do elementu History (kolečko s H) znamená následující: Semafor se vrátí do toho nižšího stavu, který byl právě nastaven při opouštění stavu Aktivní (v kolečku H je jakoby „buffer stavu“ ☺):
strana 3
© Ilja Kraval, 2007, http://www.objects.cz
STAVOVÝDIAGRAM SEMAFORU
Aktivní
Zelená
Červená
Vypnutí
Zapnutí
Neaktivní
obrázek 3 Semafor se nevrací automaticky do implicitního stavu, ale do toho stavu, který byl nastaven, když semafor opouštěl stav Aktivní
Co je to shallow a deep history V UML existují dva typy History, „shallow history“ a „deep history“. Jaký je mezi nimi rozdíl? Oba dva prvky znamenají „návrat do stavu, který byl opouštěn a zapamatován“. Rozdíl je v chování stavového automatu vůči ještě nižším stavům, které jsou obsaženy v uvedených nižších stavech, tj. rozdíl se projeví, pokud tyto stavy jsou ještě dále složeny z nižších stavů. Pokud nižší stavy (v našem případě Červená a Zelená) nemají nižší stavy, rozdíl mezi typy prvků shallow a deep history nebude. Zaveďme tedy ještě podstavy, například semafor ve stavu zelená ještě začne před přepnutím na červenou blikat (má ještě nižší stavy Zelená nebliká - bliká).
strana 4
© Ilja Kraval, 2007, http://www.objects.cz
Zelená
bliká
nebliká
obrázek 4 Stav Zelená se skládá ještě ze dvou stavů Nyní existují dvě varianty, jak se může stavový stroj chovat: První: Pokud použijeme shallow history (kolečko s H a bez *), říkáme tím: Semafor se vrátí do toho stavu (Červená, Zelená), který byl opuštěn a tento stav začne od implicitního (tj. při zapnutí do Zelené se začne „nebliká“). Druhá: Pokud použijeme deep history(kolečko s H a *), tak se provede „násobná restaurace stavů“ a to všech podstavů celého stroje:
strana 5
© Ilja Kraval, 2007, http://www.objects.cz
STAVOVÝDIAGRAM SEMAFORU
Aktivní
Zelená nebliká
Červená
bliká
Vypnutí
Neaktivní
obrázek 5 semafor se vrací při zapnutí do stavu, který byl opuštěn a to platí pro všechny podstavy stavů V předešlém modelu se semafor chová tak, že pokud byl vypnut ve stavu zelená a zelená blikala, tak po zapnutí se semafor dostane do stavu zelená a zelená bude blikat. Pokud bychom použili shallow history, tak se semafor bude chovat tak, že pokud byl vypnut ve stavu zelená a zelená blikala, tak po zapnutí se semafor dostane do stavu zelená a zelená nebude blikat (spadne totiž do implicitního stavu). Shallow history znamená restauraci do nižšího stavu, který byl zapamatován, ale ten začíná implicitním stavem. Deep history tedy znamená restauraci stroje do stavů, které byly nastaveny v daném stavu a to do všech úrovní podstavů. Konec článku
strana 6