Principio de Inversión de Dependencias (DIP)
El Principio de Inversión de Dependencias (DIP) establece que los módulos de alto nivel no deberían depender de módulos de bajo nivel; ambos deberían depender de abstracciones. Además, las abstracciones no deben depender de los detalles, sino que los detalles deben depender de las abstracciones.
- ¿Por qué es importante?
Este principio promueve un diseño desacoplado, donde los cambios en los módulos de bajo nivel no afectan a los módulos de alto nivel. Facilita la extensibilidad y la testabilidad del código.
1. Ejemplo 1: Sin Cumplir DIP #
Código Malo (Violación del DIP) #
Problema: El módulo de alto nivel
Notificadordepende directamente del módulo de bajo nivelEnviarCorreo. Si necesitamos cambiar la forma de enviar notificaciones (por ejemplo, usar SMS o push notifications), tendremos que modificar la claseNotificador, rompiendo el principio.
Código Bueno (Aplicando DIP) #
Solución: Ahora
Notificadordepende de la abstracciónServicioNotificacion, no de la implementación concretaEnviarCorreo. Esto permite cambiar la forma de enviar notificaciones sin modificar la claseNotificador.
2. Ejemplo 2: Extensión sin Modificación #
Supongamos que ahora queremos enviar notificaciones por SMS además de correo.
Beneficio: Gracias a la abstracción
ServicioNotificacion, podemos agregar nuevas formas de notificación sin modificar el código existente deNotificador.
3. Beneficios de Aplicar el DIP #
- Desacoplamiento: Los módulos de alto nivel no dependen directamente de los módulos de bajo nivel.
- Facilidad de cambio: Las nuevas funcionalidades se pueden agregar sin modificar el código existente.
- Mayor testabilidad: Las dependencias pueden ser simuladas (mocked) durante las pruebas.
Siguiendo el Principio de Inversión de Dependencias (DIP), obtendrás un diseño más modular, flexible y mantenible. 😊
Resumen del tema
Conceptos clave #
- Principio de Inversión de Dependencias (DIP):
- Los módulos de alto nivel no deben depender de módulos de bajo nivel; ambos deben depender de abstracciones.
- Las abstracciones no deben depender de los detalles; los detalles deben depender de las abstracciones.
- Inversión de la Dirección de Dependencia: la lógica de negocio define los contratos/interfaces (
ServicioNotificacion) y las capas de infraestructura o detalle técnico (EnviarSMS,EnviarCorreo) los implementan. - Facilidad de Extensión: incorporar un nuevo canal de comunicación o driver de base de datos no exige cambiar la clase de alto nivel.
Qué debes recordar #
Haz que tus módulos de negocio dependan de interfaces abstractas y no de implementaciones técnicas concretas.