DAO's nas classes de negócio  XML
Índice dos Fóruns » Arquitetura de Sistemas
Autor Mensagem
saoj
Forum Spammer
[Avatar]

Membro desde: 09/03/2004 23:34:46
Mensagens: 2133
Localização: RJ, BRA
Offline

Ok, entendi.

Tenho o seguinte DAO que é acessado pelo modelo de negócios:



Reparem algumas coisas:

Ele é uma interface

Ele não possui qualquer acoplamento a java.sql.Connection. org.hibernate.session, java.io.File, etc.

Posso ter N implementações desse DAO, tais como, JdbcUserDAO, MySQLUserDAO (que extends JdbcUserDAO), HibernateUserDAO, LDAPUserDAO, TestUserDAO, DummyUserDAO, etc.

Algumas perguntas:

1) Posso considerar essa interface como respositório?

2) Como ficaria um repositorio então nesse meu caso?

Obrigado e acredito que todos estão tirando proveito desse tópico!

- "Prefiro proclamar abertamente aos homens, baseando-me no meu conhecimento da realidade, aquilo que lhes seja útil, ainda que ninguém o compreenda, a dar, sob o caloroso aplauso da multidão, o meu acordo em tolices." (Epicuro) Vestido Noiva Ipanema Rio de Janeiro Casamento InterNovias InterNoivas
[Email] [WWW]
SadNess
JavaTeenager
[Avatar]

Membro desde: 30/03/2006 16:51:25
Mensagens: 189
Online

pqp
essas 3 páginas de tópico valem + a pena do que muito livro por aí
Tecnoage
Forum Spammer

Membro desde: 13/03/2005 23:18:07
Mensagens: 1570
Offline

Acredito que sim... O DAO implementa esse repository, e é utilizado algo para injetar a implementação.

Oracle SOA Certified
[Email] [MSN]
RafaelRio
JavaGuru
[Avatar]

Membro desde: 05/09/2006 06:52:42
Mensagens: 253
Localização: Sampa
Offline

É isso aí, saoj!

Daí, a implementação do repository pode ser obtida através de dependency injection (injetada), service locator ou factories.

Ou seja, obtida por meio de padrões cuja finalidade é desacoplar ao máximo uma classe dependente (cliente) de uma implementação específica.

T+ !

Rafael Fiume. SCJP 6.0
Cotidiano em Wonderland

Nullius in verba.
"A palavra de nenhum homem será a final."

Lema da Royal Society, associação de cientistas de Londres, em 1660. Entre os seus membros e presidentes esteve Isaac Newton.
[Email]
saoj
Forum Spammer
[Avatar]

Membro desde: 09/03/2004 23:34:46
Mensagens: 2133
Localização: RJ, BRA
Offline

Eu chamei minha interface the UserDAO.

Por isso que eu falei que o modelo de negócios deve acessar o DAO. Na verdade ele vai acessar a INTERFACE UserDAO.

Resta saber se ao invés de chamar essa interface the UserDAO deveríamos chamar ela de UserRepository, ou ainda se isso deveria ser feito de outra maneira...


- "Prefiro proclamar abertamente aos homens, baseando-me no meu conhecimento da realidade, aquilo que lhes seja útil, ainda que ninguém o compreenda, a dar, sob o caloroso aplauso da multidão, o meu acordo em tolices." (Epicuro) Vestido Noiva Ipanema Rio de Janeiro Casamento InterNovias InterNoivas
[Email] [WWW]
RafaelRio
JavaGuru
[Avatar]

Membro desde: 05/09/2006 06:52:42
Mensagens: 253
Localização: Sampa
Offline

Eu também chamaria a interface de UserDAO e a implementação, de UserDAOBean, por causa das convenções de nomes da especificação EJB.

T+ !

Rafael Fiume. SCJP 6.0
Cotidiano em Wonderland

Nullius in verba.
"A palavra de nenhum homem será a final."

Lema da Royal Society, associação de cientistas de Londres, em 1660. Entre os seus membros e presidentes esteve Isaac Newton.
[Email]
Fabio Kung
JavaEvangelist

Membro desde: 08/03/2004 08:24:47
Mensagens: 425
Localização: São Paulo
Offline

