Marcio Cunha

Arquitetura Hexagonal: Como Isolar o Domínio de Frameworks

Aprenda a estruturar sistemas de software desacoplando regras de negócio de frameworks, bancos de dados e interfaces externas usando a arquitetura hexagonal.

Marcio Cunha12 min
Também disponível em:EnglishEspañol
Resumo
  • O desacoplamento estrutural protege a lógica principal contra mudanças repentinas em bibliotecas externas.
  • Portas funcionam como contratos formais que definem o ponto de entrada e saída do núcleo da aplicação.
  • Adaptadores atuam como tradutores para conectar o mundo externo, como APIs HTTP e bancos de dados relacionais.
  • Testes automatizados tornam-se consideravelmente mais rápidos ao eliminar dependências de infraestrutura pesada.
  • A manutenibilidade de longo prazo compensa a complexidade inicial de configuração do projeto.

O Problema Silencioso do Acoplamento com Frameworks

Quando começamos a construir um sistema, é comum escolhermos um framework popular e construirmos toda a lógica de negócio diretamente sobre ele. No início, isso traz velocidade. Contudo, conforme o sistema cresce, as regras vitais da empresa ficam emaranhadas com bibliotecas de terceiros, roteadores web e ORMs, que são ferramentas de mapeamento objeto-relacional usadas para traduzir código em tabelas de banco de dados. Na prática, isso significa que atualizar uma versão importante do framework pode se transformar em um pesadelo técnico.

O acoplamento excessivo transforma o software em uma estrutura frágil. Se o seu banco de dados mudar ou se a interface de usuário precisar migrar de tecnologia, todo o sistema sofre reestruturações profundas. A arquitetura hexagonal, também conhecida como portas e adaptadores, surge justamente para resolver esse dilema fundamental de engenharia de software.

O Que é a Arquitetura Hexagonal e Sua Origem

Concebida por Alistair Cockburn no início dos anos 2000, a arquitetura hexagonal propõe uma mudança radical na forma de enxergar o software. Em vez de organizar o código em camadas horizontais tradicionais, como apresentação, negócios e dados, ela separa a aplicação em zonas concêntricas. No centro absoluto fica o domínio da aplicação, que representa o coração do negócio, totalmente livre de detalhes técnicos.

O formato hexagonal não possui significado geométrico restrito; ele serve apenas para ilustrar que a aplicação possui múltiplas faces para interagir com o exterior. Na prática, isso significa que o núcleo não sabe se está respondendo a uma requisição HTTP, a uma fila de mensagens ou a uma linha de comando. Ele apenas executa operações de negócio puras e retorna resultados.

Entendendo Portas: Os Contratos de Comunicação

As portas funcionam como interfaces formais que estabelecem regras rígidas sobre como o mundo exterior pode interagir com o núcleo da aplicação. Existem essencialmente dois tipos de portas: as portas de entrada, que recebem solicitações de usuários ou sistemas externos, e as portas de saída, que permitem ao núcleo solicitar serviços externos, como persistência de dados ou envio de e-mails.

Para ilustrar na prática, imagine uma porta de saída chamada 'RepositorioDeUsuario'. Ela define apenas que o sistema precisa salvar e buscar usuários, sem mencionar se o banco de dados utilizado será PostgreSQL, MongoDB ou arquivos JSON em disco. Essa independência protege a lógica de negócio de flutuações tecnológicas.

Adaptadores: Os Tradutores do Mundo Real

Se as portas definem os contratos, os adaptadores são os responsáveis por implementar esses contratos para o mundo real. Um adaptador de entrada pode ser um controlador REST que recebe requisições JSON da web e as traduz para chamadas que o núcleo compreende. Já um adaptador de saída pode ser uma classe concreta que implementa a interface do repositório utilizando o ORM do banco de dados.

Na prática, o adaptador atua como um tradutor linguístico. O núcleo da aplicação fala apenas o idioma puro das regras de negócio. O adaptador traduz esse idioma para o dialeto técnico exigido pelo framework, pelo banco de dados ou pelo protocolo de comunicação utilizado naquele momento específico.

Implementação Prática em Código

Para visualizar a arquitetura na prática, observe a separação clara entre a interface que define a porta e a implementação do adaptador que conversa com a infraestrutura externa.

# Porta de Saída (Dentro do Domínio)  
from abc import ABC, abstractmethod

class RepositorioUsuario(ABC):
@abstractmethod
def salvar(self, usuario):
pass

# Adaptador de Saída (Na Infraestrutura)
class AdaptadorPostgresUsuario(RepositorioUsuario):
def __init__(self, conexao_db):
self.conexao_db = conexao_db

def salvar(self, usuario):
self.conexao_db.executar('INSERT INTO usuarios...', (usuario.nome,))

Esse bloco de código demonstra como o domínio define a necessidade de salvar um usuário através de uma classe abstrata. A infraestrutura implementa essa necessidade usando uma tecnologia específica, mantendo o domínio isolado de detalhes de banco de dados.

Vantagens Reais e Trade-offs Operacionais

Adotar a arquitetura hexagonal traz benefícios expressivos, especialmente para a testabilidade. Como o núcleo não depende de bancos de dados ou servidores web, é possível escrever testes automatizados extremamente rápidos que rodam diretamente na memória. Além disso, a manutenibilidade melhora drasticamente ao longo dos anos, pois equipes diferentes podem trabalhar em adaptadores distintos sem interferir na lógica central.

No entanto, nem tudo são vantagens. O principal trade-off é o aumento inicial de complexidade e a quantidade de código boilerplate, que são aquelas classes de tradução repetitivas. Projetos pequenos ou MVPs, que significam produtos mínimos viáveis criados para validar ideias rapidamente, podem sofrer com o excesso de burocracia estrutural se utilizarem essa abordagem desde o primeiro dia.

Considerações Finais sobre Escalabilidade de Design

A arquitetura hexagonal não é uma bala de prata aplicável a qualquer software, mas sim uma ferramenta poderosa para sistemas complexos que exigem alta longevidade e independência tecnológica. Ao blindar o domínio contra as constantes mudanças de frameworks e ferramentas, as empresas ganham a liberdade de evoluir sua infraestrutura técnica sem precisar reescrever suas regras de negócio.

Investir tempo no desenho correto das portas e adaptadores exige disciplina da equipe de engenharia, mas o retorno se manifesta na forma de sistemas mais flexíveis, fáceis de testar e preparados para absorver novas demandas de mercado com o mínimo atrito técnico possível.