A quem delegar reponsabilidade de criar os objetos

Por exemplo:

Tenho um Value Object e um Business Object de cidade.

Toda validação deveria ser feita no BO?

Estava pensando em fazer o seguinte:
Criar um metodo tipo createCidade(parâmetros) que recebe os parâmetros necessários para criação de uma cidade encapsulando a instânciação.

O que vcs acham?

Se for fazer factories, faca direitinho :smiley:

http://www.dofactory.com/patterns/PatternFactory.aspx

http://www.dofactory.com/patterns/PatternAbstract.aspx

:wink:

É mesmo necessario criar factories para VO’s?! Não vejo nenhuma vantagem em criar uma factory que recebe os mesmos parametros que um construtor receberia e como os VO’s não são, geralmente, suscetiveis a varias implementações as factories ficam meio sem sentido, ou não?!

Até.

[quote=“fabriciogiordani”]
Estava pensando em fazer o seguinte:
Criar um metodo tipo createCidade(parâmetros) que recebe os parâmetros necessários para criação de uma cidade encapsulando a instânciação.

O que vcs acham?[/quote]

Depende… Fazer

public Cidade createCidade(String nome, String uf) {
    retur new Cidade(nome, uf);
}

nao tem mta utilidade. Um factory seria util se vc fosse puxar a instancia de um proxy, por exemplo… algo como

public Cidade createCidade(String nome, String uf) {
    Cidade cidade = (Cidade)ProxyFactory.wrap(Cidade.class);
    cidade.setNome(nome);
    cidade.setUf(if);

    return cidade;
}

teria mais razao para existir.

Rafael

Óia o Rafael mexendo com dynaop… que chique 8)

Talvez implementar um service locator seria uma boa saída também.

Isso me lembra a discussão sobre modelo de domínio anêmico.

Acho que se vc tem BOs ricos, que usam serviços de outros BOs e objetos num container IoC, vale usar uma Factory.

Ou melhor dizendo, vale usar o padrão ‘‘Factory’’, que pode ser um método de um objeto que também está no container!! : )

Ou seja, sua factory pode passar para o BO, além dos valores que vêm do VO, wrappers e objetos do container.

Por exemplo, se seu BO faz prevalência, ele pode ter um construtor que recebe um Prevayler, e a Factory fica meio assim:

public class ClientFactoryImpl implements ClientFactory {
   
   public ClientFactoryImpl(Prevayler prevayler, ProxyFactory proxyFactory) {...}

   public Client getInstance(ClientValue value) {
      Client result = new Client(prevayler);
      result = (Client) proxyFactory.wrap(result);
      result.readFromValue(value);
      return result;
  }
}

Hmmm, não gostei. Melhor seria:

   public Client getInstance() {//igual, mas sem argumentos}

   // em outro lugar:
   ClientFactory fac = (ClientFactory) pico.getComponentInstance(ClientFactory.class);
   Client client = fac.getInstance();
   try {
      client.readFromValue(value);
      return SUCCESS;
   }
   catch (SomeLogicFailedException e) {
      showError(e);
      return ERROR;
   }

E aih, q vcs me dizem?? Já sei que tem um antipattern aí no meio, a Factory não faz nada com o objeto Prevayler, ela só passa pros filhos. Mas não parei pra pensar se dá pra fazer diferente…

[]s!