přidání výběrového segmentu
často ve státních strojích musíte provést přechod stavu pouze tehdy, když konkrétní podmínka (nazývaná guard podmínka) vyhodnotí hodnotu TRUE za běhu. Také poměrně často musíte přejít do různých stavů, v závislosti na výsledku některých podmínek stráže hodnocených za běhu.
UML poskytuje speciální konstrukci nazvanou “choice pseudostate”, kterou můžete použít v takových situacích. “Choice pseudostate” umožňuje rozdělit přechod na více odchozích cest, z nichž každá má svůj vlastní ochranný stav.
Všimněte si, že je užitečné uvažovat o volbě pseudostátu, jako je ten, který je uveden v panelu (B) výše uvedeného diagramu, jako prohlášení o sloučeniněif (guard1()) {...} else if (guard2()) {...}
(to je ve skutečnosti způsob, jakým generátor kódu QM™ implementuje výběrové segmenty). Pozor, protože stráže vedou v kódu kIF
s aELSE
s, jejich nadměrné používání vede k kódu “špagety” a v první řadě porušuje účel používání státních strojů. Z tohoto důvodu by stráže měly být používány uvážlivě.
ve většině nástrojů UML proces kreslení výběrových segmentů spočívá v prvním přidání “choice pseudostate” (diamantu) a následném připojení odchozího přechodového segmentu pomocí stráže. V QM™ je tento proces zjednodušen, protože sada nástrojů State Machine obsahuje nástroj pro výběr segmentu připravený k použití, který kombinuje “pseudostát volby” s přechodovým segmentem, který je k němu trvale připojen.
Poznámka volba segmentu je jediný způsob, jak v QM™ připojit ochranný stav k přechodu, jak je znázorněno na panelu (a) výše uvedeného diagramu. Segment QM™ Choice je však výkonnější než jednoduché stráže na přechodech, jak je vysvětleno v následujících částech. Poznámka: Chcete-li přidat segment výběru, musíte nejprve vytvořit a zobrazit stavový diagram. Kromě toho musí mít stavový stroj alespoň jeden vnitřní přechod (zakončený) nebo výběrový segment (). Chcete-li přidat, přesunout, změnit velikost nebo upravit segmenty výběru, musí být diagram státního stroje odemčen ().
ujistěte se, že je podokno stavového stroje aktivní. V panelu nástrojů stavový stroj klikněte na nástroj Výběr segmentu a uvolněte tlačítko myši (netahejte nástroj z panelu nástrojů). V tomto okamžiku, když umístíte kurzor myši na aktivní stavový diagram, se ukazatel myši změní na nástroj choice-segment s ikonou” zakázáno ” (), protože segment výběru Lze přidat pouze na nepřipojený čtvercový konec přechodu () nebo na existující segment výběru (). Když umístíte kurzor myši nad povolený bod připojení pro segment výběru, změní se ukazatel myši na nástroj segment výběru pomocí kotvy (). Chcete-li k tomuto bodu připojení přidat segment výběru, stiskněte tlačítko myši a přetáhněte konec segmentu výběru na požadovaný okraj cílového stavu. Takto vytvořená přechodová cesta bude odpovídat pravidelnému přechodu ze státu na stát se strážcem.
můžete také přidat segment výběru, který se stane interním přechodem se strážcem. Chcete-li to provést, jednoduše přetáhněte konec segmentu výběru a nehodte jej na žádný státní okraj. V tomto okamžiku se segment výběru stane interním přechodem. Vnitřní přechod se provádí výhradně ve zdrojovém stavu a nikdy nevede ke změně stavu.
poznámka: Standardní “normativní” UML notace neumožňuje přidat interní přechodové segmenty do výběru pseudostates. Naproti tomu nenormativní reprezentace Interních přechodů v QM™ umožňuje snadno přidávat interní přechodové segmenty do vybraných pseudostatů a rychle a intuitivně měnit typ přechodu připojením/odpojením přechodového konce do/ze stavu.
nakonec můžete také přidat segment výběru na nepřipojený konec jiného segmentu výběru, jak je znázorněno v animaci níže:
Poznámka Tato možnost přidání výběrových segmentů do již existujících výběrových segmentů znamená, že můžete vytvářet složité vnořené stráže. Stejně jako u všech podmínek ochrany byste však měli tuto funkci používat uvážlivě, abyste se vyhnuli kódu “špaget”.
položka segmentu výběru může být konfigurována podle listu vlastností specifického pro výběr.
selection Segment property sheet obsahuje následující vlastnosti:
- Choice Guard
- Choice Target (neupravitelné–určeno geometricky)
- Choice Action
Choice Guard
každý segment volby v QM™ musí mít explicitní vlastnost guard, která se skládá ze dvou položek: pseudokódu a kódu. Pro generování kódu je relevantní pouze zadání kódu vlastnosti guard. Položka pseudokódu je navržena pouze pro zobrazení v diagramu, aby se zabránilo nepořádku minimalizací množství textu, který se má zobrazit vedle tvaru přechodu.
pozor položka pseudokódu vlastnosti guard je určena pouze pro zobrazení v textovém poli přidruženém k segmentu výběru, ale nemá žádné důsledky pro generování kódu. Poznámka vlastnost guard je zobrazena v textovém poli segmentu výběru podle stejných pravidel jako textové pole přechodu. Navíc, aby se snížil nepořádek v diagramu, je ochranný kryt zobrazen ve zkrácené podobě, kde jsou odstraněny všechny mezery v ochranném krytu a výsledný ochranný text je zkrácen na 32 znaků. (Když je stráž zkrácena, poslední znak je’~’).
pro úspěšné generování kódu musí být zadání kódu vlastnosti guard právním booleovským výrazem C nebo C++. Výraz může používat atributy stavového stroje (pomocí ukazatele me) a parametry události spouštěcí události (viz část níže).
přístup ke spouštěcí události: Výraz stráž může přistupovat k původní spouštěcí události (přechodu, ke kterému je volba připojena přímo nebo nepřímo), která je poskytována jako ukazatel e typu (QEvt const * const)
. To znamená, že máte přístup pouze pro čtení k události a nemůžete změnit ukazatel e
. Pro přístup k parametrům události původní spouštěcí události, obvykle musíte snížit ukazatel události e. Tento pokles je vždy založen na spouštěči přechodu (signál spouštěcí události, viz přechodový spouštěč), což znamená, že musíte vždy znát typ události (třída událostí) spojený se spouštěčem.
volba cíl
Cílová vlastnost není upravitelná přímo, ale spíše je určena geometricky koncovým bodem výběrového segmentu. Pro přechody mezi státy je vlastnost target uvedena v cílovém stavu, ve kterém končí koncový bod (). Pro vnitřní přechody se čtvercovým koncovým bodem () ukazuje Cílová vlastnost internal
.
volba akce
segment volby může mít volitelnou vlastnost akce, která se provádí pouze tehdy, když stráž vyhodnotí hodnotu TRUE za běhu (viz také vyhodnocení pořadí akce).
vlastnost akce se skládá ze dvou položek: pseudokódu a kódu (viz List vlastností volby). Pro generování kódu je relevantní pouze kódová část vlastnosti akce. Pole pseudokódu je navrženo pouze pro zobrazení v diagramu, aby se zabránilo nepořádku minimalizací množství textu, který se má zobrazit vedle tvaru přechodu.
Poznámka položka pseudokódu vlastnosti akce je určena pouze pro zobrazení v diagramu a nemá žádné důsledky pro generování kódu.
ukazatel na spouštěcí událost: kód akce výběru často potřebuje přístup ke spouštěcí události, která je poskytována jako ukazatel e typu (QEvt const * const)
. To znamená, že máte přístup pouze pro čtení k události a nemůžete změnit ukazatel e
. Pro přístup k parametrům události spouštěcí události, obvykle musíte snížit ukazatel události e. Tento pokles je vždy založen na spouštěči přechodu (signál spouštěcí události, viz přechodový spouštěč), což znamená, že musíte vždy znát typ události (třída událostí) spojený se spouštěčem.
výběrové textové pole
jakmile je položka výběrového segmentu vybrána jako aktuální položka, můžete vidět hranici textového pole přidruženého k výběrovému segmentu. Textové pole umožňuje přesunout a změnit velikost vybraného textu přetažením nebo přetažením rukojeti textového pole podle stejného algoritmu jako textové pole přechodu.
else Guard
vlastnost guard může být definována jako speciální klíčové slovo else. Takový jiný stráž doplňuje jakékoli jiné podmínky ochrany připojené ke stejné volbě pseudostate. Else guard může být zadán buď v položce kódu nebo v položce pseudokódu vlastnosti guard. Je zřejmé, že” else ” stráž má smysl pouze pro výběr pseudostate s více odchozích výběrových segmentů.
Poznámka: během generování kódu bude else guard vždy generován jako poslední ve skupině všech stráží spojených se stejným pseudostátem volby, bez ohledu na jeho pořadí v Průzkumníku modelu.
výběrové segmenty bez else
podle specifikace UML musí být událost, která nemůže být zpracována kvůli tomu, že všichni strážci hodnotí jako nepravdivá, považována za nezpracovanou, což znamená, že musí být rozšířena do superstátu(států). Tento požadavek má důsledky pro výběr pseudostatů bez explicitního segmentu else. Konkrétně, aby vyhověl sémantice UML, generátor kódu QM™ vygeneruje v takových případech implicitní větev else
, která způsobí šíření události do superstátů.
Všimněte si, že existuje rozdíl mezi pseudostátem volby s prázdným segmentem else a jinak identickým pseudostátem volby bez segmentu else. Explicitní prázdné else způsobí, že událost bude spotřebována (aniž by něco udělala), zatímco absence segmentu else způsobí, že se událost rozšíří do superstátu(superstátů).
pořadí hodnocení stráží
SPECIFIKACE UML vyžaduje, aby se podmínky stráží připojené ke stejnému pseudostátu výběru vzájemně doplňovaly, takže na pořadí hodnocení stráží nezáleží. Při zachování komplementárních stráží se v QM™ stále doporučuje, nástroj vyhodnocuje stráže vždy v předem stanoveném pořadí, na které se můžete spolehnout.
pořadí hodnocení stráže je určeno pořadím položek segmentu výběru v Průzkumníku modelu. Toto pořadí lze změnit pomocí tlačítek nahoru a dolů na panelu nástrojů Průzkumníka. Alternativně lze aktuální položku Přesunout nahoru nebo dolů v Průzkumníku modelů pomocí klávesových zkratek: Ctrl – (key-up) a Ctrl – (key-down).
Poznámka V případě překrývajících se stráží, pokud záleží na pořadí hodnocení stráží, důrazně doporučujeme uspořádat vybrané segmenty graficky v diagramu ve stejném pořadí jako v Průzkumníku modelů, jak je znázorněno na obrazovce výše. Vygenerovaný kód pak bude následovat stejné pořadí, jak je znázorněno napravo od výše uvedeného diagramu.
vyhodnocení pořadí akce
libovolné segmenty výběru připojené k přechodu přidávají akce segmentu výběru k akci provedené přechodem. Pořadí hodnocení všech těchto akcí je intuitivní a začíná vždy přechodovou akcí provedenou bezpodmínečně, následovanou podmíněným hodnocením akcí vybraných segmentů.
například pořadí hodnocení akce ve výše uvedeném diagramu je shrnuto následujícím pseudokódem:
vnořené výběrové segmenty
jak je popsáno výše, výběrové segmenty mohou hnízdit. To vám umožní vytvářet složité podmíněné přechodové cesty, ale jako vždy u stráží by tato funkce neměla být nadužívána.
jednou z častých chyb je například použití hluboce vnořených výběrových segmentů k výběru z řady možných přechodových cest (viz panel (a) na obrázku níže):
lepší a mnohem jednodušší alternativou je použití segmentů s více možnostmi výběru připojených ke stejnému pseudostátu volby, jak je znázorněno na panelu (B)ve výše uvedeném diagramu.
Poznámka Nezapomeňte, že k danému přechodu můžete připojit mnoho výběrových segmentů. Diagram s menším počtem volitelných pseudostatů (diamantů) je lepší, srozumitelnější diagram. Pozor generátor kódu QM™ omezuje počet úrovní vnoření v kódu na 16 (včetně vnoření uvnitř funkcí obsluhy stavu). Použití hluboce vnořených výběrových segmentů může tento limit snadno překročit.
směrování výběrových segmentů
přechod s více výběrovými segmenty, některé z nich potenciálně vnořené, seskupuje mnoho prvků v malém prostoru diagramu. Chcete-li graficky uspořádat tak složitou “kouli konektorů”, musíte si být vědomi základních pravidel, která platí v této situaci.
prvním pravidlem je, že než budete moci změnit tvar libovolného prvku, musíte jej nejprve vybrat.
Chcete-li například přesunout volbu-pseuodstate (diamant ), musíte kliknout na původní příchozí přechod na volbu-pseudostate. Vezměte prosím na vědomí, že byste zcela konkrétně neměli klikat na samotný tvar diamantu, protože je to vlastně překrývající se sbírka příchozího konce tranze plus všech odchozích segmentů choce, takže je nejednoznačné, jaký tvar vlastně máte na mysli. Místo toho byste měli kliknout na jeden z přechodových segmentů nebo na začátek-konec transitonu. (Poznámka: Můžete také jednoznačně vybrat libovolnou položku modelu v zobrazení Průzkumníka modelu). Následující animace ilustruje proces:
na druhou stranu, pokud vyberete segment odchozí volby, nemůžete přesunout pseudostate volby. Místo toho můžete nyní přesunout pouze vybraný segment výběru a znovu jej připojit někam jinam.
Leave a Reply