Arquitectura Limpia y Demo en Vivo
TODAS las entregas E1-E5 deben estar completadas y funcionando. Esta evaluación integra todo el proyecto TaskFlow.
Estas clases preparan los conocimientos necesarios para esta evaluación:
Presentar el proyecto TaskFlow completo con Arquitectura Limpia y sustentar técnicamente todas las decisiones de diseño implementadas durante el curso.
Individual o en parejas (máximo 2 personas). Debe ser el mismo equipo de todas las entregas previas (E1-E5).
Formato de entrega: Repositorio GitHub final con todo el proyecto TaskFlow completo, README.md profesional con diagramas, y base de datos inicializada. Los dos miembros del equipo deben presentar juntos.
La sustentación tiene una duración máxima de 15 minutos distribuidos en 3 partes:
El proyecto final debe seguir la siguiente estructura de Clean Architecture:
__pycache__, .pyc, .env)main con versión finalpytest sin erroresalembic upgrade head ejecuta sin erroresEl README debe incluir un diagrama como este (puedes usar Mermaid en Markdown):
graph TB
subgraph "API Layer"
A[FastAPI Routes]
B[Templates Jinja2]
end
subgraph "Application Layer"
C[UsuarioService]
D[TareaService]
E[DTOs]
end
subgraph "Domain Layer"
F[Usuario Entity]
G[Tarea Entity]
H[Repository Interfaces]
end
subgraph "Infrastructure Layer"
I[UsuarioRepositorySQL]
J[TareaRepositorySQL]
K[Database Session]
end
A --> C
A --> D
B --> A
C --> F
D --> G
C --> H
D --> H
I -.implements.-> H
J -.implements.-> H
I --> K
J --> K
El contenedor de dependencias debe permitir cambiar entre persistencia JSON y SQL fácilmente:
# src/infrastructure/di/container.py
from dependency_injector import containers, providers
from src.domain.repositories.interfaces import IUsuarioRepository, ITareaRepository
from src.infrastructure.repositories.usuario_repo import UsuarioRepositorySQL, UsuarioRepositoryJSON
from src.application.services.usuario_service import UsuarioService
class Container(containers.DeclarativeContainer):
config = providers.Configuration()
# Configuración de base de datos
database_url = config.database_url
# Selector de implementación según configuración
usuario_repository = providers.Selector(
config.storage_type,
sql=providers.Factory(UsuarioRepositorySQL, session=database_url),
json=providers.Factory(UsuarioRepositoryJSON, path="data/usuarios.json")
)
# Servicios de aplicación
usuario_service = providers.Factory(
UsuarioService,
usuario_repo=usuario_repository
)
| Criterio | Excelente (100%) | Aceptable (70%) | Insuficiente (40%) | Peso |
|---|---|---|---|---|
| Funcionalidad Completa Todas las features de E1-E5 integradas |
CRUD completo, HTMX, persistencia dual, tests pasando | Funcionalidad básica con algunos bugs menores | Features faltantes o errores críticos | 30% |
| Arquitectura Limpia Separación de capas y dependencias |
4 capas bien definidas, dependencias correctas (hacia adentro) | Capas existentes pero con algunas dependencias cruzadas | Arquitectura plana o dependencias invertidas | 25% |
| Calidad de Código Patrones, typing, documentación |
Repository, DI, DTOs, type hints completos, PEP 8 | Patrones parciales, algunos hints faltantes | Código spaghetti, sin patrones evidentes | 20% |
| Presentación y Demo Claridad y manejo de preguntas |
Demo fluida, respuestas técnicas correctas | Demo con pausas, respuestas básicas | Demo fallida o sin conocimiento técnico | 15% |
| Documentación README, diagramas, comentarios |
README profesional con diagramas Mermaid | README básico con instrucciones | Sin README o documentación incompleta | 10% |
Implementar cualquiera de las siguientes features otorga +1 punto adicional a la nota final (máximo 1 punto):
uvicorn api.main:app)
pytest)
alembic upgrade head)