Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Regras do domínio que necessitam de consultas a dados

algumas regras de negócio precisam de acesso a dados, seja para fazer uma consulta, ou cálculo,etc... por exemplo a classe CPF, uma regra de negócio básica poderia ser que não exista cpfs duplicados na base de dados, mas para saber se o cpf já consta na base, não tem jeito, vou precisar disparar uma busca, como fica esse tipo de problema com a arquitetura proposta pelo curso, já que por princípio eu não poderia ter a entidade acessando um repositório?

3 respostas
solução!

Pelo que me lembro do livro do Uncle Bob pra essa situação é utilizado o Princípio da Inversão de Dependência (DIP, do inglês), um dos princípios do SOLID. O fluxo que vc descreveu tem uma dependência de uma regra de negócio para a camada mais externa da infraestrutura.

Mas pela Clean Architecture, as dependências devem sempre apontar da camada mais externa para a mais interna. Então temos que inverter a direção de dependência pelo DIP.

Basicamente o que se faz ao invés da regra de negócio (buscarCpf) depender do repositório, é criada uma interface na camada de domínio e o buscarCpf chama o método dessa interface. Então, na camada em que fica o repositório essa interface é implementada.

Veja que a dependência foi invertida, antes buscarCpf dependia do repositório. Agora, buscarCpf depende da interface que está na camada de domínio e o repositório depende (implementa) da mesma interface, ou seja, o repositório agora depende da camada de domínio.

O proposto pelo clean code é excelente, mas na vida real para conseguir alcançar o proposto sem aumentar o esforço é um pouco difícil, veja bem, se usarmos o spring temos essa implementação de repositório, mas ele está intimamente ligado ao framework, outro caso é se formos utilizar jpa, que nos força a ter um construtor padrão mesmo que não tenha nada haver com o negócio. Acredito que podemos minimizar o acoplamento mas nunca fugir dele 100%, poderiamos até tentar uma super solução purista, mas a questão é: valo o esforço? bom é um trade off mesmo

Concordo, fugir 100% é difícil mas da pra minimizar bastante. A proposta da inversão de dependência em si só não é tão complexa mas a implementação da Clean Architecture exige um esforço maior, principalmente quando envolve frameworks e pra quem não está acostumado (me incluo nessa).

Teve um post que o instrutor Rodrigo postou um projeto com exemplo legal desse desacoplamento entre o Framework e a camada da Entidade:

https://cursos.alura.com.br/forum/topico-separacao-das-anotacoes-do-jpa-infra-da-camada-de-dominio-151304