Null objektum (tervezési minta)

Az oldal jelenlegi verzióját még nem ellenőrizték tapasztalt közreműködők, és jelentősen eltérhet a 2017. szeptember 16-án áttekintett verziótól ; az ellenőrzések 15 szerkesztést igényelnek .

Az objektumorientált programozásban a Null Object  egy bizonyos semleges („null”) viselkedésű objektum. A Null Object tervezési minta leírja az ilyen objektumok használatát és viselkedését (vagy annak hiányát). Először a Pattern Languages ​​of Program Design könyvsorozatban jelent meg . [egy]

Leírás

Az objektum-orientált nyelvekben , mint például a Java vagy a C# , az objektumok NULL értékűek lehetnek . Az ilyen objektumokra való hivatkozásokat használat előtt ellenőrizni kell, hogy nincs-e nulla, mivel a "null" objektumok osztályának metódusai általában nem hívhatók meg.

A Null-objektum célja egy objektum hiányának beágyazása oly módon, hogy egy másik objektummal helyettesíti, amely nem csinál semmit.

Ez a tervezési minta akkor javasolt, ha:

Szerkezet

Az UML osztálydiagramjában a tervezési minta a következőképpen jelenik meg:

Példák

Példa a C# -ban

Forrásszöveg C# nyelven /* * Példa a Null Object minta használatára: */ voidMain ( ) { AbstractEntity realEntity = new RealEntity (); realEntity . doSomething (); // RealEntity::doSomething AbstractEntity unknownEntity = new NullEntity (); ismeretlen entitás . doSomething (); // nincs kimenet } // Itt definiálhat más metódusokat és osztályokat nyilvános absztrakt osztály AbstractEntity { public abstract void doSomething (); } nyilvános osztály RealEntity : AbstractEntity { nyilvános felülírás érvénytelen doSomething () { Konzol . WriteLine ( "RealEntity::doSomething" ); } } nyilvános osztály NullEntity : AbstractEntity { nyilvános felülírás érvénytelen doSomething () { // semmittevés } }

Példa PHP -ben

PHP forráskód /* * Példa a Null Object minta használatára: */ deklarál ( szigorú_típusok = 1 ); névtér DesignPatterns \ Behavioral \ NullObject ; szolgáltatási osztály { public function __construct ( privát naplózó $ naplózó ) { } /** * csinálj valamit ... */ nyilvános funkció doSomething () { // itt vegyük észre, hogy nem kell ellenőrizni, hogy a logger be van-e állítva pl. is_null(), ehelyett csak használja $ this -> logger -> log ( ' Benne vagyunk ' . __METHOD__ ) ; } } /** * Főbb jellemzők: A NullLoggernek erről a felületről kell örökölnie, mint bármely más naplózónak */ interfész Logger { nyilvános függvénynapló ( string $ str ) ; } osztályú PrintLogger a Loggert valósítja meg { nyilvános függvénynapló ( string $ str ) _ { echo $ str ; } } osztály NullLogger a Loggert valósítja meg { nyilvános függvénynapló ( string $ str ) _ { // ne csinálj semmit } } $ servicePrint = új szolgáltatás ( új PrintLogger ()); $ servicePrint -> doSomething (); // 'A DesignPatterns\Behavioral\NullObject\Service::doSomething mappában vagyunk' $ serviceNull = új szolgáltatás ( new NullLogger ()); $ serviceNull -> doSomething (); // (ne csinálj semmit)

Java példa

Java forrás /* * Pattern Null objektum. */ public class { public static void main ( String [ ] args ) { AbstractEntity realEntity = new RealEntity (); realEntity . doSomething (); // RealEntity::doSomething AbstractEntity unknownEntity = new NullEntity (); ismeretlen entitás . doSomething (); // nincs kimenet } } absztrakt osztály _ _ public abstract void doSomething (); } class RealEntity kiterjeszti AbstractEntity { @Felülbírálás public void doSomething () { Rendszer . ki . println ( "RealEntity::doSomething" ); } } class NullEntity kiterjeszti AbstractEntity { @Felülbírálás public void doSomething () { } }

Példa Pythonban

Forráskód Pythonban # Pattern Null objektum. osztály AbstractEntity : def doSomething ( self ): pass osztály RealEntity ( AbstractEntity ): def doSomething ( self ): print ( "RealEntity.doSomething" ) osztály NullEntity ( AbstractEntity ): def doSomething ( self ): pass def main (): real_entity = RealEntity () real_entity . csinálj valamit () unknown_entity = NullEntity () ismeretlen_entitás . csinálj valamit () if __name__ == "__main__" : ()

Ruby példa

Ruby forráskód modul NullObject #AbstractEntity osztály AbstractEntity def doSomething NoMethodError emelése . új vége vége #RealEntity osztály RealEntity < AbstractEntity def doSomething felteszi : "RealEntity > Do Something" vége vége # NullEntity osztály NullEntity < AbstractEntity def doSomething nulla vége vége vége #Ügyfél modul kliens tartalmazza a NullObject-et realEntity = RealEntity . új nullEntity = NullEntity . új " RealEntity :" # => RealEntity realEntity . doSomething # => RealEntity > DoSomething " NullEntity :" # => NullEntity: nullEntity . csinál Valamit #nincs kimenet vége

Jegyzetek

  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 Archiválva : 2012. június 15. a Wayback Machine SourceMaking oktatóprogramjában

Linkek