Qué es la arquitectura hexagonal, ventajas y desventajas

Comienza gratis a usar HubSpot CMS en español
Maria Coppola
Maria Coppola

Actualizado:

Publicado:

En el mundo del desarrollo de software, existen diversas metodologías y arquitecturas que se ajustan a las necesidades de cada proyecto. Una de ellas es la arquitectura hexagonal, un patrón de diseño que busca separar las preocupaciones del negocio de las preocupaciones técnicas del sistema.

Qué es arquitectura hexagonal

A través de este enfoque, se pueden obtener varios beneficios que ayudan a garantizar la calidad del software y su escalabilidad. En este artículo exploraremos qué es la arquitectura hexagonal, sus ventajas y desventajas, y cómo se puede aplicar a diferentes proyectos de software.

    << [Comienza ya] Gestiona tu contenido de una manera fácil con el software  CMS gratuito de HubSpot>>   

La arquitectura hexagonal se representa como un hexágono, donde el núcleo del sistema está en el centro, rodeado de puertos y adaptadores. Los puertos son las interfaces a través de las cuales el sistema interactúa con el mundo exterior, como la interfaz de usuario, las interfaces de red o las interfaces de base de datos. Los adaptadores son los componentes que conectan los puertos con el núcleo del sistema.

En esta arquitectura, el núcleo del sistema contiene toda la lógica y las reglas de negocio; mientras que los puertos y adaptadores se encargan de la entrada y salida de datos. El objetivo es separar la lógica de negocio de la tecnología subyacente, lo que permite una mayor flexibilidad y facilidad de mantenimiento.

La arquitectura hexagonal se basa en varios patrones de diseño de software, como el patrón de Inversión de Control (IoC), el patrón de Inyección de Dependencias (DI) y el patrón de Capas (Layers). Estos patrones de diseño se desarrollaron con anterioridad, pero la arquitectura hexagonal los combinó en un enfoque coherente y completo para el diseño de sistemas de software.

Desde entonces, la arquitectura hexagonal ha ganado popularidad en la comunidad de desarrollo de software, y se considera una de las mejores prácticas para la construcción de sistemas escalables, flexibles y mantenibles.

Ventajas y desventajas de la arquitectura hexagonal

Ventajas

La arquitectura hexagonal tiene varias ventajas, entre las que se incluyen:

Separación de responsabilidades

La arquitectura hexagonal separa claramente las responsabilidades de la lógica de negocio de las responsabilidades de la infraestructura. Esto ayuda a mantener la lógica de negocio independiente de la tecnología subyacente y facilita el mantenimiento y la evolución de la aplicación a lo largo del tiempo.

Facilidad de prueba 

La arquitectura hexagonal facilita la escritura de pruebas automatizadas para la lógica de negocio. Como la lógica de negocio se encuentra en el núcleo de la arquitectura y no depende de la infraestructura, las pruebas automatizadas pueden enfocarse únicamente en la lógica de negocio, sin preocuparse por la tecnología subyacente.

Flexibilidad

La arquitectura hexagonal permite una mayor flexibilidad en la elección de tecnologías y herramientas. Como la lógica de negocio no depende directamente de la infraestructura, se puede cambiar la tecnología subyacente sin tener que cambiar la lógica de negocio.

Escalabilidad

La arquitectura hexagonal permite escalar la aplicación en diferentes niveles, como la lógica de negocio o la infraestructura. Esto permite una mayor capacidad de respuesta a las necesidades de la aplicación y de los usuarios.

Mantenibilidad

La arquitectura hexagonal facilita el mantenimiento de la aplicación a lo largo del tiempo, ya que la separación de responsabilidades hace que sea más fácil entender y actualizar diferentes componentes de la aplicación. Además, la flexibilidad en la elección de tecnologías y herramientas también facilita el mantenimiento de la aplicación.

Desventajas

Si bien la arquitectura hexagonal tiene varias ventajas, también tiene algunas desventajas, que incluyen las siguientes:

Complejidad

La arquitectura hexagonal puede ser más compleja que otras arquitecturas, ya que requiere la creación de varios componentes, como puertos y adaptadores, que pueden ser difíciles de entender y mantener.

Sobrecarga de código

Puede requerir más código que otras arquitecturas, lo que aumenta la complejidad y dificulta la comprensión del código.

Dificultades en el diseño inicial

La arquitectura hexagonal puede ser difícil de diseñar inicialmente, ya que requiere una comprensión profunda de la lógica de negocio y de la infraestructura.

Potencial de sobreingeniería

Si no se diseña y se implementa adecuadamente, la arquitectura hexagonal puede conducir a una sobreingeniería, donde se crea una solución excesivamente compleja y costosa en términos de tiempo y recursos.

Objetivos de la arquitectura hexagonal

