Objeto nulo (patrón de diseño)

La versión actual de la página aún no ha sido revisada por colaboradores experimentados y puede diferir significativamente de la versión revisada el 16 de septiembre de 2017; las comprobaciones requieren 15 ediciones .

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]

Descripción

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:

Estructura

En un diagrama de clases en UML , un patrón de diseño se representa de la siguiente manera:

Ejemplos

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 ()

Ejemplo de rubí

código fuente rubí módulo NullObject #EntidadAbstracta clase AbstractEntity def hacer algo generar NoMethodError . nuevo final final #EntidadReal clase RealEntity < AbstractEntity def hacer algo pone "RealEntity > Hacer algo" final final # Entidad Nula clase NullEntity < AbstractEntity def hacer algo nulo final final final #Cliente módulo Cliente incluir NullObject entidad real = entidad real . nuevo nullEntity = NullEntity . nuevo pone "RealEntity:" # => RealEntity entidad real . hacerAlgo # => RealEntity > HacerAlgo pone "Entidad Nula:" # => Entidad Nula: entidad nula . hacer algo #no salida final

Notas

  1. Woolf, Bobby. Lenguajes de patrones de diseño de programas 3  (neopr.) / Martin, Robert; Riehle, Dirk; Buschman, Frank. — Addison-Wesley , 1998.
  2. http://sourcemaking.com/design_patterns/null_object Archivado el 15 de junio de 2012 en el Tutorial de creación de código fuente de Wayback Machine .

Enlaces