Hexagono

Arquitectura Hexagonal

La arquitectura hexagonal, también conocida como patrón de puertos y adaptadores, es un enfoque de diseño de software propuesto por Alistair Cockburn con un objetivo brutalmente simple pero que muchos sistemas ignoran: evitar que el núcleo de la aplicación dependa de detalles externos como bases de datos, frameworks, APIs o interfaces de usuario. En lugar de construir el sistema alrededor de tecnologías que inevitablemente cambian, la arquitectura hexagonal propone construirlo alrededor del dominio del negocio, que es lo único que realmente importa y lo único que debería sobrevivir al paso del tiempo.

El problema que intenta resolver es dolorosamente común. En arquitecturas tradicionales, el código termina acoplado a frameworks, ORMs, librerías o servicios externos. El resultado es un sistema donde cambiar la base de datos, exponer una nueva API o modificar la interfaz gráfica se convierte en una cirugía mayor, con efectos secundarios impredecibles. El dominio, que debería ser el corazón del sistema, termina enterrado debajo de capas de dependencias técnicas. La arquitectura hexagonal invierte esa relación: el dominio está en el centro y todo lo demás gira alrededor de él.

El concepto clave es separar claramente el núcleo de la aplicación de los detalles externos mediante dos elementos fundamentales:

  • Puertos: son interfaces que definen cómo el mundo externo puede interactuar con el núcleo o cómo el núcleo interactúa con el exterior. Representan contratos, no implementaciones.
  • Adaptadores: son implementaciones concretas de esos puertos que conectan el núcleo con tecnologías específicas, como una base de datos, una API REST, un sistema de mensajería o una interfaz web.

El nombre “hexagonal” no es porque el software mágicamente tenga seis lados, sino porque el hexágono permite visualizar que el núcleo puede tener múltiples puntos de interacción sin privilegiar ninguno. No importa si el sistema es accedido desde una API, una interfaz web, una consola o pruebas automatizadas, todos interactúan a través de puertos definidos, manteniendo el núcleo aislado.

En el centro se encuentra el dominio, que contiene la lógica de negocio pura. Este código no sabe nada de HTTP, SQL, frameworks o librerías específicas. Solo conoce conceptos del negocio, como usuarios, pedidos, pagos o cualquier entidad relevante. Este enfoque está profundamente alineado con los principios de diseño promovidos por Eric Evans en Domain-Driven Design, donde el dominio es la prioridad absoluta.

Una forma práctica de entenderlo es imaginar que el núcleo es el cerebro y los adaptadores son los sentidos y las extremidades. El cerebro no necesita saber cómo funcionan los músculos o los nervios en detalle, solo necesita enviar y recibir señales. Si se cambia un músculo por una prótesis más avanzada, el cerebro sigue funcionando igual. En software, esto significa que puedes cambiar PostgreSQL por MongoDB, REST por GraphQL o incluso cambiar completamente de framework sin tocar la lógica de negocio.

La estructura típica incluye tres zonas conceptuales:

  • Núcleo (dominio y casos de uso): contiene las entidades, reglas de negocio y lógica principal.
  • Puertos: interfaces que definen las operaciones necesarias.
  • Adaptadores: implementaciones técnicas que conectan el núcleo con el mundo exterior.

Este enfoque ofrece ventajas extremadamente prácticas:

  • Independencia de frameworks: el framework se convierte en un detalle reemplazable.
  • Alta testabilidad: el núcleo puede probarse sin base de datos ni servicios externos.
  • Bajo acoplamiento: los cambios técnicos no rompen la lógica de negocio.
  • Mayor mantenibilidad: el sistema evoluciona con menos riesgo.
  • Flexibilidad tecnológica: puedes cambiar tecnologías sin reescribir el sistema completo.

En sistemas modernos, donde las tecnologías cambian cada dos años y cada framework promete ser el último que necesitarás antes de quedar abandonado, esta independencia es oro puro. Empresas como Netflix o Amazon utilizan principios similares para evitar que su negocio dependa de decisiones técnicas específicas, permitiendo evolucionar su infraestructura sin destruir su lógica central.

Otro beneficio importante es que obliga a pensar correctamente en el diseño. En lugar de empezar creando controladores, endpoints o tablas de base de datos, se empieza definiendo el dominio y los casos de uso. Esto produce software más limpio, más coherente y más alineado con el problema real que se intenta resolver. El desarrollador deja de pensar en términos de “guardar en la base de datos” y empieza a pensar en términos de “registrar un usuario”, que es el lenguaje real del negocio.

También facilita la evolución del sistema. Por ejemplo, un sistema que inicialmente funciona con una interfaz web puede posteriormente añadir una API, una aplicación móvil o incluso un sistema de mensajería sin modificar el núcleo. Solo se añaden nuevos adaptadores. El dominio permanece intacto, como debería ser.

La arquitectura hexagonal no es una bala mágica ni es obligatoria para todos los proyectos. En sistemas pequeños puede parecer excesiva, y muchos desarrolladores la evitan porque requiere disciplina y una forma de pensar más estructurada. Pero en sistemas que crecen, sobreviven años o necesitan adaptarse constantemente, se convierte en una diferencia brutal entre un sistema que evoluciona sin dolor y uno que colapsa bajo su propio peso técnico.

En esencia, la arquitectura hexagonal es una forma de proteger lo único que realmente importa en un sistema: la lógica de negocio. Todo lo demás es temporal. Frameworks mueren, bases de datos cambian, tecnologías quedan obsoletas, pero el dominio es lo que define el valor del software. Este enfoque asegura que ese valor no quede secuestrado por decisiones técnicas pasajeras, permitiendo construir sistemas más duraderos, más limpios y significativamente más fáciles de mantener.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *