Los anti-patrones describen soluciones recurrentes que deterioran la calidad de un sistema. Reconocerlos permite prevenir deuda técnica y mejorar la mantenibilidad. En esta sección analizaremos tres anti-patrones clásicos descritos por Andrew Koenig y popularizados por trabajos como Anti-pattern: God Object, Spaghetti Code y Golden Hammer.
Un anti-patrón no es simplemente un error aislado, sino una respuesta repetida a un problema que inicialmente parece conveniente pero produce consecuencias negativas a largo plazo. Identificarlos exige evaluar el contexto, detectar señales de alerta y contar con estrategias de refactorización.
El anti-patrón God Object aparece cuando una clase o módulo concentra demasiadas responsabilidades, conoce datos de todo el sistema e interviene en cualquier operación relevante. A menudo surge por crecimiento incremental sin arquitectura clara.
Genera acoplamiento extremo, inhibe la extensión modular, introduce puntos únicos de fallo y reduce la cohesión. Cambiar cualquier comportamiento obliga a modificar la misma clase omnipotente, incrementando el riesgo de regresiones.
public class SistemaVentas
{
private readonly ConexionDb _conexion;
private readonly ServicioEmail _email;
private readonly MotorPrecios _motor;
private readonly Reporteador _reporte;
public void ProcesarPedido(Pedido pedido)
{
_motor.Calcular(pedido);
_conexion.Guardar(pedido);
_reporte.GenerarCsv(pedido);
_email.EnviarConfirmacion(pedido);
}
public void SincronizarInventario() { /* 200 lineas mas... */ }
public void Auditar() { /* ... */ }
public void ExportarFinanzas() { /* ... */ }
}
Esta clase centraliza persistencia, logística, reporting y comunicación. La refactorización consiste en extraer servicios especializados (ServicioPedidos
, SincronizadorInventario
, ServicioReportes
) y coordinar desde una fachada ligera, reduciendo acoplamiento.
Spaghetti Code describe programas con flujo de control enredado: saltos arbitrarios, funciones largas, ausencia de modularidad y dependencias cruzadas. El nombre evoca un plato de spaghetti donde los hilos se entrelazan sin orden aparente.
goto
, flags globales o retornos anticipados que generan flujos no lineales.Dificulta la lectura del código, retrasa la detección de errores y complica el mantenimiento. Los equipos invierten la mayor parte del tiempo intentando comprender el flujo para realizar cambios mínimos.
void procesar() {
leerArchivo();
while(condition) {
if (tipo.equals("A")) {
// 80 líneas de reglas
} else if (tipo.equals("B")) {
// 65 líneas más
} else {
// nuevos parches
}
if (error) { reiniciar(); continue; }
actualizarUI();
grabarBaseDatos();
}
}
El primer paso de refactorización puede ser extraer métodos por tipo (procesarTipoA
, procesarTipoB
) y reemplazar condicionales por Strategy o Command, logrando lógica acotada y testeable.
Golden Hammer alude a la tendencia de utilizar la misma herramienta o tecnología para resolver cualquier problema, ignorando alternativas más adecuadas. El nombre proviene del dicho: “Si todo lo que tienes es un martillo, todo te parece un clavo”.
Conduce a sub-diseño o sobre-ingenerización, elevando costos de mantenimiento y generando inconsistencias. Las soluciones resultan frágiles porque la herramienta elegida no fue diseñada para ese uso.
Un equipo insiste en usar el mismo framework batch para servicios REST, tareas de ETL y procesamiento de colas. La falta de soporte nativo para HTTP obliga a crear capas adaptadoras complejas y scripts manuales. Evaluar alternativas como Spring Boot, Apache Camel o arquitecturas sin servidor evitaría una solución frágil.
Anti-patrón | Señales clave | Impacto | Primeros pasos de mitigación |
---|---|---|---|
God Object | Clase monolítica, dependencia transversal | Alto riesgo de regresiones, baja cohesión | Dividir responsabilidades, introducir fachadas y servicios |
Spaghetti Code | Flujo errático, funciones gigantes | Dificultad de mantenimiento, bugs recurrentes | Refactor incremental, pruebas de caracterización |
Golden Hammer | Una sola herramienta para todo | Soluciones frágiles, sobrecostos | POCs comparativas, guías de selección tecnológica |
Evitar anti-patrones no depende solo de patrones técnicos, sino de gobernanza, revisiones de código, pruebas automatizadas y una cultura que fomente cuestionar decisiones heredadas. Registrar lecciones aprendidas y realizar retrospectivas técnicas ayuda a detectar tendencias peligrosas a tiempo.