Aplicar correctamente los conceptos de acoplamiento y cohesión exige técnicas con respaldo empírico. Sin un plan, las refactorizaciones pueden introducir nuevas dependencias o dispersar responsabilidades. Este capítulo recopila buenas prácticas y alertas frecuentes al momento de optimizar la arquitectura, ilustradas con ejemplos en Java.
Antes de modificar código conviene reunir evidencias. Las métricas de análisis estático, los reportes de defectos y los tiempos de revisión indican dónde la cohesión es baja o el acoplamiento presenta riesgos. Herramientas como SonarQube ayudan a identificar clases con alta complejidad o dependencias circulares sin necesidad de inspeccionar manualmente cada componente.
Desacoplar a cualquier precio puede generar anti-patrones:
Una refactorización mal planificada puede repartir responsabilidades sin criterio, reduciendo la cohesión. Algunos signos:
Helper o Manager.El siguiente fragmento muestra una refactorización que cayó en excesos: se crearon interfaces múltiples sin intención concreta.
interface Procesador {
void ejecutar();
}
class ProcesadorPedidos implements Procesador {
private final ServicioPedidos servicioPedidos;
private final ServicioNotificaciones servicioNotificaciones;
ProcesadorPedidos(ServicioPedidos servicioPedidos,
ServicioNotificaciones servicioNotificaciones) {
this.servicioPedidos = servicioPedidos;
this.servicioNotificaciones = servicioNotificaciones;
}
public void ejecutar() {
servicioPedidos.procesar();
servicioNotificaciones.enviar();
}
}
La interfaz Procesador no aporta contexto y todos los métodos de ProcesadorPedidos se limitan a delegar, por lo que el acoplamiento no disminuye y la cohesión se difumina.
Una mejora consiste en expresar la intención real y combinar las dependencias necesarias bajo un servicio con responsabilidad clara:
class CoordinadorPedidosPendientes {
private final ServicioPedidos servicioPedidos;
private final ServicioNotificaciones servicioNotificaciones;
CoordinadorPedidosPendientes(ServicioPedidos servicioPedidos,
ServicioNotificaciones servicioNotificaciones) {
this.servicioPedidos = servicioPedidos;
this.servicioNotificaciones = servicioNotificaciones;
}
void ejecutarCiclo() {
servicioPedidos.procesarPendientes();
servicioNotificaciones.notificarResultados();
}
}
El nuevo nombre comunica el objetivo y los métodos mantienen cohesión funcional. Además, los tests pueden concentrarse en validar un ciclo específico sin dependencias artificiales.
Las buenas prácticas en torno al acoplamiento y la cohesión son un camino constante. Al observar los errores habituales y anticipar sus causas, el equipo puede tomar decisiones más conscientes, preservar la claridad del diseño y responder con agilidad a los cambios del negocio.