Háblame de la arquitectura hexagonal y de su origen.
sobes.tech AI
Respuesta de la IA
La arquitectura hexagonal (Puertos y Adaptadores) es un patrón arquitectónico propuesto por Alistair Cockburn. Su objetivo es aislar el núcleo de la lógica de negocio de la aplicación de las dependencias externas (UI, bases de datos, servicios de terceros).
Origen:
Alistair Cockburn presentó el concepto en 2005. La idea principal surgió como una reacción a las arquitecturas tradicionales en capas, donde la lógica de negocio a menudo estaba fuertemente acoplada a la capa de infraestructura. Cockburn buscaba crear una arquitectura que permitiera desarrollar y probar la lógica de negocio independientemente de cómo interactuara con el mundo exterior. El nombre "hexagonal" simboliza la capacidad de la aplicación para interactuar con diferentes tipos de "adaptadores" externos a través de "puertos". Se eligió un hexágono como figura abstracta que tiene suficientes "caras" (puertos) para interactuar con diferentes sistemas.
Principios básicos:
- Núcleo (Core / Dominio): Contiene la lógica de negocio pura y los objetos de dominio. No depende de tecnologías externas.
- Puertos (Ports): Interfaces que definen la interacción entre el núcleo y el mundo exterior. Hay dos tipos de puertos:
- Entrantes (Driving Ports): Definen cómo los agentes externos (por ejemplo, interfaz de usuario o API) pueden invocar funciones del núcleo.
- Salientes (Driven Ports): Definen cómo el núcleo puede interactuar con servicios externos (por ejemplo, base de datos o API de terceros). El núcleo define estas interfaces, pero no las implementa.
- Adaptadores (Adapters): Implementan los puertos y sirven como enlace entre el núcleo y los elementos externos. También hay dos tipos de adaptadores:
- Entrantes (Driving Adapters): Transforman las solicitudes de los agentes externos a un formato comprensible por el núcleo (por ejemplo, un adaptador UI).
- Salientes (Driven Adapters): Transforman las llamadas desde el núcleo a un formato comprensible por los servicios externos (por ejemplo, un adaptador de base de datos).
Ventajas:
- Aislamiento: El núcleo de la lógica de negocio no depende de tecnologías externas.
- Testabilidad: El núcleo puede ser probado independientemente, sin necesidad de ejecutar toda la pila.
- Flexibilidad: Es fácil reemplazar un adaptador por otro sin modificar el núcleo (por ejemplo, cambiar de una base de datos a otra).
- Mantenibilidad: Las diferentes partes de la aplicación (núcleo y adaptadores) pueden desarrollarse y evolucionar independientemente.
Aplicación en Frontend:
Aunque la arquitectura hexagonal se asocia más con el backend, sus principios también pueden aplicarse en el frontend para estructurar la aplicación cliente:
- Núcleo: Módulos que contienen la lógica de negocio y el estado de la aplicación (por ejemplo, reductores de Redux, tienda Zustand, componentes con lógica pura sin vinculación al DOM).
- Puertos: Interfaces que definen cómo la UI interactúa con la lógica (entrantes) y cómo la lógica interactúa con APIs externas o almacenamiento local (salientes).
- Adaptadores: Componentes UI que manejan la entrada del usuario y llaman a los puertos (adaptadores entrantes), y servicios que realizan solicitudes HTTP o trabajan con la API del navegador como localStorage (adaptadores salientes).
Ejemplo de estructura (abstracta):
📦 app
┣ 📂 core
┃ ┣ 📂 domain
┃ ┃ ┗ 📜 todos.ts // Descripción de la entidad Todo
┃ ┣ 📂 application
┃ ┃ ┗ 📜 todoService.ts // Lógica de negocio para Todo
┃ ┗ 📂 ports
┃ ┃ ┣ 📜 in/ITodoUseCase.ts // Puerto entrante (interfaz para UI)
┃ ┃ ┗ 📜 out/ITodoRepository.ts // Puerto saliente (interfaz para acceso a datos)
┣ 📂 infra
┃ ┣ 📂 adapters
┃ ┃ ┣ 📂 in/reactUIAdapter.tsx // Adaptador entrante (componente React)
┃ ┃ ┗ 📂 out/apiTodoRepository.ts // Adaptador saliente (implementación de acceso a API)