¿Por qué el patrón de inyección de dependencia no se incluyó en la Banda de cuatro?

37

¿Por qué el patrón de inyección de dependencia no se incluyó en la pandilla de cuatro ? ¿El GOF fue anterior a las pruebas automatizadas generalizadas? ¿La inyección de dependencia ahora se considera un patrón central?

Tom Squires
fuente
18
.. porque "inyección de dependencia" no
Dipan Mehta
1
@DipanMehta stackoverflow.com/questions/823387/…
Tom Squires
14
Todo lo que se repite forma un patrón de repetición. Todos los elementos de diseño (que no son ideas únicas y locas) son "patrones".
S.Lott
3
Estas respuestas largas son probablemente engañosas, ya que validan la pregunta. Si bien, como se mencionó, la inyección de dependencia no es un patrón de diseño. Es un "mecanismo" para la creación de instancias de objetos, típicamente manejado por el marco.
Nazar Merza
1
La inyección de dependencia es un patrón . Se opone al patrón del Localizador de servicios. Lee Fowler, quien acuñó el término. No tengo ni idea de cómo tanta gente votó por esas tonterías.
James

Respuestas:

101

Fui editor de la revista Software Development cuando salió el libro Gang of Four y puedo decir con total confianza que las pruebas unitarias no eran una práctica generalizada en 1994, cuando se publicaron originalmente Design Patterns .

En 1994, C ++ era el lenguaje orientado a objetos más comúnmente utilizado, y la mayoría de las personas que lo programaban provenían de un fondo C. Una de las cosas de "pensar en objetos" que la gente simplemente no tenía es la idea de cientos o miles de puntos de entrada a su programa. Pensaste en el main(). Si trabajó en un proyecto grande, es posible que tenga un archivo MAKE (generalmente bastante elaborado) para crear un programa basado en módulos. ¿Pero "pruebas unitarias"? ¿Comenzar un proceso, construir el contexto de memoria necesario, ejecutarlo y derribarlo, por método ? Eso fue muy radical.

Java hizo que la programación de múltiples puntos de entrada fuera más obvia. En el momento del auge original de Dot-Com, las pruebas unitarias eran una técnica bien conocida, pero realmente era JUnit (¿alrededor de 2001?) Lo que hizo que se incendiara y se convirtiera en una práctica universal.

Aunque la estrategia y el concepto general de programación para una interfaz formaban parte de GoF y el espíritu de mediados de los 90, la idea de la inyección llegó bastante tarde a la fiesta (¿alrededor del '03 -'05?). Honestamente, mis canas todavía tienen dudas sobre ese aspecto de la DI ("¡Fuera de mi césped, malditos archivos de configuración!").

Larry OBrien
fuente
17
Lamento que solo tenga un voto para dar una respuesta tan perspicaz.
@Larry OBrien: la exploración de registros basados ​​en convenciones simplifica enormemente el código de configuración y prácticamente elimina la configuración xml en contenedores ioc.
quentin-starin
44
Me gustaría agregar que la inyección de dependencia en su núcleo no se basa en absoluto en los archivos de configuración. Puede hacerlo todo a mano, lo que lo hace muy fácil de usar y sigue siendo un enfoque muy flexible.
marco-fiset
31

Lo llamaron Estrategia .

Su estrategia parece tener todas las características de la inyección de dependencia sin el nombre de sonido complejo.

S.Lott
fuente
16
-1. ¡Lo siento! El patrón de estrategia no tiene nada que ver con la inyección de dependencia.
Dipan Mehta
14
@Dipan: antes de votar en contra de esto, será mejor que pienses en la respuesta cinco minutos.
Doc Brown
66
Es cierto que la Inyección de dependencia puede considerarse muy similar al Patrón de estrategia, pero cuando las personas dicen inyección de dependencia, generalmente se refieren a Inversión de control, que creo que es mucho más diferente de la Estrategia (especialmente el contenedor IoC).
MattDavey
8
DI es más un patrón de creación. Crea e inyecta estrategias. Decir que es una estrategia es solo la mitad de la verdad. ¡DI es más un patrón de microkernel! No puedo creer que la gente votara esto. La estrategia es más como un rasgo de buena DI, no una necesidad.
Falcon
0

Creo que la inyección de dependencia es más relevante cuando se separa la implementación en niveles. Otra área en la que pensamos en la inyección de dependencia es la prueba unitaria. Y su sugerencia previa parece ser correcta. Si la pandilla recolectara y segregara patrones en 2012, definitivamente la inyección de dependencia estaría allí.

La estrategia podría surgir en las discusiones, pero la estrategia no habla sobre la inyección de dependencia. Pero cuando se usa el patrón de estrategia en un solo proyecto o dll (todas las clases e interfaces permanecen en un proyecto) parece que estamos haciendo una inyección de dependencia. De hecho no lo somos.

Ahora, si las clases e interfaces mencionadas en el patrón de estrategia están separadas en diferentes proyectos o niveles, entonces tendremos que usar técnicas de inyección de dependencia. Podríamos usar archivos de configuración de la unidad (sin embargo, no es posible cambiar el tiempo de ejecución). Pero el patrón de estrategia no dice cómo inyectar una dependencia.

Si hay un patrón que se asemeja mucho a la inyección de dependencia, entonces es el patrón del método abstracto de fábrica. Este patrón podría usarse dentro de un patrón de estrategia para inyectar dependencia.

Nubes azules
fuente
2
Esto no responde la pregunta. Lea la pregunta original en lugar de responder a otras respuestas :)
Andres F.
-4

La estrategia de respuesta es 100% correcta. Lo voté pero puedo comentar.

"La estrategia permite que el algoritmo varíe independientemente de los clientes que lo usan. [1] La estrategia es uno de los patrones incluidos en el influyente libro Design Patterns de Gamma et al. Que popularizó el concepto de usar patrones para describir el diseño del software".

Un patrón de diseño no depende de su uso. La inyección de dependencia se implementa utilizando el patrón de estrategia. Si nombramos cada patrón en función del caso de uso, tendríamos que cambiar el nombre de muchos patrones.

El patrón de repositorio no es un patrón nuevo, es el Patrón de plantilla.

"En el método de plantilla de este patrón de diseño, las subclases pueden anular uno o más pasos del algoritmo para permitir diferentes comportamientos y garantizar que se siga el algoritmo general".

A menudo, los patrones son múltiples patrones combinados y nombrados como el patrón MVC.

El GOF no tenía interfaces con las clases Pure Abstract utilizadas, y también aprovechó la capacidad de C ++ para heredar de más de una clase.

Entrenador David
fuente
1
El propósito de un patrón es absolutamente importante para distinguir. Entre los patrones de GoF, Adaptador y Proxy son buenos ejemplos: tienen la misma forma, pero tienen un propósito diferente. También estoy en desacuerdo con su afirmación de que DI se implementa utilizando la estrategia; La estrategia es más específica en su propósito y en la forma en que se usa el objeto configurado, por lo que es más razonable decir que la Estrategia se implementa con DI.
Jules