Pular para o conteúdo principal

Padrãointermediário

Arquitetura Hexagonal

Visão Geral

Arquitetura Hexagonal é o nome pelo qual Ports and Adapters se popularizou. É o mesmo padrão — Cockburn adotou os dois nomes, e o segundo é o que ele passou a preferir por ser mais descritivo.

Este documento existe porque o nome "hexagonal" é o mais usado na prática e produz mal-entendidos próprios, que vale desfazer.

Problema

O hexágono é uma escolha de desenho, não uma prescrição. Cockburn explicou que escolheu seis lados por conveniência gráfica — cabem portas suficientes ao redor sem que o desenho fique poluído — e para evitar a leitura de "cima e baixo" que a imagem de camadas impõe.

Três mal-entendidos vêm daí.

"São seis camadas." Não são. O número não significa nada.

"Cada lado é um tipo de adaptador." Não. Um sistema pode ter dois adaptadores ou vinte.

"É diferente de Ports and Adapters." Não é. Times debatem qual adotar como se fossem alternativas.

Conceitos Centrais

O que o desenho comunica

Siga as setas: nenhuma delas sai de dentro para fora. O banco e a API externa apontam para o núcleo tanto quanto a Web aponta — é essa simetria que o desenho existe para mostrar.

Duas ideias, e só duas: existe um dentro e um fora; e todas as dependências de código apontam para dentro. O lado conduzido é o que engana: o núcleo usa o banco, mas depende da porta que ele mesmo declara — e quem depende do banco é o adaptador.

A ausência de hierarquia entre os elementos do lado de fora é o ponto. Numa arquitetura em camadas, a interface do usuário fica no topo e o banco na base, o que sugere uma ordem que não existe. No hexágono, os dois são igualmente exteriores.

O que muda em relação a camadas

CamadasHexagonal
MetáforaPilhaDentro e fora
DireçãoDe cima para baixoPara dentro
Banco de dadosCamada inferiorUm adaptador entre outros
Interface do usuárioCamada superiorUm adaptador entre outros
RegraSó a camada de baixoSó o que está mais para dentro

A mudança prática decisiva: em camadas, o domínio depende da persistência. Em Hexagonal, a persistência depende do domínio.

Quando Usar

As mesmas condições de Ports and Adapters: mais de um canal, valor recorrente em testar sem infraestrutura, dependências voláteis, domínio com lógica substancial.

Prefira este nome quando o time já o conhece — a familiaridade reduz atrito de adoção.

Quando Não Usar

As mesmas condições de Ports and Adapters. Em resumo: CRUD, canal único e estável, sistemas pequenos, portas que espelham a infraestrutura, ou ausência de mecanismo que imponha a regra.

Um caso adicional específico do nome: quando o hexágono é adotado como estrutura de diretórios sem a regra de dependência. Times criam dominio/, aplicacao/, adaptadores/ e continuam importando infraestrutura no domínio. O resultado tem a aparência do padrão e nenhuma das propriedades.

Alternativas

As mesmas de Ports and Adapters. Vale acrescentar: os outros três nomes. Onion e Clean Architecture compartilham a tese; escolher entre eles é principalmente uma decisão de vocabulário de time.

Trade-offs

Idênticos aos de Ports and Adapters. O nome não muda o custo.

O único trade-off próprio do nome é de comunicação: "hexagonal" é mais reconhecido e mais sujeito a mal-entendido; "ports and adapters" é mais preciso e menos conhecido.

Modos de Falha

Os mesmos de Ports and Adapters, mais dois específicos do nome:

Hexágono decorativo. Estrutura de diretórios sem regra de dependência imposta.

Discussão sobre o número de lados. Tempo gasto debatendo se um adaptador novo "cabe no hexágono".

Erros Comuns

Tratar como padrão distinto de Ports and Adapters. É o mesmo.

Ler os seis lados como prescrição. São desenho.

