Saltar a contenido

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?