saoj wrote:
1) Posso considerar essa interface como respositório?

2) Como ficaria um repositorio então nesse meu caso?

Sérgio, eu mudaria um pouco o nome dos métodos para tirar os rastros que de que há um banco (ou algo do tipo). Trocando load/search por get, acho que já ficaria melhor. Trocando insert/delete por add/remove tb melhoraria um pouco.

Fica mais com cara de coleção, entende? Mas isso é só firula.

Fora isso, usaria unchecked exceptions para todos esses métodos e aí sim renomearia para UserRepository.

http://blog.caelum.com.br


Fabio Kung
[WWW] [MSN] [ICQ]
pcalcado
Moderador
[Avatar]

Membro desde: 08/03/2004 17:19:35
Mensagens: 5115
Localização: Melbourne - Australia
Offline

Rafaelprp wrote:onde acho documentação da sun falando sobre esses padrões de nomes ?


Não há, pelo menos não amplamente divulgada. Estes padrões foram catalogados por Martin Fowler e Eric Evans.

Rafaelprp wrote:
e no caso, isso aqui estaria errado ?? Lá ele utiliza a nomeclatura DAO na interface...


Não está errado porque o autor está falando sobre DAOs e não sobre Repositórios.

Rafaelprp wrote:
Tá parecendo aquele velho papo que no mundo java existem vários nomes para a mesma coisa...


Releia meu último post.

Phillip Calçado "Shoes"
http://fragmental.tw/
http://blog.fragmental.com.br/
"It is unfortunate that much of what is called 'object-oriented programming today is simply old style programming with fancier constructs." - Alan Kay
[Email] [WWW] [Yahoo!] [MSN]
bmentges
HelloWorld
[Avatar]

Membro desde: 17/06/2005 14:49:21
Mensagens: 21
Localização: Rio de Janeiro, RJ
Offline

Interessante a discussão

Bruno Mentges de Carvalho
http://www.brunocarvalho.com
[WWW]
pcalcado
Moderador
[Avatar]

Membro desde: 08/03/2004 17:19:35
Mensagens: 5115
Localização: Melbourne - Australia
Offline

Sim, Sérgio, pode chamar de Repositório. Mas tem 2 coisas importantes aí:

1) Nomes são muito importantes. Design Patterns são úteis entre outras coisas por definirem um nome comum a alguma técnicas, por isso nomenclatura deve ser usada com muito cuidado.

2) Um Repositório não é um DAO, um DAO pode ser um repositório. Vou coalr aqui uma resposta minha na lsita de DDD que pode esclarecer:

"Phillip Calçado" wrote:
Re: [domaindrivendesign] Farewell to Repositories (I think)

The main thing to keep in mind while working with Repositories is that
they're a domain concept, while a DAO or any other Mapper between
objects and tables aren't. The domain classes knows that repositories
are where business objects instances remain. As a business concept it
can and will be handled, received as a parameter, etc. by those
business domain classes like services and entities.

A DAO doesn't fit in a Repositories place directly, this would break
layered archtiecture of a application, but generally a Repository is
just something that when invoked will call a DAO.

To avoide the tortures of creating a brinless delegator as a
Repository you can use the Dependency Inversion principle, by Uncle
Bob, and make Repository an interface implemented by the DAO class.
This way your domain classes won't end up dependent on infrastructures
classes (like DAOs) while you avoid creating Repository classes that
acts just like delegators.

I've used this approach more than once. In a recent project I've used
this Dao<<implements>>Repository strategy and suddenly was requested
that before checking the database I'd have to first check a enterprise
search engine (something like google appliances or a dedicated Lucene
server). I used to have:

And changed to:


The RepositoryImpl was the class responsible for looking for the
instance persisted in one of the two deta repositories. The domain
classes that just relied on the Repository concept, not its
implementation, weren't affected.

cheers


http://tech.groups.yahoo.com/group/domaindrivendesign/message/5425

Phillip Calçado "Shoes"
http://fragmental.tw/
http://blog.fragmental.com.br/
"It is unfortunate that much of what is called 'object-oriented programming today is simply old style programming with fancier constructs." - Alan Kay
[Email] [WWW] [Yahoo!] [MSN]
rflprp
Virtual Machine Man

