Antipatrones y Decisiones Tecnicas
Antipatrones Criticos (genéricos)
1. Exceptions silenciosas
# INCORRECTO
try:
process(data)
except:
pass
# CORRECTO
try:
process(data)
except ProcessingError:
logger.error("Fallo en procesamiento de %s", data.id, exc_info=True)
return Failure("Error procesando datos")
2. Result Pattern olvidado
# INCORRECTO — exceptions anidadas
def create_user(data):
try:
validated = validate(data) # puede lanzar
saved = repo.save(validated) # puede lanzar
return saved
except ValidationError as e:
raise
except DBError as e:
raise
# CORRECTO — Railway-Oriented
def create_user(data: CreateDTO) -> Result[User, str]:
validated = validate(data)
if isinstance(validated, Failure):
return validated
return repo.save(validated.unwrap())
3. Logging incorrecto
# INCORRECTO
import logging
logger = logging.getLogger(__name__) # Logger sin prefijo de proyecto
# CORRECTO
from mi_proyecto.infrastructure.logging import get_logger
logger = get_logger(__name__) # Logger con jerarquia del proyecto
4. DTOs mutables
# INCORRECTO
@dataclass
class UserDTO:
name: str
email: str # Mutable — puede cambiar accidentalmente
# CORRECTO
@dataclass(frozen=True)
class UserDTO:
name: str
email: str # Inmutable — seguro para compartir
5. Acoplamiento a implementaciones concretas
# INCORRECTO — use case depende de implementacion
class ProcessUseCase:
def __init__(self):
self.repo = SQLiteRepository() # Acoplado
# CORRECTO — depende de abstraccion (port)
class ProcessUseCase:
def __init__(self, repo: RepositoryPort):
self.repo = repo # Inyectado, testeable
Decisiones Tecnicas del Proyecto
| Decision |
Estado |
Razon |
Alternativa descartada |
|
|
|
|
|
|
|
|
Framework de Decision para Nuevas Tecnologias
Antes de agregar una dependencia o tecnologia:
| Criterio |
Pregunta |
| Necesidad |
Realmente necesitamos esto ahora? |
| Restricciones |
Cumple las restricciones del proyecto? |
| Complejidad |
Agrega complejidad justificada? |
| Alternativas |
Hay una solucion mas simple? |
| Mantenimiento |
Quien lo mantiene a largo plazo? |
| Reversibilidad |
Es facil revertir si no funciona? |