###### 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