# Arquitectura Hexagonal <div style="width:300px; margin: 0 auto;"> <img src="https://i.imgur.com/aBlxCCh.png" alt="hexagonal_arq"/> </div> El nombre arquitectura hexagonal no es del todo correcto, ya que te puede llevar a pensar de que sólo puedes tener 6 interfaces, 6 implementaciones, lleva mucha confusión. **Arquitectura de Puertos y Adaptadores**(interfaces e implementaciones) sería un mejor nombre. Está compuesta de 3 capas: - **Infraestructura**: Cualquier cosa que tenga que ver con entrada salida (base de datos, conexiones a apis, etc) - **Aplicación**: Donde van los casos de uso (crear un usuario, login, logout) - **Dominio**: Cualquier Value Object que pueda haber e interfaces de nuestros repositories, nuestros agregados o entidades. ## Regla de dependencia 1. Infraestructura puede conocer detalles de aplicación y dominio. 2. Aplicación puede conocer detalles de dominio pero no de infraestructura. 3. Dominio sólo puede conocerse así mismo ## Estructura de carpetas Está es la estructura de carpetas que podríamos llegar a tener si aplicamos la arquitectura: <div style="width:300px; margin: 0 auto;"> <img src="https://i.imgur.com/pbpPs7H.png" alt="hexagonal_arq_folder"/> </div> Aunque puede llegar a tener un problema si nuestra aplicación es muy grande y tiene muchas entidades de dominio. <div style="width:300px; margin: 0 auto;"> <img src="https://i.imgur.com/ANUJ7vC.png" alt="hexagonal_arq_folder"/> </div> ### Vertical Slicing Aplicando está organización dividiríamos nuestras carpetas por entidades, y dentro de cada entidad haremos nuestra división por capas: <div style="width:300px; margin: 0 auto;"> <img src="https://i.imgur.com/hBw1zAg.png" alt="vertical slicing"/> </div> La estructura quedaría tal que así: <div style="width:300px; margin: 0 auto;"> <img src="https://i.imgur.com/xL1GVqr.png" alt="vertical slicing"/> </div> ### Scream Si nos quedamos cortos con vertical slicing, podemos hacer una agrupación más. Podemos separar dentro de las carpetas por los casos de uso, lo que nos grita es lo que hacemos y no lo que somos: <div style="width:300px; margin: 0 auto;"> <img src="https://i.imgur.com/uTZfMd3.png" alt="screaming_arquitecture"/> </div> ## En frontend [Curso Arquitectura Hexagonal en Frontend by *Codely TV*](https://pro.codely.com/library/arquitectura-hexagonal-en-frontend-197663/483637/about/?utm_source=youtube&utm_medium=social&utm_campaign=course-launch&utm_content=hexagonal-front) [Arquitectura Hexagonal en el FrontEnd by *Adrián Ferrera*](https://softwarecrafters.io/react/arquitectura-hexagonal-frontend) [Arquitectura hexagonal dev.to](https://dev.to/dennysjmarquez/la-arquitectura-hexagonal-un-enfoque-para-desarrollar-aplicaciones-robustas-en-react-angular-y-vue-con-ejemplos-de-codigo-l4l) [Alejándonos de ReactJs y VueJs en frontend usando Clean Architecture](https://xurxodev.com/frontend-clean_architecture/) [hexagonal-architecture-frontend](https://github.com/juanm4/hexagonal-architecture-frontend) ## Anotaciones - Muchas veces la capa de aplicación no tiene sentido, ya que no hay casos de uso como tal en el proyecto. Además en ocasiones el concepto de capa de aplicación es muy difuso y puede llevar a dudas. - Vertical slicing puede llegar a ser muy útil para encontrar lo que necesites buscar. Si por ejemplo tienes una entidad user y necesitas buscar algún caso de uso que tenga que ver con dicha entidad, será más fácil de encontrar. - Hay que tener presente todo el ámbito del proyecto. No sirve de nada usar una arquitectura muy bien estructurada, si luego dejas que la generación de ids, a la hora de insertar valores en una base de datos, la gestione esa herramienta, porque ya se está creando una fuerte dependencia a ese motor de base de datos. ## Recursos [Aprender arquitectura hexagonal by *CodelyTV*](https://youtu.be/eNFAJbWCSww) [Mesa redonda: Organización de carpetas en la arquitectura hexagonal by *Lean Mind*](https://youtu.be/OUOQcO-OQ98) ###### tags: `Clean Code` `Código limpio`