Patrones de Diseño y Principios SOLID
Patrones de Diseño y Principios SOLID en Python para Procesadores de Pago
Principios SOLID
Principio de Responsabilidad Única en Desarrollo de Software
Procesador de Pagos con Principios SOLID y Stripe
Aplicación del Principio de Responsabilidad Única en Procesador de Pagos
Principio Abierto-Cerrado en Desarrollo de Software
Implementación del Principio Abierto-Cerrado en Procesadores de Pago y Notificadores
Principio de Sustitución de Liskov en Desarrollo de Software
Aplicación del Principio de Sustitución de Liskov en Python
Principio de Segregación de Interfaces en Software
Implementación del Principio de Segregación de Interfaces en Procesadores de Pago
Principio de Inversión de Dependencias en Software
Aplicación del Principio de Inversión de Dependencias en Python
Reestructuración del proyecto
Reestructuración de Código con Módulos en Python y Principios SOLID
Patrones de Diseño
Introducción a los Patrones de Diseño de Software
Patrón Strategy en Diseño de Software con Python
Implementación del Strategy Pattern en Procesador de Pagos en Python
Patrón Factory Pattern en Python: Creación de Objetos Dinámicos
Patrón Factory en Procesadores de Pago en Python
Patrón Decorador: Añadir Responsabilidades Dinámicas a Objetos
Aplicación del Patrón Decorador en Servicios de Pago
Patrón de Diseño Builder: Construcción de Objetos Complejos
Builder Pattern para Servicio de Pagos en Python
Patrón Observer: Gestión de Eventos y Notificaciones Automáticas
Patrón Observer en Sistemas de Pago: Implementación y Notificaciones
Patrón Chain of Responsibility en Validación de Pagos
Implementación del patrón Chain of Responsibility en validaciones de pago
Principios SOLID y Patrones de Diseño en Procesadores de Pago
No tienes acceso a esta clase
¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera
El patrón Chain of Responsibility es una herramienta poderosa que permite crear cadenas de validaciones de manera flexible y estructurada. En esta guía, exploraremos cómo aplicar este patrón a un servicio de procesamiento de pagos, modificando su arquitectura para utilizar una cadena de responsabilidades que valide tanto el cliente como los datos de pago.
Para comenzar, es necesario encapsular los datos del cliente y del pago en una clase que llamaremos Request
. Utilizando la librería Pydantic con BaseModel
, podemos crear esta estructura de datos fácilmente.
from pydantic import BaseModel
from payment_data import PaymentData
from customer import CustomerData
class Request(BaseModel):
customerData: CustomerData
paymentData: PaymentData
El siguiente paso es definir una clase abstracta que dictará la forma que deberán tomar las validaciones dentro de la cadena. Utilizaremos el módulo ABC
para crear una clase abstracta que denominaremos ChainHandler
.
from abc import ABC, abstractmethod
from typing import Self
from dataclasses import dataclass
@dataclass
class ChainHandler(ABC):
nextHandler: Self = None
def setNext(self, handler: Self) -> Self:
self.nextHandler = handler
return handler
@abstractmethod
def handle(self, request: Request):
pass
Para integrar la validación de clientes, crearemos una clase CustomerHandler
que extienda ChainHandler
y utliza un validador previamente definido.
from validations import CustomerValidator
class CustomerHandler(ChainHandler):
def handle(self, request: Request):
validator = CustomerValidator()
try:
valid = validator.validate(request.customerData)
if self.nextHandler:
self.nextHandler.handle(request)
except Exception as e:
print("Error:", e)
raise e
Una vez que tengamos los Handlers
, debemos modificar el servicio de pagos para utilizar la cadena de responsabilidades y no depender de válidus individuales.
from commons import Request
def some_service_method(customer_data, payment_data):
try:
request = Request(customerData=customer_data, paymentData=payment_data)
validator.handle(request)
except Exception as e:
print("Error en las validaciones")
raise e
Para integrar el nuevo sistema de validaciones dentro del builder, añadiremos un método que configure la cadena de validación. Nos aseguramos de que el builder retorne el tipo correcto y se encadene correctamente.
from customer_handler import CustomerHandler
from typing import Optional
class PaymentServiceBuilder:
validator: Optional[ChainHandler] = None
def setChainOfValidations(self) -> Self:
customer_handler = CustomerHandler()
self.validator = customer_handler
return self
def build(self):
# Lógica adicional de construcción
...
En el método principal donde se configura el servicio de pagos, eliminamos los antiguos métodos de configuración de validadores y añadimos el nuevo método para definir la cadena de validaciones.
builder = PaymentServiceBuilder()
builder.setChainOfValidations()
Este enfoque no solo mejora la organización del código, sino que también facilita la extensión de comportamiento al permitir añadir fácilmente más validadores a la cadena. Animamos a los estudiantes a seguir explorando y expandiendo esta implementación según sus necesidades específicas. ¡Continúen aprendiendo!
Aportes 2
Preguntas 1
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?