Jump to content


Photo

Dao E Domain Object


  • Faça o login para participar
3 replies to this topic

#1 Renan Gonçalves

Renan Gonçalves

    Web Developer

  • Usuários
  • 771 posts
  • Sexo:Masculino
  • Localidade:São Paulo, SP
  • Interesses:Programar PHP, Java (e JSP), Javascript (com Ajax, claro), Ruby (on Rails) !

Posted 02/12/2007, 22:11

Fala galera, beleza?


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 = new Usuario();
$usuario->blablabla...
$usuario->save();

De outra forma:
$usuario = new Usuario();
$usuario->blablabla...
$usuarioDAO = new UsuarioDAO();
$usuarioDAO->create($usuario);

Minhas pergunta são:
Qual dessas práticas você utiliza?
Qual acha mais "correta"?


Obrigado por ajudarem ... ;-)
[]'s

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.

Renan Gonçalves
renan.saddam@gmail.com
(WebSite / Gmail / orkut / Windows Live! Messenger
)

"Aquele que se define se limita."


#2 savior

savior

    Campanha [codebox], use ou morra :D

  • Usuários
  • 1229 posts
  • Sexo:Masculino
  • Localidade:Curitiba, PR - Brasil
  • Interesses:Na vida ;P

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:
function foo() {
$usuario = new Usuario();
$usuario->blablabla...
$usuario->get(10001); //Pegar o usuário com a ID 10001
return $usuario;
}
$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 :)

[]'s

[lastfm] [blog]

Campanha codebox: use-a ou morra!
bfmaster_duran[at]yahoo.com.br


#3 Renan Gonçalves

Renan Gonçalves

    Web Developer

  • Usuários
  • 771 posts
  • Sexo:Masculino
  • Localidade:São Paulo, SP
  • Interesses:Programar PHP, Java (e JSP), Javascript (com Ajax, claro), Ruby (on Rails) !

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.


[]'s

Renan Gonçalves
renan.saddam@gmail.com
(WebSite / Gmail / orkut / Windows Live! Messenger
)

"Aquele que se define se limita."


#4 savior

savior

    Campanha [codebox], use ou morra :D

  • Usuários
  • 1229 posts
  • Sexo:Masculino
  • Localidade:Curitiba, PR - Brasil
  • Interesses:Na vida ;P

Posted 03/12/2007, 11:48

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.


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 :P

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 :P
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 :)

Não sei se meus argumentos são facilmente 'dirrubados', mas eu defendo esse ponto de vista.

[]'s

Edição feita por: savior, 03/12/2007, 11:49.

[lastfm] [blog]

Campanha codebox: use-a ou morra!
bfmaster_duran[at]yahoo.com.br





0 user(s) are reading this topic

0 membro(s), 0 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq