Obiect nul (model de design)

Versiunea actuală a paginii nu a fost încă revizuită de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită pe 16 septembrie 2017; verificările necesită 15 modificări .

În programarea orientată pe obiecte, un obiect nul  este un obiect cu un anumit comportament neutru ("null"). Modelul de proiectare Null Object descrie utilizarea unor astfel de obiecte și comportamentul lor (sau lipsa acestora). Publicat pentru prima dată în seria de cărți Pattern Languages ​​​​of Program Design . [unu]

Descriere

În limbaje orientate pe obiecte, cum ar fi Java sau C# , obiectele pot fi NULL . Referințele la astfel de obiecte trebuie verificate pentru null înainte de a fi utilizate, deoarece metodele clasei unui obiect „null” în general nu pot fi apelate.

Scopul unui obiect nul este să încapsuleze absența unui obiect prin înlocuirea acestuia cu un alt obiect care nu face nimic.

Acest model de design este recomandat atunci când:

Structura

Într -o diagramă de clasă în UML , un model de design este reprezentat după cum urmează:

Exemple

Exemplu în C#

Text sursă în C# /* * Un exemplu de utilizare a modelului Null Object: */ voidMain ( ) { AbstractEntity realEntity = new RealEntity (); realEntity . face ceva (); // RealEntity::do Something AbstractEntity unknownEntity = new NullEntity (); Entitate necunoscută . face ceva (); // nicio ieșire } // Definiți aici alte metode și clase clasă abstractă publică AbstractEntity { public abstract void doSomething (); } clasă publică RealEntity : AbstractEntity { public override void do Something () { Consola . WriteLine ( "RealEntity::doSomething" ); } } clasă publică NullEntity : AbstractEntity { public override void do Something () { // facand nimic } }

Exemplu în PHP

Cod sursă PHP /* * Un exemplu de utilizare a modelului Null Object: */ declara ( strict_types = 1 ); namespace DesignPatterns \ Behavioral \ NullObject ; clasa de serviciu { funcția publică __construct ( logger privat $ logger ) { } /** * Fă ceva ... */ funcție publică face ceva () { // observați aici că nu trebuie să verificați dacă logger-ul este setat cu de ex. is_null(), folosește-l în schimb $ this -> logger -> log ( ' Suntem în ' . __METODA__ ) ; } } /** * Caracteristică cheie: NullLogger trebuie să moștenească de la această interfață ca orice alt logger */ interfață Logger { jurnalul funcțiilor publice ( șir $ str ); } clasa PrintLogger implementează Logger { jurnalul funcțiilor publice ( șir $ str ) { echo $ str ; } } clasa NullLogger implementează Logger { jurnalul funcțiilor publice ( șir $ str ) { // nu face nimic } } $ servicePrint = serviciu nou ( nou PrintLogger ()); $ servicePrint -> doSomething (); // „Suntem în DesignPatterns\Behavioral\NullObject\Service::doSomething” $ serviceNull = serviciu nou ( nullLogger nou ()); $ serviceNull -> doSomething (); // (nu face nimic)

Exemplu Java

Sursa Java /* * Pattern Null obiect. */ clasă publică principală { public static void main ( String [] args ) { AbstractEntity realEntity = new RealEntity (); realEntity . face ceva (); // RealEntity::do Something AbstractEntity unknownEntity = new NullEntity (); Entitate necunoscută . face ceva (); // nicio ieșire } } clasa abstracta _ _ public abstract void doSomething (); } clasa RealEntity extinde AbstractEntity { @Trece peste public void face Something () { Sistem . afară . println ( "RealEntity::doSomething" ); } } clasa NullEntity extinde AbstractEntity { @Trece peste public void face Something () { } }

Exemplu în Python

Cod sursă în Python # Pattern Obiect nul. clasa AbstractEntity : def face Something ( self ): trece clasa RealEntity ( AbstractEntity ): def face Something ( self ): print ( „RealEntity.do Something” ) clasa NullEntity ( AbstractEntity ): def face Something ( self ): trece def main (): real_entity = RealEntity () entitate_reala . face ceva () unknown_entity = NullEntity () entitate_necunoscută . face ceva () if __name__ == "__main__" : principal ()

Exemplu Ruby

Cod sursă Ruby modulul NullObject #AbstractEntity clasa AbstractEntity def face Something ridicați NoMethodError . nou Sfârşit Sfârşit #RealEntity clasa RealEntity < AbstractEntity def face Something pune „RealEntity > Do Something” Sfârşit Sfârşit # NullEntity clasa NullEntity < AbstractEntity def face Something zero Sfârşit Sfârşit Sfârşit #Client modul Client include NullObject realEntity = RealEntity . nou nullEntity = NullEntity . nou pune „RealEntity:” # => RealEntity realEntity . doSomething # => RealEntity > DoSomething pune „NullEntity:” # => NullEntity: nullEntity . face Something #not output Sfârşit

Note

  1. Woolf, Bobby. Limbaje modele ale programului Design 3  (neopr.) / Martin, Robert; Riehle, Dirk; Buschmann, Frank. - Addison-Wesley , 1998.
  2. http://sourcemaking.com/design_patterns/null_object Arhivat 15 iunie 2012 la Wayback Machine SourceMaking Tutorial

Link -uri