La arquitectura hexagonal junto con arquitectura de puertos y adaptadores es muy utilizada hoy en día, sin embargo la gente aun se confunde con el nombre y no conoce muy bien la diferencia entre ellos, cual es su valor añadido.

La arquitectura hexagonal es un estilo de arquitectura que mueve el foco de un programador desde un plano más conceptual hacia la distinción entre el interior y el exterior del software. La parte interior son los casos prácticos y el modelo domain está construido sobre ello. La parte exterior es UI, base de datos, mensajería, etc. La conexión entre el interior y el exterior es mediante puertos, y su implementación equivalente se conocen como adaptadores. Por esta razón, este estilo de arquitectura se conoce habitualmente como Puertos y Adaptadores.

La arquitectura hexagonal promueve la separación de asuntos mediante la encapsulación de la lógica en diferentes capas de la aplicación. Esto permite un aislamiento de mayor nivel, testabilidad, y control sobre el código de negocio específico. Cada capa de la aplicación tiene un estricto grupo de responsabilidades y requerimientos. Esto crea separaciones más claras entre la lógica y la funcionalidad, y como esas capas deberían interactuar entre ellas.
Cada parte del hexágono representa un input – puerto, por ejemplo HTTP, que utiliza un adaptador para un tipo específico. Crea una separación clara entre el modelo domain y los dispositivos utilizados para las entradas o salidas.

 

3 componentes de una arquitectura hexagonal

 

1.Modelo Domain
Un modelo domain es un modelo conceptual, una representación de conceptos significativos para el domain que han de ser modelados en el software. Los conceptos incluyen la información envuelta en el negocio y dirige los usos de negocio en relación a esa información.

 

2.Puertos
Un puerto es un punto de entrada, proveniente del centro de la lógica. Define una serie de funciones. Un puerto es el mediante el que la lógica de negocio es accesible. Es una barrera de caso práctico, por ejemplo, puertos se corresponden a casos prácticos en una aplicación. La implementación más simple de un puerto puede tener forma de capa API. Los puertos son mayormente la mayoría de los API de la aplicación. Son llamados por los adaptadores primarios que forman la parte de usuario de la aplicación. Ejemplos de ello son las funciones que permiten cambiar objetos, atributos y relaciones en el centro de la lógica.
Los puertos secundarios son las interfaces para los adaptadores secundarios. Son llamados desde el centro de la lógica. Un ejempo de puerto secundario es una interface para almacenar objetos individuales. Esta interface simplemente especifica que un objeto puede ser creado, actualizado, recuperado y borrado. No te da ninguna información sobre como este objeto esta almacenado.

 

3. Adaptadores
Un adaptador es un puente entre la aplicación y el servicio necesitado en una aplicación. Se adapta a un puerto específico. Los adaptadores actúan de capa que sirve para transformar la comunicación entre actores externos y la lógica de la aplicación de forma que ambas dos quedan independientes. En una arquitectura hexagonal todas los actores primarios y secundarios interactúan con los puertos de la aplicación a traves de los adaptadores. Los actores primarios son aquellos que utilizan el sistema para conseguir una meta en particular, mientras que los actores secundarios son aquellos que el sistema utiliza para conseguir la meta principal de los actores primarios.
En otras palabras, un adaptador primario es una pieza de código entre el usuario y el centro de la lógica. Un adaptador puede ser una función de la prueba unitaria para el centro de la lógica. Otra, puede ser la función de controlador que interactúa con la interface de usuario gráfico y el centro de la lógica.
Un adaptador secundario es una implementación de puerto secundario, una interface. Por ejemplo, puede ser una clase pequeña que convierte la petición de almacenamiento en la aplicación en una base de datos, y devuelve los resultados de la base de datos en forma de petición por el puerto secundario.

 

