Duvidas sobre o pattern DAO!  XML
Índice dos Fóruns » Metodologias de Desenvolvimento e Testes de Software
Autor Mensagem
leandronsp
JavaEvangelist
[Avatar]

Membro desde: 22/03/2008 22:24:29
Mensagens: 482
Localização: São Paulo
Offline

sergiotaborda wrote:
?

Em uma arquitetura sã vc tem serviços que invocar métodos em repositorios.
Os repositorios criam as pesquisas e as executam. Se vc usa o hibernate ou o JPA vc invoca-os directamente de dentro do repositorio.
O repositorio não é plugável, não é flexivel, não é genérico e depende fortemente do dominio do sistema onde é usado.


Eu utilizo Repositorio e a aplicação é extremamente flexível, fica independente do domínio e da persistência.
A programação com repositorio, se bem utilizada, fica bem facil de ser compreendida, podendo permitir vc criar varios metodos de consulta e dar manutenção.

Blog | Github | About me! |

Contribua => Parser HTML

Compartilhe arquivos e ideias no ebaH!
[Email] [WWW] [MSN]
sergiotaborda
GUJ Expert
[Avatar]

Membro desde: 22/03/2005 20:57:48
Mensagens: 3420
Offline

leandronsp wrote:
sergiotaborda wrote:
?

Em uma arquitetura sã vc tem serviços que invocar métodos em repositorios.
Os repositorios criam as pesquisas e as executam. Se vc usa o hibernate ou o JPA vc invoca-os directamente de dentro do repositorio.
O repositorio não é plugável, não é flexivel, não é genérico e depende fortemente do dominio do sistema onde é usado.


Eu utilizo Repositorio e a aplicação é extremamente flexível, fica independente do domínio e da persistência.


Ser independente do domínio e da persistência é impossível. Essa afirmação precisa de de um exemplo que a comprove.

Criando sua própria API de Validação



Blog do MiddleHeaven
[WWW]
luistiagos
GUJ Expert
[Avatar]

Membro desde: 10/07/2006 10:37:23
Mensagens: 3009
Offline

sergiotaborda wrote:
leandronsp wrote:
sergiotaborda wrote:
?

Em uma arquitetura sã vc tem serviços que invocar métodos em repositorios.
Os repositorios criam as pesquisas e as executam. Se vc usa o hibernate ou o JPA vc invoca-os directamente de dentro do repositorio.
O repositorio não é plugável, não é flexivel, não é genérico e depende fortemente do dominio do sistema onde é usado.


Eu utilizo Repositorio e a aplicação é extremamente flexível, fica independente do domínio e da persistência.


Ser independente do domínio e da persistência é impossível. Essa afirmação precisa de de um exemplo que a comprove.


Eu tbm.... nunca vi esta façanha...




SCJP 1.5
SCJA 1.0
IBM DB2 Associate
[Email] [MSN]
clone_zealot
JavaEvangelist

Membro desde: 21/11/2004 16:40:00
Mensagens: 419
Offline

sergiotaborda wrote:
leandronsp wrote:
sergiotaborda wrote:
?

Em uma arquitetura sã vc tem serviços que invocar métodos em repositorios.
Os repositorios criam as pesquisas e as executam. Se vc usa o hibernate ou o JPA vc invoca-os directamente de dentro do repositorio.
O repositorio não é plugável, não é flexivel, não é genérico e depende fortemente do dominio do sistema onde é usado.


Eu utilizo Repositorio e a aplicação é extremamente flexível, fica independente do domínio e da persistência.


Ser independente do domínio e da persistência é impossível. Essa afirmação precisa de de um exemplo que a comprove.


Além de ser impossível, oq vc ganha(ria) com tanta flexibilidade?
Não vejo utilidade de se criar o sistema mais independente do mundo, tão independente que ele nem precisa saber o domínio dele. Basta vc pensar no seu problema perto dele, e ele resolve =/

"Não amo a espada por sua agudez,
não amo a flecha por sua rapidez,
não amo o homem por sua glória,
amo sim, tudo o que eles defendem"
Faramir, Príncipe de Ithilien
leandronsp
JavaEvangelist
[Avatar]

