rmanguinho / clean-ranking-loader Goto Github PK
View Code? Open in Web Editor NEWExemplo de API feita com Rest e GraphQL utilizando Clean Architecture
Home Page: https://rmanguinho.github.io/
License: GNU General Public License v3.0
Exemplo de API feita com Rest e GraphQL utilizando Clean Architecture
Home Page: https://rmanguinho.github.io/
License: GNU General Public License v3.0
Assisti a live inteira sobre Clean Architecture e anotei algumas dúvidas. Baixei o código-fonte do GitHub e adicionei algumas coisas para testar meus conhecimentos, mas surgiram algumas dúvidas que achei interessante compartilhar.
Portanto, decidi abrir essa issue para sanar algumas dúvidas ou confusões da minha parte, talvez isso sirva para alguma outra pessoa também.
Com a criação dos Adapters para o Express
e para o Apollo
, recebendo um Controller
, eu consigo isolar o Express
e o Apollo
. Dessa forma, eu segrego a criação e o uso desses Adapters. Em resumo, como estou implementando uma interface Adapter, eu consigo fazer com que qualquer biblioteca alternativa ao Apollo
se comunique com qualquer framework alternativo ao Express
. Entendi bem?
Falando sobre o Repository
, seria mais expressivo se eu criasse um Repository
para Ranking chamado RankingRepository
com os métodos mais básicos (GetLast
, GetTopFive
, GetFirst
, InsertOne
, InsertMany
, ...) ao invés de criar uma classe para cada método? Se eu fosse adicionar mais um Use Case
chamado TopFiveRankingLoader
, onde poderia melhorar no seguinte caminho:
Onde estou errando nesse pensamento?
TopFiveRankingUseCase
(mudei o nome para ficar mais expressivo, mas é a mesma coisa que TopFiveRankingLoader)RankingRepository.GetTopFiveRanking()
- Eu particularmente mudaria o RepositoryTopFiveRankingLoaderService
LoadTopFiveRankingController
GetLast
, GetTopFive
, GetFirst
, InsertOne
, InsertMany
, ...) eu TENHO que criar uma classe de serviço dentro de Data/Services (GetLastRankingService
, GetTopFiveRankingService
, GetFirstRankingService
, InsertOneRankingService
, InsertManyRankingService
) que por sua vez só será usada dentro de um arquivo de Controller - este também com o mesmo padrão de 1 para 1.LoadTopFiveRankingController
TopFiveRankingLoaderService
RankingRepository.GetTopFiveRanking()
TopFiveRankingUseCase
LoadGetFirstRankingController
GetFirstRankingLoaderService
RankingRepository.GetFirstRanking()
GetFirstRankingUseCase
LoadInsertOneRankingController
InsertOneRankingLoaderService
RankingRepository.InsertOneRanking()
InsertOneRankingUseCase
Para mim, isso está "orientado ao método do repository", porque toda vez que eu tiver um método (como por exemplo o
InsertOne
na lista acima) , eu preciso criar acima dele umservice
e acima desteservice
também devo criar umcontroller
e, por fim, um abaixo dorepository
que seria meuUseCase
. Consegue perceber onde estou errado? Minha linha de raciocínio sempre está um para um. Sei que estou errando em alguma coisa.
Outra coisa que ficou confusa para mim:
O Service usado é o Service do DDD? Caso seja, não deveríamos usar o Service apenas quando uma operação ultrapassa os limites transacionais impostos por um Agregado, isto é, quando há mais de um Agregado envolvido?
Pensando em uma abordagem de DDD, eu poderia remover essa classe de Service e, portanto, injetar o Repository via construtor direto no Controller?
Falando sobre o controller, para cada possível rota que eu venha ter, eu devo deveria criar um arquivo separado que implementa o Controller (com método handle) para executar minha intenção (de obter dados ou mudar o estado)?
InsertOneRankingController
DeleteOneRankingController
UpdateOneRankingController
GetTopFiveRankingController
Seria mais ou menos nesse estilo?
Essas foram as minhas dúvidas e talvez seja a de alguém também. A LIVE foi incrível, aprendi bastante e se teve dúvida é porque foi boa mesmo e é um sinal de quê estou aprendendo. Abraços!!!! Só tenho mais que agradecer ao @rmanguinho e ao Rodrigo Branas.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.