Úvod do modelu nulových objektov

1. Prehľad

V tomto rýchlom výučbe sa pozrieme na Null Object Pattern, špeciálny prípad Strategického vzoru. Popíšeme jeho účel a kedy by sme mali skutočne uvažovať o jeho použití.

Ako obvykle poskytneme aj jednoduchý príklad kódu.

2. Nulový vzor objektu

Vo väčšine objektovo orientovaných programovacích jazykov nesmieme používať a nulový odkaz. Preto sme často nútení písať nulový kontroly:

Príkaz cmd = getCommand (); if (cmd! = null) {cmd.execute (); }

Niekedy, ak je počet takýchto ak vysoké príkazy, kód sa môže stať škaredým, ťažko čitateľným a náchylným na chyby. To je prípad, kedy sa môže hodiť vzor nulového objektu.

Účelom vzoru nulového objektu je minimalizovať tento druh nulový skontrolovať. Namiesto toho môžeme identifikovať nulové správanie a zapuzdriť ho v type očakávanom kódom klienta. Častejšie potom nie, takáto neutrálna logika je veľmi jednoduchá - nerobiť nič. Týmto spôsobom už nemusíme riešiť špeciálne zaobchádzanie s nulový referencie.

S nulovými objektmi môžeme jednoducho zaobchádzať rovnako, ako s každou inou inštanciou daného typu, ktorá v skutočnosti obsahuje sofistikovanejšiu obchodnú logiku. V dôsledku toho zostane kód klienta čistejší.

Pretože nulové objekty by nemali mať žiadny stav, nie je potrebné vytvárať rovnaké inštancie viackrát. Takto budeme často realizovať nulové objekty ako singletons.

3. UML diagram nulového objektu

Pozrime sa na vzor vizuálne:

Ako vidíme, môžeme identifikovať týchto účastníkov:

  • Zákazník vyžaduje inštanciu AbstractObject
  • AbstractObject definuje zmluvu Zákazník očakáva - môže tiež obsahovať zdieľanú logiku pre implementačné triedy
  • RealObject náradie AbstractObject a poskytuje skutočné správanie
  • NullObject náradie AbstractObject a poskytuje neutrálne správanie

4. Implementácia

Teraz, keď máme jasnú predstavu o teórii, pozrime sa na príklad.

Predstavte si, že máme aplikáciu smerovač správ. Každá správa by mala mať priradenú platnú prioritu. Náš systém má smerovať správy s vysokou prioritou na bránu SMS, zatiaľ čo správy so strednou prioritou by mali byť smerované do frontu JMS.

Z času na čas, môžu však prísť správy s „nedefinovanou“ alebo prázdnou prioritou na našu aplikáciu. Takéto správy by mali byť z ďalšieho spracovania vyradené.

Najskôr vytvoríme Router rozhranie:

verejné rozhranie Router {void route (Správa správ); }

Ďalej vytvoríme dve implementácie vyššie uvedeného rozhrania - implementáciu zodpovednú za smerovanie na bránu SMS a implementáciu správ do frontu JMS:

verejná trieda SmsRouter implementuje smerovač {@Override public void route (správa správy) {// podrobnosti implementácie}}
verejná trieda JmsRouter implementuje smerovač {@Override public void route (správa správy) {// podrobnosti implementácie}}

Nakoniec poďme implementovať náš nulový objekt:

verejná trieda NullRouter implementuje smerovač {@Override public void route (správa správy) {// neurobiť nič}}

Teraz sme pripravení dať všetky kúsky dohromady. Pozrime sa, ako môže vyzerať vzorový kód klienta:

public class RoutingHandler {public void handle (Iterable messages) {for (Message msg: messages) {Router router = RouterFactory.getRouterForMessage (msg); router.route (správa); }}}

Ako vidíme, liečime všetkých Router predmety rovnako, bez ohľadu na to, akú implementáciu vráti RouterFactory. To nám umožňuje udržiavať náš kód čistý a čitateľný.

5. Kedy použiť vzor nulového objektu

Mali by sme použiť vzor nulového objektu, keď a Zákazník by inak skontroloval nulový len na preskočenie vykonania alebo vykonanie predvolenej akcie. V takýchto prípadoch môžeme neutrálnu logiku zapuzdriť do nulového objektu a vrátiť ju klientovi namiesto nulový hodnotu. Takto už kód klienta nemusí byť informovaný, ak je daná inštancia známa nulový alebo nie.

Takýto prístup sa riadi všeobecnými objektovo orientovanými princípmi, napríklad Tell-Don't-Ask.

Aby sme lepšie pochopili, kedy by sme mali použiť vzor nulového objektu, predstavme si, že ho musíme implementovať CustomerDao rozhranie definované takto:

verejné rozhranie CustomerDao {Collection findByNameAndLastname (názov reťazca, priezvisko reťazca); Zákazník getById (Long id); }

Väčšina vývojárov by to urobila návrat Collections.emptyList () od findByNameAndLastname () v prípade, že sa žiaden zo zákazníkov nezhoduje poskytnuté vyhľadávacie kritériá. Toto je veľmi dobrý príklad sledovania vzoru nulového objektu.

Naproti tomu dostaťById () by mal vrátiť zákazníka s daným id. Niekto, kto volá túto metódu, očakáva, že získa konkrétnu entitu zákazníka. Ak taký zákazník neexistuje, mali by sme sa výslovne vrátiť nulový signalizovať, že s poskytnutým ID nie je niečo v poriadku.

Rovnako ako u všetkých ostatných vzorov, pred slepou implementáciou modelu nulových objektov musíme zvážiť náš konkrétny prípad použitia. V opačnom prípade môžeme do nášho kódu neúmyselne zaviesť chyby, ktoré bude ťažké nájsť.

6. Záver

V tomto článku sme sa dozvedeli, čo je Null Object Pattern a kedy ho môžeme použiť. Implementovali sme tiež jednoduchý príklad návrhového vzoru.

Ako obvykle sú všetky ukážky kódu k dispozícii na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found