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