Objekt null (návrhový vzor)

Aktuální verze stránky ještě nebyla zkontrolována zkušenými přispěvateli a může se výrazně lišit od verze recenzované 16. září 2017; kontroly vyžadují 15 úprav .

V objektově orientovaném programování je objekt Null  objekt s určitým neutrálním ("null") chováním. Návrhový vzor Null Object popisuje použití takových objektů a jejich chování (nebo jeho nedostatek). Poprvé publikováno v knižní sérii Pattern Languages ​​of Program Design . [jeden]

Popis

V objektově orientovaných jazycích , jako je Java nebo C# , mohou mít objekty hodnotu NULL . Odkazy na takové objekty je třeba před použitím zkontrolovat na hodnotu null, protože metody třídy "null" objektu obecně nelze volat.

Účelem nulového objektu je zapouzdřit nepřítomnost objektu jeho nahrazením jiným objektem, který nic nedělá.

Tento návrhový vzor se doporučuje, když:

Struktura

V diagramu tříd v UML je návrhový vzor reprezentován následovně:

Příklady

Příklad v C#

Zdrojový text v C# /* * Příklad použití vzoru Null Object: */ voidMain ( ) { AbstractEntity realEntity = new RealEntity (); realita . udělat něco (); // RealEntity::doSomething AbstractEntity unknownEntity = new NullEntity (); neznámáEntita . udělat něco (); // žádný výstup } // Zde definujte další metody a třídy veřejná abstraktní třída AbstractEntity { public abstract void doSomething (); } public class RealEntity : AbstractEntity { veřejné přepsání void doSomething () { Konzole . WriteLine ( "RealEntity::doSomething" ); } } public class NullEntity : AbstractEntity { veřejné přepsání void doSomething () { // nicnedělání } }

Příklad v PHP

Zdrojový kód PHP /* * Příklad použití vzoru Null Object: */ deklarovat ( strict_types = 1 ); jmenný prostor DesignPatterns \ Behavioral \ NullObject ; servisní třída { veřejná funkce __construct ( soukromý Logger $ logger ) { } /** * dělej něco ... */ veřejná funkce udělat něco () { // zde si všimněte, že nemusíte kontrolovat, zda je logger nastaven např. is_null(), místo toho ji použijte $ this -> logger -> log ( ' Jsme v ' . __METHOD__ ) ; } } /** * Klíčová vlastnost: NullLogger musí dědit z tohoto rozhraní jako každý jiný logger */ rozhraní Logger { veřejný log funkce ( string $ str ); } třída PrintLogger implementuje Logger { veřejný protokol funkcí ( string $ str ) { echo $ str ; } } class NullLogger implementuje Logger { veřejný protokol funkcí ( string $ str ) { // nedělat nic } } $ servicePrint = nová služba ( new PrintLogger ()); $ servicePrint -> doSomething (); // 'Jsme v DesignPatterns\Behavioral\NullObject\Service::doSomething' $ serviceNull = nová služba ( new NullLogger ()); $ serviceNull -> doSomething (); // (nedělat nic)

Příklad Java

Zdroj Java /* * Objekt Pattern Null. */ public class Hlavní { public static void main ( String [] args ) { AbstractEntity realEntity = new RealEntity (); realita . udělat něco (); // RealEntity::doSomething AbstractEntity unknownEntity = new NullEntity (); neznámáEntita . udělat něco (); // žádný výstup } } abstraktní třída _ _ public abstract void doSomething (); } class RealEntity rozšiřuje AbstractEntity { @Přepsat public void doSomething () { Systém . ven . println ( "RealEntity::doSomething" ); } } class NullEntity rozšiřuje AbstractEntity { @Přepsat public void doSomething () { } }

Příklad v Pythonu

Zdrojový kód v Pythonu # Pattern Null objekt. třída AbstractEntity : def doSomething ( sebe ): složit třída RealEntity ( AbstractEntity ): def doSomething ( sebe ): tisknout ( "RealEntity.doSomething" ) třída NullEntity ( AbstractEntity ): def doSomething ( sebe ): složit def main (): real_entity = RealEntity () skutečná_entita . udělat něco () neznáma_entita = NullEntity () neznámá_entita . udělat něco () if __name__ == "__main__" : hlavní ()

Ruby příklad

Zdrojový kód Ruby modul NullObject #Abstraktní Entita třída AbstractEntity def něco udělat zvýšit NoMethodError . Nový konec konec #RealEntity class RealEntity < AbstractEntity def něco udělat vloží "RealEntity > Udělej něco" konec konec # NullEntity class NullEntity < AbstractEntity def něco udělat nula konec konec konec #Klient modul Klient zahrnout NullObject realEntity = RealEntity . Nový nullEntity = NullEntity . Nový vloží "RealEntity:" # => RealEntity realita . doSomething # => RealEntity > DoSomething vloží "NullEntity:" # => NullEntity: nullEntity . udělej něco #not výstupu konec

Poznámky

  1. Woolf, Bobby. Pattern Languages ​​of Program Design 3  (neopr.) / Martin, Robert; Riehle, Dirk; Buschmann, Frank. — Addison-Wesley , 1998.
  2. http://sourcemaking.com/design_patterns/null_object Archivováno 15. června 2012 na Wayback Machine SourceMaking Tutorial

Odkazy