School Work, ufpe e cin">
Desacoplamento Das Camadas Do Código Utilizando Arquitetura Hexagonal, Um Exemplo Prático em Rust
Desacoplamento Das Camadas Do Código Utilizando Arquitetura Hexagonal, Um Exemplo Prático em Rust
Desacoplamento Das Camadas Do Código Utilizando Arquitetura Hexagonal, Um Exemplo Prático em Rust
CENTRO DE INFORMÁTICA
SISTEMAS DE INFORMAÇÃO
Recife
2022
MARIA ESTELA DA COSTA E LIMA SOUZA
Recife
2022
MARIA ESTELA DA COSTA E LIMA SOUZA
__________________________________
Prof. Vinicius Cardoso Garcia (Orientador)
UNIVERSIDADE FEDERAL DE PERNAMBUCO
__________________________________
Prof. Kiev Santos da Gama (2º membro da banca)
UNIVERSIDADE FEDERAL DE PERNAMBUCO
Dedico este trabalho de conclusão de curso primeiramente
a minha família, que sempre me apoiou em todas as
decisões da minha vida, meus pais que buscaram me dar
uma educação de qualidade e sempre mostraram o valor da
educação como transformadora do mundo e para além
disso, por me ensinarem e mostrarem como em pequenos
atos de esforço e amor podemos fazer a diferença na vida
dos outros, obrigada João, Ana e Mateus, vocês fazem
muita diferença na minha vida. Dedico também a todos os
meus amigos da faculdade, que durante esses anos sempre
estiveram comigo, me deram apoio nos momentos que
precisei e fizeram com que essa jornada da minha vida
fosse leve, cheia de alegria e os momentos de dificuldade
foram menores porque vocês estavam lá, então obrigada a
Luana Ribeiro, Pedro Henrique, Pedro Augusto, Daniel
Carvalho, Eva Marla e Igor Fernandes por essa jornada e
por fim, agradecer a todos os meus professores do Centro
de Informática por fazerem com que minha jornada no
centro fosse tão importante para a vida que levo
atualmente, em especial dedico a Vinicius Cardoso Garcia
e Fernando Marciano Neto que me ensinaram para além da
programação a ver a tecnologia como algo que pode ajudar
outras pessoas, por estarem em muitos momentos
importantes na minha jornada no Cin e por terem me
ajudado diversas vezes.
AGRADECIMENTOS
Em primeiro lugar, agradeço a Deus por ter me abençoado com pessoas incríveis ao
longo de minha jornada pessoal e profissional. Agradeço a meus amigos e as pessoas do meu
trabalho pela paciência que tiveram em escutar meus desabafos sobre a realização deste
trabalho, a iFood pelo suporte e compreensão nos momentos que precisei me dedicar mais a
esse trabalho de conclusão.
Ademais sou grato por todos amigos que fiz na faculdade, que sempre estiveram
dispostos a me ajudar em momentos difíceis do curso. Agradeço a meus professores e
principalmente ao meu orientador, Vinicius Garcia, pela ajuda e conselhos dados não só na
realização desse trabalho, mas durante minha graduação.
Ao Centro de Informática da Universidade Federal de Pernambuco - CIN-UFPE, pela
excelente estrutura física e pessoal proporcionada a todos os seus alunos. E por último,
agradeço a minha família, Ana, João e Mateus, por todo suporte e amor. Por causa deles,
sempre acreditei que seria capaz de atingir meus objetivos.
Epígrafe
On the last few years there was a crescent evolution in software development and even
more we look for methods of developing complex methods on a large scale, with agility and
efficiency gains on maintenance and building of those. To think about software architecture is
to develop a system skeleton, and this is one of the ways so that there is agility on developing
these programs.
Nowadays there are multiples models of architecture, such as architecture hexagonal
which brings a decoupling at the codes's layers. The goal of these job is to investigate the
principles that leads to the choice for an architecture hexagonal and show as an easy practice
the implementation of a software based on an architecture hexagonal to understand the
advantages of this architecture to system development and maintenance.
1 INTRODUÇÃO
desenvolvida sobre esta arquitetura, isso porque esse estilo facilita em aplicações voltadas a
desenvolvimento backend e com a chegada o aumento das arquiteturas voltadas a
microservices esse design de código facilita também na implementação e comunicação de
projeto com outros ambientes .
O projeto será feito na linguagem de programação Rust, por ser uma linguagem que
autora teria interesse de aprender e trabalhar futuramente, para a implementação, o objetivo é
que seja possível entender e observar arquitetura hexagonal, considerando esse padrão para
gerar um desacoplamento no código e como falado anteriormente, facilitando a
implementação de estruturas que estão mais usadas atualmente.
1.1 Motivação
1.2 Objetivo
Esse documento está organizado em seis capítulos. O primeiro é introdução, que visa
contextualizar a pesquisa com suas motivações e objetivos. No segundo capítulo são conceitos
gerais aplicados, serão apresentados conceitos falados durante essa monografia e trazer
explicações mais aprofundadas sobre arquitetura hexagonal. No terceiro capítulo serão
apresentadas as ferramentas utilizadas durante a implementação deste projeto e qual
metodologia foi utilizada para a monografia. No quarto capítulo de desenvolvimento será
mostrado os principais fluxos de implementação. No capítulo cinco serão mostrados métricas
de sucesso e falhas aplicadas neste trabalho de conclusão de curso. Por fim, no sexto e último
capítulo é discutida a conclusão da pesquisa e também possíveis trabalhos futuros.
16
Esta seção tem o objetivo de mostrar que existem diversas definições e formas de
entender a arquitetura de um software, será falado sobre o conceito e surgimento da
arquitetura e qual visão será abordado durante este trabalho de conclusão de curso.
Até a década de 90 o termo "arquitetura de software" já tinha sido citado algumas
vezes, contudo ainda não era um termo "comum" e que fosse importante até então ser
discutido sua definição, com o amadurecimento das linguagens de programação e a
preocupação em como fazer software de forma ágil e reutilizável, principalmente após a
década de 70 onde nessa década foi muito falado sobre criação de times que desenvolvessem
em larga escala, sobre gerência, dentre outras coisas, essas discussões geraram várias lacunas
em como construir software em larga escala (WIRTH, 2008).
Com o nascimento de muitas linguagens de programação, como C++ , que se tornou
importante para o surgimento de muitas outras e a preocupação de criar código e linguagens
mais interpretáveis, o termo "arquitetura de software" já era mais comum, contudo, a década
de 90 foi o momento onde houve o auge das discussões sobre a definição do que é arquitetura
de software e também como fazer com essa arquitetura ajudasse no desenvolvimento (SIM,
2005) . Existe um Padrão do que é arquitetura, de acordo com o Instituto de Engenheiros
17
Eletricistas e Eletrônicos ISO/IEEE 1471-2000, que define a arquitetura com visões múltiplas
e se preocupa com os seguintes critérios :
● Todo Sistema tem uma Arquitetura mas nem toda arquitetura é um sistema.
● Uma arquitetura e uma descrição de arquitetura não são a mesma coisa.
● Padrões de arquitetura, descrições e processos de desenvolvimento podem diferir e ser
desenvolvidos separadamente.
● As descrições de arquitetura são inerentes e multi visualizadas.
● Separando conceitos de visão de um objeto para especificar caminhos de escrever
descrições de padrões de arquitetura.
Para além dos critérios estabelecidos pelo IEEE 1471, existem algumas definições sobre
arquitetura, são elas:
● É a interface entre o problema do negócio e a solução técnica (ASTUDILLO, 1998) .
● A Visualização do Processo, que contém a descrição das tarefas (processo e
encadeamentos) envolvidas, suas interações e configurações, e a alocação de objetos e
classes de design para tarefas. Esta visualização só precisará ser utilizada se o sistema
tiver um grau significativo de Simultaneidade. No RUP, ela é um subconjunto do
Modelo de Design (KRUCHTEN, 1995).
● Conjunto de componentes e seus relacionamentos, que deve satisfazer os requisitos
funcionais e não funcionais do sistema (MAIER, 2001)
● Implementar a arquitetura específica em um sistema, é se preocupar com o design,
como citado "o conceito de nível mais alto de um sistema em seu ambiente" (MAIER,
2001).
O estilo pode ser definido por um conjunto de padrões, ou pela escolha de componentes
ou conectores específicos que funcionarão como os tijolos básicos da construção . Em um
determinado sistema, alguns estilos podem ser capturados como parte da descrição
arquitetural em um guia de estilo de arquitetura-fornecido por meio do produto de trabalho de
especificação do projeto. O estilo desempenha um papel vital na compreensão e integridade da
arquitetura. Esse será apresentado e destrinchando na proposta do artigo, definindo as
camadas que a arquitetura hexagonal exige pelo seu padrão (ANUNCIAÇÃO, 2006).
2.2.1 MVC
Nesse tópico será falado, de forma breve, sobre o padrão Movel-View-Controller (MVC),
esse padrão de projeto foi um dos primeiros criados e muito utilizados ainda hoje, o propósito
dessa arquitetura é dividir o projeto em três camadas, são elas:
19
A imagem abaixo exemplifica como são separadas as camadas de uma arquitetura MVC:
Fonte: https://stackoverflow.com/questions/29594105/mvc-is-it-model-to-view-or-controller-to-view
20
Não será aprofundada de forma específica essa arquitetura entrando em suas nuances,
pois o objetivo de trazer esse formato de arquitetura aqui é fazer uma comparação entre a
arquitetura hexagonal e o padrão MVC, para entender a partir dela, quais os pontos positivos e
negativos no desacoplamento de código.
2.2.2 MVP
não está conectado a view, apenas a uma interface que se comunica com ela, com isso não
Fonte : https://blog.matheuscastiglioni.com.br/eda/
Essa arquitetura traz consigo pontos positivos como escalabilidade, tolerância a falhas, e
processos desacoplados e de pontos de desvantagens são : inconsistência de informações, lidar
com erros, dentre outros.
22
Não será aprofundada de forma específica cada arquitetura entrando em suas nuances,
pois o objetivo de trazer esse formato de arquitetura aqui é fazer uma comparação entre a
arquitetura hexagonal e outros padrões arquiteturais, para entender a partir deles, quais os
pontos pontos fortes e fracos da arquitetura hexagonal.
"Eu finalmente tive esse momento aha! No qual vi que as faces do hexágono [interno]
são portas… e os objetos entre os dois hexágonos são adaptadores e, portanto, o padrão
arquitetural consiste em uma Arquitetura Baseada em Portas e Adaptadores. Esse nome
admite uma explicação melhor do que aquela que eu propus com o nome Arquitetura
Hexagonal" ( COCKBURN, 2005).
Logo é visível que o foco da arquitetura de portas e adaptadores é fazer com o core da
aplicação seja o principal aspecto a ser olhado no sistema, sendo ele desacoplado de todo o
sistema não gera impacto modificá-lo ou atualizado, fazendo com que regras de negócio sejam
facilmente aplicadas, sem interferir na infraestrutura utilizada no projeto.
O autor cita a arquitetura hexagonal como um caso "genérico" de um modelo em
camadas, o principal objetivo do pensamento de Alain Cockburn para a arquitetura de ports e
adapters é ver todo o contato externo como "semelhante" para dentro do aplicação, o autor
cita:
"Para mim, não há nada muito diferente sobre a rede e o banco de dados em
comparação com a pessoa sentada na tela trabalhando na interface do usuário. Na verdade,
eu deliberadamente desejo que haja pouca diferença. Eu quero especificamente substituir a
pessoa sentada na tela por um arquivo simples cheio de casos de teste, com um link EDI para
o computador de outra empresa, com um desenvolvedor digitando na janela de transcrição,
com um link para outro programa local. Além disso, desejo substituir a rede e o banco de
dados por um script enlatado ou banco de dados de demonstração localmente, com uma GUI
e um desenvolvedor inventando dados em tempo real, com um link de satélite." (Cockburn,
2006)"
24
2.3.1 ADAPTADORES
O primeiro conceito que será definido na arquitetura hexagonal é dos adaptadores, eles
estão na camada mais externa da arquitetura, esses atuam como conectores do ambiente
externo com a aplicação, os adapters tem a seguinte função :
● Recebem chamadas de fora do sistema e são responsáveis por enviar essas chamadas
para os métodos referentes a cada chamada (EVANS, 2015).
● Também estão escutando chamadas de dentro do sistema, isto é, após passar pelo
domínio uma porta pegará esse dado que enviará essa chamada final para o adaptador
de saída e direciona para um sistema externo, como por exemplo um banco de dados
ou uma fila (EVANS, 2015).
25
● Os adaptadores podem ser facilmente substituídos, por não possuir contato direito com
outras camadas de código, facilitando a mudança de infraestrutura sem causar um
impacto significativo ao projeto (EVANS, 2015).
● Um adaptador pode ter várias portas conectadas a ele, eles são usuários das portas.
● Os adaptadores têm também a função de persistir informações (EVANS, 2015).
Fonte :
https://medium.com/ssense-tech/hexagonal-architecture-there-are-always-two-sides-to-every-s
tory-bc0780ed7d9c
26
Para cada porta que seu hexágono possui, um adaptador deve ser criado, portanto, isso
traz a liberdade de modificá-lo e apagá-lo dinamicamente. Em portas e adaptadores, temos
também o conceito de portas primárias e secundárias, e o conceito é o mesmo utilizado com
os atores (COCKBURN, 2006).
2.3.2 PORTAS
As portas nasceram como interfaces das camadas mais baixo nível expostas, o termo
porta designa a entrada para a comunicação, e dentro da arquitetura hexagonal, a porta é
justamente essa camada de comunicação com a classes do domínio, a porta servirá como uma
interface e se refere a uma camada de abstração, entre o adaptador e o domain, que tem a
função de não deixar que o adaptador e domain se comuniquem,assim como ilustra a imagem
a seguir:
Fonte : https://www.bclaud.com.br/posts/basics-hexagonal-architecture/
27
No hexágono inferior a porta é representada como uma interface que traz o isolamento
do domain, nela que será feito o tratamento dos dados que entram no domain, 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)
Existem dois tipos de portas para a estrutura desta arquitetura:
● Portas de entrada (inbound): são portas usadas para transmissão de fora para dentro,
ou seja, quando um agente ou classe externa precisa chamar um método de uma classe
de domínio. Logo, essas portas declaram os serviços providos para o mundo exterior
(GAITONDE, 2020).
● Portas de saída: são interfaces usadas para comunicação de dentro para fora, isso
significa, quando uma classe de domínio precisa chamar um método de uma classe
externa. Logo, essas portas declaram os serviços requeridos pelo sistema, isto é,
serviços do mundo exterior que são necessários para o funcionamento do sistema
(GAITONDE, 2020).
2.3.3 DOMÍNIO
● Responsável por se referir a toda lógica de negócio, seja como essas regras estejam
implementadas. (GRIFFIN, 2021)
O desenho da arquitetura para representar o domínio está representado no centro do
hexágono:
Fonte :
https://itnext.io/hexagonal-architecture-principles-practical-example-in-java-364bb2e50075?g
i=154fdc7cb2d8
referente a validação de negócio e lógica, sendo um fator importante para mudar de forma
eficiente a lógica de negócio.
3 FERRAMENTAS E METODOLOGIA
Neste capítulo será mencionado quais ferramentas foram utilizadas para implementar a
arquitetura hexagonal, e a metodologia utilizada durante este trabalho, como falado
anteriormente, o objetivo deste trabalho é implementar esse design de arquitetura, o uso
dessas ferramentas atualmente são utilizadas pela indústria e por isso foram escolhidas para
este trabalho de conclusão de curso:
3.1 Metodologia
A metodologia proposta para essa monografia foi uma prova de conceito e o objeto de
estudo foi uma implementação para entender conceitos da arquitetura hexagonal, sendo
analisada a partir de métricas qualitativas que resultem em entender pontos fortes e fracos da
implementação.
31
Fonte:https://www.geeksforgeeks.org/goal-question-metric-approach-in-software-quality/
Essa forma de análise, busca entender objetivos principais e a partir deles criar ramos
que tragam dúvidas e a partir daí métricas para medir o sucesso da implementação. Neste
trabalho será utilizado esse conceito para apresentar métricas de sucesso deste trabalho .
Para a análise do design do projeto e desacoplamento, foram levados em considerações
os os seguintes objetivos (Goals) de acordo com a metodologia GQM:
sendo utilizados e seguir boas práticas de desenvolvimento da linguagem Rust, esse ponto foi
definido como importante porque melhora a eficiência no tempo de compilação do projeto e
impede possíveis bugs no desenvolvimento.
Por fim, o último ponto destrinchado foram as metrics (métricas), sendo elas:
● Em questão de desacoplamento de código foram utilizadas as seguintes métricas: em
relação a outras arquiteturas, no ponto de vista de baixo acoplamento do design, pouca
dependência de módulos, funções com responsabilidade única e reutilização de
código, que serão apresentados na seção de resultados, foi observado também
desacoplamento de código em relação a aplicação seguindo critérios de todas as
interfaces serem utilizadas no código, o domain só tem regra de negócio e a porta
aponta pro domain e os adapters para as portas.
● Na qualidade de código foram utilizadas as seguintes métricas : não existir código não
utilizado, não existir if e elses que não são necessários, destacar breakpoints, remover
vírgulas e importações triviais.
Foi feita uma análise entre as arquiteturas citadas na seção 2.3 e a arquitetura
hexagonal, olhando para o ponto de desacoplamento de software metrificadas pela ferramenta
GQM.
Outra análise feita, na implementação de código, foi analisar pontos de sucesso de
uma implementação hexagonal segundo o livro Domain-Driven Laravel, esses pontos foram
abordados na seção 2.3 desta monografia.
O último ponto analisado, foi a qualidade do código, utilizando a ferramenta
Rust-Analyze a fim de validar boas práticas no código, a partir de métricas utilizadas por essa
ferramenta.
3.2.1 DIAGRAMAS.NET
3.2.2 RUST
3.2.3 MONGODB
4 PROJETO
Neste capítulo será apresentado como o projeto foi criado para representar uma
arquitetura hexagonal, explicar decisões arquiteturais e design do código, mostrar diagramas
UML criados para implementar essa arquitetura e como houve o desacoplamento a nível de
código esclarecendo como esse desacoplamento pode beneficiar no desenvolvimento de um
projeto de software, na sessão seguinte será apresentado o resultado das pesquisas feitas sobre
a arquitetura, validando se o projeto desenvolvido de fato segue padrões arquiteturais
estabelecidos pelo design de portas e adaptadores.
Este projeto foi pensado e desenvolvido de forma autoral, sendo projetado de acordo
com estudos e leituras da arquitetura hexagonal, colocando em prática os conceitos principais
falados durante todo este projeto de conclusão de curso, estes conceitos foram explicitados no
capítulo referentes ao 2.3, onde se fala da arquitetura hexagonal.
Atualmente, a autora tem cerca de 6 meses de experiência de implementação da
arquitetura hexagonal dentro do ambiente de trabalho, para além disso, cerca de 3 meses
estudando profundamente os conceitos desta arquitetura para a conclusão deste trabalho,
lendo artigos, vendo vídeos e propostas do autor.
O projeto desenvolvido para apresentar a arquitetura hexagonal foi uma API REST
com os eventos de leitura, escrita, adição e remoção de campos utilizando o Banco de dados
MongoDB, esse sistema faz chamadas HTTP e salva essas informações no banco a partir de
algumas regras de negócio definidas no tópico 4.1 deste documento.
Nesse tópico será falado como foram tomadas as decisões a respeito do design do
projeto, essa foi uma sessão de análise de requisitos, onde foi pensado como o fluxo
funcionaria a fim de seguir aos critérios estabelecidos pela arquitetura hexagonal.
37
Como observado acima, a ideia pensada foi trazer duas conexões externas, uma do lado
do cliente, outra do lado do servidor de banco de dados, essas estruturas foram pensada para
demonstrar que ao serem implementadas na camada de adapter elas são além de desacopladas
de fácil "troca" por exemplo, caso fosse necessário mudar o banco de dados escolhido ou
utilizar dois bancos em uma aplicação bastaria adicionar um adapter novo a essa conexão.
Logo a primeira decisão de projeto foi que seriam dois adapters, sendo assim:
Foi utilizado adaptadores de entrada do tipo HTTP e de saída uma conexão com o banco
de dados a fim de apresentar a estrutura de entrada e saída do fluxo de dados.
O segundo ponto pensado foi em um projeto para implementar e validar o sistema. Para
isso foi pensado em uma API de cadastro, leitura, edição e remoção de livros para que
trouxesse uma ideia de projeto real. A partir da definição do que seria feito, foram mapeados
pontos para que durante a implementação fosse possível atender aos critérios de cada camada
da arquitetura hexagonal.
Camada Critério
Para a validação dos requisitos comentados acima, foram projetados payloads esperados
que passaram pelas camadas de adapter, ports e domain da aplicação. Esses payloads também
foram pensados a fim de implementar a arquitetura hexagonal, com o objetivo de atender aos
critérios definidos na tabela 1 e também para atender a cada camada da aplicação, os
payloads são:
É importante observar que no primeiro momento, o usuário fará uma requisição do tipo
POST com o nome do livro como "name". O payload de entrada nas regras de negócio para o
nome do livro é "book_name". Seguindo o seguinte exemplo :
Para salvar no Banco de dados o Payload que é utilizado na Port, tem um parâmetro a
mais o "_id", que tem um valor único gerado pelo próprio MongoDB, no Domain esse valor é
um Option, abaixo terá um exemplo do payload de saída.
Na pasta raiz do, terá o arquivo main.rs que tem a função de inicializar o projeto, onde
ficará a conexão com o servidor, a inicialização do banco de dados, as chamadas http.
Na mesma camada do arquivo main.rs vai existir uma camada referente a estrutura de
pastas com os nomes utilizados pela arquitetura hexagonal, ports, adapters e domain. Esses
nomes foram utilizados para trazer clareza onde cada módulo do projeto está, seguindo o
padrão de nomenclatura utilizado por Cockburn, por que assim é fácil identificar cada parte da
arquitetura.
1. Fluxo de arquivos
Após o source(src) foram criadas pastas onde estarão as camadas explicadas durantes
este trabalho de conclusão de curso, são elas os adaptadores(adapter), portas(ports), dominio(
domain) e configuração (config), como apresenta a figura 15.
4.3 IMPLEMENTAÇÃO
● Main
O main tem a função de inicializar o projeto, lá onde ficará a inicialização da porta que
roda o serviço, o servidor e do Banco de dados e a inicialização referentes ao projeto.
● Adapters
Foi criado outro adaptador no projeto, que foi o adaptador de saída que é o que faz a
conexão com o banco de dados, como representado na figura 17:
Ok(book)
}
● Ports
O exemplo abaixo é uma função existente na camada de porta inbound, ela acontece após
o estímulo do adapter, ou seja, no caso que está sendo apresentado o fluxo, após uma chamada
HTTP o adapter chamará uma porta responsável por ser a interface da arquitetura e assim
traduzir o que vem do mundo externo pro domain.
#[derive(Serialize)]
pub struct Book {
pub id: Option<Uuid>,
pub book_name: String,
pub description: String,
pub is_test: bool,
}
O exemplo de código mostrado acima espera um payload do tipo, CreateBook ( que vem
da camada Adaptadora ) , após entrar na porta a função validate_field direciona esse payload
pro domain (após convertido numa struct esperada pelo domain), ao fazer as validações
necessárias, que foram comentadas na tabela 1, será retornado o result_book que veio do
Domain.
● Domain
return book_field;
48
book
}
Assim como falado anteriormente, para mostrar que essa camada é responsável pela regra
de negócio e é desacoplada do que vem da entrada do mundo externo, foi feito um exemplo
simples para definir se o livro é ou não do tipo "is_test", essa camada recebe o tipo
BookDomain, e retorna o tipo BookDomain, que será utilizado pela próxima porta que utilizar
esse serviço.
Nesse ponto é importante salientar que o domain não tem contato direto com outras
camadas do código, ele apenas interage validando as regras de negócio, e retornando um
objeto do tipo domain, cumprindo assim o que é estabelecido pela arquitetura hexagonal, que
o domain tenha apenas essa responsabilidade.
https://github.com/estelasouza/tcc
49
5 RESULTADOS
Para a pesquisa, foi utilizado o método GQM (goal, question, metric) a partir dele foram
encontradas métricas para medir os pontos de sucesso e de fracasso durante a implementação
utilizando a arquitetura hexagonal. Em resumo sobre esse método :
1. Goal - significa meta, esse ponto é responsável por visualizar os principais pontos do
projeto
2. Questions - significa perguntas, a partir das "metas" estabelecidas serão geradas
perguntas a respeito de como é possível metrificar o sucesso
3. Metric - significa métrica, aqui serão verificados de forma mais palpáveis métricas que
serão destrinchadas para atingir ao sucesso das principais metas.
Nota Cor
Atendeu as expectativas
Para analisar a qualidade de código, foi utilizado uma ferramenta chamada Rust-Analyze
que ao ser configurada analisa os seguintes critérios, esses foram estabelecidos no
mapeamento do método do GQM, logo foram ativadas as seguintes funcionalidades no
Rust-Analyze :
Funcionalidade Status
Foram feitas as alterações sugeridas pela ferramenta, para que essa análise acontecesse
novamente, é possível verificar que o tempo de compilamento da aplicação antes das
alterações foi de 0.61s , após a correção sugerida pela ferramenta, houve o seguinte resultado
no tempo de compilação:
A partir dessa conclusão, nota-se que após a melhoria do código, houve um ganho
considerável no tempo de execução do projeto, após sugestão do Rust Analyze.
54
É importante ressaltar que, essa ferramenta traz a análise de forma geral e não uma
definição mais cognitiva, então essa avaliação está sujeita a falhas por levar em consideração
apenas pontos pré-mapeados, outro ponto, é que qualidade de código foi levada em
consideração apenas a opinião da autora, podendo ser tendenciosa, então existe um ponto de
melhoria para trabalhos futuros.
Após a análise dos pontos levantados é possível avaliar que dentro dos pontos levantados
atualmente a qualidade de código atende as expectativas de padrão definidas pela ferramenta.
5.2 Desacoplamento
Foi feita uma comparação entre as arquiteturas apresentadas na seção 2, são elas a MVC,
MVP e Arquitetura Orientada a Eventos, para entender quais critérios mapeados no GQM
cada arquitetura abrange, com o intuito de tirar conclusões delas em relação à arquitetura
hexagonal.
Tabela 4 - Análise desacoplamento mapeado pela QGM, tabela comparativa entre arquiteturas
(Parte 1)
Baixo acoplamento do
design de código
(estrutura de pastas)
Pouca dependência de
módulos da aplicação
Funções com
responsabilidade única
55
Reutilização de código
Fonte: Elaborado pela autora
CRITÉRIO IMPLEMENTAÇÃO
CRITÉRIO IMPLEMENTAÇÃO
Manutenabilidade
É possível notar que nos 3 primeiros pontos sugeridos pelo autor Jessen, a
implementação atende aos critérios, no ponto de repetição de código, foi mapeado pela autora
desta monografia um ponto que não atende as expectativas como esperado, levantando o
seguinte cenário: se duas filas forem consumidas e utilizarem payloads com apenas 1 campo
diferente, será necessário criar duas portas separadas para cada fila. No ponto de
manutenibilidade, na visão da autora que desenvolveu o projeto, o ponto de manutenibilidade
não atinge as expectativas, como algo simples pois à medida que o projeto vá crescendo, a
manutenção vai ficar mais complexa por existir muitos arquivos.
A partir das análises feitas pela ferramenta Rust Analyze e pela própria autora é possível
ver que a implementação teve sucesso nos quesitos de qualidade de código e o tempo de
compilação após utilizar as sugestões da ferramenta caíram de 0.61s para 0.22s, logo no
seguinte ponto o projeto atendeu as expectativas.
Por fim, é importante lembrar que os critérios foram avaliados pela autora em questão da
monografia, ou seja, não foi feita uma pesquisa quantitativa que mostrasse que os pontos
levantados pelo autor convergem com pontos vista da comunidade, tendo o risco de ter uma
análise tendenciosa, tal ponto é levantado para possíveis trabalhos futuros .
6 CONCLUSÃO
Este trabalho de conclusão de curso teve como objetivo geral apresentar o padrão de
arquitetura hexagonal, que é chamado também de portas e adaptadores, e a partir da
apresentação desse padrão exibir a implementação de como utilizar essa arquitetura em um
projeto de software, pontuando como ela favorece o desacoplamento de código.
Foi possível durante o desenvolvimento do trabalho explicar de forma teórica
conceitos de arquitetura de software, mostrar visões de outras arquiteturas para além da
59
Para trabalhos futuros, o primeiro ponto levantado foi dar continuidade a esse trabalho
buscando fazer pesquisas quantitativas para entender outras visões e opiniões sobre a
qualidade de código e a implementação feita da arquitetura hexagonal, é factível também
entender como o comportamento dessa arquitetura em sistemas com larga escala, verificar
eficiência do projeto .
Para além desse ponto, a arquitetura hexagonal ainda é relativamente nova, não
existem tantos artigos ou trabalhos relacionados sobre a mesma, é possível também, para
60
trabalhos futuros fazer revisões literárias sobre o assunto aprofundando em alguns pontos e
buscando lacunas de estudo nessa área da arquitetura de software.
61
REFERÊNCIAS
Barroca, L., Hall, J., & Hall, P. (2000). An Introduction and History of Software
Architectures, Components, and Reuse. Software Architectures, 1–11.
https://doi.org/10.1007/978-1-4471-0367-7_1
Len Bass, Paul Clements, and Rick Kazman. Software Architecture in Practice.
Addison-Wesley Longman Publishing Co., Inc., Boston, MA, USA, 1998., 2nd edition, April
2003.
Philippe Kruchten 1995. "The 4+1 view model of architecture," IEEE Software.
12(6), novembro de 1995
<https://itnext.io/hexagonal-architecture-principles-practical-example-in-java-364bb2e500
75>. Acesso em: 11 set. 2022