Přeskočit obsah
    Axiom AAF: Neztratit během vývoje hodnotu užitku systému očekávanou zákazníkem.

Vlak má svoje vagóny

Motiv

Evidujeme jízdy vlaků. Řekneme „vlak má vagóny" a chceme to rovnou modelovat jako vlastnictví — vlak drží svoje vagóny. Jenže vagón je evidovaný kus z parku: sdílený, vedený samostatně, dnes v jednom vlaku, zítra v jiném. Nemůže být nedílnou částí jediného vlaku, takže holá kompozice je špatně. Oprava je v jednom slově: „vlak má svoje vagóny". Tím vzniká nová entita — Vagón vlaku, zařazení konkrétního evidovaného vagónu do tohoto vlaku. Vlak vlastní seznam těchto zařazení (Kompozice ku N) a každé z nich odkazuje na jeden evidovaný vagón z parku (Odkaz do seznamu).

Evidujeme platby. Platba prochází stavy (čekající, zaplacená, stornovaná); možné stavy jsou vedené v samostatném číselníku. „Stav této platby v daný okamžik" není totéž co „položka číselníku stavů" — je to záznam, že platba nabyla daného stavu, s časem. Platba drží seznam těchto záznamů (Kompozice ku N), z nichž každý odkazuje na položku číselníku (Odkaz do seznamu) — svou historii stavů.

V obou případech svádí naivní formulace k holému vlastnictví, ale správné řešení vloží mezi celek a sdílenou položku reifikovanou vazbu: samostatný pojem (Vagón vlaku, Stav platby), který vzniká teprve poskládáním a v zadání často schází, protože splývá se sdílenou položkou. Celek vlastní seznam těchto vazeb (Kompozice ku N) a každá odkazuje na položku ze samostatného sdíleného seznamu (Odkaz do seznamu). Tento složený vzor je Vlak má svoje vagóny.

Zkratka

má svoje … → Vlak má svoje vagóny; Platba má svoje stavy. Celek drží seznam vlastních vazeb, z nichž každá ukazuje na položku ze sdíleného seznamu. Signál: scházející prostřední pojem„… v tomto celku" je něco jiného než „evidovaná položka".

Popis

Vzor Vlak má svoje vagóny je složený vzor — vzniká skladbou dvou jednodušších vzorů CLM Lite: Kompozice ku N a Odkaz do seznamu (viz kapitoly). Spojuje je společný prvek: celek vlastní seznam svých částí (Kompozice ku N) a každá taková část zároveň odkazuje na položku sdíleného seznamu (Odkaz do seznamu). Tentýž prvek modelu vystupuje v obou vzorech — jako vlastněná část i jako držitel odkazu. Důležité je, že tento odkaz spolu s kompozicí reprezentuje vazbu — není to prosté Property (vlastnost); přes prvek Vagón vlaku vzniká analytický vztah.

Společný prvek je tedy reifikovaná vazba (přiřazení). Chová se jako spojka mezi celkem a sdílenou položkou a nese, co o tom přiřazení potřebujeme evidovat — pořadí, čas, platnost. Je to scházející pojem: v zadání bývá zaměňován se sdílenou položkou, ač je to jiná entita („Vagón vlaku" × „evidovaný vagón", „Stav platby" × „položka číselníku stavů").

Vzor je asymetrický: vazbu vlastní jedna strana — celek. „Vlak má svoje vagóny" dává smysl, „vagón má svoje vlaky" ne (sdílená položka o svých vlastnících nic neví). Tím se vzor liší od Asociační třídy (viz dále), která je symetrická a vazbu nevlastní ani jedna strana. Vlastnictví drží ta strana, která smí na vazbě záviset; sdílená, centrálně užívaná položka zůstává nezávislá. Rozdíl nejlépe ukáže kontrast: Sňatek mezi mužem a ženou (asociační třída, symetrický) versus Vlak má svoje vagóny (asymetrický).

Strukturovaný popis

Vzor spojuje tři Class dvěma asociacemi.

Mezi celkem X a vazbou XY je asociace Kompozice ku N: konec u X nese agregační druh composite, konec u XY má otevřenou horní hranici multiplicity (celek drží seznam). Mezi vazbou XY a položkou Y je asociace Odkaz do seznamu: směřuje k Y, multiplicita konce u Y je 1 nebo 0..1.

Klíč je ztotožnění: XY je týž prvek, který v Kompozici ku N vystupuje jako vlastněná část a v Odkazu do seznamu jako zdroj odkazu. Vzor XY zavádí (je to nový reifikovaný pojem); X i Y jsou existující třídy modelu.

