[quote=CodeDeveloper]sergiotaborda e demais pessoas que quiserem compartilhar,
Diante da discussão (muito produtiva, por sinal), venho com a seguinte questão:
Suponha que em um sistema financeiro exista a classe NotaFiscal , NotaFiscalService e NotaFiscalDAO.
NotaFiscalService.salva(NotaFiscal f) recebe uma NotaFiscal para salvá-la no sistema. Nesse método são feitas MUITAS verificações para saber se a nota é válida, se já existe no sistema (evitar duplicidade), e etc etc etc, e depois se tudo passar na verificação, ela chama o método NotaFiscalDAO.salva(NotaFiscal f) para persistí-la no banco.
Agora vamos as dúvidas:
1ª Dúvida - QUAL DESSAS ABORDAGEM É A MAIS CORRETA:
-
toda a validação no Service.
-
validação de regras de negócio no Service e “validação de dados” (notnull, apenas numeros positivos e etc etc… não sei o nome que se dá a esse tipo de validação) na classe DAO.
-
toda a validação no DAO (o que pelo que vi, parece não ser uma boa idéia)
2ª Dúvida - PROBLEMA QUE VEJO NAS ABORDAGENS
- se toda a validação for no Service, o sistema permite que uma nota fiscal seja criada e passada diretamente para o DAO, ao invés, do Service, causando um grande problema de consistencia de dados.
- se apenas a “validação de dados” (notnull, apenas numeros positivos e etc etc) for feita no DAO, o sistema permite que uma nota fiscal seja criada e passada diretamente para o DAO, não verificando as regras de negócios e causando problemas de consistencia.
- se toda a validação for feita no DAO, garantimos a consistencia dos dados, porém ao meu ver, não faz sentido a classe DAO executar validações de regras de negócio.
Gostaria de saber a opinião de vocês nessas abordagens para tentar chegar em uma possível “forma ideal”. Concordo em parte quando dizem que não da pra fazer um super sistema invencível a tolos em prazos apertados. Mas também acho que podemos garantir um bom nível de consistencia de dados.
Fico no aguardo dos mais experientes!
[/quote]
O que vc deve fazer é criar um NotFscalValidator que contém as regras. Depois o NotaFiscalService vai simplesmente invocar o validator.
O seu problema de algum desavisado chamar o DAO diretamente sem passar pelo service e por isso tenho que validar no DAO não procede. Se o cara programou errado, problema dele.
Do ponto de vista do design o DAO não é um objeto de dominio e não pode saber das regras. Aliás, em algumas circusntancias vc não vai querer esa validação. O serviço que o DAO provê é simples Acesso (Data Acess Object). Regras não é com ele.
E como já discutimos antes, a validação feita no DAO (null etc … ) é apenas para não sobrecarregar o banco de dados e a rede.
A separação de camadas tem precedencia sobre “programadores desavisados”.E na prática, o DAO vai salvar em varias circusntancias, não apenas no create , por isso ele não deve validar demais. O service por sua vez, pode pegar uma nota e processaá-la de diferentes formas e salvar no final. Cada forma terá sua validação. Entao é o método do service que escolhe o validator, o validator que valida, e o DAO simplesmente grava.