Aplicación del Principio de Responsabilidad Única en Procesador de Pagos
Clase 4 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
Para aplicar el principio de responsabilidad única (SRP) sobre un procesador de pagos en Python, se debe organizar el código para que cada clase o método tenga una única responsabilidad. A continuación, te explicaré cómo refactorizar el código original, identificando responsabilidades y dividiéndolo en componentes más manejables.
¿Cómo estaba estructurado el código original?
El código inicial contenía varias responsabilidades en una sola clase llamada PaymentProcessor. Estas responsabilidades incluían:
- Validación de datos del cliente
- Validación de los datos de pago
- Procesamiento del pago con Stripe
- Envío de notificaciones (email o SMS)
- Registro de la transacción en logs
Este enfoque infringe el principio SRP, ya que una sola clase está encargada de múltiples tareas, lo que hace difícil mantener y escalar el código.
¿Cómo refactorizar el código aplicando SRP?
El primer paso fue identificar las distintas responsabilidades dentro de la clase. Se encontraron cuatro bloques importantes de responsabilidades:
- Validación de datos del cliente.
- Validación de datos del pago.
- Procesamiento del pago.
- Notificación y logging de transacciones.
¿Cómo organizar las nuevas clases?
1. ¿Cómo separar la validación de datos del cliente?
Se creó una clase CustomerValidation con el método validate, encargado exclusivamente de validar los datos del cliente, como nombre y contacto. El código de validación fue extraído de la clase PaymentProcessor y movido aquí.
2. ¿Cómo manejar la validación del pago?
Al igual que en la validación del cliente, se creó una clase PaymentDataValidator, encargada de validar los datos de pago, como la fuente de pago (por ejemplo, si se provee una tarjeta o token válido).
3. ¿Cómo procesar el pago sin romper SRP?
El procesamiento de pago es una responsabilidad que corresponde a la interacción con la API de Stripe. En este caso, se mantuvo esta lógica en una clase llamada StripePaymentProcessor, asegurando que solo procese pagos.
4. ¿Cómo gestionar las notificaciones?
Se creó una clase Notifier, que maneja el envío de notificaciones, ya sea por email o SMS. Esto ayuda a aislar la lógica de notificaciones del resto del código, permitiendo cambios futuros sin afectar otras partes.
5. ¿Cómo registrar logs de transacciones?
Se añadió una clase TransactionLogger dedicada al registro de las transacciones. Esta clase se encarga de capturar información de la transacción y guardarla en los logs del sistema.
¿Cómo coordinar todas estas clases?
Se unieron todas estas clases bajo una nueva entidad PaymentService, que orquesta la interacción entre ellas. Esta clase permite coordinar la validación, procesamiento, notificaciones y registro de transacciones de manera eficiente y con SRP.
¿Cómo se manejan los errores y excepciones?
Cada clase maneja sus propias excepciones, asegurando que las validaciones levanten errores específicos cuando los datos son incorrectos. Además, se agregó manejo de excepciones con try-except para capturar fallas en el procesamiento de pagos, lo que permite gestionar errores de manera controlada.