Cambias una conexión y se rompe todo: qué propone la arquitectura hexagonal
Puertos y adaptadores explicados con un ejemplo pequeño y verificable en Python.
Separar una regla del negocio de la herramienta que guarda los datos permite probarla y cambiar sus conexiones con un alcance más claro.
Qué propone la arquitectura hexagonal
En el artículo original de Alistair Cockburn, los puertos y adaptadores permiten desarrollar y probar la aplicación sin depender directamente de su interfaz o base de datos. El nombre no obliga a crear seis capas ni seis componentes.
- Regla: expresa qué debe ocurrir en el negocio.
- Puerto: define la conexión que necesita la aplicación.
- Adaptador: implementa esa conexión con una tecnología.
Un ejemplo mínimo
Esta función valida un código antes de guardarlo. Recibe la conexión desde fuera, sin elegir una base de datos:
from typing import Protocol
class Repositorio(Protocol):
def guardar(self, codigo: str) -> None: ...
def registrar_solicitud(codigo: str, repo: Repositorio) -> None:
codigo = codigo.strip()
if not codigo:
raise ValueError("El código es obligatorio")
repo.guardar(codigo)
Un adaptador podría guardar en una base de datos; otro podría conservar el código en memoria para una prueba. La función mantiene la misma regla. Protocol ayuda a expresar ese contrato para herramientas de tipado; las anotaciones no validan automáticamente los datos durante la ejecución.
Qué comprobaría
Verificaría que un código válido se guarda y que uno vacío produce un error sin llamar al repositorio. Luego probaría el adaptador de datos por separado. El ejemplo es propio e ilustrativo: no constituye una aplicación completa.
Cuándo aporta valor
Este enfoque resulta útil cuando hay reglas que proteger e integraciones que pueden cambiar. En un sistema heredado, empezaría por delimitar un caso de uso; no reorganizaría toda la aplicación únicamente para adoptar el patrón.
Fuentes consultadas el 4 de octubre de 2026. Los ejemplos son ilustrativos y las conclusiones expresan una lectura profesional.