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?
[quote=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?
Espero respostas, vlw novamente galera[/quote]
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?
É 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…
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.
[quote=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.
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.
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…
[quote=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…
[/quote]
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
enum XPTOSearchCodeType {
ID,
SPECIAL
}
class XPTOSearchCode {
String code;
XPTOSearchCodeType type;
}
class CodeDiferenciator {
public XPTOSearchCode diferenciate(String code){
// logica que diferencia um do outro. Isto é só um exemplo
if (code.startsWith("9999")){
return new XPTOSearchCode (SPECIAL, code);
} else {
return new XPTOSearchCode (ID, code);
}
}
}
class EntityRep {
public Entity findBy ( XPTOSearchCode sc){
if (sc.getType().equals(XPTOSearchCodeType.ID)){
return findByID(sc.getCode());
} else {
return findBySpecialCode(sc.getCode());
}
}
Entity findByID(String id){
// executa uma pesquisa usando o Id como chave
}
Entity findBySpecialCode(String code){
//exectua uma pesquisa usando o sc como chave
}
}
class Service {
CodeDiferenciator cd
EntityRep rep;
public Entity locateEntity(String code){
return rep.findBy(cd.diferenciate(code));
}
}
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
class XPTOSearchCode
{
class SpecialXPTOSearchCode extends XPTOSearchCode //blah blah
class IDXPTOSearchCode extends XPTOSearchCode // blah blah
public XPTOSearchCode (String code)
{
return differenciate(code);
}
private XPTOSearchCode differenciate(String code)
{
// logica que diferencia um do outro. Isto é só um exemplo
if (code.startsWith("9999"))
return new SpecialXPTOSearchCode(code);
else
return new IDXPTOSearchCode(code);
}
}
class EntityRep {
Entity findBy(XPTOSearchCode code){
queryObject = code.generateQuery(); // blah blah
}
}
class Service {
EntityRep rep;
public Entity locateEntity(String code){
return rep.findBy(new XPTOSearchCode(code));
}
}
[quote=sergiotaborda]Como eu disse, pode ser demasiada engenharia. Mas o seu codigo não funciona e nem faz sentido.
Constutores não retornam nada [/quote]
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.
[quote=Bruno Laturner][quote=sergiotaborda]Como eu disse, pode ser demasiada engenharia. Mas o seu codigo não funciona e nem faz sentido.
Constutores não retornam nada [/quote]
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.[/quote]
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…