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.