Bevezetés a Null Object Pattern-be

1. Áttekintés

Ebben a gyors bemutatóban megnézzük a Null Object Pattern-t, a Strategy Pattern speciális esetét. Leírjuk a célját és azt, hogy mikor érdemes megfontolnunk a használatát.

Szokás szerint egy egyszerű példát is megadunk.

2. Null Object Pattern

Az objektumorientált programozási nyelvek többségében nem használhatjuk a nulla referencia. Ezért kénytelenek vagyunk gyakran írni nulla ellenőrzések:

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

Néha, ha az ilyenek száma ha az utasítások magasak lesznek, a kód csúnyává, nehezen olvashatóvá és hibára hajlamossá válhat. Ekkor jöhet jól a Null Object Pattern.

A Null Object Pattern célja az ilyen minimalizálása nulla jelölje be. Ehelyett azonosíthatjuk a null viselkedést, és beilleszthetjük az ügyfélkód által elvárt típusba. Gyakrabban akkor nem, az ilyen semleges logika nagyon egyszerű - ne tegyen semmit. Így már nem kell foglalkoznunk a nulla hivatkozások.

Egyszerűen kezelhetjük a null objektumokat ugyanúgy, mint egy adott típusú bármely más példányt, amely valójában valamilyen kifinomultabb üzleti logikát tartalmaz. Következésképpen az ügyfélkód tisztább marad.

Mivel a null objektumoknak nem lehetnek állapotuk, nem kell többször azonos példányokat létrehozni. Így gyakran fogunk megvalósítani null objektumok as szinglik.

3. A Null Object Pattern UML diagramja

Nézzük meg a mintát vizuálisan:

Mint láthatjuk, a következő résztvevőket azonosíthatjuk:

  • Ügyfél példányt igényel AbstractObject
  • AbstractObject meghatározza a szerződést Ügyfél elvárja - az implementációs osztályok megosztott logikáját is tartalmazhatja
  • RealObject megvalósítja AbstractObject és valós viselkedést nyújt
  • NullObject megvalósítja AbstractObject és semleges viselkedést biztosít

4. Végrehajtás

Most, hogy világos elképzelésünk van az elméletről, nézzünk meg egy példát.

Képzelje el, hogy van egy üzenet router alkalmazásunk. Minden üzenetnek érvényes prioritással kell rendelkeznie. Rendszerünk a magas prioritású üzeneteket egy SMS-átjáróhoz irányítja, míg a közepes prioritású üzeneteket egy JMS-sorba kell irányítani.

Időről időre, „meghatározatlan” vagy üres prioritású üzenetek érkezhetnek alkalmazásunkhoz. Az ilyen üzeneteket el kell vetni a további feldolgozástól.

Először létrehozzuk a Router felület:

nyilvános felület Router {void route (Message msg); }

Ezután hozzuk létre a fenti felület két megvalósítását - az egyiket az SMS-átjáró felé történő továbbításért, és azt, amely az üzeneteket a JMS-sorba irányítja:

public class SmsRouter megvalósítja az útválasztót {@Override public void route (Message msg) {// implementáció részletei}}
public class JmsRouter implementálja az útválasztót {@Override public void route (Message msg) {// implementáció részletei}}

Végül, valósítsuk meg a null objektumunkat:

public class NullRouter implementálja az útválasztót {@Override public void route (Message msg) {// nem csinál semmit}}

Most készen állunk az összes darab összerakására. Nézzük meg, hogyan nézhet ki a példa kliens kód:

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

Ahogy látjuk, bánunk mindenkivel Router tárgyak ugyanúgy, nem számít, milyen megvalósítást ad vissza a RouterFactory. Ez lehetővé teszi számunkra, hogy kódunkat tisztán és olvashatóan tartsuk.

5. Mikor kell használni a Null Object Pattern-t

Akkor kell használnunk a Null Object Pattern-t, ha a Ügyfél különben ellenőrizné nulla csak a végrehajtás kihagyása vagy egy alapértelmezett művelet végrehajtása érdekében. Ilyen esetekben a semleges logikát egy null objektumba foglalhatjuk, és visszaküldhetjük az ügyfélnek a nulla érték. Így az ügyfél kódjának már nem kell tudnia, ha egy adott példány az nulla vagy nem.

Egy ilyen megközelítés általános objektum-orientált elveket követ, mint például a Tell-Don't-Ask.

Hogy jobban megértsük, mikor kell használnunk a Null Object Pattern-t, képzeljük el, hogy végre kell hajtanunk CustomerDao interfész a következőképpen definiálva:

nyilvános felület CustomerDao {Collection findByNameAndLastname (karakterlánc neve, karakterlánc vezetékneve); Ügyfél getById (hosszú azonosító); }

A fejlesztők többsége megtenné Visszatérés Collections.emptyList () tól től findByNameAndLastname () abban az esetben, ha egyik ügyfél sem felel meg a megadott keresési feltételeket. Ez nagyon jó példa a Null Object Pattern követésére.

Ezzel szemben a kapById () vissza kell adnia az ügyfelet a megadott azonosítóval. Valaki, aki ezt a módszert hívja, arra számít, hogy megszerzi az adott ügyfél entitást. Ha ilyen ügyfél nem létezik, akkor kifejezetten vissza kell térnünk nulla jelezni, hogy valami nincs rendben a megadott azonosítóval.

Mint minden más mintában, meg kell fontolnunk sajátos felhasználási esetünket, mielőtt vakon végrehajtanánk a Null Object Pattern-t. Ellenkező esetben akaratlanul is bevezethetünk néhány hibát a kódunkba, amelyeket nehéz megtalálni.

6. Következtetés

Ebben a cikkben megtudtuk, mi a Null Object Pattern, és mikor használhatjuk. A tervezési minta egyszerű példáját is megvalósítottuk.

Szokás szerint az összes kódminta elérhető a GitHubon.