UPOZORNĚNÍ

Zkoušky OCUP Fundamental a OCUP Intermediate již není možné absolvovat. Nově jsou k dispozici OCUP 2 Foundation a OCUP 2 Intermediate. Texty uvedené na těchto neodpovídají plně novým zkouškám. Aktuální text najdete na nových stránkách.

Testy znalostí UML

Chcete si kdykoliv před, při nebo po čtení těchto stránek udělat test znalostí UML? Máte možnost absolvovat takový, který připravil autor těchto stránek. Vše podstatné najdete na http://www.kurzy-uml.cz.

Kombinované fragmenty (Combined Fragments)

Metamodel: Combined Fragments

Třída InteractionFragment

Základní abstraktní třídou je InteractionFragment, která představuje kus interakce (jak již víte z předchozí úrovně certifikace, interakce je definována dvěma množinami – platné a neplatné sekvence přijímaných a vysílaných událostí). Tímto kusem je opět dvojice množin, ve kterých je část interakcí. Notaci si definují až jednotlivé specializace.

Díky asociace s třídou InteractionOperand je možné vnořovat fragmenty do sebe. Fragment taktéž ví o tom, do kterých čar života zasahuje a které interakce je součástí.

Třída InteractionConstraint

Omezení interakce (třída InteractionConstraint) je logický výraz, který uvozuje operand v kombinovaném fragmentu (o obou třídách si povíme vzápětí). Omezení interakce navíc volitelně přidává dva výrazy udávající minimální (minint) a maximální (maxint) počet průchodu v cyklu (opět, za chvíli bude vysvětleno). Musí platit, že 0 ≤ minint ≤ maxint.

Omezení interakce se zobrazuje v hranatých závorkách u čáry života, ve které se objeví první výskyt události v rámci operandu. Toto omezení je pak uvedeno nad tímto výskytem. Logickým výrazem může být i slovo else, které uvádí platný operand pro ostatní případy v rámci fragmentu.

Třída InteractionOperand

Třída InteractionOperand je součástí kombinovaného fragmentu interakce (třída CombinedFragment, viz hned další třída). Operand představuje jeden operand výrazu daného kombinovaným fragmentem.

Operand může být uvozen podmínkou (třída InteractionConstraint), která říká, že sekvence daná operandem bude provedena pouze tehdy, je-li tato podmínka splněna. Pokud není podmínka uvedena, je to považováno, jako by splněna byla.

Sémantika je dána fragmentem, ve kterém se nachází.

Jednotlivé operandy se od sebe oddělují přerušovanou čarou a společně pak tvoří daný fragment, který je vlastní.

Na následujícím obrázku vidíme jeden kombinovaný fragment typu alt zahrnující čáry života A, B a C. Uvedený fragment má dva operandy, každý z nich pak jednu podmínku. Oba operandy jsou od sebe odděleny přerušovanou čarou.

Příklad notace fragmentů a operandů

Třída CombinedFragment

Kombinovaný fragment (třída CombinedFragment) představuje seřazenou množinu operandů, které následně tvoří fragmenty sekvence interakce. Sémantika třídy závisí na hodnotě atributu interactionOperator (operátor). Na základě této hodnoty platí následující pravidla:
  • Pokud je operátor opt, loop, break, assert nebo neg, pak fragment musí mít právě jeden operand.
  • Pokud má podmínka dané hodnoty minint a maxint, pak se tyto uplatní pouze v případě, že operátor bude mít hodnotu loop.
  • Operátory consider a ignore mohou být použity pouze třídou ConsiderIgnoreFragment (bude uvedeno dále).

Možnosti (interactionOperator = alt)

Daný kombinovaný fragment umožňuje vybrat (nanejvýš) jeden z nabízených operandů. Ten je vybírán na základě podmínky, která je vyhodnocena jako platná. Může se použít i else pro negaci disjunkce všech ostatních podmínek daných operandy v kombinovaném fragmentu.

Pokud není splněna žádná podmínka, nic se neděje. Příklad byl uveden u popisu třídy InteractionOperand.

Volba (interactionOperator = opt)

Tento kombinovaný fragment s právě jedním operandem je spuštěn, je-li splněna podmínka. V opačném případě je vynechán.

Příklad volby (interactionOperator = opt)

Paralelismus (interactionOperator = par)

