Hexagonal Architecture Pattern

Há alguns anos, Alistair Cockburn propôs um padrão bem interessante. Citando suas palavras, a ideia central é:

Permitir que a interação com uma aplicação seja idência para usuários, programas, testes automatizados ou scripts. Também, que possa ser desenvolvida e testada isoladamente.

Na medida que “eventos” cheguem de componentes externos, seria responsabilidade de um adaptador fazer a conversão para uma chamada local ou mensagem a ser encaminhada para a aplicação. Esta seria ignorante a natureza da origem do input. Quando a aplicação tem algum retorno ou necessidade de envio externo, também o faria através de um adaptador que usaria os meios apropriados para cada tecnologia.  A aplicação “conhece” apenas os adaptadores, sem jamais interagir com componentes externos diretamente.

Poderíamos representar essa ideia graficamente da forma que segue:

De acordo com este padrão, é uma boa ideia projetar nossas aplicações com algum nível de separação entre o core, que contem a lógica de domínio, e uma camada externa de adaptadores que seriam responsáveis por interagir com componentes externos. Seguindo essa idia, controllers Web API/MVC seriam bons exemplos desses adaptadores – eles são responsáveis por prover data e por tratar inputs. O mesmo pode ser dito a respeito de implementações do padrão Repository que interage com bases de dados.

Enquanto algumas abstrações são interessantes no modelo de dominio, estas podem não ser adequadas para interação com componentes externos. A camada externa, que contem as implementações dos adaptadores, seria onde as abstrações do domínio seriam convertidas para representações mais adequadas.

Um bom exemplo das implicações desse padrão seria a adoção de um modelo separado para persistência sempre que necessário. Outro bom exemplo é o uso de DTOs na comunicação com o frontend.

Adotar este padrão reduz o acomplamento e torna o sistema mais fácil de manter. No curto prazo, ele poderia aumentar os custos de desenvolvimento. Entretanto, o custo se justificaria facilmente no longo prazo.

Compartilhe este insight:

11 respostas

    1. Poxa, meus posts de código tem código. O que poderia ser compartilhado aqui?

      Devolvo o pedido. 🙂 show me the code e melhorem p conteúdo com o código que vocês sentem falta.

  1. Elemar, meus pêsames por ter perdido todo o conteúdo do blog…

    Você pensa ou planeja fazer algum treinamento abordando todo o conteúdo que você posta aqui?

    1. Olá Thiago.

      No momento, não tenho a intenção de oferecer treinamentos. Entretanto, ofereço o serviço de mentoria para profissionais de TI.

  2. Hexagonal é animal, “Ports and Adapters”, acaba se tornando um vício, ultimamente estou adotando esta arquitetura em todos meus projetos, grandes ou pequenod

  3. Olá Elemar, gostaria de saber sobre sua opinião aonde a conversão das minhas DTOs ficassem no Application do DDD pelo fato de todos meus adapters usarem as DTOs e não precisarem repetir a conversão em todos.

    1. Vinício, embora a Dominio entenda do seu negócio, nada impede dela entender suas DTOs, uma vez que elas compoe alguma parte do negócio, importante a application entender apenas de adptadores.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Elemar Júnior

Sou fundador e CEO da EximiaCo e atuo como tech trusted advisor ajudando diversas empresas a gerar mais resultados através da tecnologia.

Elemar Júnior

Sou fundador e CEO da EximiaCo e atuo como tech trusted advisor ajudando diversas empresas a gerar mais resultados através da tecnologia.

Mais insights para o seu negócio

Veja mais alguns estudos e reflexões que podem gerar alguns insights para o seu negócio:

Este post foi originalmente publicado em 2015 (infelizmente, a postagem original não está mais disponível) Nesse post vamos implementar, passo-a-passo,...
Um de nossos objetivos, nesse momento, é  melhorar a comunicação, compartilhando a visão do nosso fluxo de trabalho com a...
A EximiaCo não vende! Quando planejei a empresa decidi que ela não teria um departamento comercial. A estratégia é buscar...
In the previous post, I asked which function, in the following code, would fill the array with 1’s faster and...
Este post é uma releitura de um que havia escrito, em 2016, e que se perdeu no “reboot” do blog....
Recentemente, compartilhei uma excelente palestra, do Feredico Lois, colega no desenvolvimento do RavenDB, sobre padrões para alta performance com C#....
× Precisa de ajuda?