Uvod u uzorak nultih objekata

1. Pregled

U ovom ćemo brzom uputstvu pogledati Null Object Pattern, poseban slučaj Strateškog uzorka. Opisat ćemo njegovu svrhu i kada bismo zapravo trebali razmotriti njezinu upotrebu.

Kao i obično, pružit ćemo i jednostavan primjer koda.

2. Uzorak nultih objekata

U većini objektno orijentiranih programskih jezika ne smijemo koristiti a null referenca. Zbog toga smo često prisiljeni pisati null provjere:

Naredba cmd = getCommand (); if (cmd! = null) {cmd.execute (); }

Ponekad, ako je broj takvih ako izjave postaju visoke, kôd može postati ružan, težak za čitanje i sklon pogreškama. Tada može dobro doći uzorak nultih objekata.

Namjera Null Object Pattern-a je minimizirati tu vrstu null ček. Umjesto toga, možemo identificirati null ponašanje i uvrstiti ga u tip koji očekuje klijentski kod. Češće nego ne, takva neutralna logika je vrlo jednostavna - ne činite ništa. Na ovaj se način više ne moramo baviti posebnim rukovanjem null reference.

Jednostavno se možemo prema null objektima ponašati na isti način kao prema bilo kojoj drugoj instanci određenog tipa koja zapravo sadrži neku sofisticiraniju poslovnu logiku. Slijedom toga, klijentski kod ostaje čišći.

Kako null objekti ne bi trebali imati nikakvo stanje, ne treba više puta kreirati identične instance. Stoga ćemo često implementirati nulti objekti kao jednokrevetne.

3. UML dijagram nulskog uzorka objekta

Pogledajmo uzorak vizualno:

Kao što vidimo, možemo identificirati sljedeće sudionike:

  • Klijent zahtijeva primjerak SažetakObjekt
  • SažetakObjekt definira ugovor Klijent očekuje - može sadržavati i zajedničku logiku za izvedbene klase
  • RealObject provodi SažetakObjekt i pruža stvarno ponašanje
  • NullObject provodi SažetakObjekt i pruža neutralno ponašanje

4. Provedba

Sad kad imamo jasnu ideju o teoriji, pogledajmo primjer.

Zamislite da imamo aplikaciju usmjerivača poruka. Svaka poruka treba imati valjani prioritet. Naš bi sustav trebao usmjeravati poruke visokog prioriteta na SMS gateway, dok bi poruke sa srednjim prioritetom trebale biti usmjerene u JMS red.

S vremena na vrijeme, međutim, mogu doći poruke s "nedefiniranim" ili praznim prioritetom našoj aplikaciji. Takve poruke treba odbaciti od daljnje obrade.

Prvo ćemo stvoriti Usmjerivač sučelje:

javno sučelje Router {void route (Message msg); }

Dalje, kreirajmo dvije implementacije gornjeg sučelja - onu koja je odgovorna za usmjeravanje na SMS gateway i onu koja će preusmjeriti poruke u JMS red:

javna klasa SmsRouter implementira usmjerivač {@Preuzmi javnu praznu rutu (poruka poruke) {// detalji implementacije}}
javna klasa JmsRouter implementira usmjerivač {@Override public void route (Message msg) {// detalji implementacije}}

Konačno, implementiramo svoj null objekt:

javna klasa NullRouter implementira usmjerivač {@Override public void route (Message msg) {// ne radi ništa}}

Sada smo spremni sastaviti sve dijelove. Pogledajmo kako može izgledati primjer klijentskog koda:

javna klasa RoutingHandler {javna void handle (Iterable messages) {for (Message msg: messages) {Router router = RouterFactory.getRouterForMessage (msg); router.route (msg); }}}

Kao što vidimo, liječimo sve Usmjerivač objekti na isti način, bez obzira na to koju implementaciju vrati RouterFactory. To nam omogućuje da naš kod ostane čist i čitljiv.

5. Kada koristiti uzorak nultih objekata

Trebali bismo koristiti uzorak nultih objekata kada a Klijent inače provjeriti za null samo da preskoči izvršenje ili izvrši zadanu radnju. U takvim slučajevima možemo enkapsulirati neutralnu logiku unutar null objekta i vratiti je klijentu umjesto null vrijednost. Na ovaj način klijentov kod više ne mora biti svjestan je li određena instanca null ili ne.

Takav pristup slijedi opće objektno orijentirane principe, poput Recite-ne-pitajte.

Da bismo bolje razumjeli kada bismo trebali koristiti Null Object Pattern, zamislimo da to moramo primijeniti CustomerDao sučelje definirano na sljedeći način:

javno sučelje CustomerDao {Zbirka findByNameAndLastname (ime niza, prezime niza); Kupac getById (dugi ID); }

Većina programera bi povratak Collections.emptyList () iz findByNameAndLastname () u slučaju da se nitko od kupaca ne podudara navedeni kriteriji pretraživanja. Ovo je vrlo dobar primjer praćenja Null Object Pattern.

Suprotno tome, dobitiById () treba vratiti kupca s danim ID-om. Netko tko poziva ovu metodu očekuje da će dobiti određeni entitet kupca. U slučaju da takav kupac ne postoji, trebali bismo se izričito vratiti null kao znak da nešto nije u redu s navedenim id-om.

Kao i kod svih ostalih obrazaca, moramo razmotriti naš specifični slučaj upotrebe prije slijepe primjene Null Object Pattern. Inače, u naš kôd možemo nenamjerno unijeti neke pogreške koje će biti teško pronaći.

6. Zaključak

U ovom smo članku saznali što je uzorak nulskog objekta i kada ga možemo koristiti. Također smo implementirali jednostavan primjer uzorka dizajna.

Kao i obično, svi uzorci koda dostupni su na GitHubu.