22 Boss Fight 3: La Torre Stark
23 🏗️ Boss Fight 3: La Torre Stark
23.1 Prueba Final del Nivel 3
23.2 🎬 La Situación
“La Torre Stark. Nuevo centro de operaciones. Todo lo que necesito, todo en un lugar.” — Tony Stark
Tony construye la Torre Stark. No es solo un edificio, es un ecosistema. Cada piso tiene un propósito, cada sistema se comunica, todo está diseñado para eficiencia máxima.
Tu misión: Crear una arquitectura que sea como la Torre Stark: organizada, eficiente, mantenible.
23.3 🎯 Misión: Sistema de Gestión de Proyectos “Stark Industries”
23.3.1 Requisitos de Arquitectura
stark-projects/
├── src/
│ ├── domain/ # Lógica de negocio
│ │ ├── entities/ # Entidades del dominio
│ │ ├── services/ # Servicios de dominio
│ │ └── interfaces/ # Interfaces/ports
│ ├── application/ # Casos de uso
│ │ ├── use_cases/ # Lógica de aplicación
│ │ └── dto/ # Data Transfer Objects
│ ├── infrastructure/ # Implementación
│ │ ├── repositories/ # Repositorios concretos
│ │ ├── api/ # Controladores API
│ │ └── persistence/ # Base de datos
│ └── shared/ # Código compartido
├── tests/
│ ├── unit/ # Tests unitarios
│ ├── integration/ # Tests de integración
│ └── e2e/ # Tests end-to-end
├── docs/ # Documentación
└── scripts/ # Scripts de utilidad
23.3.2 Entidades del Dominio
# domain/entities/project.py
from dataclasses import dataclass
from datetime import datetime
from typing import Optional
@dataclass
class Project:
"""Entidad Project del dominio"""
id: str
name: str
description: str
status: str # "active", "completed", "archived"
created_at: datetime
updated_at: Optional[datetime] = None
def activate(self):
"""Activa el proyecto"""
self.status = "active"
self.updated_at = datetime.now()
def complete(self):
"""Marca proyecto como completado"""
self.status = "completed"
self.updated_at = datetime.now()23.3.3 Casos de Uso
# application/use_cases/create_project.py
from dataclasses import dataclass
from src.domain.entities.project import Project
from src.domain.interfaces.project_repository import ProjectRepository
@dataclass
class CreateProjectRequest:
"""DTO para crear proyecto"""
name: str
description: str
@dataclass
class CreateProjectResponse:
"""DTO de respuesta"""
project_id: str
name: str
status: str
class CreateProjectUseCase:
"""Caso de uso: Crear proyecto"""
def __init__(self, repository: ProjectRepository):
self.repository = repository
def execute(self, request: CreateProjectRequest) -> CreateProjectResponse:
"""Ejecuta el caso de uso"""
# Validar datos
if not request.name.strip():
raise ValueError("Nombre no puede estar vacío")
# Crear entidad
project = Project(
id=self.repository.generate_id(),
name=request.name,
description=request.description,
status="active",
created_at=datetime.now()
)
# Persistir
self.repository.save(project)
# Retornar respuesta
return CreateProjectResponse(
project_id=project.id,
name=project.name,
status=project.status
)23.4 🚀 Evaluación
23.4.1 Métricas de Calidad
| Métrica | Objetivo | Tu Resultado |
|---|---|---|
| Acoplamiento | Bajo (dependencias invertidas) | ⬜ |
| Cohesión | Alta (cada clase hace una cosa) | ⬜ |
| Testeabilidad | Alta (fácil de testear) | ⬜ |
| Mantenibilidad | Alta (cambios fáciles) | ⬜ |
23.4.2 Checklist de Arquitectura
23.5 🏆 Logro Desbloqueado: “Architect”
23.5.1 Requisitos
23.5.2 Recompensa
- +250 XP
- Logro “Architect”
- Acceso a Nivel 4
23.5.3 Siguiente Nivel
“J.A.R.V.I.S., ¿puedes ayudarme con esto?” — Tony Stark