Membro desde: 27/04/2005 18:52:49
Mensagens: 822
Offline

onde acho documentação da sun falando sobre esses padrões de nomes ?
rflprp
Virtual Machine Man

Membro desde: 27/04/2005 18:52:49
Mensagens: 822
Offline

e no caso, isso aqui estaria errado ?? Lá ele utiliza a nomeclatura DAO na interface...

Tá parecendo aquele velho papo que no mundo java existem vários nomes para a mesma coisa...
Luca
Moderador
[Avatar]

Membro desde: 06/09/2002 14:30:10
Mensagens: 5094
Localização: São Paulo/SP ou Paraty/RJ
Offline

Olá

Rafaelprp wrote:Tá parecendo aquele velho papo que no mundo java existem vários nomes para a mesma coisa...


Nada é imutável no campo da idéias. As coisa evoluem. Desde que os caras da Sun escreveram sobre design patterns, muitos outros autores escreveram também e muitas idéias se aprimoraram.

Siga o exemplo do Phillip, que estuda para caramba para se manter atualizado. Procure ler os livros que ele recomenda e entenderá melhor o porque das mudanças.

[]s
Luca

Dare Obasanjo (Program Manager at Microsoft)
"The folks I know from across the industry who have to build large scale Web services on the Web today at Google, Yahoo!, Facebook, Windows Live, Amazon, etc are using RESTful Web services. The only times I encounter someone with good things to say about WS-* is if it is their job to pimp these technologies or they have already "invested" in WS-* and want to defend that investment."


CEP, JMS, JMX e coisas afins (ou não)
http://lucabastos.blogspot.com/
[Email] [WWW]
RafaelRio
JavaGuru
[Avatar]

Membro desde: 05/09/2006 06:52:42
Mensagens: 253
Localização: Sampa
Offline

Fabio Kung wrote:
saoj wrote:
1) Posso considerar essa interface como respositório?

. . . e aí sim renomearia para UserRepository.

pcalcado wrote:Sim, Sérgio, pode chamar de Repositório.

Se eu entendi bem o que foi dito aqui, inclusive nesse e nesse blog, por todos os motivos já citados, a interface UserDAO deve ser renomeada para UserRepository.

Então, o artigo Ei! Como é o seu DAO? Ele é tão abstraído quanto o meu? do blog da Caelum deve ser atualizado, certo?
Pois essa interface DAO é utilizada na camada de negócio - pelo menos é o que subtende-se pelo artigo:
Afinal, Client é um aggregate, e o repository deverá lidar com Client e suas classes colaboradoras, como Address, etc.

Esse outro artigo sugere o que o pcalcado disse acima:
Repository -> RepositoryImpl -> DAO -> DAOImpl

Ali, o autor diz que nos DAO's devem haver - digamos assim - métodos de granulação fina, estritamente relacionados às operações com banco de dados: create, find / search, update, delete; nos repositórios, operações mais "interessantes", relacionadas aos negócios", como procurarTodosClientesInadimplentes.

procurarTodosClientesInadimplentes para mim estaria num domain service e poderia gerar outra discussão: se deveria estar num repositório ou não. Mas creio que ficou claro o que quis dizer.

T+ !

Rafael Fiume. SCJP 6.0
Cotidiano em Wonderland

Nullius in verba.
"A palavra de nenhum homem será a final."

Lema da Royal Society, associação de cientistas de Londres, em 1660. Entre os seus membros e presidentes esteve Isaac Newton.
[Email]
Fabio Kung
JavaEvangelist

Membro desde: 08/03/2004 08:24:47
Mensagens: 425
Localização: São Paulo
Offline

Rafael, você levantou algumas questões muito boas.

Se os objetos do domínio possuírem alguma referência, eu chamaria a interface de Repository, caso contrário chamaria de DAO.

Mas isso também é bem discutível.

http://blog.caelum.com.br


Fabio Kung
[WWW] [MSN] [ICQ]
 
Índice dos Fóruns » Arquitetura de Sistemas
Ir para:   
Apoiado e desenvolvido por Caelum Cursos Java - Powered by JForum 2.1.8 © JForum Team