mi茅rcoles, 1 de octubre de 2025

馃崘馃崕 Arquitectura Hexagonal explicada con peras y manzanas

Introducci贸n

Imagina que tienes una aplicaci贸n que cocina peras y manzanas. Tienes la receta (la l贸gica de negocio) y diferentes formas de cocinarla: en horno, en microondas, o incluso en una app m贸vil. Pero… ¿qu茅 pasa si cambias la forma de cocinar? ¿Tendr铆as que cambiar toda la receta? La arquitectura hexagonal (tambi茅n llamada Ports and Adapters) naci贸 para resolver exactamente eso.

1. El problema de las capas tradicionales

En las arquitecturas tradicionales (por ejemplo, MVC cl谩sico), la aplicaci贸n suele estar fuertemente acoplada a frameworks, bases de datos o controladores HTTP. Por ejemplo: Si cambias tu base de datos de MySQL a MongoDB, debes modificar c贸digo en varias partes. Si agregas una nueva API REST o una interfaz gr谩fica, debes tocar tu capa de negocio. Esto genera dependencias cruzadas y hace que cada cambio t茅cnico afecte la l贸gica central.

2. La idea central de la arquitectura hexagonal

En una arquitectura hexagonal, la l贸gica de negocio vive en el centro (como el coraz贸n de la aplicaci贸n). Todo lo que la rodea (base de datos, API, mensajer铆a, interfaz) se conecta mediante puertos (ports) y adaptadores (adapters).

En palabras simples:

La l贸gica no sabe si los datos vienen de una base, de una API o de un archivo JSON. Solo espera que alguien le entregue los datos con el formato correcto. As铆 logramos que la receta (el negocio) no dependa del tipo de cocina (la infraestructura).

3. Ejemplo con peras y manzanas

Sin arquitectura hexagonal:

public class FrutaService { 
private final FrutaRepository repository; 
public FrutaService() { 
this.repository = new FrutaRepository(); 
// ❌ Acoplamiento directo 
public double calcularTotal() { 
List<Fruta> frutas = repository.obtenerFrutas(); 
return frutas.stream().mapToDouble(Fruta::getPrecio).sum(); 
}

Aqu铆, FrutaService depende directamente del repositorio. Si ma帽ana cambias de base de datos, tienes que modificar el servicio.

Con arquitectura hexagonal:

public interface FrutaRepository { 
List<Fruta> obtenerFrutas(); 
}

public class FrutaService { 
private final FrutaRepository repository; 
public FrutaService(FrutaRepository repository) { 
this.repository = repository; 
public double calcularTotal() { 
return repository.obtenerFrutas() .stream() .mapToDouble(Fruta::getPrecio) .sum(); 
}

@Repository 
public class FrutaRepositoryDB implements FrutaRepository { 
// L贸gica para obtener frutas desde una BD 

public class FrutaRepositoryArchivo implements FrutaRepository { 
// L贸gica para obtener frutas desde un archivo JSON 
}

Resultado: tu servicio nunca cambia, aunque cambie la fuente de datos.

4. Beneficios clave

  1. 馃敼 Desacoplamiento total entre negocio y tecnolog铆a.
  2. 馃敼 Facilidad de pruebas unitarias: puedes usar mocks sin conectarte a BD.
  3. 馃敼 Sustituibilidad: cambia un adaptador por otro sin tocar la l贸gica.
  4. 馃敼 Escalabilidad: agrega nuevas entradas (API, CLI, eventos) sin romper nada.

5. Conclusi贸n

En resumen, la arquitectura hexagonal es como una cocina modular: puedes usar horno, microondas o sart茅n… pero la receta sigue siendo la misma. El negocio no se entera del cambio, solo sabe cocinar peras y manzanas. No se trata solo de dibujar un hex谩gono bonito, sino de proteger tu l贸gica de negocio del caos tecnol贸gico.

¿Qu茅 opinas?

¿Ya aplicaste este patr贸n en tus proyectos? D茅jame tu experiencia en los comentarios o s铆gueme en LinkedIn para m谩s art铆culos de desarrollo y arquitectura.


No hay comentarios: