Aplicación del Principio de Inversión de Dependencias en Python
Clase 12 de 27 • Curso de Patrones de Diseño y SOLID en Python
Resumen
El principio de inversión de dependencias es clave para mejorar la arquitectura del código, y este ejemplo sobre el servicio de pagos lo ilustra perfectamente. En lugar de que la clase de alto nivel dependa de detalles de las clases de bajo nivel, se trabaja con abstracciones, lo que permite mayor flexibilidad al añadir nuevas funcionalidades.
¿Cumple el código con el principio de inversión de dependencias?
Sí, el código cumple con el principio desde el momento en que el servicio de pagos (clase de alto nivel) no depende directamente de los detalles de los procesadores de pagos, validadores o notificadores, sino de interfaces o protocolos. Esto significa que, si alguna de las implementaciones cambia, el servicio de alto nivel no requiere modificaciones, ya que interactúa únicamente con las abstracciones.
¿Qué detalles pueden mejorar para aplicar mejor el principio?
Aunque la implementación está alineada con el principio de inversión de dependencias, hay un detalle por mejorar: las clases de alto nivel aún instancian clases de bajo nivel dentro de sus atributos, como los validadores o el logger. Para eliminar esta dependencia, se recomienda remover esas “default factories” y en su lugar, inyectar todas las dependencias desde fuera del servicio. Esto garantizaría una mayor adherencia al principio.
¿Cómo se instancia el servicio de pagos aplicando el principio?
El código muestra claramente cómo se instancian las dependencias antes de crear el servicio de pagos. Se crea el procesador de pagos de Stripe, un notificador de email, los validadores de clientes y pagos, así como el logger. Luego, se pasa cada dependencia al PaymentService
, asegurando que el servicio de alto nivel no conozca los detalles internos de las clases de bajo nivel.
- Se instancia el procesador de Stripe y se reutiliza para recurrencias y reembolsos.
- Si se requiere un servicio con otro procesador, como uno offline, el cambio es sencillo porque las clases están desacopladas.
¿Cómo permite la inyección de dependencias mejorar la flexibilidad del código?
La inyección de dependencias facilita la flexibilidad, ya que permite cambiar las implementaciones sin modificar el servicio principal. Si en lugar de Stripe se requiere otro procesador o un notificador distinto como SMS, el código solo necesita ajustar las instancias que se pasan al servicio, sin afectar el código principal.