DDD - Dúvida sobre onde coloco essa regra de negocio

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=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

[code]
class Servico{

Entidade encontraEntidadePorID(String id);
Entidade encontraEntidadePorCodigo(String codigo);

}[/code]

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…

[]s

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.

Poderia ser algo do tipo:

Entidade entidadeRetornada = repositorioEntidade.buscarEntidadePeloIdOuPeloCodigoEspecial(parametroIdOuCodigoEspecial);

[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.

Poderia ser algo do tipo:

Entidade entidadeRetornada = repositorioEntidade.buscarEntidadePeloIdOuPeloCodigoEspecial(parametroIdOuCodigoEspecial);

[/quote]

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

Muito obrigado Sergio…a sua solução é excelente…vlw

Talvez assim fosse melhor,

XPTOSearchCode sc = new XPTOSearchCode("9999") boolean isSpecialCode = sc.isSpecialCode();

Abraços.

colando do sergio:

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));
   }
}

Overkill much?

[quote=Bruno Laturner]colando do sergio:
[/quote]

Como eu disse, pode ser demasiada engenharia. Mas o seu codigo não funciona e nem faz sentido.
Constutores não retornam nada

[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…