Vaughn Vernon continuo con la Hexagonal, o Puertos y adaptadores, estilo de arquitectura, la cual fue creada por Alistar Cockburn. Alistar cree que la arquitectura debería permitir a una aplicación ser igualmente conducida por los usuarios, programas, test automáticos o secuencias de comandos por lotes, y ser desarrolladas y testeadas de manera individual a sus dispositivos y base de datos.
Vaughn es famoso por su libro sobre DDD y vé la arquitectura hexagonal como una evolución del estilo de capas pero con ventajas. Permite retrasar decisiones para ciertos mecanismo de arquitectura, por ejemplo el tipo de persistencia a utilizar sin impedir el progreso de la funcionalidad en progreso. Lo importante aquí es que pensar en términos de puertos y adaptadores convierte a una manera más fácil el uso de los mismos API internos para diferente tipos de clientes.
Él ve que el foque principal de esta arquitectura es desacoplar el centro de la lógica de la aplicación de los servicios que utiliza. Permitiendo que diferentes servicios puedan “enchufarse”, y que la aplicación pueda funcionar sin estos servicios.

 

Beneficios de una arquitectura hexagonal

 

Agnóstico al mundo exterior
La aplicación puede esencialmente ser dirigida por cualquier número de controles distintos. Puedes utilizar tu centro de lógica de negocio interior a traves de un interface “Command Line”, otra aplicación o sistema, un humano o un guión automatico.

 

Independiente a servicios externos
Cuando tu aplicación es agnostica al mundo exterior, significa que es independiente de los servicios exteriores. Puedes desarrollar el interior del centro de la aplicación mucho antes que empieces a pensar sobre el tipo de base de datos que vas a utilizar. Definiendo puertos y adaptadores para tu base de datos, estas libre de utilizar cualquier tecnologia de implementación. Lo que te permite utilizar un almacenamiento de información en la memoria en los primeros dias, y mas tarde tomar la decisión de que tipo de base de datos qieres utilizar cuando necesites almacenar la información de tu aplicación en un almacenamiento persistentemente.

 

Mas facil de testear de manera individual
Ahora que tu aplicación es agnóstica al mundo exterior, es mucho más fácil de testear de forma individual. Esto significa que en vez de enviar peticiones en HTTP, o hacia base de datos, simplemente puedes testear cada capa de tus aplicación, burlando cualquier dependencia. Esto solo funciona en test rápidos, pero desacopla de manera masiva tu código de los detalles de implementación del mundo exterior.

 

Los puertos y adaptadores son reemplazables
El rol de los puertos y adaptadores es convertir la petición y las respuestas a medida que entran del mundo exterior. Este proceso de reconversión permite a la aplicación a recibir peticiones y enviar respuestas a cualquier numero de tecnología exterior sin tener que saber nada de ellas. Permite reemplazar un adaptador por una implementación diferente que forme la misma interface.

 

Separación de las diferentes tasas de cambio
Las capas más exteriores que típicamente tienen más cambios. Por ejemplo, la interfaz de usuario, gestionando peticiones o trabajando con servicios externos que normalmente evoluciona más rápido que las reglas de negocio de la aplicación. Esta separación te permite rapidamente iterar en las capas más externas sin tocar las capas más interiores que se han de mantener consistentes. Las capa mas interna no tiene conocimiento de las más exteriores y estos cambios pueden darse sin dañar el codigo.

 

Alto mantenimiento
El mantenimiento es la ausencia de deuda técnica. Cambios en una área de la aplicación no afectan a otras. Añadir características no requiere un largo cambio de bases de código. Añadiendo nuevas maneras de interactuar con la aplicación requiere pocos cambios. El testeo es relativamente fácil.

 

En resumen, la arquitectura hexagonal es un enfoque que divide el software en dos partes, la interior y la exterior. Aplicando este enfoque, haces tu parte de código más importante libre de detalles técnicos innecesarios y ganar flexibilidad, testabilidad y otras ventajas que hacen de tu proceso de trabajo uno más eficiente.

 

Suscríbete a nuestro newsletter para estar al día de los eventos, meet ups y demás artículos!

 

Si te gustó este artículo sobre arquitectura Hexagonal, probablemente te pueda gustar: