Arquitectura del Sistema - PowerSystem2024/CapybaraFilms_ProyectoTercerSemestre GitHub Wiki

arquitc

🎯 Introducción

Esta sección profundiza en la arquitectura por capas implementada en Capybara Films. Si todavía no leíste la 📘 Guía general del sistema, allí vas a encontrar una introducción más visual y resumida.

A continuación, se detalla el propósito y funcionamiento de cada una de las capas del sistema desde una perspectiva más técnica, incluyendo decisiones de diseño, responsabilidades, y cómo interactúan entre sí.

📖 Contenido:


🏗️ Arquitectura del Sistema

📌 El sistema sigue una arquitectura por capas, combinada con el patrón DAO para el acceso a datos. Esta organización favorece la separación de responsabilidades y facilita el mantenimiento y la escalabilidad del proyecto.

ArquitecturaCapybaraFilms


🖥️ Capa de Presentación

La Capa de Presentación actúa como el punto de entrada del sistema y coordina el flujo principal del proceso de reserva. En esta aplicación, está representada por el archivo main.py.

Aunque no contiene lógica de negocio, esta capa es responsable de inicializar y conectar todas las partes del sistema antes de comenzar la ejecución. También se encarga de manejar errores y asegurar que los pasos del flujo se ejecuten en orden y de forma segura.

⚙️ Inicialización de dependencias

Antes de iniciar el proceso de reserva, main.py configura manualmente todos los componentes necesarios del sistema. Esta inicialización de dependencias incluye:

  • Instancia única de conexión a la base de datos: Se crea un solo objeto DatabaseConnection, compartido entre todos los DAOs.

  • Creación de DAOs: Se instancian los objetos ClienteDAO, PeliculaDAO, SalaDAO, ButacaDAO, ReservaDAO y CandyDAO, cada uno con la conexión previamente creada.

  • Instanciación de servicios: Se configura el servicio CineServices, al que se le inyectan los DAOs y el ServicioValidacion.

Este patrón de inyección de dependencias manual permite que cada componente reciba exactamente lo que necesita sin crear sus propias dependencias internas, lo que facilita el mantenimiento y las pruebas del sistema.

📄 Ver código en main.py, líneas 19–29

🛡️ Validación secuencial del flujo

El flujo de reserva sigue un patrón de validación paso a paso, donde cada etapa depende del éxito de la anterior. Si algo falla, la ejecución se detiene inmediatamente para evitar inconsistencias.

Características clave de este enfoque:

  • Ejecución inmediata ante fallos: Si una función devuelve None o datos inválidos, el programa hace return y no continúa con los siguientes pasos.

  • Mensajes contextuales: Cada validación fallida genera un mensaje claro al usuario, indicando el motivo del error.

  • Integridad del sistema: Esto asegura que no se creen reservas con datos incompletos o inválidos.

📄 Ver ejemplo en main.py, líneas 41–43

📋 Pasos del Flujo de Reserva llevados a cabo por main.py

A continuación, se listan los pasos del flujo de reserva coordinado desde main.py, junto con sus enlaces al código correspondiente:



🧠 Capa de Servicios

La capa de servicios services proporciona la lógica de negocio central que orquesta las interacciones del usuario, la gestión del flujo de trabajo y la validación para el sistema de reserva de cine Capybara Films. Esta capa se sitúa entre el punto de entrada de la aplicación main.py y la capa de acceso a datos (data), implementando los flujos de trabajo de reserva principales, desde la validación del cliente hasta la finalización de la reserva.

Aquí se implementan las reglas y procesos para:

  • Orquestación de Flujos de Trabajo: Coordina los pasos lógicos del proceso de reserva de cine.

  • Validación de Entrada: Asegura que los datos proporcionados por el usuario sean válidos antes de procesarlos.

  • Interacción con la Capa de Datos: Actúa como intermediario entre la lógica de negocio y las operaciones de persistencia de datos.

  • Manejo de Lógica Específica del Negocio: Implementa las reglas únicas del negocio Capybara Films.

Componentes de la Capa de Servicios

Servicios Funcionalidad Dependencias clave
CineServices Gestiona todo el flujo de reserva, orquesta los pasos e interactúa con el usuario Todos los DAO, ServicioValidacion
ServicioValidacion Realiza validaciones, controla la integridad de los datos y gestiona clientes DatabaseConnection, ClienteDAO, Cliente