Membro desde: 22/03/2008 22:24:29
Mensagens: 482
Localização: São Paulo
Offline

Desculpem, creio que me equivoquei em dizer que o repository fica independente do dominio. Ele faz parte do dominio. Qdo desenvolvo o dominio, eu tbm crio os repositorios.
Mas ainda entendo que ele é independente da persistencia. Vou tentar demonstrar:



Um factory Interface para definir os repositorios mais especificos:



Um repositorio interface mais especifico, que extende o RepositorioInterface:



Até agora, minhas interfaces de repositorio foram independentes da persistencia.
A partir de agora, a implementação do Dao (infra-estrutura para persistência):



Neste caso estou utilizando a persistencia com JPA. Meu DaoFactory é implementado da seguinte forma:


Na aplicação o objeto do tipo RepositorioFactoryInterface faz os trabalhos de persistência:



Não sei se ficou claro, mas eu entendo que mesmo que eu altere minha forma de persistência (no caso, trocar o JPA por qq outra coisa), não afeta as lógicas de persistência no repositório (eu só alteraria meu Dao).

Blog | Github | About me! |

Contribua => Parser HTML

Compartilhe arquivos e ideias no ebaH!
[Email] [WWW] [MSN]
sergiotaborda
GUJ Expert
[Avatar]

Membro desde: 22/03/2005 20:57:48
Mensagens: 3420
Offline

Estava indo bem até que ...

leandronsp wrote:
Até agora, minhas interfaces de repositorio foram independentes da persistencia.
A partir de agora, a implementação do Dao (infra-estrutura para persistência):



Outch! Se eu tivesse um centavo por cada vez que alguem confundo repositorio com DAO, estaria rico.

Veja bem o problema. O repositorio não é um DAO, nem o DAO é um repositorio. Logo, herança ou implementação de um pelo outro é asneira.

Este erro é muito comum pela mesma razão que é muito comuma alguem fazer este erro aqui:



ou



As pessoas ainda não sabem o que é herança. A regra é simples: perfira composição a herança. Apenas e quando A é B é que a herança pode ser usada. (Herança aqui inclui o implements e o extends)

Ora da mesma forma que um Pedido não é um HashMap e sim Pedido contém um Map, também Repositorio não é um DAO, Repositorio contém um DAO.

Inverter as coisas é ainda pior. Fazer DAO extends Repositorio é do mesmo calibre que fazer HashMap extends Pedido. Pedido é do dominio, Map é de infra. infra não pode extender o dominio. O dominio não pode extender a infra. O que pode acontecer é que o dominio use a infra. Daqui a composição ao invés da herança.

Pior ainda é escrever um DAO usando JPA por baixo.... JPA é orientado ao dominio. DAOs não são. Você não precisa usar a camada de DAO se usa JPA.

Por amor de Deus, pessoal, estudem a arquitetura JPA e o padrão Domain Store. É triste vos ver cometendo o mesmo erro vezes sem conta...

A partir do ponto que vc misturou tudo não só você não sabe no "mato sem cachorro" em que se está metendo como você ainda sofre do sindrome de DAO. Pelo menos vc ainda vislumbra uma diferença entre DAO e Repositório. Isso já é um bom sinal para um cura possivel.

This message was edited 1 time. Last update was at 01/07/2009 07:25:58


Criando sua própria API de Validação



Blog do MiddleHeaven
[WWW]
mochuara
GUJ Master
[Avatar]
Membro desde: 20/05/2009 11:21:32
Mensagens: 1776
Offline

leandronsp wrote:
sergiotaborda wrote:
?

Em uma arquitetura sã vc tem serviços que invocar métodos em repositorios.
Os repositorios criam as pesquisas e as executam. Se vc usa o hibernate ou o JPA vc invoca-os directamente de dentro do repositorio.
O repositorio não é plugável, não é flexivel, não é genérico e depende fortemente do dominio do sistema onde é usado.


Eu utilizo Repositorio e a aplicação é extremamente flexível, fica independente do domínio e da persistência.
A programação com repositorio, se bem utilizada, fica bem facil de ser compreendida, podendo permitir vc criar varios metodos de consulta e dar manutenção.


Eu utilizo Interfaces e a aplicação é extremamente flexível, fica independente do domínio e da persistência.
A programação com Interfaces, se bem utilizada, fica bem facil de ser compreendida, podendo permitir vc criar varios metodos de consulta e dar manutenção.
mochuara
GUJ Master
[Avatar]
Membro desde: 20/05/2009 11:21:32
Mensagens: 1776
Offline

leandronsp wrote:Desculpem, creio que me equivoquei em dizer que o repository fica independente do dominio. Ele faz parte do dominio. Qdo desenvolvo o dominio, eu tbm crio os repositorios.
Mas ainda entendo que ele é independente da persistencia. Vou tentar demonstrar:



Um factory Interface para definir os repositorios mais especificos:



Um repositorio interface mais especifico, que extende o RepositorioInterface:



Até agora, minhas interfaces de repositorio foram independentes da persistencia.
A partir de agora, a implementação do Dao (infra-estrutura para persistência):



Neste caso estou utilizando a persistencia com JPA. Meu DaoFactory é implementado da seguinte forma:


Na aplicação o objeto do tipo RepositorioFactoryInterface faz os trabalhos de persistência:



Não sei se ficou claro, mas eu entendo que mesmo que eu altere minha forma de persistência (no caso, trocar o JPA por qq outra coisa), não afeta as lógicas de persistência no repositório (eu só alteraria meu Dao).


O uso de interfaces no DAO é a forma como o padrão foi projetado originalmente. O que as interfaces com prefixo Repositório que você utilizou têm de especial que a fazem levar o nome pomposo de Padrão Repositório?
leandronsp
JavaEvangelist
[Avatar]

Membro desde: 22/03/2008 22:24:29
Mensagens: 482
Localização: São Paulo
Offline

Sérgio,

Obrigado pelas críticas. Todas são mto bem-vindas.
A idéia do DAO nesta aplicação é justamente ele fazer os CRUDS. E o DAOFactory iniciar transações do JPA, comitar, etc.

Obviamente, nota-se na classe DAO os métodos que fazem os trabalhos de persistência utilizarem o EntityManager. Ficou uma coisa meio óbvia, e cheguei a pensar: "pra quê ter DAO, se tudo isso parece feijão com arroz 'duas vezes'?".

Entendi oq vc quis dizer, e pesquisando melhor em foruns, no seu blog inclusive, em links recomendados, percebi que o EntityManager do JPA e o Session do Hibernate poderiam ser os "DAO´s" da aplicação (certo?). No meu caso, como utilizo o Repository, eu injetaria o EntityManager nas minhas classes de negócio do Repository? Algo como:



Se for dessa forma, não fica parecendo um DAO, só que com outro nome?
Obrigado.

Blog | Github | About me! |

Contribua => Parser HTML

Compartilhe arquivos e ideias no ebaH!
[Email] [WWW] [MSN]
fantomas
GUJ Master
[Avatar]

Membro desde: 24/04/2008 16:10:55
Mensagens: 1506
Localização: Terra (maior parte do tempo)
Offline

leandronsp

Dá uma lida neste link http://debasishg.blogspot.com/2007/02/domain-driven-design-inject.html, nele tem esta definição data pelo autor que pode lhe ajudar.

Debasish Ghosh wrote:
The main differences between the Repository and the DAO are that :


* The DAO is at a lower level of abstraction than the Repository and can contain plumbing codes to pull out data from the database. We have one DAO per database table, but one repository per domain type or aggregate.

* The contracts provided by the Repository are purely "domain centric" and speak the same domain language.


Não deixe de ler o post do cara (Debasish Ghosh) acho que irá melhora um pouco mais o seu entendimento além de dar outras idéias.

flws
sergiotaborda
GUJ Expert
[Avatar]

Membro desde: 22/03/2005 20:57:48
Mensagens: 3420
Offline

leandronsp wrote:
Entendi oq vc quis dizer, e pesquisando melhor em foruns, no seu blog inclusive, em links recomendados, percebi que o EntityManager do JPA e o Session do Hibernate poderiam ser os "DAO´s" da aplicação (certo?).


Certo!
Só lembrando que realmente o EntityManager é uma implementação do padrão DomainStore.
O Session do Hibernate é uma implementação do padrão UnitOfWork


