Arquitetura Hexagonal (Ports & Adapters)
Tags: javascript, node, architecture
Published: 2023-05-24 18:01:31

A **arquitetura hexagonal**, popularmente conhecida como **Ports & Adapters**, é um padrão de arquitetura de software para desenvolvimento back-end onde seu design permite uma maior maturidade, organização e manutenabilidade de software, cuja aplicação deve ter um objetivo único: regras consolidadas e centralizar a lógica de negócios da aplicação, o que a torna independente de tecnologias externas. Na arquitetura hexagonal, a aplicação é dividida em camadas, sendo a camada de negócios ou domínio o núcleo (core domain) da arquitetura. Com isso, a partir dessas camadas formamos os **hexágonos** da arquitetura, quer dizer que você tem **delimitações de camadas**, sendo a principal delimitação o **core** (núcleo).

> ⬣ O hexágono não precisa ser necessariamente um hexágono.

O conceito de Arquitetura Hexagonal foi proposto por Alistair Cockburn, em meados dos anos 90, em um artigo postado na primeira wiki que foi desenvolvida, chamada WikiWikiWeb (cujos artigos tratavam principalmente de temas relacionados com Engenharia de Software).

Os objetivos de uma Arquitetura Hexagonal são parecidos com os de uma Arquitetura Limpa (Clean Architecture). Mas, para reforçar, a ideia é construir sistemas que favorecem reusabilidade de código, alta coesão, baixo acoplamento, independência de tecnologia e que são mais fáceis de serem testados.

Uma Arquitetura Hexagonal divide as classes de um sistema em dois grupos principais:

<img src="https://fernandofranzini.files.wordpress.com/2019/04/1.png" height="277" align="right">

No meio temos o **application core** (núcleo da aplicação) ou **domain** (domínio) ou **camada de negócio** que é a razão do software existir, é o coração de tudo, como por exemplo: entidades e regras do negócio da aplicação e o local do nosso DDD. No domain, temos praticamente toda a implementação das regras de negócio e funcionalidades do sistema, sendo uma camada interna e isolada do restante da aplicação e é independente de qualquer tecnologia externa. As outras camadas da arquitetura são responsáveis por adaptar as tecnologias externas à camada de negócios, mais conhecidos como _Adapters_.

No segundo hexágono, temos as **application** (aplicação) ficam os caso de uso, fluxo de aplicação e comportamento da aplicação.

Na parte mais externa nós temos o **framework** (estrutura), que são todas as ferramentas que vão ajudar e facilitar o seu processo de desenvolvimento. É o conjunto de bibliotecas que dão acesso a aplicação (serialização, HTTP, processo de visualização), bibliotecas que permitem a aplicação dar uma resposta a uma requisição, framework não sabe do que se trata a aplicação, apenas faz o 'meio de campo'.

## Ports and Adaptores (adaptadores e portos)
<img src="https://upload.wikimedia.org/wikipedia/commons/7/75/Hexagonal_Architecture.svg" height="277" align="right">

**Adapters** (adaptadores) são implementações do sistema que permitem a comunicação do sistema com tecnologias e ferramentas externas, como: base de dados, broker, browser, smtp para envio de e-mails. Inclusive o próprio framework para e as suas configurações. E, assim, esses adapters podem ser facilmente alterados quando necessário sem afetar o Application Core que segue isolado e como é feita essa comunicação entre essas camadas. Existem dois tipos de Adapters:

- **Camada de adaptação de entrada**: responsável por adaptar as requisições de entrada da aplicação, como requisições HTTP, para objetos que possam ser entendidos pela camada de negócios;
- **Camada de adaptação de saída**: .

A comunicação com essas camadas de Adapters é feito através dos Ports (portos). Em uma Arquitetura Hexagonal, o termo porta designa as interfaces usadas para comunicação com as classes de domínio (veja que interface aqui significa interface de programação; por exemplo, uma interface de Java).

Existem dois tipos de portos: