Table of Contents
Modelo Hexagonal en la arquitectura de Software
La arquitectura hexagonal junto con arquitectura de puertos y adaptadores es muy utilizada hoy en día, sin embargo la gente aun se confunde con el nombre y no conoce muy bien la diferencia entre ellos, cual es su valor añadido. La arquitectura hexagonal es un estilo de arquitectura de software que mueve el foco de un programador desde un plano más conceptual hacia la distinción entre el interior y el exterior del software. La parte interior son los casos prácticos y el modelo domain está construido sobre ello. La parte exterior es UI, base de datos, mensajería, etc. La conexión entre el interior y el exterior es mediante puertos, y su implementación equivalente se conocen como adaptadores. Por esta razón, este estilo de arquitectura hexagonal se conoce habitualmente como Puertos y Adaptadores. La arquitectura hexagonal promueve la separación de asuntos mediante la encapsulación de la lógica en diferentes capas de la aplicación. Esto permite un aislamiento de mayor nivel, testabilidad, y control sobre el código de negocio específico. Cada capa de la aplicación tiene un estricto grupo de responsabilidades y requerimientos. Esto crea separaciones más claras entre la lógica y la funcionalidad, y como esas capas deberían interactuar entre ellas. Cada parte del hexágono representa un input – puerto, por ejemplo HTTP, que utiliza un adaptador para un tipo específico. Crea una separación clara entre el modelo domain y los dispositivos utilizados para las entradas o salidas.Los 3 componentes de un patrón de arquitectura hexagonal
1.Patrón Hexagonal – Modelo Domain
Un modelo domain es un modelo conceptual, una representación de conceptos significativos para el domain que han de ser modelados en el software. Los conceptos incluyen la información envuelta en el negocio y dirige los usos de negocio en relación a esa información.2.Puertos en las arquitecturas hexagonales
Un puerto es un punto de entrada, proveniente del centro de la lógica. Define una serie de funciones. Un puerto es el mediante el que la lógica de negocio es accesible. Es una barrera de caso práctico, por ejemplo, puertos se corresponden a casos prácticos en una aplicación. La implementación más simple de un puerto puede tener forma de capa API. Los puertos son mayormente la mayoría de los API de la aplicación. Son llamados por los adaptadores primarios que forman la parte de usuario de la aplicación. Ejemplos de ello son las funciones que permiten cambiar objetos, atributos y relaciones en el centro de la lógica. Los puertos secundarios son las interfaces para los adaptadores secundarios. Son llamados desde el centro de la lógica. Un ejemplo de puerto secundario es una interface para almacenar objetos individuales. Esta interface simplemente especifica que un objeto puede ser creado, actualizado, recuperado y borrado. No te da ninguna información sobre como este objeto esta almacenado.3. Adaptadores en arquitectura de software hexagonal
Un adaptador es un puente entre la aplicación y el servicio necesitado en una aplicación. Se adapta a un puerto específico. Los adaptadores actúan de capa que sirve para transformar la comunicación entre actores externos y la lógica de la aplicación de forma que ambas dos quedan independientes. En una arquitectura hexagonal todas los actores primarios y secundarios interactúan con los puertos de la aplicación a través de los adaptadores. Los actores primarios son aquellos que utilizan el sistema para conseguir una meta en particular, mientras que los actores secundarios son aquellos que el sistema utiliza para conseguir la meta principal de los actores primarios. En otras palabras, un adaptador primario es una pieza de código entre el usuario y el centro de la lógica. Un adaptador puede ser una función de la prueba unitaria para el centro de la lógica. Otra, puede ser la función de controlador que interactúa con la interface de usuario gráfico y el centro de la lógica. Un adaptador secundario es una implementación de puerto secundario, una interface. Por ejemplo, puede ser una clase pequeña que convierte la petición de almacenamiento en la aplicación en una base de datos, y devuelve los resultados de la base de datos en forma de petición por el puerto secundario. Vaughn Vernon continuo con la Hexagonal, o Puertos y adaptadores, estilo de arquitectura, la cual fue creada por Alistar Cockburn. Alistar cree que la arquitectura debería permitir a una aplicación ser igualmente conducida por los usuarios, programas, test automáticos o secuencias de comandos por lotes, y ser desarrolladas y testeadas de manera individual a sus dispositivos y base de datos. Vaughn es famoso por su libro sobre DDD y ve la arquitectura hexagonal como una evolución del estilo de capas pero con ventajas. Permite retrasar decisiones para ciertos mecanismo de arquitectura, por ejemplo el tipo de persistencia a utilizar sin impedir el progreso de la funcionalidad en progreso. Lo importante aquí es que pensar en términos de puertos y adaptadores convierte a una manera más fácil el uso de los mismos API internos para diferente tipos de clientes. Él ve que el foque principal de esta arquitectura es desacoplar el centro de la lógica de la aplicación de los servicios que utiliza. Permitiendo que diferentes servicios puedan “enchufarse”, y que la aplicación pueda funcionar sin estos servicios.Beneficios de una programación hexagonal en el desarrollo de software
Arquitectura hexagonal y el mundo exterior
La aplicación puede esencialmente ser dirigida por cualquier número de controles distintos. Puedes utilizar tu centro de lógica de negocio interior a traves de un interface “Command Line”, otra aplicación o sistema, un humano o un guión automático.Independiente a servicios externos
Cuando tu aplicación es agnóstica al mundo exterior, significa que es independiente de los servicios exteriores. Puedes desarrollar el interior del centro de la aplicación mucho antes que empieces a pensar sobre el tipo de base de datos que vas a utilizar. Definiendo puertos y adaptadores para tu base de datos, estas libre de utilizar cualquier tecnología de implementación. Lo que te permite utilizar un almacenamiento de información en la memoria en los primeros días, y mas tarde tomar la decisión de que tipo de base de datos quieres utilizar cuando necesites almacenar la información de tu aplicación en un almacenamiento persistentemente.Mas fácil de testear de manera individual
Ahora que tu aplicación es agnóstica al mundo exterior, es mucho más fácil de testear de forma individual. Esto significa que en vez de enviar peticiones en HTTP, o hacia base de datos, simplemente puedes testear cada capa de tus aplicación, burlando cualquier dependencia. Esto solo funciona en test rápidos, pero desacopla de manera masiva tu código de los detalles de implementación del mundo exterior.Los puertos y adaptadores son reemplazables
El rol de los puertos y adaptadores es convertir la petición y las respuestas a medida que entran del mundo exterior. Este proceso de reconversión permite a la aplicación a recibir peticiones y enviar respuestas a cualquier numero de tecnología exterior sin tener que saber nada de ellas. Permite reemplazar un adaptador por una implementación diferente que forme la misma interface.Separación de las diferentes tasas de cambio
Las capas más exteriores que típicamente tienen más cambios. Por ejemplo, la interfaz de usuario, gestionando peticiones o trabajando con servicios externos que normalmente evoluciona más rápido que las reglas de negocio de la aplicación. Esta separación te permite rápidamente iterar en las capas más externas sin tocar las capas más interiores que se han de mantener consistentes. Las capa mas interna no tiene conocimiento de las más exteriores y estos cambios pueden darse sin dañar el código.Alto mantenimiento
El mantenimiento es la ausencia de deuda técnica. Cambios en una área de la aplicación no afectan a otras. Añadir características no requiere un largo cambio de bases de código. Añadiendo nuevas maneras de interactuar con la aplicación requiere pocos cambios. El testeo es relativamente fácil. En resumen, la arquitectura hexagonal es un enfoque que divide el software en dos partes, la interior y la exterior. Aplicando este enfoque, haces tu parte de código más importante libre de detalles técnicos innecesarios y ganar flexibilidad, testabilidad y otras ventajas que hacen de tu proceso de trabajo uno más eficiente.EJEMPLOS DE DISEÑOS DE SOFTWARE BASADOS EN ARQUITECTURA HEXAGONAL
Habiendo visto ya la teoría os presentamos una serie de ejemplos prácticos en los que se ha hecho uso del patrón que proporciona el marco de la arquitectura de software hexagonal: Suscríbete a nuestro newsletter para estar al día de los eventos, meet ups y demás artículos!Si te gustó este artículo sobre arquitectura Hexagonal, probablemente te pueda gustar:
- Código limpio
- Principios SOLID
- “Software que funciona” como medida de progreso
- Diseño guiado por el dominio
- Arquitectura de software – beneficios
- Arquitectura de microservicios vs monolítica
Author
-
Ekaterina Novoseltseva is an experienced CMO and Board Director. Professor in prestigious Business Schools in Barcelona. Teaching about digital business design. Right now Ekaterina is a CMO at Apiumhub - software development hub based in Barcelona and organiser of Global Software Architecture Summit. Ekaterina is proud of having done software projects for companies like Tous, Inditex, Mango, Etnia, Adidas and many others. Ekaterina was taking active part in the Apiumhub office opening in Paseo de Gracia and in helping companies like Bitpanda open their tech hubs in Barcelona.
Ver todas las entradas
More to Explore
- Enfoques arquitectónicos: Arquitectura limpia y hexagonal
- La deuda del proceso es algo que debería importarte
- Recap del Global Software Architecture Summit 2022
- Estilos de arquitectura de software
- Taller de GSAS: Conviértete en empresa de diseño de software
- Principios y objetivos de la Arquitectura Continua
6 Comments
Fredy Cortés
Hola me gustaría saber donde puedo encontrar literatura sobre este tema, para poder tomarlo como referencia en un articulo de investigación. Te agradecería un montón.
Ekaterina Novoseltseva
Hola, uno de los primeros articulos sobre este tema estaba publicado por Alistair Cockburn: https://alistair.cockburn.us/hexagonal-architecture/
jose cuentas
compa tienes algun ejemplo de desarrollo para este tema?
Ekaterina Novoseltseva
Hola, mil disculpas por la tardanza en responder, si, mi compañero Javier Gomez ha escrito 2 articulos sobre este tema ( explicando ejemplo real ):
1. Aplicando Arquitectura Hexagonal: principios
https://apiumhub.com/es/tech-blog-barcelona/aplicando-arquitectura-hexagonal-proyecto-symfony/
2. Arquitectura Hexagonal en un proyecto Symfony: Trabajando con Identificadores de Dominio
https://apiumhub.com/es/tech-blog-barcelona/hexagonal-symfony-identificadores-de-dominio/
Ramon Bacardi
podemos ver un ejemplo «basico» de esta arquitectura ?
Ekaterina Novoseltseva
Hola, si, mi compañero Javier Gomez – Desarrollador Backend ha escrito 2 articulos sobre este tema ( explicando ejemplo real ):
1. Aplicando Arquitectura Hexagonal: principios
https://apiumhub.com/es/tech-blog-barcelona/aplicando-arquitectura-hexagonal-proyecto-symfony/
2. Arquitectura Hexagonal en un proyecto Symfony: Trabajando con Identificadores de Dominio
https://apiumhub.com/es/tech-blog-barcelona/hexagonal-symfony-identificadores-de-dominio/