Předpis a jeho instance¶
Úvod¶
Tato kapitola zavádí druhý ze tří principů modelování: rozdělení na předpis a jeho instance.
Princip existuje proto, aby se táž definice neopakovala u každého výskytu zvlášť. Vlastnosti se popíšou jednou, u předpisu. Každý výskyt pak nese jedinou vazbu, totiž že z toho předpisu vznikl, a vlastnosti z něj přebírá. Je to DRY: jedno místo, kde je vlastnost zavedena, místo opakování prvek od prvku.
Rozdělení platí všude, kde je něco stanoveno předem jako předpis a podle toho pak vznikají konkrétní výskyty tohoto předpisu. Nejznámější je jeho použití na třídy, tedy dvojice třída a instance, jak ji zná objektově orientované programování i běžná analytická praxe. Princip ale platí obecněji a týká se stejně tak prvků typu Use Case, procesů a všeho dalšího, co má svůj předpis.
Předpis a jeho instance¶
Předpis je meta-pravidlo pro budoucí instance. Definuje vlastnosti, které budou mít všechny instance z něj vzniklé. Sám žádné konkrétní hodnoty nenese.
Instance je konkrétní výskyt s konkrétními hodnotami těchto vlastností. Vznikla z předpisu a ten určuje, jaké vlastnosti má.
Oba prostory jsou disjunktní. Nic není zároveň předpisem a instancí ve stejném pohledu; může být obojím, ale vždy vůči něčemu jinému a na jiné úrovni.
Pro strukturu se hodí analogie papírové kartotéky. Každý šuplík má jednu nevyplněnou kartičku-vzor, ze které se kopírováním vytvářejí nové vyplněné kartičky. Kartička-vzor je předpis, vyplněné kartičky jsou instance. Všechny kartičky v jednom šuplíku mají stejný formát, protože vznikly z téhož vzoru; formát se ale šuplík od šuplíku liší.
Pro chování se hodí analogie divadelní hry. Scénář hry je předpis; každé odehrané představení je instance z tohoto předpisu. Představení se od sebe liší obsazením, délkou i publikem, přesto všechna vznikla z jednoho scénáře hry. Předpis tedy neurčuje jen to, jaké má instance vlastnosti, ale i to, jak probíhají.
Platí v řeči i v evidenci¶
Rozdělení na předpis a instanci není vlastností jenom modelu. Platí i tam, kde žádný model není, tedy v běžné řeči o doméně.
Věta v bance na přepážce „běžný účet by měl mít datum založení" mluví o předpisu. Otázka „kde to datum najdu ve své smlouvě?" mluví o instanci. Obě jsou přitom v řeči.
Rovina řeči a rovina evidence je jedna osa, předpis a instance druhá, a jsou na sobě nezávislé. Kombinací vznikají čtyři možnosti:
- předpis v řeči je pojem běžný účet tak, jak o něm lidé mluví,
- instance v řeči je instance můj běžný účet, tedy ten, jehož instanci smlouvy mám před sebou,
- předpis v evidenci je evidovaný pojem,
- instance v evidenci je evidovaný výskyt s konkrétními hodnotami.
V řeči se jen z kontextu pozná, zda jde o předpis, nebo o instanci. Mluvčí to neoznačuje a obojí běžně střídá i uvnitř jedné věty, aniž si toho všimne. Právě proto se v analytickém textu přidává v nejasných případech rozlišovací slovo u instance. Typickým možným a jasným rozlišením je množné číslo jako seznam: „seznam běžných účtů" jsou instance a ne předpis.
Platí pro každý předpis, nejen pro třídy¶
Kartotéka i divadelní hra ukazují touž věc ve dvou různých oblastech, a to není náhoda:
- evidovaný pojem je předpis, evidovaný výskyt s konkrétními hodnotami je jeho instance; prvek typu Class je modelová podoba evidovaného pojmu, takže platí totéž,
- prvek typu Use Case je předpis, jeho konkrétní provedení je instance,
- chod procesu je předpis, jeho konkrétní proběhnutí je instance.
Class je tedy jedním z klientů této definice, nikoli jejím vlastníkem. Jazyk UML zavádí pro tuto vlastnost pojem Classifier, ale to je už konkrétní formalismus tohoto jazyka. Princip stojí nad ním a platí i tam, kde se UML nepoužívá.
Praktický důsledek je ten, že otázku „mluvíme teď o předpisu, nebo o instanci?" je nutné klást i mimo model tříd. U Use Case a u procesu se běžně neklade vůbec, a právě tam vznikají nedorozumění.
Statický a dynamický prostor¶
Prostor předpisů je statický. Počet předpisů v nasazeném systému je neměnný. Změní se jen tehdy, když někdo změní model, tedy zásahem zvenčí, ne během provozu.
Prostor instancí je dynamický. Počet instancí se za běhu mění, instance vznikají a zanikají.
Z toho plyne pravidlo o zdroji pravdy: model instancí je vždy jen příklad, nikdy zdroj pravdy. Pravdu drží předpis. Konkrétní výskyt může být kdykoli jiný, může chybět i přebývat, a nic z toho o modelu nevypovídá.
Jak se předpis hledá¶
Předpis se v analýze nachází zobecněním z instancí. Nejprve se vidí konkrétní výskyty jako příklady toho, co se eviduje nebo co se děje, a teprve z nich se odvodí meta-pravidlo, které mají společné. Ten přechod je pohyb z prostoru instancí do prostoru předpisů. Pro laika jsou instance srozumitelné, analytik provádí obtížnější zobecnění na předpis.
Směr práce a směr platnosti jsou tedy opačné. Pracuje se zdola nahoru, od výskytů k předpisu; platnost je ale shora dolů, od předpisu k výskytům.
Jak se v textu pozná předpis od instance¶
Chybou je nejednoznačnost, tedy stav, kdy z věty ani z kontextu nelze určit, zda jde o předpis, nebo o instanci. Nejčastěji se to projeví v komunikaci: věta vytržená z kontextu nebo špatně vyjádřená vede k nedorozumění.
Rozlišovací slovo se přidává u instance, protože právě ta je konkrétní a dá se ukázat. Ustáleným výrazem je evidovaný výskyt; v běžné řeči totéž nese konkrétní faktura nebo tato faktura.
Předpis zůstává bez určení: faktura má číslo, datum a řádky. Někdy při komunikaci je vhodné uvést „každá faktura". Kde je potřeba zdůraznit, že jde o předpis, mluví se o pojmu faktura nebo o vlastnostech faktury.
Vyřešit to u zdroje je levné. Neudělá-li se to, nejednoznačnost se propíše do dokumentace a od té chvíle ji musí rozplétat každý, kdo ji čte, pokaždé znovu.
Rozlišující znaky¶
Předpis definuje vlastnosti budoucích instancí a nenese hodnoty. Instance nese hodnoty a vznikla z předpisu.
Předpis a instance je vztah mezi tím, co je stanoveno předem, a konkrétním výskytem, který podle toho vznikl. Předek a potomek je vztah mezi dvěma předpisy, z nichž jeden zužuje druhý. Obě dvojice se v řeči popisují stejně, tedy jako přechod od obecnějšího ke konkrétnějšímu, ale leží na různých osách: předpis Pes je potomkem předpisu Zvíře, kdežto konkrétní pes Alík je instancí předpisu Pes. Rozlišuje se otázkou, co stojí na druhém konci: výskyt s hodnotami, anebo další předpis.
Synonyma pro předpis jsou typ a druh. Slovo třída je název předpisu v modelu evidovaných pojmů, tedy jedno z použití principu, ne obecné synonymum.
Synonyma pro instanci jsou objekt a výskyt.
Výraz s pojmenovaným typem, například typ Kočka, může mimo to označovat i položku číselníku, která ten předpis v evidenci zastupuje. Rozlišení popisuje pojem Meta-úroveň.
Abstraktní předpis¶
Existují předpisy, které vlastní instance nemají. Nazývají se abstraktní a nejsou chybou.
Abstraktní předpis existuje kvůli zástupnosti: všude, kde se v modelu objeví, může jeho roli sehrát kterýkoli z jeho konkrétních potomků. Díky tomu se pravidlo napíše jednou pro abstraktního předka a platí pro všechny jeho potomky, včetně těch, které někdo doplní později.
Platí to obecně, nejen pro třídy. Je-li přihlášení možné třemi různými způsoby, dá se to modelovat dvojím způsobem: buď rozvětvením uvnitř jednoho prvku typu Use Case, anebo abstraktním prvkem typu Use Case se třemi konkrétními potomky, ze kterých se podle situace dosadí jeden. Druhá varianta drží každý způsob odděleně a nový způsob se přidá bez zásahu do stávajících.
Test platnosti předpisu¶
Ke každému předpisu musí být představitelné instance, buď jeho vlastní, anebo instance jeho konkrétních potomků.
Předpis, pod kterým není ani jedno, je prázdná abstrakce. Neplatí tedy jednoduché pravidlo, že za každým předpisem musí stát vlastní instance; abstraktní předpis je vidí přes své potomky. Neplatí ale ani opak, tedy že abstraktní předpis nemusí dokládat nic.
Rozlišující znaky¶
Abstraktní předpis vlastní instance nemá a existuje kvůli zástupnosti; jeho potomci instance mají. Prázdná abstrakce nemá instance ani přes potomky a nedokládá nic.
Meta-úroveň¶
Vztah předpisu a instance lze aplikovat opakovaně: předpis může být sám instancí předpisu vyššího řádu, tedy předpisu předpisů.
Táž pomůcka, která rozlišuje předpis od instance, ukazuje i úroveň. Mluví-li se o seznamu něčeho, jsou v tom seznamu instance. Co v něm je, určuje, na které úrovni se právě stojí. Seznam běžných účtů obsahuje výskyty jednoho předpisu, takže jsme na základní úrovni. Seznam typů systému, tedy seznam tříd, obsahuje předpisy a ty jsou v té chvíli v roli instancí, takže jsme o úroveň výš.
Platí to i v technologii: seznam tabulek v databázi je meta dotaz, seznam tříd v Javě přes Reflection také.
Analytické modelování stojí na jedné dvojici úrovní, tedy na předpisu a jeho instancích. Pohyb výše do meta není jeho předmětem; formalizuje ho MOF a nad ním Pattern Metamodel.
Číselník typů jako imitace meta seznamu¶
Číselník typů do toho ale nepatří. Je to imitace takového dotazu do meta, tedy číselník vytvořený bokem: neodečítá se z modelu, někdo ho založil zvlášť a zvlášť ho udržuje v konzistenci s modelem. Meta dotaz vyjmenuje skutečné předpisy, kdežto řádky číselníku předpisy nejsou, jsou to jejich zástupci držení jako data.
Prostor instancí s předpisy jako seznamem přímo pracovat neumí. Aby šlo typ uživateli nabídnout, nechat jej vybrat a výběr uložit, musí být typy v evidenci k dispozici jako evidované instance na základní úrovni. V systému se proto zavede číselník typů, tedy seznam položek s kódem a názvem; odtud názvy jako typy zvířat nebo typy dokladů.
Takový číselník imituje meta seznam předpisů uvnitř prostoru instancí. Jedna položka odpovídá jednomu předpisu a zastupuje jej tam, kde se s předpisy přímo pracovat nedá.
Obě strany platí současně a ani jedna z nich není omyl:
- Kočka jako předpis, tedy pojem v modelu, ze kterého se rodí instance,
- Kočka jako položka číselníku, tedy instance s hodnotami kód 1 a název „Kočka".
Odtud plyne homonymum. Výraz typ Kočka označuje obojí a bez kontextu se nedá poznat, o kterou z těch dvou věcí jde. Nevzniká to nedbalostí, ale právě tou imitací: číselník je udělaný tak, aby vypadal jako seznam typů.
Rozlišuje se stejně jako jinde, tedy rozlišovacím slovem u instance: položka číselníku Kočka proti pojmu Kočka.
Na nižších úrovních abstrakce má tentýž převod vlastní jména. V technologickém návrhu a v kódu se strana hodnoty objevuje jako výčtový typ (enum) nebo jako discriminator, a vznik instance správného předpisu z takové hodnoty řeší vzory Factory a Prototype. Jsou to pojmy z jiné hodnoty osy úrovní abstrakce (návrh technologie); v analytickém modelu se s nimi nepracuje přímo, ale pouze v tom smyslu, že technologie takovéto výběry typů umožňují.
Rozlišující znaky¶
Předpis je to, z čeho se rodí instance. Zástupce předpisu v číselníku je instance, která předpis reprezentuje, aby se s ním dalo pracovat v prostoru instancí. Jsou to dvě různé věci ve dvou různých prostorech, spojené převodem, ne dvě jména téhož.
Nejčastější chyby¶
Nejednoznačné, zda předpis, nebo instance. Z věty ani z kontextu nelze určit, o co jde. Není chybou mluvit stručně; chybou je chybějící rozlišovací slovo, protože pak se význam musí odhadovat a nedorozumění se propíše dál.
Model instancí použitý jako zdroj pravdy. Z konkrétních výskytů se usuzuje na model, aniž se ověří, že totéž platí i pro výskyty, které zrovna nejsou vidět. Instance jsou příklad, pravdu drží předpis.
Prázdná abstrakce. Zavede se abstraktní předpis, pod kterým si nikdo neumí představit ani jednu instanci, ani přes potomky.
Záměna předpisu s jeho zástupcem v evidenci. Mluví se o typu Kočka, aniž je určeno, zda jde o pojem v modelu, nebo o položku číselníku. Číselník typů imituje meta seznam předpisů, takže obojí vypadá v textu stejně.
Záměna generalizace s rozdílem předpisu a instance. S potomkem předpisu se zachází, jako by to byla jeho instance, anebo naopak s instancí, jako by to byl potomek. Obojí se v řeči popisuje jako přechod od obecnějšího ke konkrétnějšímu, ale jsou to dvě různé osy.
Vázání principu na třídy. Předpokládá se, že se rozdělení týká jen prvků typu Class, a u prvků typu Use Case nebo u procesu se otázka, zda jde o předpis, nebo o instanci, vůbec nepoloží.
Vazby¶
Předpis a jeho instance je jedním ze tří Principů modelování; zbylé dva jsou Zrcadlení pojmů a Objektové paradigma. Použití na třídy, včetně techniky hledání tříd zobecněním z instancí, popisuje Class. Zástupnost potomka za abstraktního předka popisuje Generalizace. Že scénáře Use Case pracují s instancemi, a nikoli s předpisy, popisují kapitoly o scénářích. Ustálený výraz evidovaný výskyt vede Slovník evidovaných pojmů. Že enum, discriminator, Factory a Prototype patří do jiné hodnoty osy, popisují Úrovně abstrakce. Vyšší meta-úrovně jsou předmětem Pattern Metamodelu.
Verze a změny¶
- 2.0: Kapitola napsána znovu. Účel principu je nově řečen hned v úvodu: je to DRY. Vlastnosti se popíšou jednou u předpisu a každý výskyt nese jedinou vazbu, totiž že z toho předpisu vznikl; dosavadní úvod místo toho tvrdil, že princip odpovídá na otázku, ve které rovině se analytik právě pohybuje, což není to, k čemu princip je. Nová pod-sekce Platí v řeči i v evidenci: princip není vlastností jenom modelu, platí i tam, kde žádný model není, takže osa řeči a evidence a osa předpisu a instance jsou nezávislé a dávají čtyři kombinace. Ve výčtu použití proto na prvním místě stojí evidovaný pojem a Class je uveden jako jeho modelová podoba. Doplněna disjunktnost obou prostorů, analogie divadelní hry rozvedena na chování a nová pod-sekce Jak se předpis hledá s obecnou formou hledání zobecněním z instancí (technika pro třídy zůstává v kapitole Class); pravidlo o zdroji pravdy vytčeno z pod-sekce o statickém a dynamickém prostoru. Meta-úroveň povýšena z pod-sekce na samostatný pojem a přepsána. Dosavadní znění tvrdilo, že množné číslo je indikátorem úrovně a že položka číselníku je pouhá hodnota, která předpisem není. Nově platí pomůcka: mluví-li se o seznamu něčeho, jsou v tom seznamu instance, a teprve obsah seznamu určuje úroveň; doloženo i technologií, kde je seznam tabulek v databázi meta dotaz a seznam tříd v Javě přes Reflection také. Číselník typů je od meta dotazu odlišen: je to jeho imitace, číselník vytvořený bokem, který se neodečítá z modelu a musí se v konzistenci s modelem udržovat; jeho řádky předpisy nejsou, jsou to jejich zástupci. Odtud homonymum výrazu typ Kočka a odtud i převod, který se na jiné hodnotě osy úrovní abstrakce jmenuje enum, discriminator, Factory a Prototype. Slovo typ zůstává rovnocenným synonymem pro předpis; slovo třída je označeno za název předpisu v modelu evidovaných pojmů, tedy za jedno z použití, ne za obecné synonymum. Do rozlišujících znaků doplněna dvojice předpis a instance proti předek a potomek. Doplněny chyby Model instancí použitý jako zdroj pravdy a Záměna generalizace s rozdílem předpisu a instance; chyba Číselník povýšený na metaúroveň nahrazena chybou Záměna předpisu s jeho zástupcem v evidenci. Sjednocen slovník: slovo rovina zůstává vyhrazeno ose řeči a evidence, pro osu tohoto principu se používá prostor předpisů a prostor instancí, a tam, kde věta neříká, kde něco leží, ale o čem je řeč, se píše přímo předpis, nebo instance.
- 1.0: Zavedení principu jako samostatné kapitoly. Vzniklo zobecněním pod-sekce Dichotomie třída-instance z kapitoly Class, protože rozdělení na předpis a instance neplatí jen pro třídy.