---
# System prepended metadata

title: Review de implementações de arquitetura Clean
tags: [multicast, fido, clean-architecture]

---

###### tags: `multicast` `fido` `clean-architecture`

# Review de implementações de arquitetura Clean

## [tguizelini](https://github.com/tguizelini/sboot-hexagonal-architecture)

Neste exemplo existe tanto as portas de entrada quano a interface de domínio (*UseCase*), o que não fez sentido para mim. 
Não há separação por modulos, mas por packages.

### Estrutura
- [main](sboot-hexagonal-architecture/src/main/java/br/com/ht7/match/)
    - domain
        - **match**: model do domínio
        - **use case**: 
        interfaces para para implementação dos casos de uso do domínio. Nesse exemplo ele criou um caso para cada CRUD método e depois agrupou-as na *MatchUseCase* 
        - **ports**:  
        Todas as portas repetem a interface *MatchUsecase*
            - repositories:  
            inerface com a persistencia
            - presenter:  
            interface com o front
        - **service**:  
        Implementção da interface *MatchUsecase*
    - Application
        - **adapters**:
        implemtação do presenter
        - **config**:
        configuração do spring
    - Infrastructure
        - **Adapter**:
        implementação da porta repositories. Faz ligação com *MongoMatchRepository*
        - **source**:
        classes responsáveis pela ligação do banco. ex:*MongoMatchRepository*
        
## [trzpiot](https://github.com/trzpiot/spring-gradle-hexagonal-example)
 Divisão em módulos :+1:  
 A estruturação dos packages me parece estranha ao não subdividir as classes das portas e do uso de caso, mas não está errado. Creio que isso reinforça a criação, por caso de uso, de 1 porta de entrada, 1 porta de saída e 1 comando. :+1:
 Usar *usecase* no repositorio não faz muito sentido para mim, mas é questão de nomenclatura.
 
### Estrutura

- [app](https://github.com/trzpiot/spring-gradle-hexagonal-example/tree/master/app/src/main/java/de/trzpiot/hexagonal/example/app)
main da aplicação
- [core](https://github.com/trzpiot/spring-gradle-hexagonal-example/tree/master/core/src/main/java/de/trzpiot/hexagonal/example/core)
Módulo do domínio da aplicação
    - **domain**:
    Entidades do domínio
    - **usecase**:
    Separa os usos de caso em pastas contendo as classes:
        - _Usecase_:
        interface de entrada
        - _Comand_:
        objeto com as informações da porta de entrada (*Usecase*)
        - _Port_:
        interface de saída
        - _Service_:
        implemetação da interface de entrada e com ligação para a interface de saída.
- [rest](https://github.com/trzpiot/spring-gradle-hexagonal-example/tree/master/rest/src/main/java/de/trzpiot/hexagonal/example/rest)
Módulo da aplicação web.  
Aplicação REST feita com o spring. Contém os controllers dessa aplicação.
- [databse-h2](https://github.com/trzpiot/spring-gradle-hexagonal-example/tree/master/database-h2/src/main/java/de/trzpiot/hexagonal/example/database/h2) e [database-neo4j](https://github.com/trzpiot/spring-gradle-hexagonal-example/tree/master/database-neo4j/src/main/java/de/trzpiot/hexagonal/example/database/neo4j)
Módulos de ligação com o BD
    - _domain_: 
    Entidade do BD
    - _usecase_: 
    Contém 2 classes
        - repository: classe que chama o BD
        - adapter: implementação da porta do core com ligação para o repositry.
    - _config_:
    classe de configuração do BD usando spring.
    
## [RajeshBhojwani](https://github.com/RajeshBhojwani/hexagonal)

[artigo do autor sobre esse projeto](https://www.rajeshbhojwani.co.in/2018/12/hexagonal-architecture-for-java.html)
* Não há separação por módulos. :-1: 
* Na interface *EmployeeUIPort* tem annotation REST :-1: 
* *EmployeeControllerAdapter* implementa a porta *EmployeeUIPort* ao usar diretamentamente o *EmployeeService*, o que torna a porta inútil. :-1:

### Estrutura
- [main](https://github.com/RajeshBhojwani/hexagonal/tree/master/src/main/java/com/baeldung)
    - port
        - EmployeeRepositoryPort
        - EmployeeUIPort
    - adapter
        - EmployeeControllerAdapter: 
        Implementa EmployeeUIPort
        - EmployeeServiceAdapter: 
        Implementa EmployeeRepositoryPort
    - domain
        - Employee
    - service
        - EmployeeService: Não tem ligação com *EmployeeUIPort*

## [Lucasgontijo0](https://github.com/Lucasgontijo0/demo-hexagonal-architecture-spring-boot)
:-1:

A esruturação dos packeges parace bo, mas ao olhar os códigos percebe-se que ele não usa interfaces, então o controller tem dependencia para o service que tem dependencia para o repositorio, o que quebra a arquitetura.

- [main](https://github.com/Lucasgontijo0/demo-hexagonal-architecture-spring-boot/tree/master/src/main/java/com/example/demohexagonalarchitecture)
    - config:
    Classes de configuração
    - domain
    Entidades do domínio
    - error	
    Classe representando o erro http
    - repository
    Classes com ligação ao BD
    - resource	
    Classes dos controllers REST
    - service
    Classes que implementam os casos de uso.

## [oscarduignan] (https://github.com/oscarduignan/HexagonalGreetings)
:+1: 

Não há separação por módulos. :-1: 

- [main] (https://github.com/oscarduignan/HexagonalGreetings/tree/master/src/main/java/hexagonalgreetings)
    - application
        - Greeter.java:
        Implementa todas as portas de entrada e chama ou a porta de saída ou a entidade do domínio.
        - ports:
        Interfaces
            - in:
                - GetRandomGreeting.java
                - GetWorldGreeting.java
            - out
                - RandomGreeter.java
    - domain:
    Entidades
        - WorldGreeter.java
    - adapters:
    Implementam as portas
        - in
            - GreetingController.java
        - out
            - RandomKanyeGreeter.java