2012-06-05 10 views
10

En Dependency Injection, programamos en contra de una abstracción.Evitando la violación del Principio de abstracción reutilizada

Desde mi experiencia, puedo afirmar que la mayoría de las abstracciones en una aplicación tienen una relación 1: 1 con sus implementaciones. Esto es una violación de Reused Abstraction Principle.

Marcos Seeman sugerido en algunos de sus mensajes que podemos tener una implementación de objeto nulo para las abstracciones con el fin de evitar RAP violación (Esta sugerencia de Mark Seeman podría ser mi inferencia. Por favor me corrija si estoy equivocado cita a Mark en esto). Mi pregunta aquí es

  1. ¿Cómo hacer la implementación de objetos nulos?
  2. ¿Está bien violar RAP?

Respuesta

16

Personalmente me resulta útil para programar a una abstracción, incluso si no es sólo una aplicación de producción. En particular:

  • Incluso si sólo tienen una producción aplicación, que bien puede tener otras implementaciones en pruebas, ya sea falsificaciones en toda regla o se burla creados dinámicamente
  • Es una expresión más clara de las dependencias que dependiendo de la clase concreta en muchos casos. Por ejemplo, la clase concreta puede exponer a otros miembros públicos de los que no depende , por varias razones.

Eso sí, esta es una afirmación falsa para comenzar con:

En la inyección de dependencias que programar contra una abstracción.

Puede usar la inyección de dependencia con clases de hormigón con total facilidad. No hay nada que decir que tiene para crear interfaces para sus dependencias. La inyección de dependencia se refiere más a cómo obtiene su clase sus dependencias que a qué nivel de abstracción utiliza para expresarlas.

Así que, básicamente:

  • no hay que subestimar la importancia de "dobles" de prueba para implementar abstracciones, incluso si sólo tiene una implementación de producción
  • No tenga miedo a depender de la aplicación concreta si realmente lo desea, pero inyectar esa dependencia es aún más limpio que crearla dentro de su clase, donde realmente es una dependencia "propia"
  • No intente inyectar todo si el comportamiento de la dependencia no es ' t realmente un en teracción entonces puede que no desee inyectarlo. Por ejemplo, no comience a inyectar "proveedores de colecciones" solo para evitar crear instancias de List<T>; no necesita aislar su clase del comportamiento de List<T> para propósitos de prueba, por ejemplo.
+2

Pruebas! Las pruebas son las que me hacen abstraer cosas de mis clases el 98% del tiempo. Y los simulacros/imitaciones se aseguran de que siempre haya al menos dos "implementaciones". Aún así se siente raro. No entendí tu último punto sobre "interacciones" ... ¿qué son las interacciones y qué no? – stmax

+0

+1 dobles de prueba cuentan como implementaciones también –

+0

@stmax: me doy cuenta de que no lo expliqué terriblemente bien, es difícil poner mi dedo en la diferencia. Si algo se siente como un * servicio * de alguna descripción (que incluye sistemas de archivos, etc.), entonces se siente como una interacción. Si se trata de "solo un contenedor de datos" sin ningún tipo de comportamiento complicado que debamos ignorar para las pruebas (por ejemplo, una colección), entonces no es necesario inyectarlo habitualmente. –

Cuestiones relacionadas