No meu caso, como utilizo o Repository, eu injetaria o EntityManager nas minhas classes de negócio do Repository?


Sim. Exactamente.


Se for dessa forma, não fica parecendo um DAO, só que com outro nome?


Não. Isso é um erro comum. Se X e Y parecem ter a mesma interface então X é Y. não!
Para X ser Y ele precisa ter não apenas a mesma interface como a mesma responsabilidade.

DAOs e Repositorios têm responsabilidades diferentes , portanto é impossivel confundi-los.


Criando sua própria API de Validação



Blog do MiddleHeaven
[WWW]
leandronsp
JavaEvangelist
[Avatar]

Membro desde: 22/03/2008 22:24:29
Mensagens: 482
Localização: São Paulo
Offline

fantomas wrote:leandronsp

Dá uma lida neste link http://debasishg.blogspot.com/2007/02/domain-driven-design-inject.html, nele tem esta definição data pelo autor que pode lhe ajudar.

Debasish Ghosh wrote:
The main differences between the Repository and the DAO are that :


* The DAO is at a lower level of abstraction than the Repository and can contain plumbing codes to pull out data from the database. We have one DAO per database table, but one repository per domain type or aggregate.

* The contracts provided by the Repository are purely "domain centric" and speak the same domain language.


Não deixe de ler o post do cara (Debasish Ghosh) acho que irá melhora um pouco mais o seu entendimento além de dar outras idéias.

flws


valeu fantomas...vou trabalhar mais essas técnicas ensinadas

Blog | Github | About me! |

Contribua => Parser HTML

Compartilhe arquivos e ideias no ebaH!
[Email] [WWW] [MSN]
leandronsp
JavaEvangelist
[Avatar]

Membro desde: 22/03/2008 22:24:29
Mensagens: 482
Localização: São Paulo
Offline

hum... parece que ficou mais clara essa divisão de responsabilidades. Creio que esta aplicação não foge mto doq vcs estão colocando, porém com algumas ressalvas, tais como utilizar mais composição (ao invés de herança) e fazer meu domínio enxergar a interface do repositorio apenas, e não um "dao". Realmente pra essas coisas eu não tinha me atentando mto. Vou estudar mais o material do Evans - DDD.

O lance aqui então é: a interface do meu repositorio deve ser como um "contrato", numa linguagem fácil para fazer parte do domínio.
A implementação do meu repositorio "contém" a infra-estrutura para persistência, neste caso o JPA.



Blog | Github | About me! |

Contribua => Parser HTML

Compartilhe arquivos e ideias no ebaH!
[Email] [WWW] [MSN]
mochuara
GUJ Master
[Avatar]
Membro desde: 20/05/2009 11:21:32
Mensagens: 1776
Offline




Criar repositorio para DAOs é criar abstrações em cima de abstrações, totalmente desnecessário IMO.
sergiotaborda
GUJ Expert
[Avatar]

Membro desde: 22/03/2005 20:57:48
Mensagens: 3420
Offline

mochuara wrote:
Criar repositorio para DAOs é criar abstrações em cima de abstrações, totalmente desnecessário IMO.


Isso seria verdade ser existisse uma relação 1-1. Como a relação é 1-N então isso não se aplica.

Uma entidade X tem um repositorio. Mas X é um agregado de Y, Z , ... etc.. logo o repositorio de X utiliza o DAO de Y, Z, etc...

A aplicação vê apenas um repositorio e o X. Mas por baixo dos panos muitas entidades estão implicitas e muitos DAOs.
Contudo, hoje em dia o DAO é desnecessário. Utilizando qualquer domain Store voce tem uma relação N-1. Vários repositorios chamam o mesmo DomainStore (porque ele não é por entidade e sim por dominio).

Veja-se como se vir, devido a que nunca existe uma relação 1-1 entre repositorios e DAOs / DomainStore , a abstração não é desnecessária.

Criando sua própria API de Validação



Blog do MiddleHeaven
[WWW]
 
Índice dos Fóruns » Metodologias de Desenvolvimento e Testes de Software
Ir para:   
Powered by JForum 2.1.8 © JForum Team