DDD - Dúvida sobre onde coloco essa regra de negocio
13 respostas
lucasap2005
Pessoal to com a seguinte duvida…
Determinado momento preciso passar um código na minha aplicação que ou é o ID ou é um Codigo especifico que tem uma certa validação (Ex: Tem q começar com 9999).
A duvida é a seguinte, quando passo esse ID ou Codigo Especifico criei um Service que busca minha Entidade e já chama algumas validações da minha entidade para executar processo que eu preciso fazer, a regra para verificar se o que eu passei é o ID ou meu Codigo Especifico tem que ficar onde? No Service do DDD, na Entity ou na minha camada de Aplicação?
Pessoal to com a seguinte duvida...
Determinado momento preciso passar um código na minha aplicação que ou é o ID ou é um Codigo especifico que tem uma certa validação (Ex: Tem q começar com 9999).
A duvida é a seguinte, quando passo esse ID ou Codigo Especifico criei um Service que busca minha Entidade e já chama algumas validações da minha entidade para executar processo que eu preciso fazer, a regra para verificar se o que eu passei é o ID ou meu Codigo Especifico tem que ficar onde? No Service do DDD, na Entity ou na minha camada de Aplicação?
Espero respostas, vlw novamente galera
não entendi muito bem o que vc quiz dizer mas acho que resolve criando dois métodos diferentes
Sergio, desculpe se nao fui claro.
O que eu quis dizer é que o usuário passa ou o ID ou o Codigo Especial.
Ele passa o que ele quiser.
O que eu quero saber é aonde eu trato qual dos 2 ele passou?
U
uchoaaa
É Web? Validação poder ser feita no Servlet (ou qqr equivalente que estejas usando) E/OU na lógica.
Particularmente eu prefiro no Servlet se a validação não precisar de regras de negócio…
Melhor dizendo, no Controle, se for MVC. Já retornaria pro Visão a msg de erro…
[]s
pellegrino
O que você poderia fazer seria criar uma classe no seu modelo que fizesse uma pesquisa por ID ou pelo Codigo Especial e repassar o que o usuário informar para esta classe.
O que você poderia fazer seria criar uma classe no seu modelo que fizesse uma pesquisa por ID ou pelo Codigo Especial e repassar o que o usuário informar para esta classe.
Humm… se é isso que quer,lucasap2005, então vc está arranjando problema para si proprio. Como vc vai diferenciar um do outro ?
Pela formação ? Se começa com 9999 é especial se não é ID ? E quando o ID chegar em 9999 ? Isso não é nem difícil.
Cuidado com programação orientada a Strings.
lucasap2005
Mas entao Sergio, é q o Cliente trabalha dessa maneira…
Ou ele entra com o que eles chamam de Codigo Interno q é um ID ou eles entram com o Codigo Especial.
E para entra com esses codigos eles usam um leitor de codigo de barras.
Ora um usuário bipa a etiqueta com o ID, ora ele bipa com o Codigo Especial…
sergiotaborda
lucasap2005:
Mas entao Sergio, é q o Cliente trabalha dessa maneira…
Ou ele entra com o que eles chamam de Codigo Interno q é um ID ou eles entram com o Codigo Especial.
E para entra com esses codigos eles usam um leitor de codigo de barras.
Ora um usuário bipa a etiqueta com o ID, ora ele bipa com o Codigo Especial…
E daí ? Isso é input de dados : aka tela. Não interessa o que o usuário digita. Vc tem que analizar o que ele digita antes de invocar o serviço. Claro que vc pode incluir uma única função que faça a analise e decida o que fazer, mas é mais estruturado vc criar um objeto que decide que tipo de codigo é … algo assim
Tlv seja engenharia de mais , mas a ideia é concentrar a logica de decisão do tipo de codigo em um só objeto
E não colocar essa decisão nem no respositorio nem no serviço. Assim, se a logica mudar, muda apenas em um só lugar
lucasap2005
Muito obrigado Sergio…a sua solução é excelente…vlw
rponte
Talvez assim fosse melhor,
XPTOSearchCode sc = new XPTOSearchCode("9999")
boolean isSpecialCode = sc.isSpecialCode();
Como eu disse, pode ser demasiada engenharia. Mas o seu codigo não funciona e nem faz sentido.
Constutores não retornam nada
B
Bruno_Laturner
sergiotaborda:
Como eu disse, pode ser demasiada engenharia. Mas o seu codigo não funciona e nem faz sentido.
Constutores não retornam nada
Que não funciona eu sei disso, é um pseudo-código. Sobre o construtor, Opps! foi falta de atenção na hora, deveria ser um factory method.
Agora não fazer sentido, não sei por que diz isso. A intenção é diminuir ao mínimo as instruções de desvio de fluxo, e deixar o trabalho para o polimorfismo do código.
sergiotaborda
Bruno Laturner:
sergiotaborda:
Como eu disse, pode ser demasiada engenharia. Mas o seu codigo não funciona e nem faz sentido.
Constutores não retornam nada
Que não funciona eu sei disso, é um pseudo-código. Sobre o construtor, Opps! foi falta de atenção na hora, deveria ser um factory method.
Agora não fazer sentido, não sei por que diz isso. A intenção é diminuir ao mínimo as instruções de desvio de fluxo, e deixar o trabalho para o polimorfismo do código.
Mas esse é o problema. O seu codigo não mostra isso. Aliás ele não mostra nada: repare
Alguem manda o serviço procurar pelo codigo "1234567"
VC cria um objeto XPTOSearchCode diretamente ( não uma subclasse - cade o polimorfismo nisso?)
e o passa ao repositório. O repositório pede ao codigo que crie um queryobject quando deveria ser o repositorio a criar esse query object . O que vc sugere é como pedir a um objeto CPF que crie a pesquisa que procura pela pessoa no banco de dados. Como ele vai conseguir isso? No minimo estranho. Mas além disso o método diferenciate não é usado nunca - já que o seu uso no construtor é impossível, mas mesmo pensando que aquilo é uma fábrica ela não está sendo usada porque é dado um new diretamente no objeto XPTOSearchCode.
Quais serias as vantagens de abdicar do principio de separação de responsabilidades e colocar um objeto de dados criando pesquisas ? E onde isso torna as coisas polimórficas ? E porque precisa de uma fábrica além do método diferenciate ? Não entendi.
Quiça possa rever o código e escrevê-lo de outra forma para seja mais clara a sua estratégia…