Fale sobre a arquitetura hexagonal e a sua origem.
sobes.tech IA
Resposta da IA
A arquitetura hexagonal (Ports e Adaptadores) é um padrão arquitetural proposto por Alistair Cockburn. Destina-se a isolar o núcleo da lógica de negócio da aplicação das dependências externas (UI, bases de dados, serviços de terceiros).
Origem:
Alistair Cockburn apresentou o conceito em 2005. A ideia principal surgiu como uma reação às arquiteturas tradicionais em camadas, onde a lógica de negócio muitas vezes estava fortemente acoplada à camada de infraestrutura. Cockburn procurava criar uma arquitetura que permitisse desenvolver e testar a lógica de negócio independentemente de como ela interagia com o mundo exterior. O nome "hexagonal" simboliza a capacidade da aplicação de interagir com diferentes tipos de "adaptadores" externos através de "portos". Um hexágono foi escolhido como figura abstrata que possui faces suficientes (portos) para interagir com diferentes sistemas.
Princípios básicos:
- Núcleo (Core / Domínio): Contém a lógica de negócio pura e objetos de domínio. Não depende de tecnologias externas.
- Portos: Interfaces que definem a interação entre o núcleo e o mundo exterior. Existem dois tipos de portos:
- Entrantes (Driving Ports): Definem como os agentes externos (por exemplo, interface de utilizador ou API) podem invocar funções do núcleo.
- Saídas (Driven Ports): Definem como o núcleo pode interagir com serviços externos (por exemplo, base de dados ou API de terceiros). O núcleo define essas interfaces, mas não as implementa.
- Adaptadores (Adapters): Implementam os portos e servem como ligação entre o núcleo e os elementos externos. Existem também dois tipos de adaptadores:
- Entrantes (Driving Adapters): Transformam as requisições dos agentes externos num formato compreensível pelo núcleo (por exemplo, um adaptador UI).
- Saídas (Driven Adapters): Transformam as chamadas do núcleo num formato compreensível pelos serviços externos (por exemplo, um adaptador de base de dados).
Vantagens:
- Isolamento: O núcleo da lógica de negócio não depende de tecnologias externas.
- Testabilidade: O núcleo pode ser testado independentemente, sem necessidade de executar toda a pilha.
- Flexibilidade: É fácil substituir um adaptador por outro sem modificar o núcleo (por exemplo, passar de uma base de dados para outra).
- Manutenção: As diferentes partes da aplicação (núcleo e adaptadores) podem ser desenvolvidas e evoluir independentemente.
Aplicação no Frontend:
Embora a arquitetura hexagonal seja mais associada ao backend, seus princípios também podem ser aplicados no frontend para estruturar a aplicação cliente:
- Núcleo: Módulos que contêm a lógica de negócio e o estado da aplicação (por exemplo, redutores do Redux, loja Zustand, componentes com lógica pura sem ligação ao DOM).
- Portos: Interfaces que definem como a UI interage com a lógica (entrantes) e como a lógica interage com APIs externas ou armazenamento local (saídas).
- Adaptadores: Componentes UI que gerenciam a entrada do utilizador e chamam os portos (adaptadores entrantes), e serviços que realizam requisições HTTP ou trabalham com a API do navegador como localStorage (adaptadores saídos).
Exemplo de estrutura (abstrata):
📦 app
┣ 📂 core
┃ ┣ 📂 domain
┃ ┃ ┗ 📜 todos.ts // Descrição da entidade Todo
┃ ┣ 📂 application
┃ ┃ ┗ 📜 todoService.ts // Lógica de negócio para Todo
┃ ┗ 📂 ports
┃ ┃ ┣ 📜 in/ITodoUseCase.ts // Porta de entrada (interface para UI)
┃ ┃ ┗ 📜 out/ITodoRepository.ts // Porta de saída (interface para acesso a dados)
┣ 📂 infra
┃ ┣ 📂 adapters
┃ ┃ ┣ 📂 in/reactUIAdapter.tsx // Adaptador de entrada (componente React)
┃ ┃ ┗ 📂 out/apiTodoRepository.ts // Adaptador de saída (implementação de acesso à API)