Mvc

Boa noite pessoal.

Estou com umas duvidas criticas de mvc. É o seguinte, li em uma apostila o seguinte:

Evite fazer assim:

public class ClienteBO{
  public void insert(Cliente c) throws...{
    // aplica regras de negocio
    ClienteDAO dao = new ClienteDAO();
    dao.insert(c);
  }
}

“Pois assim, voltaremos a acoplar as nossas camadas, e nao é isso que desejamos. Utilize factories, que produz o DAO necessario na camda de controle, com isso é possível alterar todas as camadas de persistencia, sem obrigar o programador a reimplementar codigos na camda de controle.”

Ele sugere que faca uma classe com o padrao de factory method para gerar a minnha DAO. Mas para isso preciso de uma interface para todas as DAOS, ou seja, se todas as DAOs vao usar a mesma interface, tenho que colocar na interface os metodos abstratos de todas as minhas DAOS. Por exemplo, minha interface podera ter o metodo abstrato: cadastrarCliente(Cliente c), cadastrarProduto(Produto p). Se minha DAO de cliente for implementar essa interface, tera que implementar tambem o metodo de cadastrarProduto(Produto p), isso nao é legal, ate porque vou ter que importar a bean Produto dentro da DAO de cliente, pior, todas as beans do sistema oÔ.

Pelo exemplo da apostila, ficaria assim:

public class ClienteBO{
  public void insert(Cliente c) throws...{
    // aplica regras de negocio
    DAO dao = null; //interface padrao para as DAOs
    dao - DAOFactory.getDAO("cliente");
    dao.insert(c);
  }
}

Assim eu nao precisaria chamar diretamente a DAO de cliente, e sim indiretamente.

Isso é util? Tem uma solucao melhor?
Obrigado pessoal, talvez seja um pouco complicado enter o problema, mais qualqer coisa, so perguntar…

Obs: BO significa Busines Object, Objeto de negocio, seria a controller…

gqferrreira, a ideia de criar interfaces para os daos é correta, mas nessa caso voce nao teria métodos cadastrarProduto ou cadastraCliente, teria um método cadastrar() e as classes que implementam essa interface é que vao definir que tipo de objeto vai ser persistido.

voce pode criar o seu metodo que recebe um object “cadastrar(Object o)” ou usar generics, com generics eu nao sei exatamente como se usa
mas o google pode te ensinar…

eu tambem acho essa ideia de BO e VO totalmente errada, onde já se viu um objeto sem comportamento ? somente com valores ? isso nao é contra a ideia da orientacao a objetos ?

Nunca que o BO seria o controle, ele esta mais para o modelo ;D

pelo exemplo da apostila, ficaria assim:

dao - DAOFactory.getDAO("cliente");

o que a apostila diz ou mostra sobre DAOFactory? isso é a chave para sua questão…

A VO é a bean… por ser um “catalogo” do sistema, so deve ter atributos e seus respectivos get’s e set’s…

⁻.⁻

[quote=edufera10]pelo exemplo da apostila, ficaria assim:

dao - DAOFactory.getDAO("cliente");

o que a apostila diz ou mostra sobre DAOFactory? isso é a chave para sua questão…[/quote]

DAOFactory é a classe responsável por gerar a instancia da DAO que eu preciso em tempo de execucao pelo meio de Factory Method…

Cada vez que eu tenho que mexer com java e rever “n” interfaces e “n” factories, dói… já pensou em fazer algom assim

def peter = new Client(name: "Peter", born: "01/01/2010")
peter.save(); // id == 1

e para recuperar

def peter = Client.get(1)

louco e produtivo, isso é Grails, se puder, dê uma olhada.

Mas respondendo sua pergunta:

Não existe certo ou errado, feio ou bonito, o que importa é funcionar, pois vc mesmo vai evoluir o seu código com o passar do tempo.

1º - muito importante, de uma estudada em injeção de dependência (ID, DI)

2º - o conceito de DAOFactory é bem legal, mas vc tem que escrever muito código a cada entity, mas veja Generics -> http://blog.caelum.com.br/page/3/?s=dao / http://www.urubatan.com.br/dao-generico-um-exemplo-a-pedidos/

Espero ter ajudado.

Realmente parece ser assim… cada vez que leio um artigo sobre mvc na net, vejo maneiras diferentes, muitas vezes análogas… mas vou ver esse esquema de generics que o pessoal anda falando, deve ser útil… obrigado.