📌 Esta capa no realiza consultas SQL directas, sino que se comunica con la base de datos a través de los objetos DAO (Data Access Objects) definidos en la capa de acceso a datos.

Interacciones de la Capa de Servicios

image

Patrones Clave de Integración

  • Integración de Validación: CineServices delega la validación de entrada a ServicioValidacion, promoviendo la separación de responsabilidades.

  • Coordinación de DAOs: Los métodos de negocio orquestan múltiples operaciones de DAO para flujos de trabajo complejos (ej., una reserva de butaca puede implicar actualizar el estado de la butaca y crear una entrada en la tabla de reservas).

  • Gestión de Estado: Los servicios gestionan las transiciones de estado de los objetos de negocio (ej., el cambio de estado de una butaca de "disponible" a "reservada").

  • Interacción con el Usuario: Los servicios manejan la entrada/salida de la consola y las indicaciones al usuario dentro de la lógica de negocio, haciendo que el flujo sea interactivo.

Validación y Manejo de Errores

Los servicios de negocio implementan patrones exhaustivos de validación y manejo de errores para garantizar la robustez y la experiencia del usuario.

Tipos de Validación de Entrada

Estrategias de Manejo de Errores

  • Bloques try-catch: Utilizados para encapsular operaciones de base de datos y otros puntos de fallo conocidos, permitiendo una recuperación o registro elegante.

  • Bucles de Validación de Entrada: Implementados para solicitar repetidamente al usuario una entrada válida hasta que se cumplan los criterios, acompañados de mensajes de error amigables.

  • Degradación Elegante: El sistema está diseñado para manejar situaciones donde los recursos no están disponibles, intentando continuar el proceso o informando al usuario de manera adecuada.

  • Normalización Unicode: Soporte para caracteres internacionales mediante la normalización Unicode, lo que previene problemas con codificaciones de texto en las entradas del usuario.

Dependencias de los Servicios

La capa de servicios de negocio mantiene relaciones de dependencia limpias y bien definidas para su funcionamiento.

Tipo de Dependencia Descripción Ejemplos
Entidades de Dominio Objetos de negocio y tipos que representan conceptos del dominio Cliente, Pelicula, Butaca, TipoCandy
Objetos de Acceso a Datos (DAOs) Capa de interacción con la base de datos ClienteDAO, PeliculaDAO, ButacaDAO, ReservaDAO, CandyDAO
Librerías del Sistema Módulos estándar de Python para funcionalidades básicas sys, os, unicodedata
Servicio a Servicio Dependencias entre las propias clases de servicio CineServicesServicioValidacion

💾 Capa de Acceso a Datos

La Capa de Acceso a Datos implementa el patrón DAO (Data Access Object) para lograr una separación clara entre la lógica de negocio y las operaciones de base de datos. Cada entidad del dominio tiene una clase DAO asociada, que se encarga exclusivamente de consultar, modificar o persistir datos en la base de datos.

Clase DAO Entidad Operaciones principales
ClienteDAO Cliente buscar_por_dni(), crear_cliente()
PeliculaDAO Pelicula obtener_todas()
SalaDAO Sala buscar_por_pelicula()
ButacaDAO Butaca butacas_por_sala(), actualizar_estado(), cantidad_butacas_disponibles()
ReservaDAO Reserva crear_reserva()
CandyDAO Candy Operaciones de gestión de combos

📌 Esta capa permite que los servicios trabajen con los datos sin preocuparse por los detalles técnicos de las consultas SQL ni la estructura de la base de datos.


🧱 Capa de Dominio

La Capa de Dominio representa el núcleo lógico del sistema. Contiene las entidades de negocio y tipos de dominio que modelan los conceptos fundamentales del cine. Esta capa encapsula las reglas de negocio y mantiene su independencia respecto a las demás capas, evitando preocupaciones técnicas.

graph TD
    subgraph Capa de Dominio
        subgraph Entidades Principales
            Reserva --> Cliente
            Reserva --> Butaca
            Reserva --> Sala
            Reserva --> Candy
            Pelicula
        end

        subgraph Tipos de Dominio
            Butaca --> TipoButaca
            Butaca --> Ubicacion
            Candy --> TipoCandy
            Pelicula --> FormatoPelicula
        end
    end
Loading

🔑 Entidades Principales

💠 Cliente

La entidad Cliente representa a los usuarios del sistema. Incluye validaciones integradas para garantizar la integridad de los datos.

