Inyección de dependencias
La inyección de dependencias es un principio de diseño que consiste en proporcionar las dependencias que una clase necesita desde fuera de ella, en lugar de que la clase las cree o gestione directamente. Esto mejora el bajo acoplamiento y facilita la prueba y la reutilización del código.
1. Ejemplo Malo: Sin Inyección de Dependencias #
Ejemplo Corregido: Con Inyección de Dependencias #
Explicación de la mejora: #
-
Desacoplamiento: Antes, el jugador creaba su propia arma dentro de la clase, lo que generaba un fuerte acoplamiento entre el jugador y el tipo específico de arma. Al inyectar la arma desde fuera (a través del constructor), el jugador ya no necesita saber qué tipo de arma está usando, solo sabe que tiene una que implementa la interfaz
Arma. -
Flexibilidad: Esto permite que el jugador pueda usar cualquier tipo de arma que implemente la interfaz
Arma(por ejemplo, una espada, martillo, o incluso una nueva arma que creemos en el futuro) sin necesidad de modificar la claseJugador. -
Testabilidad: Inyectar dependencias también facilita las pruebas unitarias, ya que puedes reemplazar el objeto
Armapor un objeto simulado o mock, sin necesidad de alterar la claseJugador.
En resumen, la mejora principal es hacer el código más flexible y reutilizable al permitir que las dependencias (en este caso, el tipo de arma) sean proporcionadas desde fuera en lugar de ser creadas dentro de la clase.
2. Otro ejemplo #
Ejemplo Malo: Sin Inyección de Dependencias #
Problemas en los Ejemplos Malos #
- Alto Acoplamiento:
OrderServiceestá directamente acoplado aCreditCardProcessor, dificultando cambios o sustituciones por otra implementación. - Dificultad en Pruebas: No es fácil probar
OrderServicede manera aislada porque no se puede sustituirCreditCardProcessorpor un mock. - Extensibilidad Limitada: Agregar un nuevo método de pago requiere modificar la lógica de
OrderService. - Reutilización:
OrderServiceno puede trabajar con cualquier implementación dePaymentProcessor, haciéndolo no reutilizable.
Ejemplo Corregido: Con Inyección de Dependencias #
Resumen del tema
Conceptos clave #
- Inyección de Dependencias (DI): técnica donde un objeto recibe las dependencias que necesita desde el exterior (normalmente por constructor) en lugar de instanciarlas internamente con
new. - Inversión de Control (IoC): separar la creación de objetos de su uso lógico y delegar la instanciación en contenedores de DI o en el código que configura la aplicación.
- Dependencia de Abstracciones: definir interfaces (
PaymentProcessor) para que la clase cliente (OrderService) interactúe con contratos y no con implementaciones concretas. - Beneficios: facilita el testing unitario con mocks, permite intercambiar componentes y reduce drásticamente el acoplamiento.
Qué debes recordar #
Inyecta las dependencias a través de interfaces para desacoplar tus clases, permitir la sustitución de componentes y hacer tu código fácilmente testeable.