Curso de Patrones de Diseño y SOLID en Python

Código funcional vs código mantenible en Python

Curso de Patrones de Diseño y SOLID en Python

Contenido del curso

Principios SOLID

Patrones de Diseño

Código funcional vs código mantenible en Python

Resumen

Aplicar principios SOLID y patrones de diseño en Python transforma un script funcional en un sistema mantenible, escalable y flexible. Si construyes procesadores de pagos o cualquier servicio backend, esta guía te muestra cómo evolucionar tu código desde una clase monolítica hasta una arquitectura modular lista para crecer.

¿Cómo evoluciona un procesador de pagos al aplicar SOLID?

Al inicio existía una sola clase con un método procesar_transacción que cargaba con todo: validar la información, cobrar contra la pasarela de Stripe, notificar al usuario y registrar la transacción en un log. Funcionaba, sí, pero violaba casi todos los principios SOLID.

La reconstrucción avanzó paso a paso, desde el principio de responsabilidad única hasta el principio de inversión de dependencias. Cada principio fue empujando el código hacia clases con un propósito claro y dependencias inyectadas en lugar de acopladas.

¿Qué son los principios SOLID? Son cinco reglas de diseño orientado a objetos que ayudan a escribir código mantenible: responsabilidad única, abierto/cerrado, sustitución de Liskov, segregación de interfaces e inversión de dependencias.

¿Qué cambió en la estructura del código en Python?

El resultado final usa módulos de Python para separar responsabilidades y define una clase específica por comportamiento. Ya no hay una clase haciendo todo, sino piezas pequeñas que colaboran entre sí.

  • Un módulo para validación de datos.
  • Un módulo para procesamiento de pagos contra Stripe.
  • Un módulo para notificaciones.
  • Un módulo para logging de eventos.

Esa separación es la base para que el sistema pueda escalar sin que cada cambio rompa otro componente.

¿Qué patrones de diseño se aplicaron al procesador de pagos?

A los principios SOLID se sumaron varios patrones de diseño que resolvieron problemas concretos del flujo de pagos. Cada uno entró con una razón clara, no por adornar el código.

  • Patrón builder: simplifica la instanciación de la clase principal, evitando constructores con demasiados parámetros.
  • Patrón factory: elige el procesador de pagos correcto según las circunstancias del pago, sin que el cliente conozca la clase concreta.
  • Decorador para logging: envuelve al servicio principal para registrar eventos sin modificar su lógica original.
  • Cadena de responsabilidad: valida la información paso a paso antes de procesar el cobro, permitiendo agregar nuevas validaciones sin tocar el flujo central.

¿Para qué sirve el patrón factory en un procesador de pagos? Sirve para decidir, en tiempo de ejecución, qué procesador concreto se usa según el tipo de transacción, sin acoplar al cliente con una clase específica.

¿Cómo se comporta el código final al ejecutarse?

Al correr el sistema reconstruido, el flujo replica el comportamiento del algoritmo inicial pero con mucho mejor arquitectura. Valida la información, procesa la transacción, notifica a los servicios correspondientes, envía la confirmación, registra el evento y retorna.

La verificación en Stripe confirma el cierre del ciclo: el cargo se aplica a la tarjeta correcta por el monto correcto. El requisito original, hacer una transacción real con Stripe, se cumple, ahora con una base preparada para crecer.

¿Por qué código que funciona no siempre es código mantenible?

Que un programa corra hoy no garantiza que sobreviva mañana. Un código que ignora los principios SOLID y carece de patrones de diseño termina siendo frágil, difícil de modificar y limitado frente a alta transaccionalidad.

El procesador de pagos inicial funcionaba, pero no aguantaría escala. La versión final también será reemplazada algún día, porque todo software envejece. La diferencia está en cuánto tiempo y con qué facilidad puedes mantenerlo, extenderlo y adaptarlo mientras siga vivo.

¿Cuál es la diferencia entre código funcional y código mantenible? El código funcional cumple su tarea hoy; el mantenible permite agregar funcionalidades, corregir errores y escalar sin reescribirlo desde cero.

Si construiste tu propio procesador siguiendo el curso, cuéntame en los comentarios qué patrón te resultó más útil y qué refactor aplicarías ahora a tu código de trabajo.