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:
obrázek 1 Opuštění stavu z hranice Uvedený diagram stavového stroje semaforu znamená následující: 1. Stav u semaforu se skládá ze dvou vnitřních ( nižších stavů ), a, v něm se tyto dva stavy střídají, počáteční je stav. 2. Na událost se semafor přepne do stavu nezávisle na tom, v jakém nižším stavu je stav, zda je ve stavu nebo. Mimochodem to znamená, že přepínání mezi stavy a bude probíhat tak dlouho, dokud se neprovede vypnutí, a proto uvnitř stavu 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 začne opět od počátečního stavu ( od černého kolečka ), v tom případě namalujeme diagram takto: strana 2
Zapnutí 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 (v kolečku H je jakoby buffer stavu ): strana 3
Zapnutí obrázek 3 Semafor se nevrací automaticky do implicitního stavu, ale do toho stavu, který byl nastaven, když semafor opouštěl stav 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ě a ) 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 nebliká - bliká). strana 4
nebliká bliká obrázek 4 Stav 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 (, ), 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
nebliká bliká 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