Dao E Domain Object - Teoria de Programação - Fórum WMO
Dao E Domain Object
Started By Renan Gonçalves, 02/12/2007, 22:11
Posted 02/12/2007, 22:11
Estou com um dúvida aqui na hora de implementar um novo projeto.
Para entender melhor eu vou usar como exemplo a classe Usuario que seria o objeto de dominio e o UsuarioDAO que é o DAO.
Como em todo projeto nós temos a camada de persistência e temos também os objetos de domínio.
Porém muitos frameworks implementam a persistência com os objetos de domínio. Onde a classe Usuario extende a classe UsuarioDAO e os métodos CRUD (e métodos como findAllBy* ou findBy*), tal como qualquer outro método referente ao objeto ficam no objeto.
Podemos usar como exemplo o CakePHP (classe Model extende AppModel), ZendFramework (voce extende a classe Zend_DB_Table), entre outros.
No Java uma prática comum é você separar essas responsabilidades.
Nós temos a classe Usuario com seus getters e setters (ou não) e seus demais métodos, menos a parte de persistência, que fica a cargo do DAO Layer.
Salvando um usuario com Objeto de domínio e DAO juntos (em PHP):
$usuario->blablabla...
$usuarioDAO->create($usuario);
Qual dessas práticas você utiliza?
Qual acha mais "correta"?
Obrigado por ajudarem ...
Só uma adição...
No Zend como pode usar o Zend_Db_Adapter como DAO, mas dessa forma você não teria o objeto de domínio, que no caso seria uma extensão de Zend_Db_Table. Mas é claro que você pode usar estes recursos da forma que você quiser.
E como não sou o dono da verdade me corrijam caso eu esteja errado.
Posted 03/12/2007, 08:03
Olha ... tem gente que prefira tudo junto e tem gente (como eu) que prefere tudo separado.
Eu prefiro somente passar o objeto usuário, somente com variaveis de leitura, pois pense nesse trecho:
$usuario->get(10001); //Pegar o usuário com a ID 10001
$user = foo();
Imagine ... você vai estar retornar para a variavel alem dos atributos setados, você dará acesso as funções que estão extendendo essa classe. Para mim eu acho uma tremenda falha de segurança (para mim). A quem diga que essa maneira é a melhor q se tem para se usar lógica.
Prefiro a segunda maneira porque é mais organizadinho e eu garanto que só passe os atributos setados para a página.
Aprendi OO com java, por isso que para mim parece melhor a segunda alternativa
Posted 03/12/2007, 08:12
Opa Savior, valeu cara!
Exatamente, eu também acho a segunda opção melhor.
Tanto também no aspecto de performance, que pode ser obtida de melhor maneira com a segunda opção.
E como você, eu desenvolvi meu OO com Java, mas o engraçado é que os grandes frameworks em PHP fazem da primeira forma e por isso me veio essa dúvida.
No aspecto performance vamos analisar o seguinte:
Usuario extende a abstração de dados.
Logo cada instancia de Usuario herda todos os métodos desta abstração. Deixando cada instancia sobrecarregada e também "insegura", como você disse.
E do outro lado da moeda:
Usuario extende Object.
Cada instancia de Usuario possui apenas seus metodos e propriedades. E então temos o UsuarioDAO (singleton) que faz a persistência.
Pensando dessa maneira, é mais um motivo para eu considerar a segunda opção a melhor.
Posted 03/12/2007, 11:48
Se você analisar bem, pessoal que aprende com linguagens inicialmente estruturais tem tendências a ter essa linha de lógica, CakePHP existia antes mesmo da OO do PHP prestar
Vejo alguns programadores vindos do ASP, C, Delhpi que desenvolvem essa linha de raciocínio, mais o pessoal que aprendeu com java pensa da mesma maneira que nós.
E mesmo se usar Singleton (quer dizer, no php é um pseudo-Singleton), vai ter falha de segurança (ao meu ponto de vista) ao retornar o objeto.
Unica coisa que eu faço o meus BEANS herdarem é o ActionForm, para validações
Uso uma Action (que herda uma ActionMapping) que dae ela tem acesso a DAO (Persistência), que dae a DAO me retorna um Objeto Bean ... para mim fica legalzinho assim