# Arquitectura hexagonal (software)

La arquitectura hexagonal, o arquitectura de puertos y adaptadores, es un patrón arquitectónico utilizado en el diseño de software . Su objetivo es crear componentes de aplicación acoplados de forma flexible que puedan conectarse fácilmente a su entorno de software mediante puertos y adaptadores . Esto hace que los componentes sean intercambiables en cualquier nivel y facilita la automatización de pruebas.

## Origen

La arquitectura hexagonal fue inventada por Alistair Cockburn en un intento de evitar los problemas estructurales conocidos en el diseño de software orientado a objetos, como las dependencias no deseadas entre capas y la contaminación del código de la interfaz de usuario con la lógica de negocio. Inicialmente, se discutió en la wiki de Portland Pattern Repository; en 2005 Cockburn lo renombró a "Puertos y adaptadores". En abril de 2024, Cockburn publicó un libro completo sobre el tema, en coautoría con Juan Manuel Garrido de Paz.
El término "hexagonal" proviene de las convenciones gráficas que muestran el componente de la aplicación como una celda hexagonal. El propósito no era sugerir que habría seis entradas/puertos, sino dejar suficiente espacio para representar las diferentes interfaces necesarias entre el componente y el mundo externo.

## Principio

La arquitectura hexagonal divide un sistema en varios componentes intercambiables y acoplados de forma flexible, tales como el núcleo de la aplicación, la base de datos, la interfaz de usuario, las pruebas y las interfaces con otros sistemas. Este enfoque es una alternativa a la arquitectura multicapa tradicional.
Cada componente está conectado a los demás a través de una serie de "puertos" expuestos. La comunicación a través de estos puertos sigue un protocolo determinado dependiendo de su finalidad. Los puertos y protocolos definen una API abstracta que puede implementarse mediante cualquier medio técnico adecuado (por ejemplo, invocación de métodos en un lenguaje orientado a objetos, llamadas a procedimientos remotos o servicios web).
La granularidad de los puertos y su número no están restringidos:
* Un solo puerto podría en algunos casos ser suficiente (por ejemplo en el caso de un consumidor de servicio simple);
* Normalmente, hay puertos para fuentes de eventos (interfaz de usuario, alimentación automática), notificaciones (notificaciones salientes), bases de datos (para interconectar el componente con cualquier SGBD adecuado) y administración (para controlar el componente);
* En un caso extremo, podría haber un puerto diferente para cada caso de uso, si fuera necesario.
Los adaptadores son la unión entre los componentes y el mundo exterior. Adaptan los intercambios entre el mundo externo y los puertos que representan los requisitos del interior del componente aplicación. Puede haber varios adaptadores para un puerto, por ejemplo, los datos pueden ser proporcionados por un usuario a través de una IGU o una interfaz de línea de comandos, por una fuente de datos automatizada o por secuencias de prueba.

## Crítica

El término "hexagonal" implica que el concepto tiene 6 partes, mientras que solo hay 4 áreas clave. El uso del término proviene de las convenciones gráficas que muestran el componente de la aplicación como una celda hexagonal. El propósito no era sugerir que habría seis entradas/puertos, sino dejar suficiente espacio para representar las diferentes interfaces necesarias entre el componente y el mundo externo.
Según Martin Fowler, la arquitectura hexagonal tiene la ventaja de utilizar similitudes entre la capa de presentación y la capa de fuente de datos para crear componentes simétricos hechos de un núcleo rodeado de interfaces, pero con el inconveniente de ocultar la asimetría inherente entre un proveedor de servicios y un consumidor de servicios que se representaría mejor como capas.

## Evolución

Según algunos autores, la arquitectura hexagonal está presente en el origen de la arquitectura de microservicios.

## Variantes

La arquitectura de cebolla (del inglés onion architecture) propuesta por Jeffrey Palermo en 2008 es similar a la arquitectura hexagonal: también externaliza la infraestructura con interfaces para asegurar un acoplamiento flexible entre la aplicación y la base de datos. Además, descompone el núcleo de la aplicación en varios anillos concéntricos mediante la inversión de control.
La arquitectura limpia (del inglés clean architecture) propuesta por Robert C. Martin en 2012 combina los principios de la arquitectura hexagonal, la arquitectura de cebolla y otras variantes. Proporciona niveles adicionales de detalle del componente, que se presentan como anillos concéntricos. Aísla adaptadores e interfaces (interfaz de usuario, bases de datos, sistemas externos, dispositivos) en los anillos externos de la arquitectura y deja los anillos internos para casos de uso y entidades. La arquitectura limpia utiliza el principio de inversión de dependencia con la regla estricta de que las dependencias solo deben existir desde un anillo externo hacia un anillo interno y nunca al revés.