Implementación del Principio Abierto-Cerrado en Procesadores de Pago y Notificadores
Clase 6 de 27 • Curso de Patrones de Diseño y SOLID en Python
Contenido del curso
- 2

Principio de Responsabilidad Única en Desarrollo de Software
05:59 - 3

Procesador de Pagos con Principios SOLID y Stripe
11:14 - 4

Aplicación del Principio de Responsabilidad Única en Procesador de Pagos
25:30 - 5

Principio Abierto-Cerrado en Desarrollo de Software
02:39 - 6

Implementación del Principio Abierto-Cerrado en Procesadores de Pago y Notificadores
14:46 - 7

Principio de Sustitución de Liskov en Desarrollo de Software
03:18 - 8

Aplicación del Principio de Sustitución de Liskov en Python
06:44 - 9

Principio de Segregación de Interfaces en Software
02:33 - 10

Implementación del Principio de Segregación de Interfaces en Procesadores de Pago
09:06 - 11

Principio de Inversión de Dependencias en Software
04:23 - 12

Aplicación del Principio de Inversión de Dependencias en Python
05:56
- 14

Introducción a los Patrones de Diseño de Software
03:54 - 15

Patrón Strategy en Diseño de Software con Python
01:55 - 16

Implementación del Strategy Pattern en Procesador de Pagos en Python
10:58 - 17

Patrón Factory Pattern en Python: Creación de Objetos Dinámicos
03:05 - 18

Patrón Factory en Procesadores de Pago en Python
11:06 - 19

Patrón Decorador: Añadir Responsabilidades Dinámicas a Objetos
03:06 - 20

Aplicación del Patrón Decorador en Servicios de Pago
12:57 - 21

Patrón de Diseño Builder: Construcción de Objetos Complejos
01:28 - 22

Builder Pattern para Servicio de Pagos en Python
18:55 - 23

Patrón Observer: Gestión de Eventos y Notificaciones Automáticas
01:48 - 24

Patrón Observer en Sistemas de Pago: Implementación y Notificaciones
11:12 - 25

Patrón Chain of Responsibility en Validación de Pagos
02:04 - 26

Implementación del patrón Chain of Responsibility en validaciones de pago
16:27 - 27

Principios SOLID y Patrones de Diseño en Procesadores de Pago
03:19
El principio de abierto-cerrado promueve la creación de código que permita extender funcionalidades sin modificar el comportamiento original. A continuación, veremos cómo se puede aplicar este principio en el contexto de un procesador de pagos que debe añadir nuevas pasarelas sin cambiar el código existente.
¿Cómo se aplica el principio abierto-cerrado en un procesador de pagos?
La clave para implementar el principio abierto-cerrado en un sistema de pagos es diseñar el código de manera que pueda admitir nuevas pasarelas sin modificar la estructura existente. Esto se logra utilizando clases abstractas o interfaces que actúan como intermediarios. Así, los procesadores de pagos específicos, como Stripe, pueden heredar de estas clases abstractas y añadir su propia lógica sin afectar el código original.
¿Qué cambios se hicieron para implementar una nueva pasarela?
Para incorporar una nueva pasarela de pagos en este caso:
- Se creó una nueva carpeta con ejemplos de antes y después de aplicar el principio abierto-cerrado.
- Los datos del cliente y el pago se refactorizaron utilizando Pydantic, que es la librería más popular en Python para validaciones de datos.
- Se introdujeron modelos de datos tipados para CustomerData y PaymentData, con campos claros como montos (enteros) y fuentes de pago (cadenas de texto).
¿Cómo se manejan los datos con Pydantic?
Pydantic permite definir modelos de datos que facilitan la validación y tipado. Por ejemplo, el modelo CustomerData contiene atributos como name (nombre del cliente) y contact_info (información de contacto), que incluye campos opcionales como teléfono o correo electrónico. Esto hace que la manipulación de datos sea más clara y segura.
¿Cómo se crean nuevas pasarelas de pagos usando clases abstractas?
Primero, se define una clase abstracta que representará un procesador de pagos. Esta clase no contiene lógica interna, sino que se utiliza para definir la firma del método principal, processTransaction. Los procesadores de pagos como Stripe implementan esta clase abstracta, heredando su forma y añadiendo la lógica específica para procesar las transacciones.
- Se define una clase abstracta
PaymentProcessorque incluye el métodoprocessTransaction. - Stripe, por ejemplo, hereda de esta clase abstracta para implementar su propia lógica de procesamiento.
- El servicio de pagos ya no depende de la implementación concreta de Stripe, sino que interactúa con la clase abstracta, lo que facilita añadir nuevas pasarelas sin tocar el código base.
¿Cómo se manejan las notificaciones de confirmación?
Se siguió una estrategia similar para las notificaciones. Al igual que con los procesadores de pagos, se creó una clase abstracta Notifier que define la firma del método SendConfirmation. Esto permite crear diferentes implementaciones, como un notificador por correo electrónico o un notificador por SMS, sin afectar la estructura del código original.
- Se introdujo un
EmailNotifiery unSMSNotifier, ambos heredando de la clase abstractaNotifier. - El código decide dinámicamente qué tipo de notificación enviar según los datos del cliente, ya sea por correo o por SMS.
¿Cómo se extendió el código sin modificar su estructura original?
Al final, el servicio de pagos se extendió para que permitiera enviar notificaciones vía SMS sin cambiar su base de código. Esto se logró creando una nueva clase SMSNotifier que también hereda de Notifier. El código puede cambiar entre el envío de correos o mensajes de texto con solo ajustar la implementación del servicio, cumpliendo así con el principio abierto-cerrado.