Adotar os diretórios sem a regra. É o mais caro dos erros desta lista, porque produz o custo integral e nenhum benefício: a estrutura sugere um isolamento que o compilador não impõe.

Debater qual dos quatro nomes adotar. A escolha entre Hexagonal, Onion e Clean é de vocabulário; a decisão que importa é se a regra de direção vale e como será imposta.

Exemplo Real

Um time adotou hexagonal num serviço novo e, seis meses depois, dois testes de arquitetura escritos numa tarde acusaram dezenove violações — domínio importando infra e adaptador importando adaptador. É o caso descrito em arquitetura vs. implementação, onde a lição é sobre a distância entre a arquitetura declarada e a implementada.

O que interessa aqui é o que veio depois, porque ele responde à pergunta específica do padrão: depois de corrigido, o hexagonal se pagou?

As dezenove violações foram corrigidas em três semanas, e os dois testes passaram a impedir novas. A partir daí o serviço operou com a estrutura de fato isolada por dezoito meses, durante os quais três trocas de infraestrutura aconteceram:

troca arquivos tocados duração
provedor de pagamento adaptador + teste 6 dias
banco relacional → gerenciado adaptador + config 2 dias
fila própria → gerenciada adaptador + teste 4 dias

Nenhuma tocou o domínio. Como referência, a mesma troca de provedor de pagamento em outro serviço da empresa — sem isolamento, com o cliente HTTP importado direto pelos casos de uso — levou sete semanas e tocou 41 arquivos.

O custo do padrão, medido no mesmo período:

arquivos a mais no serviço ~30%
tempo de integração de pessoa nova +1,5 dia, estimado
casos de uso que precisaram de porta nova 4 de 23
portas que nunca tiveram um segundo adaptador
em nenhum momento dos 18 meses 6 de 9

A última linha é a que o time considera a mais honesta, e o critério dela importa: conta as portas que nunca tiveram um segundo adaptador em momento algum do período. As outras três tiveram — não simultaneamente, mas em sequência, quando a infraestrutura foi trocada. Contadas num instante qualquer, as nove teriam um adaptador só, e a métrica não diria nada. Dois terços delas nunca exerceram a indireção, e provavelmente nunca vão. Elas são custo de indireção sem retorno de substituição — pagas para que as três que importaram funcionassem.

Na retrospectiva: o saldo foi positivo porque o serviço era de integração intensa, com quatro dependências externas voláteis. Num serviço de domínio estável e pouca infraestrutura, as mesmas seis portas ociosas seriam o resultado inteiro — e a conclusão seria oposta.

Esse é o critério que o time passou a aplicar antes de adotar o padrão em serviços novos: contar as dependências externas que podem mudar. Acima de três, o isolamento se paga; abaixo, ele produz indireção que ninguém exerce.

E há um detalhe de sequência que a equipe considera decisivo: as três trocas foram feitas depois de o teste de arquitetura existir. Sem ele, as dependências teriam voltado a vazar entre uma troca e outra, e a segunda troca já não encontraria o isolamento que a primeira supunha. Neste serviço, seis meses sem verificação bastaram para dezenove violações — e não há razão para tratar esse número como lei, mas há para tratar a direção como esperada: sem mecanismo que imponha a regra, a erosão começa antes de alguém notar.

Conceitos Relacionados

Exercício Prático

Se seu sistema declara usar arquitetura hexagonal, escreva o teste que verifica a regra: nenhum pacote de domínio importa infraestrutura.

Rode e conte as violações antes de corrigir qualquer coisa.

Perguntas de Entrevista

  • Qual a diferença entre Hexagonal e Ports and Adapters?
  • Por que seis lados?
  • Como você verifica que a regra de dependência está sendo respeitada?

Para Aprofundar

  • Cockburn, Alistair. Hexagonal Architecture, 2005 — inclui a explicação sobre a escolha do nome.
  • Martin, Robert C. Clean Architecture. Prentice Hall, 2017 — a comparação entre as variações.
Terminou de ler este documento?Seu progresso fica salvo apenas neste navegador.