Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Open Closed Principal

Estou com dúvida em algumas questões aqui com o Open Closed Principal, gostaria muito que você me ajudasse a responder minhas dúvidas.

1- Dúvida: Foi passado no curso, que para fazer as validações eu passo os argumentos diretamente, por exemplo: listaValidacoes.forEach(v -> v.verification(validacao1, validacao2)); Porém, eu gostaria de passar dentro de uma classe, por exemplo v- > v.verification(new VerificationArgs(validacao1, validacao2); Insira aqui a descrição dessa imagem para ajudar na acessibilidadeO porque disso? Acho que para fazer manutenção é muito melhor, pois se for adicionar mais algum atributo para fazer validação, é só adicionar na classe VerificationArgs e passar ele como argumento no forEach, outro fator que eu acho que por que dessa forma é melhor, é pq eu não vou precisar sempre ter na assinatura do método, os attributos que eu não vou utilizar, desse novo jeito que eu disse, eu só puxo do VerificationArgs os atributos que vou precisar usar naquela classe para validar, assim não tendo atributos inuteis na assinatura do método, exemplo : Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Então nessa classe, eu só puxo o atributo que vou utilizar, e na assinatura do método não fica poluída com atributos que não vou utilizar NESSE método para fazer validações, Dessa forma está correta?

2- Dúvida:

Insira aqui a descrição dessa imagem para ajudar na acessibilidadeComo eu estava falando anteriormente, eu estava usando uma classe para representar esses dados que serão necessários para fazer validação, eu posso usar em forma de Record? lembrando que os dados são imutáveis, só vou usar para validar, e não alterar nada com eles.

3- Dúvida: Como podem ver, eu usei o SecretaryRepository como parametro pois em uma das validações vou precisar puxar esse repository para verificar se o o e-mail que está sendo passado na requisição já existe no banco, tem sentido? Eu preferi fazer dessa forma para não ter que injetar na classe que valida isso diretamente, como já está sendo injetada no SecretaryService, achei melhor só transferir o repository de classe mesmo, do que ter que injetar novamente na classe que vai precisar fazer validação com esse repository. Então, evito o seguinte : Insira aqui a descrição dessa imagem para ajudar na acessibilidade

4- Dúvida: Exemplo: tanto para cadastrar um usuário no sistema quanto para atualizar, eu tenho que verificar se o cpf tem um formato válido, então eu tenho uma classe para validar para atualizar e outra para registrar, não são a mesma classe pois uma recebe um tipo de DTO, e a outra outro tipo de DTO, então a validação para registrar e atualizar um usuário ficam em classes diferentes, porém a lógica(regra de negocio) , código para validar se o cpf está em um formato válido é a mesma, então eu isolei essa lógica em uma classe separada, e só chamei esse método nas 2 classes, para registrar e para atualizar, fiz isso para não ter que reescrever o mesmo código 2 vezes.

Lógica : Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Estou chamando o método para REGISTRAR um usuário :

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Estou chamando método para ATUALIZAR um usuário :

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Desculpem pela quantidade de perguntas, mas são extremamente importantes para mim e já estou um tempo com dúvida, se puderem responder por gentileza.

1 resposta
solução!

Olá Victor, tudo bem?

Vamos às suas dúvidas:

1- Sua ideia de criar uma classe VerificationArgs para encapsular os argumentos das validações é uma boa prática, pois ajuda a deixar a assinatura do método mais limpa e organizada. Além disso, se você precisar adicionar mais atributos para validar, basta adicionar na classe VerificationArgs e não na assinatura do método. Isso ajuda a evitar a poluição da assinatura do método com atributos que não serão utilizados naquele contexto. Portanto, sua abordagem está correta.

2- Você pode usar a classe Record para representar os dados que serão necessários para fazer a validação, desde que sejam imutáveis e que você só precise usá-los para validar e não alterar nada com eles. A classe Record é uma boa opção para representar dados imutáveis, pois ela já implementa alguns métodos úteis, como equals(), hashCode() e toString().

3- Faz sentido passar o SecretaryRepository como parâmetro para a classe de validação, se você precisar usá-lo para verificar se o e-mail já existe no banco de dados. Isso evita que você precise injetá-lo diretamente na classe de validação, o que pode tornar a classe mais acoplada e difícil de testar. Portanto, sua abordagem está correta.

4- Isolar a lógica de validação do CPF em uma classe separada e reutilizá-la em diferentes classes é uma boa prática de programação, pois evita a duplicação de código e ajuda a manter a consistência das regras de negócio. Se a validação do CPF é a mesma para cadastrar e atualizar um usuário, não faz sentido reescrever o mesmo código duas vezes. Portanto, sua abordagem está correta.

Espero ter ajudado e bons estudos!