main - PowerSystem2024/CapybaraFilms_ProyectoTercerSemestre GitHub Wiki

arquitc

📄 main.py

main.py es el punto de entrada del sistema Capybara Films, y su función principal es orquestar el proceso completo de reserva de entradas desde la consola. Coordina la interacción con el usuario y la comunicación entre las distintas capas del sistema.

🎯 Propósito del Archivo

El archivo main.py :

  • Inicializa los componentes principales del sistema.

  • Llama a los servicios que controlan la lógica del negocio.

  • Gestiona el flujo de interacción con el usuario.

  • Valida datos y delega la persistencia a los DAOs.

  • Maneja errores y asegura el cierre de recursos.

Forma parte de la Capa de Presentación, responsable de la interacción directa con el usuario.

Estructura del Punto de Entrada

El flujo de main.py sigue un patrón claro de inicialización y ejecución secuencial. Antes de comenzar con el flujo de reserva, se crean todos los componentes necesarios para la operación del sistema.

graph TD
    main.py --> ClienteDAO
    main.py --> PeliculaDAO
    main.py --> SalaDAO
    main.py --> ButacaDAO
    main.py --> ReservaDAO
    main.py --> CineServices
    main.py --> CandyDAO

    ClienteDAO --> DatabaseConnection
    PeliculaDAO --> DatabaseConnection
    SalaDAO --> DatabaseConnection
    ButacaDAO --> DatabaseConnection
    ReservaDAO --> DatabaseConnection
    CandyDAO --> DatabaseConnection
    main.py --> DatabaseConnection
Loading

🔗 Inicialización de Componentes

La función main() comienza estableciendo la conexión a la base de datos y creando instancias de los DAOs y servicios necesarios:

Componente Propósito Capa
DatabaseConnection Conexión a la base de datos PostgreSQL Persistencia
ClienteDAO Acceso a datos de clientes Acceso a Datos (DAO)
PeliculaDAO Acceso a datos de películas Acceso a Datos (DAO)
SalaDAO Acceso a datos de salas Acceso a Datos (DAO)
ButacaDAO Acceso a datos de butacas Acceso a Datos (DAO)
ReservaDAO Acceso a datos de reservas Acceso a Datos (DAO)
CandyDAO Acceso a datos de combos/golosinas Acceso a Datos (DAO)
CineServices Orquestador del proceso de reserva Servicios

🔄 Pasos del Flujo de la Aplicacion

El punto de entrada orquesta un flujo de reserva en 7 pasos, validando en cada uno la información ingresada:

  • 1️⃣ Verificar Cliente

    • cine_services.verificar_y_validar_cliente(cliente_dao)

    • Si no se encuentra un cliente válido, el sistema finaliza.

    • Se limpia la pantalla tras validación.

  • 2️⃣ Elegir Película

    • cine_services.elegir_pelicula(pelicula_dao)

    • El usuario elige una película válida para continuar.

  • 3️⃣ Seleccionar Sala y Entradas

    • cine_services.seleccionar_sala_y_entradas(sala_dao, butaca_dao, pelicula)

    • Se recupera sala disponible y cantidad de entradas.

  • 4️⃣ Selección de Butacas

    • cine_services.seleccionar_butacas(butaca_dao, cantidad_entradas, sala)

    • Se validan las butacas y se actualiza su estado.

  • 5️⃣ Crear Reserva

    • reserva_dao.crear_reserva(cliente.id_cliente, sala.id_sala, ids_butacas)

    • Se crea la reserva en base de datos.

  • 6️⃣ Selección de Combos (opcional)

    • cine_services.seleccionar_combos(candy_dao)

    • Se agregan los combos al objeto reserva (si los hay).

  • 7️⃣ Mostrar Resumen

    • reserva.mostrar_resumen()

    • Se muestra mensaje de éxito personalizado.

🛡️ Manejo de Errores y Recursos

main.py utiliza bloques try-except-finally para garantizar la estabilidad y limpieza de recursos:

try:
    # Flujo principal de reserva
except Exception as e:
    # Muestra mensaje de error crítico
finally:
    try:
        db_connection.cerrar_conexion()
    except Exception as e:
        print(f"Error cerrando la conexión: {e}")

✳️ Manejo de errores críticos

  • Se captura cualquier error inesperado (Exception) durante la reserva.

  • Se imprime mensaje amigable al usuario sin traza técnica.

🔒 Limpieza de recursos

  • El finally garantiza el cierre de conexión incluso ante errores.

  • Se captura también error al cerrar conexión por separado.

🧪 Ejecución segura como script

if __name__ == "__main__":
    main()
  • Permite importar main.py en otros módulos sin ejecutar el flujo automáticamente.

  • Es ideal para pruebas o entornos donde se desee modularizar.

📌 Observaciones Técnicas

  • main.py no contiene lógica de negocio compleja: delega toda esa responsabilidad a CineServices y a los DAOs.

  • Utiliza impresión en consola como interfaz de usuario.

  • La validación de entradas se realiza a través del servicio ServicioValidacion, aunque no se instancia directamente en este archivo.

  • Está diseñado de forma modular, por lo que es fácilmente testeable y mantenible.

⚠️ **GitHub.com Fallback** ⚠️