Kombinovaný fragment paralelismu rozděluje výměnu zpráv do jednotlivých operandů, přičemž výměna zpráv v operandech probíhá nezávisle na ostatních operandech.

Příklad paralelismu (interactionOperator = par)

Jestliže pořadí výskytu událostí není v paralelním fragmentu důležitý, lze notaci zjednodušit pomocí tzv. koregionů:

Příklad paralelismu - coregion

Slabá sekvence (interactionOperator = seq)

Slabá sekvence (weak sequencing) klade na pořadí výskytu událostí několik omezení:
  • Pořadí jednotlivých operandů musí být zachováno.
  • Události na různých čárách života v různých operandech mohou nastat v libovolném pořadí.
  • K události na stejné čáře života v různých operandech dochází postupně.

Na následujícím příkladě zápis do databáze může probíhat současně se zápisem do souboru v druhém operandu. V třetím operandu se musí počkat na druhý.

¨Příklad slabé sekvence (interactionOperator = seq)

Všimněte si, že pokud se operandy starají o různé čáry života, pak jde vlastně o klasický paralelismus popsaný výše. V případě, že operandy pracují se stejnými čarami života, pak se jedná o přísnou sekvenci (strict), viz dále.

Přísná sekvence (interactionOperator = strict)

K výskytům událostí dochází podle daného pořadí operandů v daném fragmentu, nedochází tedy k paralelismu. Na příkladu níže se nejprve zapíší data do databáze, pak v druhém segmentu do souboru a nakonec v třetím segmentu opět do souboru.

Příklad přísné sekvence (interactionOperator = strict)

Neplatná sekvence (interactionOperator = neg)

Neplatná sekvence se používá k zobrazení části sekvence, která není povolena. Jsou to místa, kde dochází k selhání systému. Všechny ostatní fragmenty, které si zde představujeme, jsou považovány za správné.

Příklad neplatné sekvence (interactionOperator = neg)

Kritická sekce (interactionOperator = critical)

Sekvence uzavřená ve fragmentu typu critical nesmí být přerušena jakýmkoliv jiným výskytem událostí na čárách života, které jsou fragmentem zahrnuty. Na celou část sekvence v tomto fragmentu je nahlíženo jako na atomickou operaci.

Následují dva příklady. Jeden ukazuje profláknutý příklad bankovní transakce, která převádí peníze z jednoho účtu na druhý. Další příklad demonstruje operace nad seznamem, které běží paralelně. Přesto není možné v době přidání prvku do seznamu nějaký modifikovat. Modifikace musí počkat na dokončení právě probíhající konkurenční operace.

Příklad kritické sekce (interactionOperator = critical)

Příklad kritické sekce (interactionOperator = critical)

Cyklus (interactionOperator = loop)

Sekvence v kombinovaném fragmentu typu loop je opakovaně prováděna dle zadaného počtu. Omezení interakce (guard) může obsahovat jak logickou podmínku, tak i horní a dolní hranici. Dolní hranice (minint) určuje minimální počet opakování, horní hranice (maxint) maximální počet opakování. Pokud je zadána případná logická podmínka, pak bez ohledu na definovaný počet opakování se pokračuje pouze tehdy, je-li tato podmínka splněna.

Pokud je zadáno pouze minimum, pak maximum je rovno tomuto minimu. Pokud nejsou zadány dolní ani horní hranice, pak dolní je rovna 0 a horní je nekonečno (tzv. nekonečný cyklus v případě, že není definováno ani omezení).

Pokud jsou hranice definovány, pak se zadávají do kulatých závorek za slovo loop (viz příklady dále). V závorkách se pak vypíše minimum a za čárku případné maximum.

Příklad cyklu (interactionOperator = loop)

Příklad cyklu (interactionOperator = loop)

Příklad cyklu (interactionOperator = loop)
Přerušení (interactionOperator = break)

Sekvence daná kombinovaným fragmentem break je při splnění omezení (guard) vykonávána namísto té, která je ve fragmentu (InteractionFragment), který v sobě tuto sekvenci obsahuje. Zbytek sekvence je pak v tomto zahrnujícím fragmentu ignorován.

Pozor na to, že pokud podmínka není uvedena, pak není standardem řečeno, co se vykoná, zda fragment typu break nebo to, co je mimo něj.

Fragment typu break by měl zahrnovat všechny životní čáry nadřazeného fragmentu.

Tento typ fragmentu bývá používán často v cyklech.

Příklad přerušení (interactionOperator = break)

Aserce (interactionOperator = assert)

Kombinovaný fragment s asercí obsahuje pouze správné možné pokračování sekvence. Všechny ostatní jsou neplatné. Tento fragment je často používán ve spojení s třídou ConsiderIgnoreFragment (viz další kapitola).

Poznámka mimo zkoušku

Aserci jako takovou bych použil až opravdu na velmi nízké úrovni úrovně dodávky řešení (řekněme jako návrh nějaké kritické funkce) a to společně s použitím s třídou StateInvariant (tu byste měli znát z předchozí úrovně znalostí UML). Ukažme si jednoduchý příklad. Řekněme, že budeme z databáze požadovat nějakou neprázdnou množinu dat měn. Ze zadání víme, že tam vždy bude alespoň jedna měna zavedena. Protože dosud jsme na začátku vývoje a nemáme jistotu, že si někdo s databází nehrál, můžeme aserci použít např. následným způsobem:

Příklad aserce  (interactionOperator = assert)

Asi nemá cenu říkat, že ve výsledku místo aserce máme mít toto ošetřeno uživatelsky, tedy např. chybovou zprávou oznamující uživateli, že má pro dnešek smůlu a může jít ven.

Třída ConsiderIgnoreFragment

Specializace kombinovaného fragmentu ConsiderIgnoreFragment slouží pro zvážení a ignorování části interakce. Pro svou činnost navíc vyžaduje seznam zpráv, se kterými pracuje.

V případě, že interactionOperator = ignore, platí, že uvedený seznam zpráv není ve fragmentu zobrazen, a tedy ani obsloužen, ačkoliv jsou tyto zprávy vysílány/přijímány.

Pokud interactionOperator = consider, pak se naopak pracuje pouze s uvedenými zprávami a ostatní jsou ignorovány.

Notace je stejná jako v případě kombinovaného fragmentu s tím, že se přidává klíčové slovo ignore resp. consider a do složených závorek se uvádí seznam zpráv oddělených čárkou.

Tohle celé je možné používat pro testové scénáře. Ukažme si příklad.

Příklad třídy ConsiderIgnoreFragment

Fragment ignore říká, že bude ignorovat všechny zprávy pojmenované tvrdými souhláskami. V něm je pak uveden fragment typu consider, které bude brát v potaz pouze obojetné souhlásky. V něm je dále fragment typu assert, který říká, že po zprávě m musí dorazit zpráva p a poté se vyhodnotí state invariant na čáře života B. Pokud nebude tento invariant splněn, půjde o špatnou sekvence.

Třída Continuation

Třída Continuation (pokračování) je určena pro použití s kombinovaným fragmentem typu alt (možnost) a seq (slabá sekvence). Pokud některý operand takového fragmentu končí pokračováním (setting = True), pak sekvence pokračuje pouze v takovém operandu (jiného fragmentu), který stejně nazvaným pokračováním téže čáry života začíná (setting = False).

Pokračování smí zahrnovat více čar života. Pokračování téhož jména však smí zahrnout pouze tutéž množinu čar života. Pokračování se zobrazuje stejně jako state invariant a umisťuje se jako úplně první nebo úplně poslední bod operandu.

Na příkladu se zkoušející nejprve na něco optá a očekává nějakou reakci od studenta. Z něj nakonec něco vypadne a zkoušející na to reaguje.



Na následujícím obrázku dle odpovědi studenta buďto odpověď vyhodnotíme a oznámkujeme nebo studenta vyrazíme od zkoušky. Použijeme přitom referenci na Otázku, ale tím se zatím netrapte, budeme se tomu záhy věnovat.


Celý diagram se nechá také zapsat bez použití pokračování. Oba zápisy označují totéž.

Žádné komentáře:

Okomentovat

Líbila se vám právě přečtená kapitola?

Líbil se vám článek? Přinesl vám užitek? Pokud ano, můžete mi zaslat pár drobných, čímž jednak dáte najevo, že se vám tu opravdu líbilo, a jednak mi ukážete, že má práce není zbytečná. Informace o darovací platbě zde.