Arquitectura Hexagonal (Ports & Adapters) Cheatsheet Completo

La Arquitectura Hexagonal, o Arquitectura de Puertos y Adaptadores, es un patrón de diseño de software creado por Alistair Cockburn. Su objetivo principal es asegurar que la lógica de negocio central (el dominio de la aplicación) sea completamente independiente de cualquier infraestructura externa, como bases de datos, frameworks web, sistemas de mensajería o interfaces de usuario.


1. 🌟 Conceptos Clave


2. 🌀 Las Capas / Componentes

2.1. 🔵 1. Núcleo de la Aplicación (Application Core / Domain Layer)

El corazón de la arquitectura. Contiene la lógica de negocio principal y las definiciones de los puertos.

2.2. 🟡 2. Adaptadores (Adapters Layer)

La capa externa que implementa los puertos y gestiona las interacciones con el mundo exterior.


3. 🎯 La Regla de Dependencia


4. 🛠️ Implementación Práctica (Ejemplo Conceptual)

Estructura de Directorios (Ejemplo)

mi-aplicacion/
├── src/
│   ├── domain/              # El Núcleo de la Aplicación
│   │   ├── model/           # Entidades, Agregados, Objetos de Valor
│   │   │   └── Product.java
│   │   ├── ports/           # Puertos (Interfaces)
│   │   │   ├── in/          # Puertos de Conducción (Driving/Inbound Ports)
│   │   │   │   └── ICreateProductUseCase.java
│   │   │   └── out/         # Puertos Conducidos (Driven/Outbound Ports)
│   │   │       └── IProductRepository.java
│   │   └── usecase/         # Casos de Uso (Servicios de Aplicación)
│   │       └── CreateProductUseCaseImpl.java
│   │
│   └── adapters/            # La Capa de Adaptadores
│       ├── in/              # Adaptadores de Conducción (Driving Adapters)
│       │   ├── web/         # Adaptador Web (API REST)
│       │   │   └── ProductController.java  (Implementa ICreateProductUseCase)
│       │   └── cli/         # Adaptador CLI
│       │       └── ProductCliAdapter.java
│       └── out/             # Adaptadores Conducidos (Driven Adapters)
│           ├── persistence/ # Adaptador de Persistencia
│           │   ├── JpaProductRepositoryAdapter.java (Implementa IProductRepository)
│           │   └── ProductJpaEntity.java
│           └── notification/ # Adaptador de Notificación
│               └── SmtpEmailServiceAdapter.java

└── config/                  # Configuración de Inyección de Dependencias
    └── DependencyInjectionConfig.java

Flujo de Datos

  1. Entrada Externa (ej. HTTP Request): Llega al Adaptador de Conducción (Controlador Web).
  2. Adaptador de Conducción:
    • Parsea el Request HTTP (JSON/XML).
    • Crea un RequestModel (DTO) para el Caso de Uso.
    • Llama al Puerto de Conducción (Interfaz del Caso de Uso), inyectado vía DI.
  3. Caso de Uso (en el Núcleo):
    • Recibe el RequestModel.
    • Orquesta el Dominio (crea entidades, invoca lógica de negocio).
    • Utiliza los Puertos Conducidos (Interfaces de Repositorio/Servicio) (ej. IProductRepository.save()), inyectados vía DI, para interactuar con el exterior.
  4. Adaptador Conducido (ej. Implementación de Repositorio):
    • Recibe la llamada del Puerto Conducido.
    • Convierte el objeto de dominio al formato específico de la infraestructura (ej. JPA Entity, SQL).
    • Interactúa con el sistema externo (BD, API de terceros).
    • Devuelve el resultado (convertido de nuevo a objeto de dominio) al Caso de Uso.
  5. Caso de Uso: Recibe el resultado, lo procesa, y crea un ResponseModel (DTO).
  6. Adaptador de Conducción: Recibe el ResponseModel y lo convierte al formato de respuesta del agente externo (ej. JSON para HTTP Response).
  7. Salida Externa (ej. HTTP Response).

5. 📈 Beneficios


6. ⚠️ Desafíos y Consideraciones


7. 🤝 Relación con Otras Arquitecturas

La Arquitectura Hexagonal es conceptualmente muy similar a (y a menudo citada como precursora o sinónimo de) otras arquitecturas limpias:

Todos estos patrones buscan lograr los mismos beneficios de desacoplamiento y testabilidad al poner la lógica de negocio en el centro y aislarla de los detalles externos.


8. 💡 Buenas Prácticas y Consejos


Este cheatsheet te proporciona una referencia completa de la Arquitectura Hexagonal, cubriendo sus principios fundamentales, la estructura de sus capas, la crucial regla de dependencia, sus beneficios y desafíos, y las mejores prácticas para implementarla en tus proyectos de software, logrando sistemas robustos y adaptables.