Dúvidas em relação à organização lógica da aplicação [Padrões, Camadas]

Olá pessoal, tudo bem?

Estou estudando Arquitetura de Software e trabalho em um sistema que está implementado utilizando Transaction Script. A lógica da aplicação está toda contida nos Servlets, o que é um erro. Com o passar do tempo, começamos a ter código duplicado na aplicação e decidimos parar para refatorar o código.

O sistema possui um front-controller e commands para facilitar a adição de novos controladores.
Estou utilizando o padrão Data Mapper (Martin Fowler) na camada de acesso a dados:

Aí me surgiram algumas dúvidas!
Se o modelo não conhece nada sobre o banco, qual classe seria responsável por chamar meus DAOs?
Eu criei classes de serviço (façade) para tal feito mas não sei se é o correto!

Outra dúvida é a seguinte, se o certo é criar camadas de serviço mesmo, como fica as interfaces das classes de serviço? Eu passo os parâmetros ou passo o objeto do modelo?

Exemplo:

adicionarCliente(String nome, String endereço)

ou

adicionarCliente(Cliente cliente)

Talvez a segunda abordagem seja a mais correta, mas no caso da classe conter associações, eu recebo da jsp apenas o id dessa associação e eu teria que ir no banco antes só para pegar o objeto para passar para o método do serviço. Pensando nesse tipo de situação, a primeira abordagem me parece oferecer um custo computacional melhor. Não sei se ficou claro, mas o que eu quero dizer é o seguinte:

Suponha que eu tenha uma classe cliente e dependentes e que cliente possua uma lista de dependentes. Se eu utilizar a primeira abordagem, seria algo assim

adicionarCliente (String nome, String endereço, String[] listaIdsDependentes)

Se eu utilizar a segunda abordagem, ficaria algo assim:

adicionarCliente (Cliente cliente)

e eu teria que ir no banco para pegar os dados dos dependentes e formar o objeto Cliente para então passar para o método do service:

cliente.setDependentes(new DependentesDAO().getListaDependentes(listaIdsDependentes));

Uma dúvida, neste caso, é correto eu acessar o banco para pesquisa no servlet? Já que pesquisa geralmente não tem lógica.

[quote=VagnerMG]
Aí me surgiram algumas dúvidas!
Se o modelo não conhece nada sobre o banco, qual classe seria responsável por chamar meus DAOs?

Eu criei classes de serviço (façade) para tal feito mas não sei se é o correto![/quote]

O Front controller chama o DAO.

Sobre a classe de serviços, alguém vai ter que chama-la do mesmo jeito, não sei o que espera conseguir criando mais uma camada intermediária e aparentemente desnecessária, visto que o DAO já é um tipo de facade.

Desde que não seja no model que não conhece nada sobre consultas e inserções, não vejo nenhum problema em fazer no servlet.

Como falei, o frontcontroller (o servlet) chama o dao e normalmente o dao oferece todas operações de banco, inserir, consultar…

[quote=lkbm][quote=VagnerMG]
Aí me surgiram algumas dúvidas!
Se o modelo não conhece nada sobre o banco, qual classe seria responsável por chamar meus DAOs?

Eu criei classes de serviço (façade) para tal feito mas não sei se é o correto![/quote]

O Front controller chama o DAO.

Sobre a classe de serviços, alguém vai ter que chama-la do mesmo jeito, não sei o que espera conseguir criando mais uma camada intermediária e aparentemente desnecessária, visto que o DAO já é um tipo de facade.

Desde que não seja no model que não conhece nada sobre consultas e inserções, não vejo nenhum problema em fazer no servlet.

Como falei, o frontcontroller (o servlet) chama o dao e normalmente o dao oferece todas operações de banco, inserir, consultar…[/quote]

obrigado pela resposta!

Bom, de acordo com o que estou estudando, não é legal ter lógica de negócio no servlet. O servlet é somente para validação de parâmetros e lógica de apresentação, se houver!

O problema da lógica ficar no servlet é que pode ocorrer replicação se você precisar a mesma lógica em outros lugares, por isso que é recomendável a lógica de aplicação ir para a classe de serviços e a lógica de negócios ir pro model.

Estou estudando pelo livro do Martin Fowler mas ainda tenho algumas dúvidas, como as que eu postei acima!

não disse que as regras de negócio ficam no servlet, e sim as operações de banco.