Amigos, boa tarde.
Apesar de conhecer a sintaxe Java de maneira razoável e saber alguns conceitos e princípios de orientação a objeto, possuo dúvidas sobre a arquitetura que devo utilizar no novo projeto do qual vou participar.
Até agora, trabalhei com o desenvolvimento estruturado de sistemas. Infelizmente, muitos dos desenvolvedores não possuem critérios ou preocupações com a arquitetura e o resultado disto é um software com diversos problemas estruturais.
Queremos evitar que isto ocorra no novo projeto, que será desenvolvido em Java. Para isto, queremos nos apoiar em padrões e princípios da OO. Porém, sei que nada é absoluto e, por mais que sejam boas orientações a se seguir, toda regra tem sua exceção.
De qualquer forma, estou com alguns problemas para entender como acessar as informações de meu banco de dados. Pelo que já li, não é o ideal permitir que a aplicação acesse indiscriminadamente o banco de dados onde bem entender, ficando o acesso a cargo de objetos/classes específicas para isto, como por exemplo, os famosos DAOs. Isto faz sentido, uma vez que, em teoria, cada classe deve possuir uma responsabilidade, ou seja, uma única razão para mudar. Isto é facilmente visualizado em casos de classes simples de domínio, como uma possível classe Cliente, por exemplo. Logo, a classe Cliente teria a respectiva ClienteDAO, que ficaria responsável por inserir, atualizar, etc.
No entanto, as coisas começam a ficar mais difíceis de se visualizar quando pensamos em informações um pouco mais complexas. Imaginem que eu possuo um escopo simples, com classes representando cliente, pedido, item do pedido e produto. Digamos que eu queira saber todos os clientes que compraram em determinado período, logo eu precisaria selecionar os clientes de pedidos cuja data se enquadrasse nesse período. Como eu chegaria a esse conjunto de clientes? Implementaria um método estático findByDate na classe cliente (O médoto findByDate da classe Cliente chamaria um findByDate da ClienteDAO), cujos argumentos seriam as datas inicial e final do período selecionado que me retornaria um ArrayList ou alguma outra coleção de clientes? Implementaria só na classe DAO? Ou faria de um modo totalmente diferente? Caso eu devo implementada na classe Cliente/ClienteDAO, eu terei que criar um método de procura de clientes para cada forma que eu quiser pesquisá-los (Clientes de uma determinada cidade, por exemplo)?
Imaginemos outra situação. Suponhamos que eu possua uma Frame que irá me mostrar o total faturado para o cliente x no período de 01/01/2013 a 31/01/2013. Logo, preciso somar o valor total dos itens do pedido dos pedidos cujo o cliente é x e cuja data de faturamento se encaixa no período selecionado. Há a necessidade de selecionar os pedidos e fazer a soma na mão ou posso não instanciar pedido algum e solicitar a soma direto na SQL (o que me parece mais lógico)? Caso eu simplesmente pegue a soma direto do banco de dados, onde realizo a query? No próprio frame / classe de domínio por trás do frame? Num classe DAO representando o domínio do frame?
Amigos, me desculpem o texto e a ignorância. Infelizmente minha experiência com design orientado a objeto é nula. Espero que possam ajudar um humilde desenvolvedor que precisa de muita prática para entender corretamente o que faz sentido em teoria.
Abraços.