|
Jak správně používat vzory |
|
část 2. červen 2008 autor RNDr. Ilja Kraval Zavedení a použití vzoru V předchozím článku jsme si vysvětlili, že zavedení vzoru v CASE nástroji skrývat určitá úskalí. V mnoha případech se namísto správného modelu vzoru chybně nabízí model jeho konkrétního použití s konkrétním výčtem několika prvků jako "ukázka vzoru" (viz příklad se vzorem CHAIN OF RESPONSIBILITY v předešlém článku se dvěma dědici ConcreteHandler). Jaký je tedy doporučený postup pro zavedení a následné použití vzoru pomocí CASE nástrojů (například v EA)? Samozřejmě budeme chtít zavést efektivní, jednoduché a přitom účinné používání vzorů... Vysvětleme si doporučený postup pro libovolný modelovací CASE nástroj a poté si jej upřesněním pro nástroj EA. Zavedení vzoru vlastně znamená vytvořit odpovídající model vzoru a to konkrétně v jazyce UML. Části modelu se v UML vytvářejí pomocí prvků typu Package. Logicky z toho vyplývá, že jako první krok musíme zavést pro daný konkrétní vzor prvek typu Package a bude určitě vhodné dát tomuto prvku typu Package stejný název, jako je zaveden u názvu vzoru. Pro lepší přehlednost můžeme prvek typu Package vybavit stereotypem <<pattern>>. V tomto prvku typu Package zavedeme diagram a v něm znázorníme model vzoru. Zavedeme v něm prvky, tj. účastníky vzoru (tzv. Participants), přičemž budeme velmi opatrní na to, abychom každého účastníka vzoru zavedli do diagramu pouze jednou! Současně zavedeme interakce mezi prvky, tj. jedná-li se o model tříd, zavedeme odpovídající asociace a případně i generalizaci. Vraťme se k příkladu se vzorem CHAIN OF RESPONSIBILITY a porovnejme si obrázek předešlý (tj. chybný) s novým a správným modelem u vzoru. V předešlém článku byl model vzoru CHAIN OF RESPONSIBILITY zaveden chybně takto:
Nový a správný model vzoru odstraní duplicitu u prvků - třídy ConcreteHandler a bude tedy vypadat takto:
Pokud třeba, můžeme model vzoru doplnit o vysvětlení resp. o odkaz do literatury apod. Nyní je model připraven jako model v jazyce UML a přichází nejdůležitější část postupu. Zavedeme pomocný prvek dokumentace vzoru, který bude udávat možné použití vzoru. Nejlépe jej zavedeme jako prvek typu Object se stereotypem <<participants>> v daném prvku typu Package vzoru. Postup je jednoduchý: Uvnitř prvku typu Package vzoru zavedeme prvek typu Object se stereotypem <<participants>> a dáme mu stejný název, jako je název vzoru. Do textového popisu tohoto prvku (tj. do jeho prvku Notes resp. Descripiton apod.) uvedeme pod sebou jednak název vzoru a také seznam všech účastníků i s multiliplicitou v závorce (1 resp. *). Poznámka: Pokud používáte nástroj EA, je zde výhodné použít utilitu (je dodávána zdarma). Stačí potom pouze "naklikat živé odkazy" na prvky modelu. Následně budou názvy účastníků v textu držet živou referenci do modelu vzoru. Takto vznikl text, který obsahuje jednak název vzoru (to je název prvku typu Package daného vzoru), ale i názvy jeho účastníků (třídy, metody atd.). Současně u účastníků udáme do závorky také jejich povolené multiplicity. V našem příkladu může takový text v Notes vypadat třebas takto:
vzor CHAIN OF RESPONSIBILITY účastníci: třída Client (*) třída Handler (1) abstraktní metoda HandleRequest (1) třída ConcreteHandler (*) přepisující metoda HandleRequest (*)
(poznámka: žluté texty označují reference na prvky, viz zmíněný produkt EA Object Editor) Tento text je nabízen uživatelům tohoto vzoru. Pokud chceme daný vzor použít, prostě a jednoduše otevřeme tento text Notes a pouze zkopírujeme tento text přes schránku do své dokumentace (do Notes jiného prvku, třebas Notes diagramu našeho řešení apod.). Následně upravíme a doplníme tento zkopírovaný text o informaci, které naše prvky modelu hrají kterou roli účastníka v použití vzoru. Využijeme i znalosti multiplicity u každého účastníka - u účastníků s multiplicitou jedna nesmíme přiřadit více než jeden prvek našeho řešení. Jako příklad takového zkopírovaného a upraveného textu můžeme uvést následující: Byl použit vzor CHAIN OF RESPONSIBILITY, kde třída MyClient ~ Client (*), třída MyHandler ~ Handler (1), metoda MyHandleRequest ~ metoda HandleRequest (1) třídy ConcreteHandler1 a ConcreteHandler2 ~ třída ConcreteHandler (*).
Všimněme si, že v levé části textu se vyskytují "prvky našeho řešení", kdežto v pravé části textu vidíme přiřazené "prvky vzoru", které "pozůstaly" z kopírování. Jak vidět, opět je výhodné použít zmíněný "odkazovač" EA Object Editor na naše prvky modelu, protože potom držíme živou referenci nejenom na účastníky vzoru, ale i na prvky modelu, tj. na prvky našeho řešení. Dosáhli jsme tak požadovaného stavu: V našem řešení se vyskytuje odkaz na vzor a jsou také přiřazeny naše prvky řešení k účastníkům vzoru. Pokud použijeme zmíněnou utilitu, jsou navíc tyto odkazy tvořeny jako reference a jakákoliv změna názvu prvku, jak v našem modelu (což bývá časté), anebo ve vzoru (což bývá sporadické, spíše oprava chyby apod.), se automaticky promítají do textu.
Závěr Smyslem tohoto článku bylo vysvětlení základního principu zavedení a použití vzorů pomocí UML a CASE nástroje. Uvedený mechanismus použití vzorů je univerzální a vysoce efektivní a hodí se pro jakákoliv opakující se řešení. Nyní připravuji sady vzorů pro použití v této efektivní podobě. Budou publikovány na našem serveru a budou k dispozici zdarma.
Konec článku
|