V instanční rovině drží instance X seznam instancí XY; každá instance XY patří právě jedné instanci X (není sdílená) a odkazuje na jednu instanci Y. Tatáž instance Y může být sdílena mnoha instancemi XY napříč různými X.

Kanonický příklad: Vlak (X) ◆— Vagón vlaku (XY) → Vagón (Y). Vlak vlastní seznam vagónů vlaku (kompozice ku N), každý odkazuje na jeden evidovaný vagón z parku (odkaz do seznamu).

Účastníci

  • X (celek) — typ Class, multiplicita dosazení 1. Vlastník seznamu vazeb.
  • XY (vazba) — typ Class, multiplicita dosazení 1. Reifikované přiřazení, které vzor zavádí; vlastněná část celku a zároveň držitel odkazu.
  • Y (položka) — typ Class, multiplicita dosazení 1. Sdílená položka samostatného seznamu, na kterou XY odkazuje.
  • kompozice — typ Asociace, multiplicita dosazení 0. Asociace Kompozice ku N mezi X a XY (konec u X composite, otevřená multiplicita u XY).
  • odkaz — typ Asociace, multiplicita dosazení 0. Asociace Odkaz do seznamu mezi XY a Y (směr k Y, multiplicita u Y 1 / 0..1).

Nejčastější chyby

Záměna za holou Kompozici ku N. Pokud vlastněná část nikam neodkazuje (existuje jen uvnitř celku), je to prostá Kompozice ku N, ne složenina. Vzor dělá až odkaz XY → Y na sdílenou položku.

Záměna za holý Odkaz do seznamu. Pokud prostřední prvek není vlastněný celkem (je sdílený, žije samostatně), chybí kompoziční složka — je to prostý Odkaz do seznamu.

Záměna za Sdílenou agregaci. Láká modelovat sdílenou položku Y jako volnou část celku — Sdílená agregace sdílení i přežití celku dovoluje, takže argument o životním cyklu ji sám nevyloučí. Vyloučí ji to, že Y (evidovaný vagón) není částí celku — je to nezávislá entita, na kterou celek jen odkazuje — a že vzor potřebuje reifikovat samotné zařazení (XY). Správně je proto Kompozice ku N na vlastněnou vazbu XY plus Odkaz do seznamu na Y, ne agregace Y do celku.

Záměna za Asociační třídu. Asociační třída je symetrická — vazbu nevlastní ani jedna strana, propojuje dvojici přes třetí entitu stojící vedle. Vlak má svoje vagóny je asymetrický: vazbu vlastní celek. Rozliší se testem vlastnických vět — vytvoří se obě věty „A má svoje vazby s B" a „B má svoje vazby s A"; je-li přijatelná jen jedna, jde o tento vzor (vlastník = přijatelná strana), jsou-li jako vlastnictví nepřijatelné obě, jde o Asociační třídu.

Splynutí scházejícího pojmu s položkou seznamu. Reifikovaná vazba XY („Vagón vlaku", „Stav platby") je jiný pojem než sdílená položka Y („evidovaný vagón", „položka číselníku"). Jejich ztotožnění zamlží vzor.

Vtažení nesouvisejícího odkazu. Do složeniny patří jen odkaz, který vychází z vlastněné vazby XY. Jiné odkazy celku (například odkaz celku přímo na samostatný číselník) do tohoto vzoru nepatří.

Vazby

Vzor Vlak má svoje vagóny je složeninou dvou vzorů CLM Lite — Kompozice ku N a Odkaz do seznamu (viz kapitoly) — spojených ztotožněním prostředního prvku. Je to první vzor skupiny Složené vzory.

Asymetrická alternativa k Asociační třídě (viz kapitola Asociační třída): tytéž tři entity lze někdy vyjádřit i asociační třídou, ale je-li vztah jednostranně vlastněný, je Vlak má svoje vagóny přesnější. Rozlišení drží test vlastnických vět (viz Nejčastější chyby).

Souvislost s modularitou: směr vlastnictví vazby je týž princip jako rozvrstvení a střih modulů podle směru závislosti (vzor Modulární nůžky) — tentýž princip ve velkém (viz dále, zatím nezpracováno).

Externí kotva: kniha Analytické modelování v praxi, kapitola 3.3, vzor Vlak má svoje vagóny.

Verze a změny

  • 1.0 — Zavedení kapitoly.