Pregunta

Supongamos que dividir sus sistemas en los objetos de valor y objetos de Servicios (como se sugiere en "Creciendo orientada a objetos de software, guiada por pruebas". Misko Hevery llama a estos "newables" y "inyectables".

¿Qué pasa cuando uno de sus objetos de valor necesita repentinamente el acceso a un servicio de ponerlo en práctica de métodos?

Digamos que usted tiene un objeto simple agradable Valor. Es inmutable, tiene unos pocos bits de información y eso es todo. Digamos que la usamos algo como esto:

CreditCard card = new CreditCard("4111-1111-1111-1111", "07/10");
if (card.isValid())
{
  // do stuff
} 
else
{
  // don't do stuff
}

Hasta aquí todo bien. implementos isValid() un algoritmo dígito de control sobre el número de tarjeta y vuelve verdadero / falso.

Ahora, digamos que me gustaría para mejorar el sistema mediante la validación de la fecha de caducidad para el tiempo actual. ¿Cómo sugieren esto se hace sin romper el valor del objeto / servicio objeto paradim? Quisiera esta clase para seguir siendo comprobable unidad.

  • CreditCard ahora tiene una dependencia, pero debido a la forma en que se crea que no se puede inyectar, por lo que la inyección de dependencia está fuera.
  • La clase CreditCard no debe estar llamando a Singleton (soy de la posición que el acceso global a un Singleton es una mala práctica)
  • Poner el comportamiento de CreditCardVerificationService.validateCard() significa todo el código existente tiene que ser revisada. La implementación de isValid () se está filtrando.

Sé que hay cosas que se pueden hacer para evitar esto, pero ¿cuál es la manera más limpia?

¿Fue útil?

Solución

Yo diría que no es el trabajo de un objeto de la tarjeta de crédito para validar cualquier cosa. Una fábrica validaría los dígitos de comprobación para asegurarse de que se ajusten instancias de un tarjeta, mientras que un servicio de verificación de validaría la tarjeta de caducidad / $ límite.

Otros consejos

Yo estaría tentado a decir que CreditCard no es un objeto de valor.

Desde el C2 wiki :

  

Ejemplos de objetos de valor son cosas   como números, fechas, importes y   instrumentos de cuerda. Por lo general, son pequeñas   objetos que se utilizan muy ampliamente.   Su identidad se basa en su estado   en lugar de en su identidad de objeto.   De esta manera, usted puede tener múltiples copias   del mismo valor de objeto conceptual.

     

A objeto de valor no es una   BusinessObject / ReferenceObject. UN   BusinessObject / ReferenceObject es   algo que se encuentra en el mundo, mientras   un ValueObject es una medida o   Descripción de algo.

Si CreditCardNumber podría ser un objeto de valor, CreditCard parece más a un objeto de negocio que contiene algo de lógica de negocio, por ejemplo, validación.

Por lo general tienen valor de los objetos, Servicio y negocios objeto. No sé sobre "Crecimiento de software orientado a objetos", pero restringe a sí mismo con sólo el valor de los objetos y de servicio, que parece extraño para mí.

Me llamaría CreditCard un la entidad en lugar de un valor del objeto , ya que es probable que sea persistente y tener una identidad única.

De todos modos, debe ser perfectamente bien para una clase de entidad a las clases de servicio uso. Si las implementaciones de dichos servicios no deben ser seleccionados en tiempo de ejecución dependiendo de la configuración externa, entonces yo simplemente instantiate y utilizar la clase de servicio deseada en el interior del método de cliente. Contrariamente a lo que algunos pueden pensar, esto no se oponen a una unidad de pruebas, como una herramienta de burla se puede utilizar para el aislamiento.

Si la implementación del servicio hace necesidad de ser seleccionado en tiempo de ejecución, que un Servicio de Localización podría ser utilizado. Este patrón puede proporcionar apoyo directo por burlarse / falsificar, sin la necesidad de una herramienta especializada burla. El uso de un marco de apoyo DI inyección en objetos "renovada" serían otra alternativa.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top