2008-11-25 11 views
5

Hace poco vi this youtube tutorial en el patrón de diseño Objeto nulo. Aunque hubo algunos errores en él: como el NullCar que no hace nada crea un bucle infinito, el concepto fue bien explicado. Mi pregunta es, ¿qué haces cuando los objetos que pueden ser nulos tienen captadores y se usan en tu código? ¿Cómo sabes qué valor devolver por defecto? ¿O debería implementar este patrón dentro de todos los objetos? ¿Qué pasa si necesito devolver cadenas o primitivos? Estoy hablando desde una perspectiva Java.Pregunta de patrón de diseño de objeto nulo

EDIT: ¿no estaré negociando objetos nulos probando las pruebas de valor por defecto? Si no, porque no ?

Respuesta

4

Por lo que he entendido, la idea es que el valor del objeto nulo sea lo más parecido posible a "nada". Eso desafortunadamente significa que tienes que definirlo tú mismo. Como ejemplo, uso personalmente "" cuando no puedo pasar una Cadena nula, el número de objeto nulo para mí es -1 (principalmente porque por defecto la mayoría de las secuencias de bases de datos comienzan en 1 y las usamos para ítems id: sa lot so -1 es obvio que es un objeto nulo), con listas/mapas/conjuntos es Collections.EMPTY_SET, EMPTY_MAP o EMPTY_LIST y así sucesivamente. Si tengo una clase personalizada de la que tengo que crear un objeto nulo, elimino todos los datos reales y veo a dónde me lleva y luego aplico lo que acabo de mencionar hasta que esté "vacío".

Así que realmente no "sabe" qué valor devolver de manera predeterminada, solo tiene que decidirlo usted mismo.

8

El objetivo de un objeto nulo es evitar tener referencias nulas en el código. Los valores devueltos por los captadores de objetos nulos dependen de su dominio. Cero o cadena vacía son generalmente apropiados.

Si transponemos el patrón Objeto nulo a la vida real, lo que está preguntando es similar a preguntar "¿cuántos años tiene?".

Quizás su diseño se pueda mejorar ya que parece que no sigue el principio tell, don't ask.

EDITAR: el Null Object design pattern se usa normalmente cuando un objeto delega el comportamiento a otro objeto (como en Estrategia o Patrones de diseño de estado); como Tom Hawtin - tackline comentó, use Special Case Objects para objetos que devuelven valores.

+0

Creo que sería más exacto comentar que el contexto para el patrón Objeto nulo se cumple mejor con los tipos "tell, do not ask". Para los tipos que devuelven el valor, es más probable que se dirija a objetos de casos especiales. Posiblemente. –

+2

Wow, un zen tao como pista de programación ... :-) – PhiLho

2

¿qué haces cuando los objetos que pueden ser nulos tienen getters, y se usan en tu código? ¿Cómo sabes qué valor devolver por defecto?

¿Cómo sabes qué clases implementar? Esta es una pregunta de diseño, depende de la aplicación.

En general, el objetivo del patrón NullObject es admitir una refactorización Replace Conditional with Polymorphism en el caso especial donde el condicional es una comparación con el valor nulo del lenguaje de programación.

Una correcta implementación del ejemplo en el video requeriría la delegación del método driveCar en las clases Car. Las clases SlowCar y FastCar realizarían el ciclo, presumiblemente a través de una implementación compartida en una clase base, y el NullCar volvería inmediatamente.

En un contexto de Java, el atributo NullCar.speed probablemente sería un int sin casillero. Por lo tanto, establecerlo en null no es una opción.Probablemente esconderé el atributo detrás del descriptor de acceso y haré que NullCar.getSpeed presente una excepción. Cualquier código de cliente que necesitaría una prueba para evitar esta excepción pasaría a las clases de auto.

delegación de todas las operaciones que dependen directamente de un valor de velocidad que está disponible es una aplicación del principio Tell Don't Ask de diseño orientado a objetos mencionados por philippe

0

¿Cuál debe ser el punto de integración de patrón de diseño nulo en el código? Creo que los objetos DAO son el primer cliente de nivel para este patrón de diseño, ya que buscan una entidad en la base de datos y la devuelven simplemente.

La comprobación de nulabilidad de estos objetos contamina el código en la capa de servicio o en la capa de comando donde realmente se accede y se usa.

Comenta.

0

Debe devolver el objeto nulo para la clase que está obteniendo. Por ejemplo, si tiene una clase A con un getter que devuelve un objeto de la clase B, el getter NullA correspondiente debe devolver NullB.