| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/06/2007 19:27:29
|
Kenobi
Forum Spammer
![[Avatar]](/images/avatar/cf2226ddd41b1a2d0ae51dab54d32c36.jpg)
Membro desde: 14/11/2003 13:06:37
Mensagens: 1452
Localização: Brasil
Offline
|
Uma vez, batendo papo com o Vinícius Siegel (dono da global code) num evento , estávamos falando sobre pattern e ele falou uma coisa muito interessante : "Depois de 2 ou 3 cervejas, eles são praticamente iguais ... ".
Brincadeira à parte, costumo fazer o design dessa camada utilizando uma interface DAO e sua implementação de modo genérico.
Na camada Business, IoC desse com a "ajudinha" do Spring ou um esquema de anotações que voê pode montar tb ...
PS: vou postar um artigo sobre isso no meu blog, que não atualizo a quase um ano
|
------------------------------------------------------------------
"Massakatsu Agatsu Katsuhaiabi" - "A verdadeira vitória é aquela sobre nós mesmos". / acesse :soaexpert.com.br |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 06/06/2007 21:08:53
|
Rubem Azenha
Forum Spammer
![[Avatar]](/images/avatar/cb953f6ca5923f7517125db46ed1293d.png)
Membro desde: 28/06/2004 00:10:43
Mensagens: 1799
Localização: São Paulo, SP
Offline
|
pcalcado wrote:
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.
Legal Phillip. Realmente usar o nome Repository e usar a nomenclatura de métodos sugerida pelo Fábio Kung fica menos na cara que ta usando um banco de dados por trás, fica mais bonito, etc.
Mas acho que o pessoal ta mais acostumado com o termo DAO e, no fim, DAO e Repository acaba tendo o mesmo efeito.
|
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots. So far, the Universe is winning
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 07/06/2007 12:41:35
|
pcalcado
Moderador
![[Avatar]](/images/avatar/110eec23201d80e40d0c4a48954e2ff5.jpg)
Membro desde: 08/03/2004 17:19:35
Mensagens: 5169
Localização: Sydney - Australia
Offline
|
microfilo wrote:
Mas acho que o pessoal ta mais acostumado com o termo DAO e, no fim, DAO e Repository acaba tendo o mesmo efeito.
Ou eu não tô sabendo explicar ou tem algo errado na comunicação...
Imagine a situação: o seu DAO recebe como parâmetro um HttpRequest. Tem o mesmo efeito que passar um objeto de negócios para ele, não?
|
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 07/06/2007 12:45:00
|
pcalcado
Moderador
![[Avatar]](/images/avatar/110eec23201d80e40d0c4a48954e2ff5.jpg)
Membro desde: 08/03/2004 17:19:35
Mensagens: 5169
Localização: Sydney - Australia
Offline
|
Não necessariamente. (1)Ele não precisa estar falando de DDD e (2) ainda que você adote a estratégia simplificada de DAO<<implements>>Repository nada impede que o DAO tenha sua própria interface para promover alguma abstração.
|
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 07/06/2007 12:46:58
|
pcalcado
Moderador
![[Avatar]](/images/avatar/110eec23201d80e40d0c4a48954e2ff5.jpg)
Membro desde: 08/03/2004 17:19:35
Mensagens: 5169
Localização: Sydney - Australia
Offline
|
Fabio Kung wrote:Se os objetos do domínio possuírem alguma referência, eu chamaria a interface de Repository, caso contrário chamaria de DAO.
É beeeeeem por aí. Um repository é como *objetos de negocio* enxergam 'o lugar onde objetos sao guardados'. Se eles sao guardados num SGBD e mapeados com um DAO nao importa aos objetos de negocio.
|
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 07/06/2007 12:54:24
|
Fabio Kung
JavaEvangelist
Membro desde: 08/03/2004 08:24:47
Mensagens: 445
Localização: São Paulo
Offline
|
Boa Phillip, foi exatamente o que eu quis dizer!
No artigo do Paulo lá no blog da Caelum, o DAO não está sendo usado dentro dos objetos do domínio, por isso continua sendo DAO.
A diferença é sutil:
getProdutos passando 'this' ficou BEM feio, mas é só para ilustrar a idéia.
|
Procurando por oportunidades de emprego?
OndeTrabalhar.com
OndeTrabalhar.com Java?
http://blog.caelum.com.br
Fabio Kung
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 07/06/2007 12:55:32
|
robertwgil
Thread.start()
Membro desde: 16/09/2006 11:16:01
Mensagens: 45
Offline
|
Entao depois de tanta teoria como ficaria uma estrutura web para acessar um
banco de dados por exemplo?
view -> action -> modelo de negocios -> UserRepository(Interface) -> UserDao(implementação) -> etc etc..
??
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 07/06/2007 13:24:50
|
saoj
Forum Spammer
![[Avatar]](/images/avatar/2e7ceec8361275c4e31fee5fe422740b.jpg)
Membro desde: 09/03/2004 23:34:46
Mensagens: 2292
Localização: Los Angeles, EUA
Offline
|
Se eu entendi direito:
req HTTP -> Action -> Modelo -> UserRepository -> Implementação concreta do repositário MySQLUserRepository -> Banco de dados.
Mas acho que eu entendi errado, pois acima só trocamos o nome DAO por Repository.
Então talvez seja algo assim:
req HTTP -> Action -> Modelo -> UserRepository -> Implementação concreta de UserRepository -> User DAO -> Implementação concreta de UserDAO -> Banco de dados.
Parece correto do ponto de vista teórico, mas com o side-effect prático de termos muitas classes e interfaces.
Minha dúvida agora já é outra. Acredito que devido a simplicidade do meu modelo de negócios ele acabou se comportando como um UserRepository apenas, ou seja, sua única função ficou sendo CRUD de beans.
Acho que esse conceito está difícil de assimilar porque em muitos casos o repositório vai apenas espelhar fielmente o DAO, logo ele parece uma camada a mais apenas com sentido teórico mas nao prático.
Por exemplo, se eu precisar pegar todos os usuários maiores de X anos, com a cueca da cor Y e cadastrados antes de 1990, terei que criar um novo método no repositorio e um outro igualzinho no DAO.
Haverá muita duplicação entre o DAO e o Repository... A dúvida que ficou e se isso tem que ser usado sempre ou não, depende do caso.
O outro extremo seria colocar tudo na action, ou seja, a action -> DAO -> banco...
|
Participe dos meus novos blogs:
O Poder Primário - Você no controle da sua felicidade
Sedução Tecnológica - Tutoriais, dicas e histórias de um engenheiro
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 07/06/2007 13:59:22
|
Fabio Kung
JavaEvangelist
Membro desde: 08/03/2004 08:24:47
Mensagens: 445
Localização: São Paulo
Offline
|
Todas essas camadas (Repository -> RepositoryImpl -> DAO -> DAOImpl) são a maior abstração possível. Você não precisa (eu eu acho que nem deve) fazer isso sempre. Se for só para ter um monte de interfaces e classes ocas que só delegam tudo, eu não acho que valha a pena abstrair.
Já foi o tempo que achava melhor interfacear e abstrair tudo. Até discutia bastante sobre isso com o Michael Nascimento e com o Paulo Silveira (aqui e aqui).
Hoje em dia eu mudei minha opinião e procuro sempre manter as coisas o mais simples possível, mas isso não significa fazer errado (acabar com a OO, por exemplo). O Repository não precisa ser apenas um envelope para o dao. Nem interfacear o repositório é obrigatório e regra geral.
Se eu percebo a necessidade de abstrair, refatoro e pronto. Acho que não vale a pena complicar muito o modelo com 1332423 abstrações e interfaces de tudo sem nem ter certeza da real necessidade.
O conceito do Repository é esse que o Phillip apresentou (e o trecho de código que eu postei). Já como implementá-lo, no meu ponto de vista, vai depender de cada caso.
|
Procurando por oportunidades de emprego?
OndeTrabalhar.com
OndeTrabalhar.com Java?
http://blog.caelum.com.br
Fabio Kung
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 07/06/2007 14:20:48
|
Fabio Kung
JavaEvangelist
Membro desde: 08/03/2004 08:24:47
Mensagens: 445
Localização: São Paulo
Offline
|
Kenobi wrote:Vinícius Siegel (dono da global code) ...
Vinícius Senger né?
(ou ele tem um sobrenome que ninguém conhece?)
|
Procurando por oportunidades de emprego?
OndeTrabalhar.com
OndeTrabalhar.com Java?
http://blog.caelum.com.br
Fabio Kung
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 07/06/2007 17:15:28
|
RafaelRio
JavaGuru
![[Avatar]](/images/avatar/e81218f96c55d1006352ed0a3b08d790.jpg)
Membro desde: 05/09/2006 06:52:42
Mensagens: 253
Localização: Sampa
Offline
|
saoj wrote:Então talvez seja algo assim:
req HTTP -> Action -> Modelo -> UserRepository -> Implementação concreta de UserRepository -> User DAO -> Implementação concreta de UserDAO -> Banco de dados.
Parece correto do ponto de vista teórico, mas com o side-effect prático de termos muitas classes e interfaces.
[. . .]
Acho que esse conceito está difícil de assimilar porque em muitos casos o repositório vai apenas espelhar fielmente o DAO, logo ele parece uma camada a mais apenas com sentido teórico mas nao prático.
Penso assim também.
saoj wrote:Por exemplo, se eu precisar pegar todos os usuários maiores de X anos, com a cueca da cor Y e cadastrados antes de 1990, terei que criar um novo método no repositorio e um outro igualzinho no DAO.
saoj, pelo que andei pesquisando, esse é o tipo de operação sob responsabilidade de um repository, que internamente utilizaria um DAO para acessar os dados necessários e então fazer o processamento e devolver o resultado ao cliente.
Os DAO's seriam escondidos e ficariam com o mais simples e puro CRUD; operações mais relacionadas com o negócio sobem para o repository.
Fabio Kung wrote:Todas essas camadas (Repository -> RepositoryImpl -> DAO -> DAOImpl) são a maior abstração possível. Você não precisa (eu eu acho que nem deve) fazer isso sempre. Se for só para ter um monte de interfaces e classes ocas que só delegam tudo, eu não acho que valha a pena abstrair.
Já foi o tempo que achava melhor interfacear e abstrair tudo. Até discutia bastante sobre isso com o Michael Nascimento e com o Paulo Silveira (aqui e aqui).
Assino em baixo. E vale a pena ver essa discussão.
Hoje em dia eu mudei minha opinião e procuro sempre manter as coisas o mais simples possível, mas isso não significa fazer errado (acabar com a OO, por exemplo). O Repository não precisa ser apenas um envelope para o dao. Nem interfacear o repositório é obrigatório e regra geral.
Se eu percebo a necessidade de abstrair, refatoro e pronto. Acho que não vale a pena complicar muito o modelo com 1332423 abstrações e interfaces de tudo sem nem ter certeza da real necessidade.
Mesmo porque, dizer o contrário é ir contra um dos princípios do XP, metodologia que parece ser seguida por vários profissionais no GUJ.
Eu achei o conceito de Repository interessante, mas não vi ganhos nem mesmo em grandes projetos. No meu caso, por exemplo, teria que fazer muito mais do que renomear algumas interfaces.
Se um dia eu achar útil... Bem, para isso que serve refactoring.
|
T+ !
Rafael Fiume.
Sun Certified Programmer for the Java Platform, Standard Edition 6
Sun Certified Web Component Developer for the Java Platform, Enterprise Edition 5
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. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 07/06/2007 18:25:16
|
Kenobi
Forum Spammer
![[Avatar]](/images/avatar/cf2226ddd41b1a2d0ae51dab54d32c36.jpg)
Membro desde: 14/11/2003 13:06:37
Mensagens: 1452
Localização: Brasil
Offline
|
Fabio Kung wrote:
Kenobi wrote:Vinícius Siegel (dono da global code) ...
Vinícius Senger né?
(ou ele tem um sobrenome que ninguém conhece?)
Boa ... eu realmente me confundi, não sei pq troquei o sobrenome do cara
Obrigado
|
------------------------------------------------------------------
"Massakatsu Agatsu Katsuhaiabi" - "A verdadeira vitória é aquela sobre nós mesmos". / acesse :soaexpert.com.br |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 07/06/2007 18:29:15
|
Fabio Kung
JavaEvangelist
Membro desde: 08/03/2004 08:24:47
Mensagens: 445
Localização: São Paulo
Offline
|
RafaelRio wrote:mas não vi ganhos nem mesmo em grandes projetos
Rafael, o ganho seria justamente deixar a coisa mais OO.
Em vez de:
Você consegue fazer:
Se o fornecedor tiver uma referência para o RepositorioDeContas (ContasRepository).
|
Procurando por oportunidades de emprego?
OndeTrabalhar.com
OndeTrabalhar.com Java?
http://blog.caelum.com.br
Fabio Kung
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 07/06/2007 19:49:50
|
RafaelRio
JavaGuru
![[Avatar]](/images/avatar/e81218f96c55d1006352ed0a3b08d790.jpg)
Membro desde: 05/09/2006 06:52:42
Mensagens: 253
Localização: Sampa
Offline
|
Fabio Kung wrote:
RafaelRio wrote:mas não vi ganhos nem mesmo em grandes projetos
Rafael, o ganho seria justamente deixar a coisa mais OO.
Kung, você sabe, para calcular ganhos é preciso conhecer vantagens e desvantagens - me corrigindo, a palavra mais correta seria "valor", ao invés de "ganhos".
A questão que eu coloquei é "essa camada a mais vale a pena"? Se o preço para mais uma camada superar os ganhos de tornar "a coisa mais OO", a resposta é não. Taí uma discussão que vai (ou melhor, poderia ir) longe...
Ultimamente tenho pensado que vale a pena questionar novas teorias que andam ululando por aí, em pró da simplicidade, desde que com fundamentos, ao invés de simplesmente aceitá-las.
Esse repository, por exemplo, vocês podem argumentar que torna as coisas mais claras, elegantes, o genro que toda sogra gostaria de ter, mais OO, etc. Mas tô sentindo que a reação da maioria das pessoas será "isso é lindo na teoria, mas não na prática; deixa quieto, vou continuar com meus DAO's". Vão deixar (aproveitando esse exemplo) o Repository para uma "zelite" que irá se formar - "isso é só pros caras".
E quando argumentos do tipo "torna a coisa mais OO", "segundo Fowler", etc, finalmente se desgastarem, essa elite ficará isolada numa torre de marfim - já aconteceu e acontece em diversas áreas. Vão dizer coisas lá de cima na torre, as pessoas vão escutar, ficar encantadas, vai entrar por um ouvido e sair pelo outro.
Isso vai formar um vazio, que será preenchido por palpiteiros inconseqüentes, que pregarão contra a OO, design patterns e o inglês e arrebatarão coraçãozinhos por adotarem uma aura de pragmáticos (levanta a mão quem não sabe do que estou falando).
Não me entendam mal, não estou soando as trombetas do apocalipse e sou fã da fundamentação e da boa literatura. Mas tudo tem limites, cada caso é um caso, teoria ainda é uma teoria, devem ser testadas na prática, por aí vai. (Uauu!! Isso é que bom uso de clichês...)
Aceitam uma sugestão? Em casos assim, penso que o ideal seria escrever artigos técnicos com o contexto e os pormenores, como a série sobre exceções do Luca e o artigo sobre DTO do shoes. Um já é referência no tema, o outro, aposto, vai virar.
A partir daí, as pessoas pensam e decidem com suas cabeças qual o melhor caminho.
Abraços!
|
T+ !
Rafael Fiume.
Sun Certified Programmer for the Java Platform, Standard Edition 6
Sun Certified Web Component Developer for the Java Platform, Enterprise Edition 5
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. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 07/06/2007 20:27:25
|
saoj
Forum Spammer
![[Avatar]](/images/avatar/2e7ceec8361275c4e31fee5fe422740b.jpg)
Membro desde: 09/03/2004 23:34:46
Mensagens: 2292
Localização: Los Angeles, EUA
Offline
|
Fabio Kung wrote:
RafaelRio wrote:mas não vi ganhos nem mesmo em grandes projetos
Rafael, o ganho seria justamente deixar a coisa mais OO.
Em vez de:
Você consegue fazer:
Se o fornecedor tiver uma referência para o RepositorioDeContas (ContasRepository).
É realmente, o segundo é bem melhor que o primeiro, e temo que eu esteja inclinado a fazer o primeiro. Mas isso não tem haver com a questão do repository x DAO. Seja com DAO dentro de forncedores ou com repository dentro de forncedores talvez a coisa deva ser sempre feita assim mesmo como o Fábio falou... É para pensar e brincar...
|
Participe dos meus novos blogs:
O Poder Primário - Você no controle da sua felicidade
Sedução Tecnológica - Tutoriais, dicas e histórias de um engenheiro
|
|
|
 |
|
|