La buena práctica de software en una arquitectura se refiere a la adopción de un conjunto de prácticas y principios que aseguren que el software sea confiable, escalable, mantenible y fácilmente adaptable a diferentes contextos y necesidades. Los objetivos principales de la arquitectura hexagonal son los siguientes:

1. Separar la lógica de negocio del resto del sistema

El núcleo de la aplicación debe contener la lógica de negocio y las reglas de negocio, mientras que los puertos y adaptadores se encargan de la entrada y salida de datos. Esto permite una mayor flexibilidad y facilidad de mantenimiento, ya que el núcleo del sistema está aislado de la tecnología subyacente.

2. Permitir la integración de diferentes tecnologías

La arquitectura hexagonal utiliza puertos y adaptadores bien definidos que permiten una sencilla integración de diferentes tecnologías, lo que facilita la adaptación del sistema a diferentes contextos y necesidades.

3. Facilitar la realización de pruebas unitarias

Al separar la lógica de negocio del resto del sistema, permite la realización de pruebas unitarias, ya que el núcleo del sistema se puede probar sin necesidad de involucrar toda la infraestructura del sistema.

4. Mejorar la escalabilidad y el rendimiento

La separación de responsabilidades en diferentes capas y la utilización de puertos y adaptadores bien definidos pueden mejorar la escalabilidad y el rendimiento del sistema, permitiendo que los diferentes componentes se ejecuten en diferentes servidores o procesos, si es necesario.

Componentes de la arquitectura hexagonal

1. Núcleo o dominio de la aplicación (Domain Layer)

El núcleo contiene la lógica de negocio y las reglas de negocio que definen el comportamiento de la aplicación. Este componente es independiente de la tecnología subyacente y se comunica con el mundo exterior a través de interfaces definidas.

Este es el componente más importante y su principal objetivo es representar el problema que se quiere resolver de una manera orientada al negocio, independiente de la tecnología subyacente.

El funcionamiento del dominio se basa en la separación de responsabilidades. Es decir, el núcleo de la aplicación no debe preocuparse por cómo se almacenan o se recuperan los datos, ni por cómo se comunican con el mundo exterior. En su lugar, se centra en definir las reglas de negocio y la lógica necesaria para resolver el problema que se quiere abordar.

Para lograr esta separación de responsabilidades, el dominio define interfaces (puertos) que son implementadas por adaptadores externos. Estos adaptadores se encargan de comunicar el núcleo de la aplicación con el mundo exterior, transformando los datos en el formato adecuado y gestionando su entrada y salida.

El dominio también define modelos de dominio; estos son objetos que representan los conceptos clave del problema que se está resolviendo, contienen la lógica de negocio necesaria para implementar las reglas de negocio y gestionar las interacciones entre los diferentes elementos del sistema.

2. Puertos (ports)

Son interfaces que definen cómo el núcleo de la aplicación se comunica con el mundo exterior. Por ejemplo, un puerto puede ser una interfaz para acceder a una base de datos, una API web o un sistema de archivos. Los puertos son independientes de la tecnología subyacente y se implementan en adaptadores.

Son independientes de la tecnología subyacente y se definen en el Domain Layer. El objetivo principal de los puertos es permitir la separación de responsabilidades, permitiendo que el núcleo de la aplicación se centre en la lógica de negocio y las reglas de negocio, sin preocuparse por cómo se implementan las interfaces externas.

Los puertos definen una serie de métodos o funciones que pueden ser llamados desde el núcleo de la aplicación para interactuar con el mundo exterior. Por ejemplo, uno puede definir un método para obtener los datos de un servicio web, otro para guardar información en una base de datos y otro más para enviar un correo electrónico.

Para que estos puertos sean útiles, es necesario que sean implementados por adaptadores externos. Estos adaptadores son componentes que se encargan de implementar los puertos y comunicar el núcleo de la aplicación con el mundo exterior. Los adaptadores son específicos de la tecnología subyacente y pueden ser reemplazados sin afectar al resto del sistema.

El funcionamiento de los puertos se basa en la inversión de dependencias. Es decir, el núcleo de la aplicación no depende directamente de la implementación de los puertos, sino de las interfaces que los definen. Esto permite una mayor flexibilidad y facilidad de mantenimiento del sistema, ya que los adaptadores pueden ser cambiados sin afectar al núcleo de la aplicación.

En la arquitectura hexagonal, existen dos tipos de puertos:

  • Los puertos de entrada (input ports) son aquellos que permiten la entrada de datos en la aplicación. Se definen en la capa del dominio y son implementados por adaptadores externos que se encargan de transformar los datos entrantes en un formato adecuado para ser procesados por la aplicación. Un ejemplo puede ser un API REST que recibe solicitudes HTTP y las transforma en objetos de dominio que la aplicación puede procesar.
  • Los puertos de salida (output ports) son aquellos que permiten la salida de datos de la aplicación. Se definen en la capa del dominio y son implementados por adaptadores externos que se encargan de transformar los datos en un formato adecuado para su almacenamiento o su envío al mundo exterior. Un ejemplo de puerto de salida puede ser una base de datos que almacena los objetos de dominio procesados por la aplicación.

3. Adaptadores (adapters)

Los adaptadores son componentes que implementan los puertos. Por ejemplo, un adaptador puede ser una implementación de una interfaz para acceder a una base de datos específica o una implementación de una API web. Los adaptadores se encargan de la entrada y salida de datos, transformando los datos en el formato adecuado para su uso por el núcleo de la aplicación.

En la arquitectura hexagonal, los adaptadores son los componentes que se encargan de implementar los puertos definidos en el Domain Layer, permitiendo que la aplicación se comunique con el mundo exterior. Los adaptadores son específicos de la tecnología subyacente y pueden ser reemplazados sin afectar al resto del sistema.

Tienen la tarea de transformar los datos en un formato adecuado para su intercambio con el mundo exterior. Por ejemplo, si la aplicación necesita interactuar con una base de datos, el adaptador de base de datos se encargará de convertir los objetos de dominio de la aplicación en consultas SQL o comandos para el sistema de gestión de bases de datos. De esta manera, el adaptador de base de datos actúa como un puente entre la lógica de la aplicación y la tecnología subyacente.

Los adaptadores también pueden manejar la seguridad y el control de acceso a los recursos externos. Por ejemplo, si la aplicación necesita interactuar con un servicio web que requiere autenticación, el adaptador correspondiente debe encargarse de proporcionar las credenciales necesarias para acceder al servicio.

Es importante destacar que los adaptadores no contienen lógica de negocio. Su función es proporcionar una interfaz que permita que la lógica de la aplicación se comunique con el mundo exterior de manera eficiente y segura. Esto permite que los adaptadores sean reemplazados o actualizados sin afectar la lógica de la aplicación.

En la arquitectura hexagonal, hay dos tipos de adaptadores:

  • Adaptadores de entrada: se encargan de recibir los datos del mundo exterior y transformarlos en objetos que la aplicación puede procesar. Implementan los puertos de entrada definidos en el Domain Layer. Algunos ejemplos de adaptadores de entrada pueden ser una API REST que recibe solicitudes HTTP, una cola de mensajes que recibe mensajes, un archivo de texto plano que recibe datos, etcétera.
  • Adaptadores de salida: se encargan de enviar los datos procesados por la aplicación al mundo exterior. Estos implementan los puertos de salida definidos en el Domain Layer. Algunos ejemplos de adaptadores de salida pueden ser una base de datos que almacena los objetos de dominio procesados por la aplicación, un servicio web que envía datos a otros sistemas, un archivo de texto plano que guarda los datos procesados...

Cada tipo de adaptador tiene su propia responsabilidad dentro de la arquitectura hexagonal. Los adaptadores de entrada permiten que la aplicación reciba datos del mundo exterior y los transforme en objetos que pueden ser procesados por la lógica de la aplicación. Los adaptadores de salida permiten que la aplicación envíe los datos procesados al mundo exterior en un formato adecuado.

Es importante destacar que los adaptadores son componentes específicos de la tecnología subyacente y, por lo tanto, pueden ser reemplazados sin afectar la lógica de la aplicación. De esta manera, se logra una arquitectura más modular y mantenible.

4. Infraestructura (infrastructure layer)

La capa de infraestructura es la que proporciona soporte técnico al resto del sistema. Por ejemplo, puede contener componentes como servicios de mensajería, servicios de correo electrónico o servicios de autenticación. Esta capa es específica de la tecnología subyacente y puede ser reemplazada sin afectar al resto del sistema.

La capa de infraestructura contiene todos los componentes que proporcionan los recursos y servicios que la aplicación necesita para funcionar. Estos recursos y servicios pueden incluir sistemas de almacenamiento de datos, servidores de correo electrónico, sistemas de autenticación y otros sistemas de terceros.

Está compuesta por los adaptadores y los componentes que no están directamente relacionados con la lógica de negocio de la aplicación, pero que son necesarios para que la aplicación pueda funcionar. Estos componentes pueden incluir utilidades de logging, componentes de configuración, herramientas de monitoreo, etcétera.

Su funcionamiento se basa en proporcionar una abstracción de los recursos y servicios subyacentes para que la lógica de negocio de la aplicación no dependa directamente de ellos. Esto significa que la lógica de negocio no debe conocer detalles específicos de la tecnología subyacente utilizada para implementar los recursos y servicios.

