Principio de inversión de dependencias: servicio de pagos flexible
Clase 12 de 27 • Curso de Patrones de Diseño y SOLID en Python
Contenido del curso
Principios SOLID
- 2

Principio de responsabilidad única en SOLID
05:59 min - 3

Refactorizando código Python con principios SOLID
11:14 min - 4

Cómo aplicar SRP en un procesador de pagos con Stripe
25:19 min - 5

Open Closed Principle: extensión sin modificación
02:39 min - 6

Cómo usar clases abstractas en Python
14:46 min - 7

Principio de Liskov en S.O.L.I.D.
03:18 min - 8

Principio de sustitución de Liskov en Python
06:38 min - 9

Interface Segregation: cuándo separar contratos
02:33 min - 10

Segregación de interfaces en procesadores de pagos
09:05 min - 11

Principio de inversión de dependencias explicado
04:13 min - 12

Principio de inversión de dependencias: servicio de pagos flexible
Viendo ahora
Reestructuración del proyecto
Patrones de Diseño
- 14

Qué son los patrones de diseño: definición y categorías
03:54 min - 15

Strategy Pattern con Python y setprocessor
01:55 min - 16

Strategy Pattern para pagos en Python
10:58 min - 17

Factory Pattern: centralizar creación de objetos
03:05 min - 18

Patrón Factory para procesar pagos con match
11:06 min - 19

Patrón Decorator en 5 pasos para funcionalidad dinámica
03:06 min - 20

Patrón decorador en servicios de pagos
12:57 min - 21

Builder Pattern: construcción paso a paso
01:28 min - 22

Builder pattern para servicios de pagos
18:55 min - 23

Observer Pattern en sistemas de eventos
01:48 min - 24

Observer en sistemas de pagos con Python
11:11 min - 25

Chain of Responsibility para validar pagos
02:04 min - 26

Chain of Responsibility en servicios de pagos
16:27 min - 27

Arquitectura robusta para procesadores de pago
03:19 min
Aplicar el principio de inversión de dependencias en un servicio de pagos permite cambiar procesadores como Stripe u opciones offline sin tocar la lógica de alto nivel. Aquí verás cómo componer el Payment Service con protocolos, eliminar default factories e introducir inyección de dependencias para manejar cobros, recurrencias y reembolsos de forma limpia.
¿Qué asegura el principio de inversión de dependencias en el servicio de pagos?
El servicio (clase de alto nivel) no depende de detalles de clases de bajo nivel, sino de interfaces; en Python, de protocolos. Los detalles viven en los procesadores de pago que hablan con distintas pasarelas. Si se cambia el protocolo, se ajustan las implementaciones, pero el servicio se mantiene estable.
- Clase de alto nivel: Payment Service. Depende de protocolos, no de implementaciones concretas.
- Clases de bajo nivel: procesadores de pago, notificador, validadores, logger.
- Protocolos en Python: definen el contrato. La implementación puede variar sin afectar al servicio.
- Recurrencia y reembolsos: pueden usar la misma instancia del procesador (por ejemplo, Stripe) si cumple los protocolos.
- Beneficio clave: menor acoplamiento y mayor facilidad de reemplazo.
¿Cómo instanciar dependencias sin default factories?
Para cumplir a fondo el principio, se eliminan los default factories del servicio: la clase de alto nivel no debe saber cómo instanciar clases de bajo nivel. En su lugar, se reciben como dependencias ya construidas.
# Dependencias de bajo nivel
stripe_processor = StripePaymentProcessor()
email_notifier = EmailNotifier()
customer_validator = CustomerValidator()
payment_validator = PaymentValidator()
logger = TransactionLogger()
# Clase de alto nivel: composición explícita
payment_service = PaymentService(
payment_processor=stripe_processor,
notifier=email_notifier,
customer_validator=customer_validator,
payment_validator=payment_validator,
logger=logger,
recurrence_processor=stripe_processor, # reutiliza Stripe para recurrencia
refund_processor=stripe_processor # reutiliza Stripe para reembolsos
)
- default factories: se remueven del servicio para evitar acoplar construcción con lógica.
- Instanciación limpia: cada dependencia se crea fuera y se inyecta.
- Reutilización: Stripe cumple protocolos de recurrencia y reembolso, por eso se usa la misma instancia.
¿Cómo cambiar implementaciones con inyección de dependencias?
La inyección de dependencias permite intercambiar implementaciones sin modificar el servicio. Esto abre la puerta a usar un contenedor de inyección de dependencias en escenarios reales, aunque aquí se simula con composición manual.
# Nuevas implementaciones de bajo nivel
offline_processor = OfflineProcessor()
sms_notifier = SMSNotifier(gateway="custom_gateway")
# Segundo servicio con otras dependencias y sin recurrencia/reembolsos
second_service = PaymentService(
payment_processor=offline_processor,
notifier=sms_notifier,
customer_validator=customer_validator,
payment_validator=payment_validator,
logger=logger
)
- Intercambiabilidad: cambia Stripe por offline processor sin tocar la lógica de alto nivel.
- Notificadores: alterna entre Email Notifier y SMS notifier según necesidad.
- Configuración: elimina recurrencia y reembolsos cuando no aplican.
¿Qué habilidades y conceptos practicas?
- Diferenciar clase de alto nivel vs clases de bajo nivel.
- Programar contra interfaces/protocolos para reducir acoplamiento.
- Eliminar default factories en el servicio para respetar el principio.
- Aplicar inyección de dependencias para componer servicios flexibles.
- Reutilizar instancias cuando cumplen múltiples protocolos: menos complejidad.
- Preparar el terreno para un contenedor de inyección de dependencias más adelante.
¿De qué forma aplicarías el principio de inversión de dependencias en tu propio flujo de pagos o notificaciones? Comparte tu enfoque y, si te animas, integra los casos de cobro, recurrencia y reembolso practicando esta misma composición de dependencias.