Cómo estructurar una app CLI con orientación a objetos

Clase 40 de 49Curso Práctico de Python: Creación de un CRUD

Resumen

Diseña una arquitectura clara en Python con orientación a objetos para un CLI: separa interfaz, lógica de negocio y modelos. Aquí verás cómo modelar un cliente, generar IDs con UUID4, convertir objetos a diccionario y persistir datos en CSV con un servicio dedicado. Todo con código conciso y listo para crecer.

¿Cómo organizar la arquitectura de la aplicación con paquetes y módulos?

En aplicaciones reales, separar responsabilidades acelera el desarrollo y evita errores. Se propone dividir en tres capas: interfaz (comandos del CLI), lógica de negocio (servicios) y abstracciones (modelos/objetos con los que se interactúa).

¿Qué estructura de archivos y paquetes usar en clientes?

  • Paquete clients con el módulo commands.
  • Script inicial para ejecutar el CLI.
  • setup.py para instalar la aplicación en el sistema.
  • Nuevos archivos: models.py y services.py dentro de clients.

¿Qué papel cumple la interfaz de CLI en comandos?

  • Define cómo el software interactúa con el exterior.
  • En CLI, son los comandos que el usuario ejecuta.
  • Si fuese web: la interfaz gráfica. Si fuera API: los endpoints abiertos.

¿Dónde ubicar la lógica de negocio y las abstracciones?

  • Lógica de negocio en servicios: abrir y escribir archivos, operaciones de lista y actualización.
  • Abstracciones en modelos: objetos como el cliente representados con clases.

¿Cómo modelar al cliente con clases, self, UUID y schema?

El objeto cliente concentra datos y utilidades para persistir. Se resalta el uso de self, la generación de UID con el módulo estándar de Python y una representación tipo diccionario para escribir en CSV.

  • Clase cliente con init y primer parámetro self en métodos de instancia.
  • Atributos: name, company, email, position y UID.
  • UID opcional: si no viene, se genera con UUID4 (estándar de la industria).
  • Conversión a diccionario con vars para escribir a disco en CSV.
  • Decorador @staticmethod para exponer el schema (columnas) sin instanciar la clase.
  • Nota sobre lógica booleana: se menciona el uso de all y que None evalúa a falso.
# models.py
import uuid

class Cliente:
    def __init__(self, name, company, email, position, uid=None):
        self.name = name
        self.company = company
        self.email = email
        self.position = position
        # si llega uid se usa; de lo contrario se genera uno único
        self.uid = uid or uuid.uuid4()

    def to_dict(self):
        # representación del objeto como diccionario, útil para CSV
        return vars(self)

    @staticmethod
    def schema():
        # columnas que representan al objeto en datos tabulares
        return ["name", "company", "email", "position", "uid"]

¿Cómo implementar el servicio de clientes y escribir en CSV?

La clase de servicio centraliza la lógica de negocio: sabe dónde guardar, en qué modo abrir y cómo transformar datos a filas tabulares. Así, los comandos solo orquestan y el servicio hace el trabajo.

¿Qué responsabilidades tiene ClientService en la creación?

  • Recibe el nombre de la tabla: el archivo CSV destino.
  • Abre el archivo en modo append para añadir nuevas filas.
  • Usa csv.DictWriter con fieldnames obtenidos de Cliente.schema() sin instanciar.
  • Escribe una fila a partir de client.to_dict().
# services.py
import csv
from clients.models import Cliente

class ClientService:
    def __init__(self, table_name):
        self.table_name = table_name

    def create_client(self, client):
        with open(self.table_name, mode="a", newline="") as f:
            writer = csv.DictWriter(f, fieldnames=Cliente.schema())
            writer.writerow(client.to_dict())

¿Cómo se conectan comandos, modelos y servicios?

  • Los comandos del CLI son la interfaz: reciben parámetros del usuario.
  • El servicio implementa la lógica: abrir, escribir y actualizar datos.
  • El modelo define la estructura: atributos, schema y conversión a diccionario.

¿Te gustaría comentar cómo extenderías este diseño para listar, actualizar o borrar clientes?