Arquitectura del Sistema - PowerSystem2024/CapybaraFilms_ProyectoTercerSemestre GitHub Wiki
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í.
- 🏗️ Arquitectura del Sistema
- 🖥️ Capa de Presentación
- 🧠 Capa de Servicios
- 💾 Capa de Acceso a Datos
- 🧱 Capa de Dominio
- 🛢 Capa de Persistencia
- ✅ Beneficios de la Arquitectura
📌 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.
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.
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
yCandyDAO
, 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 elServicioValidacion
.
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
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 hacereturn
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
A continuación, se listan los pasos del flujo de reserva coordinado desde main.py
, junto con sus enlaces al código correspondiente:
-
Verificación o registro del cliente →
cine_services.verificar_y_validar_cliente()
-
Selección de película →
cine_services.elegir_pelicula()
-
Selección de sala y entradas →
cine_services.seleccionar_sala_y_entradas()
-
Selección de butacas →
cine_services.seleccionar_butacas()
-
Creación de reserva →
reserva_dao.crear_reserva()
-
Selección de combos →
cine_services.seleccionar_combos()
-
Visualización del resumen final →
reserva.mostrar_resumen()
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.
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.
-
Integración de Validación:
CineServices
delega la validación de entrada aServicioValidacion
, 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.
Los servicios de negocio implementan patrones exhaustivos de validación y manejo de errores para garantizar la robustez y la experiencia del usuario.
-
Validación Numérica: Asegura que las entradas sean números válidos.
-
Validación de Nombres: Verifica la validez de los nombres ingresados por el usuario.
-
Validación de Correo Electrónico: Valida el formato de las direcciones de correo electrónico.
-
Validación de DNI: Verifica la validez del número de identificación (DNI).
-
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.
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 |
CineServices → ServicioValidacion
|
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.
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
La entidad Cliente representa a los usuarios del sistema. Incluye validaciones integradas para garantizar la integridad de los datos.
Validaciones clave:
-
Validación de DNI (solo números) –
Cliente.py:37-40
-
Validación de nombres y apellidos (no vacíos) –
Cliente.py:17-30
-
Validación básica de email –
Cliente.py:47-50
Reserva actúa como agregado raíz, coordinando todos los componentes de una transacción de reserva de cine.
Funcionalidades destacadas:
-
Cálculo automático del precio total –
Reserva.py:28-55
-
Generación de resumen detallado –
Reserva.py:57-103
Butaca representa los asientos del cine y gestiona su disponibilidad y ubicación.
Gestión de estado:
-
Disponibilidad (ocupada/libre) –
Butaca.py:9-19
-
Ubicación en sala –
Butaca.py:30-34
Gestiona la información de cada película disponible, incluyendo su título, duración, formato y descripción.
Representa cada una de las salas físicas del cine. Incluye identificadores y asociaciones con películas.
Modela los productos de confitería disponibles en el cine (combos).
Enumeración que define las categorías de asientos con precios preestablecidos.
Categorías disponibles:
-
COMUN: $4000 (asiento estándar)
-
PREMIUM: $6500 (asiento mejorado)
Enumeración que describe los tipos de combos de confitería, sus componentes y precios.
Define los formatos en los que se puede proyectar una película (2D, 3D, etc.) junto con su costo adicional.
Tipo de valor que representa la posición espacial de una butaca (fila y columna).
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 |
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.
-
Conexión a la base de datos mediante la clase
DatabaseConnection
, utilizando el adaptadorpsycopg2
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.
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
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.