En la página de Wikipedia sobre inyección de dependencias, la sección de desventajas nos dice esto:
La inyección de dependencia aumenta el acoplamiento al requerir que el usuario de un subsistema satisfaga las necesidades de ese subsistema.
con un enlace a un artículo contra la inyección de dependencia .
La inyección de dependencia hace que una clase use la interfaz en lugar de la implementación concreta. Eso debería resultar en una disminución del acoplamiento , ¿no?
¿Qué me estoy perdiendo? ¿Cómo aumenta la inyección de dependencia el acoplamiento entre clases?
dependency-injection
coupling
BЈовић
fuente
fuente
Respuestas:
La inyección de dependencia disminuye el acoplamiento entre una clase y su dependencia. Pero aumenta el acoplamiento entre una clase y su consumidor (ya que el consumidor necesita más información para crearlo) y la dependencia y su consumidor (ya que el consumidor necesita saber la dependencia a utilizar).
Muy a menudo, esta es una buena compensación. La clase no debería conocer los detalles sobre sus dependencias más allá de una interfaz, y debería ser responsabilidad de la aplicación vincular bits específicos de código.
fuente
Supongamos que tiene un subsistema
S
que depende de una conexión de base de datosD
. Sin inyección de dependencia, existe un acoplamiento relativamente estrecho entreS
yD
, porqueS
necesita saber cómo usarloD
y cómo crearlo. El resto del sistema, sin embargo, puede ser felizmente inconsciente de esta dependencia entreS
yD
.Con la inyección de dependencia, el acoplamiento entre
S
y seD
vuelve más flojo, porque elimina delS
conocimiento cómo crear unD
.S
solo necesita saber cómo usarlo. El mayor acoplamiento general proviene del hecho de que otras partes del sistema ahora necesitan saberD
y posiblemente cómo crear uno. El alcance de este aumento en el acoplamiento depende de cómoD
se inyecte la dependencia enS
:S
necesita una dependenciaD
y posiblemente el conocimiento de cómo crear una.S
través del cualD
se inyecta necesita una dependenciaD
y posiblemente el conocimiento de cómo crear uno.En cualquier caso, el número de clases que depende de los
D
aumentos y el conocimiento de cómo crear unD
todavía debe estar presente en algún lugar del sistema. Esto crea un aumento general del acoplamiento.fuente
S
necesidades debe suministrar una fábrica deD
, lo que significa que necesita saber quéS
usosD
(o al menos alguna interfaz de la misma).Estoy totalmente en desacuerdo con que aumenta el acoplamiento.
Sin inyección de dependencia, tiene un acoplamiento estrecho entre un subsistema y la implementación concreta de la dependencia.
Con la inyección de dependencia ha desacoplado el subsistema de la implementación de la dependencia.
Hacer el argumento de que aumenta el acoplamiento entre el consumidor y este subsistema es MUY cuestionable, ya que implica que el consumidor ahora está estrechamente vinculado a la dependencia requerida por el subsistema. Todo lo que significa es que está escribiendo un código estrechamente acoplado que une a su consumidor con la dependencia. Idealmente TODO su código está desacoplado.
Inyección de constructor:
La resolución de dependencia es manejada por un contenedor de inyección de dependencia o una fábrica. El consumidor puede obtener una implementación concreta del subsistema desde el contenedor de inyección de dependencia o una fábrica.
El consumidor no necesita saber cómo se ve el constructor del subsistema. No hay acoplamiento a la dependencia del subsistema.
Método de inyección:
Lo mismo que la inyección del constructor, excepto que ahora el consumidor necesita obtener una instancia concreta de la dependencia del contenedor o la fábrica (o incluso hacer que se inyecte el método / constructor) e inyectarlo en el método. Nuevamente, el consumidor no está acoplado a una implementación concreta de la dependencia.
TL; DR El peor caso para la inyección de dependencia en un subsistema es que el acoplamiento se cambia al código del consumidor. NO HAY UN INCREMENTO TOTAL EN EL ACOPLAMIENTO.
El mejor de los casos es que todos los sistemas ahora están acoplados libremente y la inyección de dependencia se controla a través de contenedores o fábricas de inyección de dependencia.
fuente