¿Cómo es que la inyección de dependencia no solo mueve la complejidad a una clase separada?

9

He estado buscando usar el marco de Typhoon para la inyección de dependencia esta semana. Entiendo que separar la construcción de objetos es beneficioso para reemplazar componentes arbitrarios con simulacros durante las pruebas unitarias, y hasta ahora he visto beneficios de esto solo.

Pero no puedo evitar pensar que donde antes tenía una clase de controlador de vista enorme que tenía decenas de importaciones de encabezado, ahora tengo una clase de fábrica enorme que tiene decenas de importaciones de encabezado. ¿Se supone que debo evitar tener una clase de fábrica masiva?

Víctor
fuente
66
En una década espero que DI se haga cargo de la lista de ataques de Singleton, pero esta vez por buenas razones. Tiene algunos buenos usos, pero sugiero tener mucho cuidado al evaluar el impacto.
Balog Pal
55
No creo que la inyección de dependencias sea una forma de reducir la complejidad, sino una forma de evitar dependencias implícitas (uso de símbolos globales / variables libres) a favor de dependencias explícitas (usar parámetros explícitos / variables enlazadas). Entonces, la complejidad sigue ahí, pero se ve obligado a lidiar con ella porque la hace explícita en sus firmas de método / constructor.
Giorgio
77
Tenga en cuenta que casi cualquier sistema para organizar el código podría describirse como "simplemente trasladar la complejidad a otro lugar". No se trata de eliminar la complejidad sino de organizarla de la manera más lógica y útil.
1
Si tiene que importar 50 encabezados, debe hacerlo en alguna parte. DI lo ayuda con la forma más fácil de probar el código de su unidad.
BЈовић
2
Entonces, ¿estás diciendo que ahora tu controlador está enfocado en controlar y tu fábrica de importación de encabezados está enfocada en las importaciones de encabezados? ¿Cómo puede ser eso algo malo, ya sea que estés usando un marco DI o no?
pdr

Respuestas:

16

La inyección de dependencia simplemente ayuda a definir cómo un objeto sabe acerca de otro objeto dependiente. No le ayudará a reducir la complejidad general del sistema. Si necesitaba decenas de importación antes de DI, aún necesitará decenas de importaciones después. La diferencia es que estas importaciones se realizarán en una ubicación (clase) que tenga más sentido (fábrica, constructor, etc.).

Al permitir que se proporcionen las dependencias a través de un constructor o método, se le da la flexibilidad de proporcionar un objeto dependiente diferente, pero aún válido, a su clase y aumentar la cohesión de dicha clase al eliminar las preocupaciones.

Hay varios principios que son similares y que a menudo se usan juntos: Inyección de dependencia (DI), Inversión de control (IoC) y Principio de inversión de dependencia (DIP)

De este artículo http://martinfowler.com/articles/dipInTheWild.html

DI se trata de cableado, IoC se trata de dirección y DIP se trata de forma

Seth M.
fuente
2
+1, para la última cita. Es la mejor aclaración de estos 3 conceptos que las personas a menudo malinterpretan.
haylem
El artículo vinculado anterior es realmente excepcional. Una explicación suficientemente profunda y muy clara.
DemetriKots
10

La inyección de dependencia no reduce la complejidad, pero aumenta la capacidad de manipulación a través de la separación de preocupaciones y el acoplamiento reducido.

Pero no puedo evitar pensar que donde antes tenía una clase de controlador de vista enorme que tenía decenas de importaciones de encabezado, ahora tengo una clase de fábrica enorme que tiene decenas de importaciones de encabezado. ¿Se supone que debo evitar tener una clase de fábrica masiva?

Se supone que debes evitar las clases "enormes", punto. Digamos que divide el controlador de vista en clases más pequeñas y más fáciles de mantener. Ahora todos ellos son responsables de hacerse con sus dependencias. DI le ayuda a trasladar esta gestión de dependencias de todas esas clases a una clase de fábrica / configuración que solo es responsable de la gestión de dependencias; consulte el Principio de responsabilidad única. Y aunque sin duda será mucho menos "enorme" que el controlador de vista original, si se vuelve demasiado grande, siempre tiene la opción de dividirlo en clases más pequeñas de gestión de dependencias que son responsables de las diferentes partes de la aplicación.

Michael Borgwardt
fuente
2

En palabras simples:

La inyección de dependencia mueve la complejidad a donde hace menos daño.

EDITAR para @gnat: DI no solo está moviendo la complejidad a una clase separada, sino que la está moviendo a donde causa menos daño.

Tulains Córdova
fuente
¿Cómo responde esto a la pregunta que se hace?
mosquito
@gnat agregó una edición, mi respuesta explica en mi opinión cómo DI no solo mueve la complejidad a una clase separada.
Tulains Córdova