Refactorizando código Python con principios SOLID
Clase 3 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
Viendo ahora - 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
05:56 min
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
Construye un procesador de pagos en Python con Stripe aplicando principios SOLID y patrones de diseño desde un código base que concentra demasiadas responsabilidades. Aquí se explica el flujo inicial: validaciones, configuración de Stripe con variable de entorno, creación del cargo, manejo de errores con try/except, notificaciones por email o teléfono mediante mock, y registro en archivo transactions.log.
¿Cómo funciona el código inicial del procesador de pagos?
El punto de partida es una sola clase con un único método: process_transaction. Recibe dos parámetros: customer data y payment data. Primero realiza tres validaciones: nombre del consumidor, información de contacto y fuente de pago. Luego configura Stripe leyendo la API key desde variables de entorno, crea el cargo con monto, moneda por defecto en dólares, source y descripción, maneja errores con try/except, envía notificaciones por email o teléfono con una pasarela simulada y, finalmente, agrega una línea al archivo transactions.log con quién pagó, por cuánto y el estatus del cobro.
- Validaciones: nombre, contacto y source de pago presentes.
- Configuración de Stripe: lectura de la API key desde entorno.
- Cargo: monto en centavos, moneda por defecto en dólares, source y descripción.
- Errores: try/except para detectar fallos del pago.
- Notificaciones: por email (servidor de SNTP comentado) o por teléfono con mock.
- Log: se hace append en transactions.log con pagador, monto y estatus final.
Ejemplo de la estructura en Python:
class PaymentProcessor:
def process_transaction(self, customer_data, payment_data):
# 1) Validaciones de nombre, contacto y source.
# 2) Configurar Stripe con la API key de entorno.
# 3) Crear cargo: amount (centavos), currency (usd), source, description.
# 4) Manejar errores con try/except.
# 5) Notificar por email o teléfono (mock si no hay integración real).
# 6) Registrar en transactions.log (append con pagador, monto, estatus).
pass
¿Qué flujos de pago y notificación se demuestran con stripe?
Se presentan dos escenarios completos usando la pasarela de Stripe y datos de prueba.
- Caso 1: pago de 100 centavos (1 dólar) con cliente que tiene email. Se imprime en consola de debugging que el pago fue exitoso y se “envía” un email de confirmación. En transactions.log queda: “John Doe pagó cien” con estatus “succeeded”.
- Caso 2: pago de 500 centavos (5 dólares) con cliente que tiene teléfono y token de Mastercard. No se usa email, sino mock de SMS con el mensaje “Gracias por el pago”. En transactions.log se agrega: “Platzi Python pagó quinientos centavos” con estatus exitoso. En el panel de Stripe se ve la última transacción por 5 dólares con Mastercard.
Detalles clave del uso de Stripe mencionados:
- Los montos se envían en centavos de dólar.
- El source puede ser un token (por ejemplo, Visa o Mastercard) o un número de tarjeta de prueba.
- La API key se lee desde variables de entorno y se asigna a stripe.api_key.
Ejemplo de configuración de entorno y API key:
from dotenv import load_dotenv
import os, stripe
load_dotenv() # Lee el archivo .env del paquete.
stripe.api_key = os.getenv("STRIPE_API_KEY")
Ejemplo de notificación simulada:
contact = customer_data.get("contact_info", {})
if "email" in contact:
print("Email enviado: gracias por su pago.")
elif "phone" in contact:
print("SMS enviado: gracias por el pago.")
else:
print("No hay información para poder notificar.")
¿Qué habilidades y conceptos clave se practican con principios solid?
El enfoque es refactorizar un procesamiento “todo en uno” hacia un diseño mantenible aplicando principios SOLID y patrones de diseño. Se trabajan prácticas esenciales de ingeniería de software y de integración con pasarelas de pago.
- Principios SOLID: reducir responsabilidad única, aislar dependencias y facilitar refactorización progresiva.
- Validación de datos: verificar nombre, contacto y source antes de cobrar.
- Variables de entorno: centralizar secretos como la API key de Stripe usando dotenv y load_dotenv.
- Manejo de errores: capturar fallos con try/except y reaccionar adecuadamente.
- Servicios externos con mock: simular email (servidor de SNTP comentado) y SMS cuando no hay implementación real.
- Registro de transacciones: persistir en transactions.log para auditoría simple.
- Depuración: uso de break point y ejecución paso a paso para verificar el flujo.
- Stripe tokens: cambiar de Visa a Mastercard según el caso y confirmar el resultado en el panel de Stripe.
Si te quedó alguna duda sobre la cuenta de desarrollador de Stripe o el uso de tokens de prueba, deja tus preguntas en los comentarios y comparte tu avance.