Por ejemplo, si la aplicación necesita almacenar información en una base de datos, el adaptador de base de datos de la capa de infraestructura proporcionará una interfaz para que la lógica de negocio pueda almacenar y recuperar información sin conocer los detalles de cómo se almacenan los datos en la base de datos subyacente. De esta manera, la lógica de negocio se mantiene independiente de la tecnología subyacente y es más fácil de mantener y evolucionar a lo largo del tiempo.

Otra tarea importante de la capa de infraestructura es manejar la configuración de la aplicación. La configuración de la aplicación puede incluir cosas como la conexión a la base de datos, la configuración del servidor de correo electrónico, los valores de umbral de los sistemas de monitoreo, entre otros. La capa de infraestructura proporciona una interfaz para que la aplicación pueda leer y escribir la configuración sin conocer los detalles de cómo se almacena y se lee la configuración.

Regla de dependencia en la arquitectura hexagonal

La regla de dependencia establece que la dirección de la dependencia debe ser hacia adentro de la aplicación; es decir, que los componentes de la capa de dominio (core) no deben depender de los componentes de las capas externas (adaptadores e infraestructura). En cambio, los componentes de las capas externas deben depender de los componentes de la capa de dominio.

Esta regla es fundamental para mantener la independencia entre las distintas capas de la arquitectura hexagonal y facilitar la modificación y el mantenimiento de la aplicación. Si los componentes de la capa de dominio dependen de los componentes de las capas externas, se pierde la independencia y la flexibilidad, y cualquier cambio en una capa puede afectar a todas las demás capas.

Por lo tanto, implica que los componentes de la capa de dominio no deben conocer los detalles de implementación de las capas externas, sino que deben definir interfaces (puertos) que permitan la comunicación con las capas externas de una manera flexible y desacoplada. De esta manera, se puede mantener la independencia entre las distintas capas y facilitar la evolución y el mantenimiento de la aplicación, a lo largo del tiempo.

Consejos básicos para la implementación de la arquitectura hexagonal

Enfócate en la lógica de negocio

La lógica de negocio debe ser el componente central de la arquitectura hexagonal. Es importante separar la lógica de negocio de los detalles de la infraestructura y los adaptadores, de manera que sea más fácil de probar y mantener.

Utiliza interfaces

Emplearlas para definir los puertos y adaptadores es una buena práctica que permite la flexibilidad en el cambio de implementaciones y la comunicación entre los distintos componentes.

Mantén la independencia

Los componentes de la aplicación deben ser independientes unos de otros, lo que significa que los cambios en un componente no deben tener un impacto significativo en los otros componentes.

Busca la cohesión

Los componentes de la aplicación deben estar bien definidos y cohesivos en su función. Cada componente debe tener una responsabilidad clara y no realizar múltiples tareas.

Realiza pruebas unitarias

Son una parte importante de la implementación de una arquitectura hexagonal. La separación de la lógica de negocio de la infraestructura y los adaptadores permite pruebas unitarias más eficaces.

Emplea la refactorización de forma continua

La refactorización es una parte importante del mantenimiento de la arquitectura hexagonal. Es necesario estar siempre en busca de mejoras en la estructura de la aplicación y hacer ajustes a medida que sea necesario.

Lleva una documentación adecuada

La documentación adecuada es importante para cualquier proyecto de software, especialmente en una arquitectura hexagonal, ya que las interfaces y los puertos son componentes clave de la arquitectura. La documentación debe ser clara y fácil de entender para cualquier persona que deba trabajar en el proyecto.

Mantén la flexibilidad en la implementación

Una arquitectura hexagonal es flexible en cuanto a cómo se implementan los adaptadores y la infraestructura. Por lo tanto, es importante mantener esta flexibilidad en mente a la hora de elegir tecnologías y herramientas para la implementación de la aplicación.

Como ya viste, la arquitectura hexagonal ofrece varias ventajas, como una mayor facilidad para realizar pruebas unitarias, una mayor flexibilidad en cuanto a la implementación y la capacidad de adaptarse a los cambios en los requisitos de negocio. Por otro lado, también presenta algunas desventajas, como la complejidad inicial de diseño y la necesidad de una cuidadosa gestión de dependencias.

En general, esta metodología puede ser una excelente opción para proyectos de software complejos o de larga duración, donde la flexibilidad y la mantenibilidad son fundamentales. Es importante seguir las mejores prácticas de diseño y asegurarse de que el equipo tenga una comprensión clara de los principios de la arquitectura hexagonal para garantizar una implementación exitosa.

New Call-to-action
Temas: Backend

Artículos relacionados

Gestiona tu contenido de manera fácil con el software CMS en español gratuito de HubSpot.

COMENZAR GRATIS

CMS Hub is flexible for marketers, powerful for developers, and gives customers a personalized, secure experience

START FREE OR GET A DEMO