Validaciones clave:

💠 Reserva

Reserva actúa como agregado raíz, coordinando todos los componentes de una transacción de reserva de cine.

Funcionalidades destacadas:

💠 Butaca

Butaca representa los asientos del cine y gestiona su disponibilidad y ubicación.

Gestión de estado:

💠 Pelicula

Gestiona la información de cada película disponible, incluyendo su título, duración, formato y descripción.

💠 Sala

Representa cada una de las salas físicas del cine. Incluye identificadores y asociaciones con películas.

💠 Candy

Modela los productos de confitería disponibles en el cine (combos).

🧩 Tipos de Dominio

💠 TipoButaca

Enumeración que define las categorías de asientos con precios preestablecidos.

Categorías disponibles:

  • COMUN: $4000 (asiento estándar)

  • PREMIUM: $6500 (asiento mejorado)

💠 TipoCandy

Enumeración que describe los tipos de combos de confitería, sus componentes y precios.

💠 FormatoPelicula

Define los formatos en los que se puede proyectar una película (2D, 3D, etc.) junto con su costo adicional.

💠 Ubicacion

Tipo de valor que representa la posición espacial de una butaca (fila y columna).

🔗 Integración con otras capas

La Capa de Dominio interactúa con el resto del sistema de la siguiente forma:

Capa Uso de la Capa de Dominio
🧠 Capa de Servicios Implementa la lógica de negocio utilizando las entidades de dominio
💾 Capa de Acceso a Datos (DAO) Convierte registros de base de datos en objetos de dominio (y viceversa)
🛢 Capa de Presentación Consume las entidades de forma indirecta, a través de los servicios expuestos al usuario

🛢 Capa de Persistencia

La Capa de Persistencia se encarga de proporcionar la conectividad con la base de datos y la gestión de transacciones, aislando los detalles técnicos del resto del sistema.

📌 Responsabilidades principales:

  • Conexión a la base de datos mediante la clase DatabaseConnection, utilizando el adaptador psycopg2 para PostgreSQL hospedado en Railway como proveedor de base de datos en la nube.

  • Manejo automático de transacciones gracias al decorador @contextmanager.

  • Reintentos en caso de errores, como pérdida de conexión.

  • Seguridad transaccional con commits y rollbacks automáticos.

📊 Diagrama de DatabaseConnection

graph TD
    subgraph Clase DatabaseConnection
        ejecutar_consulta[**ejecutar_consulta**<br>Ejecutar Modificaciones] --> manejar_cursor
        obtener_datos[**obtener_datos**<br>Ejecutar Consultas] --> manejar_cursor
        _conectar[**_conectar**<br>Configuración Inicial de Conexión]
        manejar_cursor[**manejar_cursor**<br>Manejador de Contexto] --> _validar_conexion_activa[**_validar_conexion_activa**<br>Verificación de Salud de Conexión]
        cerrar_conexion[**cerrar_conexion**<br>Limpieza]
    end

    subgraph Gestión de Conexiones
        psycopg2[**psycopg2**<br>Adaptador PostgreSQL]
        psycopg2 --> PostgreSQL_Database[(**PostgreSQL en Railway**)]
    end
    _conectar --> psycopg2
Loading

✅ Beneficios de la Arquitectura

La arquitectura en capas adoptada por el sistema ofrece múltiples ventajas clave:
  • Separación de responsabilidades: Cada capa cumple un rol específico y bien definido, lo que permite una organización clara del código.

  • Inversión de dependencias: Las capas superiores dependen de abstracciones y no de implementaciones concretas, facilitando el desacoplamiento.

  • Testabilidad: La lógica de negocio está aislada de las dependencias externas, lo que permite realizar pruebas de manera más sencilla y controlada.

  • Mantenibilidad: Las modificaciones en una capa tienen un impacto mínimo sobre las demás, reduciendo el riesgo de errores colaterales.

  • Escalabilidad: Cada capa puede ser optimizada, ampliada o reemplazada de forma independiente sin afectar al sistema completo.

Además, el uso del patrón DAO (Data Access Object) permite una abstracción limpia en el acceso a la base de datos, mientras que la capa de servicios encapsula flujos de trabajo de negocio complejos que interactúan con múltiples entidades del dominio.


⬆️ Volver arriba
⚠️ **GitHub.com Fallback** ⚠️