En la programación orientada a objetos, un objeto nulo es un objeto con cierto comportamiento neutral ("nulo"). El patrón de diseño de objeto nulo describe el uso de tales objetos y su comportamiento (o la falta del mismo). Publicado por primera vez en la serie de libros Pattern Languages of Program Design . [una]
En lenguajes orientados a objetos como Java o C# , los objetos pueden ser NULL . Las referencias a dichos objetos deben verificarse en busca de nulos antes de usarse, ya que los métodos de la clase de un objeto "nulo" generalmente no se pueden llamar.
El propósito de un objeto nulo es encapsular la ausencia de un objeto reemplazándolo con otro objeto que no hace nada.
Este patrón de diseño se recomienda cuando:
En un diagrama de clases en UML , un patrón de diseño se representa de la siguiente manera:
Ejemplo en C#
Texto fuente en C# /* * Un ejemplo del uso del patrón de objeto nulo: */ voidPrincipal ( ) { AbstractEntity realEntity = new RealEntity (); entidad real . hacer algo (); // RealEntity::hacerAlgo AbstractEntity unknownEntity = new NullEntity (); entidaddesconocida . hacer algo (); // ninguna salida } // Definir otros métodos y clases aquí clase abstracta pública AbstractEntity { public abstract void hacerAlgo (); } clase pública RealEntity : AbstractEntity { anulación pública vacío hacer algo () { consola _ WriteLine ( "EntidadReal::hacerAlgo" ); } } clase pública NullEntity : AbstractEntity { anulación pública vacío hacer algo () { // haciendo nada } }Ejemplo en PHP
codigo fuente php /* * Un ejemplo del uso del patrón de objeto nulo: */ declarar ( tipos_estrictos = 1 ); espacio de nombres DesignPatterns \ Behavioral \ NullObject ; clase de servicio { función pública __construct ( registrador privado $ registrador ) { } /** * hacer algo ... */ función pública hacer algo () { // observe aquí que no tiene que verificar si el registrador está configurado con, por ejemplo. is_null(), en su lugar solo úsalo $ this -> logger -> log ( ' Estamos en ' . __METHOD__ ) ; } } /** * Característica clave: NullLogger debe heredar de esta interfaz como cualquier otro registrador */ Registrador de interfaz { registro de función pública ( cadena $ str ); } clase PrintLogger implementa Logger { registro de función pública ( cadena $ str ) { echo $ cadena ; } } clase NullLogger implementa Logger { registro de función pública ( cadena $ str ) { // hacer nada } } $ servicePrint = nuevo Servicio ( nuevo PrintLogger ()); $ servicioImprimir -> hacerAlgo (); // 'Estamos en DesignPatterns\Behavioral\NullObject\Service::doSomething' $ serviceNull = nuevo Servicio ( nuevo NullLogger ()); $ serviceNull -> hacerAlgo (); // (hacer nada)ejemplo java
Fuente Java /* * Objeto Patrón Nulo. */ clase pública Principal { public static void main ( String [] args ) { AbstractEntity realEntity = new RealEntity (); entidad real . hacer algo (); // RealEntity::hacerAlgo AbstractEntity unknownEntity = new NullEntity (); entidaddesconocida . hacer algo (); // ninguna salida } } clase abstracta _ _ public abstract void hacerAlgo (); } clase RealEntity extiende AbstractEntity { @Anular public void hacerAlgo () { sistema _ fuera _ println ( "EntidadReal::hacerAlgo" ); } } clase NullEntity extiende AbstractEntity { @Anular public void hacerAlgo () { } }Ejemplo en Python
Código fuente en Python # Patrón Objeto nulo. clase AbstractEntity : def hacerAlgo ( self ): pasar clase RealEntity ( AbstractEntity ): def hacerAlgo ( self ): imprimir ( "RealEntity.hacerAlgo" ) clase NullEntity ( AbstractEntity ): def hacerAlgo ( self ): pasar def principal (): real_entity = RealEntity () entidad_real . hacer algo () unknown_entity = NullEntity () entidad_desconocida . hacer algo () si __nombre__ == "__principal__" : principal ()Patrones de diseño | |
---|---|
Principal | |
Generativo | |
Estructural | |
conductual | |
Programación en paralelo |
|
arquitectónico |
|
Plantillas Java EE | |
Otras plantillas | |
Libros | |
Alusiones personales |