Co obnáší převod UML do programovacího jazyku? 1. díl

Možná vás právě napadlo: a proč by to někdo dělal? Důvodů může být více, např. podrobnější studium závislostí, zobrazování, které jiný nástroj neumí nebo třeba protože chcete udělat nějakou modelovací platformu. Ale důvody se zabývat tentokrát nebudeme a vrhneme se rovnou na převod.

Na to, abyste mohli převést UML do programovacího jazyku (já používám C#), potřebujete znát hned několik věcí:

  • MOF neboli Metaobject Facility Management
    • Jedná se o modelovací jazyk pro modelování metamodelů. Jinými slovy např. UML, BPMN či DMN jsou jazyky definované právě pomocí MOFu.
    • MOF jako takový je definován pomocí UML (odtud ono populární tvrzení, že UML je definované samo sebou).
  • UML neboli Unified Modeling Language
    • Pokud chcete implementovat UML, tak jej samozřejmě musíte znát. A to nikoliv pouze základy. Naprosto zásadní je znát princip spojování množin a hledání podmnožin.
  • XMI neboli XML Metadata Interchange
    • Je to specifický formát XML souboru, který byl vyvinut pro snazší výměnu modelů mezi nástroji.
  • Programovací jazyk
    • Samozřejmě převodem pro programovacího jazyka musíte tento znát.
    • Jak jsem uvedl, já používám C#, ale můžete použít i jiný. Pro můj postup je zásadní, aby takový jazyk podporovat rozhraní.
  • Trpělivost
    • V OMG standardech jsou chyby. Jako ve všem. Proti tomu nelze nic namítat. Jenže rychlost oprav ve standardech je ještě pomalejší než stavba dálnic pod taktovkou Burešovic pohůnků. Trpělivost spočívá v tom, že jednak chybu nahlásíte a jednak se v kódu musíte chybě přizpůsobit. To druhé je těžší, a to především mentálně: v tu chvíli totiž nemůžete tvrdit, že 100% podporujete standard.

Krok první: Jak vypadá definice (nejen) UML?

Na to, abychom se seznámili s definicí UML, slouží UML standard. Ten mnozí znají jako PDF dokument, který obsahuje popis metamodelu v takové podobě, aby jej dokázali pochopit běžní uživatelé s co nejmenším úsilím (čímž neříkám, že je to jednoduché). Sice můžeme tento dokument ručně prvek po prvku postupně implementovat, ale přiznejme si, že to nemá smysl z pohledu času. Jak si to tedy ulehčit?

Součástí standardu je i strojově zpracovatelná podoba ve formátu XMI (což, jak jsme si řekli, není nic jiného nežli XML v definované struktuře). Jenže jak takovou strukturu pochopit? Zkuste se podívat na kus takového souboru:

Metamodel UML v editoru Code

Na obrázku je vidět začátek definice případu užití (use case, metatřída UseCase). Jedná se o třídu (xmi:type=“uml:Class“) nazvanou UseCase (name=“UseCase“) a jednoznačně identifikovaná v rámci souboru (xmi:id=“UseCase“). Ta vlastní komentář (ownedComment) s vysvětlujícím textem (body). Dále tam jsou uvedena vlastněná pravidla (ownedRule). Část z toho lze vidět v čitelnější podobě na dalším obrázku.

Metamodel UML v editoru DME

Aniž bychom to více zkoumali, tak vidíme, že UML je definované pomocí UML. Je třeba se nad tímhle zamyslet do důsledků. Ten pán, co píše tento článek, často na svých školeních (ale i jinde) povídá, že pomocí UML je definován víceméně každý modelovací jazyk od OMG. Nekecá? Podívejme se např. na BMM (Business Motivation Model), jeden z dalších standardů OMG. Tím podíváním nemyslím PDF dokument, ale opět XMI soubor.

Metamodel BMM v editoru Code

Na tomto souboru je ukázka prvku PotentialReward. To je opět (meta)třída, má id, uuid a je odvozena (generalizace) od (meta)třídy PotentialImpact. A opět tam poznáváme prvky z UML. Podobně se klidně můžeme podívat na DMN.

Nedalo by se z toho něco vytěžit? Jestliže jsou metamodely definované pomocí UML, neznamená to náhodou, že když implementuji UML, tak vlastně budu moci načíst libovolný standard od OMG (pokud má XMI podobu)? Ano! Přesně tohle to znamená! Není to skvělé?

Dobře, jestliže metamodel můžeme definovat pomocí UML, tak když implementuji celé UML, tak budu mít vyhráno, dalo by se říct. Jenže já osobně jsem člověk neskutečně líný. Proč implementovat celé UML? Opravdu to musím? Zbude mi čas na pivko?

Zabředl jsem tedy do standardů ještě hlouběji a zjistil (no dobře, už jsem to věděl z přípravy na zkoušku z UML na úroveň Advanced), že to, jak jsou veškeré metamodely definované, určuje MOF (MetaObject Facility). Není to nic jiného než metametamodel pro metamodely (viz obrázek s úrovněmi abstrakcí).

Čtyři míry abstrakce

A přesně tento metametamodel je definován pomocí UML. A teď pozor! Nikoliv celého UML, ale pouze podmnožiny, která je výrazně menší než UML jako takové, které znáte. MOF nepoužívá případy užití, akce, sekvence či stavové diagramy, ale pouze kus diagramů tříd plus balíky. Jinými slovy, pokud implementuji pouze kus UML (a nazvu to alibisticky MOF implementace), budu schopen načíst a zpracovat libovolný OMG standard. Za méně práce více muziky? To je přesně to, co hledám! Díky tomu se budu moci podívat rozumně např. na DMN, jak ukazuje další obrázek (na něm je např. vidět, že OMG na rozdíl od UML neuvádí význam prvku v podobě komentáře – další ukázka nejednotnosti a nesourodosti jednotlivých tvůrců standardů).

Metamodel DMN v editoru DME

Takže, jak na to? Už můžeme programovat? Inu, to si povíme v dalším díle, který bude zveřejněn za 14 dní.

Zanechat odpověď

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *