Nul-objekt (designmønster)

Den aktuelle version af siden er endnu ikke blevet gennemgået af erfarne bidragydere og kan afvige væsentligt fra den version , der blev gennemgået den 16. september 2017; checks kræver 15 redigeringer .

I objektorienteret programmering er et nulobjekt  et objekt med en bestemt neutral ("nul") adfærd. Null Object -designmønsteret beskriver brugen af ​​sådanne objekter og deres adfærd (eller mangel på samme). Først udgivet i Pattern Languages ​​of Program Design -bogserien . [en]

Beskrivelse

I objektorienterede sprog som Java eller C# kan objekter være NULL . Referencer til sådanne objekter skal kontrolleres for null, før de bruges, da metoderne i klassen af ​​et "null"-objekt generelt ikke kan kaldes.

Formålet med et Null-objekt er at indkapsle fraværet af et objekt ved at erstatte det med et andet objekt, der ikke gør noget.

Dette designmønster anbefales, når:

Struktur

I et klassediagram i UML er et designmønster repræsenteret som følger:

Eksempler

Eksempel i C#

Kildetekst i C# /* * Et eksempel på brug af Null Object-mønsteret: */ voidMain ( ) { AbstractEntity realEntity = ny RealEntity (); realEntity . gøre Noget (); // RealEntity::doSomething AbstractEntity unknownEntity = ny NullEntity (); ukendt Entitet . gøre Noget (); // ingen output } // Definer andre metoder og klasser her offentlig abstrakt klasse AbstractEntity { offentlig abstrakt void doSomething (); } offentlig klasse RealEntity : AbstractEntity { offentlig tilsidesættelse ugyldig gør Noget () { Konsol . WriteLine ( "RealEntity::doSomething" ); } } offentlig klasse NullEntity : AbstractEntity { offentlig tilsidesættelse ugyldig gør Noget () { // laver ingenting } }

Eksempel i PHP

PHP kildekode /* * Et eksempel på brug af Null Object-mønsteret: */ erklære ( strenge_typer = 1 ); navneområde DesignPatterns \ Behavioral \ NullObject ; serviceklasse _ { offentlig funktion __construct ( privat logger $ logger ) { } /** * gør noget ... */ offentlig funktion gør Noget () { // bemærk her at du ikke skal tjekke om loggeren er sat med f.eks. is_null(), brug det i stedet $ this -> logger -> log ( ' Vi er med ' .__ METHOD__ ); } } /** * Nøglefunktion: NullLogger skal arve fra denne grænseflade som alle andre loggere */ interface Logger { offentlig funktionslog ( streng $ str ) ; } klasse PrintLogger implementerer Logger { offentlig funktionslog ( streng $ str ) _ { echo $ str ; } } klasse NullLogger implementerer Logger { offentlig funktionslog ( streng $ str ) _ { // gøre ingenting } } $ servicePrint = ny tjeneste ( ny PrintLogger ()); $ servicePrint -> doSomething (); // 'Vi er i DesignPatterns\Behavioral\NullObject\Service::doSomething' $ serviceNull = ny tjeneste ( ny NullLogger ()); $ serviceNull -> doSomething (); // (gøre ingenting)

Java eksempel

Java kilde /* * Mønster Null objekt. */ offentlig klasse Main { public static void main ( String [] args ) { AbstractEntity realEntity = ny RealEntity (); realEntity . gøre Noget (); // RealEntity::doSomething AbstractEntity unknownEntity = ny NullEntity (); ukendt Entitet . gøre Noget (); // ingen output } } abstrakt klasse _ _ offentlig abstrakt void doSomething (); } klasse RealEntity udvider AbstractEntity { @Tilsidesæt public void doSomething () { System . ud . println ( "RealEntity::doSomething" ); } } klasse NullEntity udvider AbstractEntity { @Tilsidesæt public void doSomething () { } }

Eksempel i Python

Kildekode i Python # Mønster Nul objekt. klasse AbstractEntity : def gør Noget ( selv ): passere klasse RealEntity ( AbstractEntity ): def gør Noget ( selv ): print ( "RealEntity.doSomething" ) klasse NullEntity ( AbstractEntity ): def gør Noget ( selv ): passere def main (): real_entity = RealEntity () real_entity . gøre noget () unknown_entity = NullEntity () ukendt_enhed . gøre noget () hvis __navn__ == "__main__" : vigtigste ()

Ruby eksempel

Ruby kildekode modul NullObject #AbstractEntity klasse AbstractEntity def gør Noget hæv NoMethodError . ny ende ende #RealEntity klasse RealEntity < AbstractEntity def gør Noget sætter "RealEntity > Gør noget" ende ende # NullEntity klasse NullEntity < AbstractEntity def gør Noget nul ende ende ende #Klient modul klient inkludere NullObject realEntity = RealEntity . ny nullEntity = NullEntity . ny sætter "RealEntity:" # => RealEntity realEntity . doSomething # => RealEntity > DoSomething sætter "NullEntity:" # => NullEntity: nullEntity . doNoget #ikke output ende

Noter

  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 Arkiveret 15. juni 2012 på Wayback Machine SourceMaking Tutorial

Links