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