| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 29/05/2007 18:03:36
|
saoj
JWizard
![[Avatar]](/images/avatar/2e7ceec8361275c4e31fee5fe422740b.png)
Membro desde: 09/03/2004 23:34:46
Mensagens: 2572
Localização: Chicago, EUA
Offline
|
Acho que quando ele disse control, ele quiz dizer modelo de negócios.
Acredito que o certo é:
Requisição Web -> Action -> Modelo de Negócios -> DAO -> Implementação de DAO
Não vejo como ser diferente disso.
O que algumas pessoas fazem, o que não é recomendável, é:
Requisição Web -> Action -> DAO -> Implementação de DAO
E tem aqueles que vão fazer assim tb:
Requisição Web -> Action -> Banco de Dados
|
Sergio A Oliveira Jr. - saoj
ExperiMENTA:
Mentawai = http://www.mentaframwork.org - Full-stack Java Web Framework com Configuracão Programática
MentaLog = http://mentalog.soliveirajr.com - Non-intrusive, fast, garbage-less, colored and straightforward logging
MentaBean = http://mentabean.soliveirajr.com - Tiny ORM with SQL Builder
MentaRegex = http://mentaregex.soliveirajr.com - Perl-style regex for Java.
MentaContainer = http://mentacontainer.soliveirajr.com - Straightforward IoC, DI e Auto-Wiring
Space4J = http://www.space4j.org - Banco-de-dados de Objetos em Memória
Options-Lib = https://github.com/saoj/options-lib - Ruby classes para ter acesso as opcoes do Yahoo Finance
Selleto = http://www.selleto.com.br
Flipinion = http://www.flipinion.com
Kawai = http://www.kawaiwiki.org
|
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 29/05/2007 18:26:58
|
ffranceschi
JavaChild
![[Avatar]](/images/avatar/c80bfa00454a7564c07c0559808294fa.jpg)
Membro desde: 23/08/2006 11:07:21
Mensagens: 130
Offline
|
Com o JPA, qual seria a desvantagem de fazer o CRUD por exemplo numa camada de negocio?
|
Fernando Franceschi
Blog - http://ffranceschi.wordpress.com/
Twitter - http://twitter.com/ffranceschi1 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 29/05/2007 19:23:48
|
saoj
JWizard
![[Avatar]](/images/avatar/2e7ceec8361275c4e31fee5fe422740b.png)
Membro desde: 09/03/2004 23:34:46
Mensagens: 2572
Localização: Chicago, EUA
Offline
|
ffranceschi wrote:Com o JPA, qual seria a desvantagem de fazer o CRUD por exemplo numa camada de negocio?
Boa pergunta.
Respondo com outra.
E se amanhã vc precisar fazer uma query mais complexa, que exiga por exemplo pegar a connection e fazer um SQL mais sinistro? Vc vai fazer essa query dentro do seu modelo de negócios?
Já tive essa mesma dúvida no passado. A session do Hibernate/JPA pode ser considerada uma espécie de DAO, mas na verdade ela não é isso.
Melhor separar claramente a abstração do seu mecanismo de persistencia num DAO e não atrelar a sua opção de JPA, Hibernate, MentaBean ao seu modelo de negócios...
|
Sergio A Oliveira Jr. - saoj
ExperiMENTA:
Mentawai = http://www.mentaframwork.org - Full-stack Java Web Framework com Configuracão Programática
MentaLog = http://mentalog.soliveirajr.com - Non-intrusive, fast, garbage-less, colored and straightforward logging
MentaBean = http://mentabean.soliveirajr.com - Tiny ORM with SQL Builder
MentaRegex = http://mentaregex.soliveirajr.com - Perl-style regex for Java.
MentaContainer = http://mentacontainer.soliveirajr.com - Straightforward IoC, DI e Auto-Wiring
Space4J = http://www.space4j.org - Banco-de-dados de Objetos em Memória
Options-Lib = https://github.com/saoj/options-lib - Ruby classes para ter acesso as opcoes do Yahoo Finance
Selleto = http://www.selleto.com.br
Flipinion = http://www.flipinion.com
Kawai = http://www.kawaiwiki.org
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 29/05/2007 19:43:28
|
marcelo_mococa
Virtual Machine Man
![[Avatar]](/images/avatar/90248d0a98105fa534cf2b0696ddd12f.jpg)
Membro desde: 03/03/2005 10:03:32
Mensagens: 622
Localização: São Paulo
Offline
|
SadNess wrote:
o que eu não entendi aqui é:
o objeto de negócios não possui nenhuma regra de negócios então?
toda a regra de negócio está em uma classe de controle?
exatamente...
|
Marcelo Madeira - TCS
SCJP 1.5
SCWCD 1.4
blog
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 29/05/2007 20:29:16
|
ffranceschi
JavaChild
![[Avatar]](/images/avatar/c80bfa00454a7564c07c0559808294fa.jpg)
Membro desde: 23/08/2006 11:07:21
Mensagens: 130
Offline
|
saoj wrote:
E se amanhã vc precisar fazer uma query mais complexa, que exiga por exemplo pegar a connection e fazer um SQL mais sinistro? Vc vai fazer essa query dentro do seu modelo de negócios?
Melhor separar claramente a abstração do seu mecanismo de persistencia num DAO e não atrelar a sua opção de JPA, Hibernate, MentaBean ao seu modelo de negócios...
Concordo que para query complexas ficaria bem confuso(e dificil de fazer) isso no seu modelo de dominio (parece que com Ibatis vc ate consegue fazer umas querys mais complexas, mas nao conheco pra falar, talvez alguem que conheca poderia opiniar), mas se for pensar num modelo bem simples onde apenas há um CRUD, valeria a pena ter no sua classe (Cliente por exemplo) os metodos insert, delete, update, select apenas delegando para uma classe DAO?
Modelos complexo acho que é interessante separar as camadas, mas modelos simples creio que nao, o que acha?
|
Fernando Franceschi
Blog - http://ffranceschi.wordpress.com/
Twitter - http://twitter.com/ffranceschi1 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 29/05/2007 20:49:48
|
pcalcado
Moderador
![[Avatar]](/images/avatar/110eec23201d80e40d0c4a48954e2ff5.jpg)
Membro desde: 08/03/2004 17:19:35
Mensagens: 5174
Localização: Sydney - Australia
Offline
|
Objetos de negócio que sabem o que significam DAOs quebram o princípio da inversão de dependências. DAO é algo concreto, ligado com a infra estrutura e não deve ser relacionado diretametne por um objetod e negócio.
Neste caso, use o padrão Repository. Note que um Repository pdoe ser apenas uma interface implementada por um DAO mas o importante é que um Repository é um conceito de negócios, um DAO não, por isso não liguem seus objetos de negócio aos DAOs.
|
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) 29/05/2007 20:58:19
|
saoj
JWizard
![[Avatar]](/images/avatar/2e7ceec8361275c4e31fee5fe422740b.png)
Membro desde: 09/03/2004 23:34:46
Mensagens: 2572
Localização: Chicago, EUA
Offline
|
DAO é uma coisa abstrata, não concreta. É uma interface que não é atrelada a nenhuma infra-estrutura.
Se eu tenho uma interface userDAO, ela pode ter qualquer tipo de implementação, inclusive TestUserDAO, DummyUserDAO, etc.
Se vc fala para o modelo de negócios não acessar o DAO, então ele acessaria o que? Acessar esse repositório, só estaríamos passando o problema do DAO para o repositório, não?
Ex do seu modelo de negócios:
Se o meu modelo de negócios não acessar o DAO acima ele vai acessar o que? Me interessei pelo que vc falou, mas estou com medo estarmos criando uma camada extra a troco de nada, o que seria um anti-pattern...
Um DAO não poderia ser considerado como um repositório de objetos e operações relacionadas a camada de persistencia? Vale a pena abstrair o DAO em mais uma camada chamada repositório?
De repente vale, não sei... O repositório é que se encarregaria de saber qual DAO usar e o Modelo usaria sempre o mesmo repositório... Não sei, ainda acho que uma interface userDAO tem exatamente essa função, ou seja, o modelo de negócios utiliza uma interface e essa interface que vai se virar para saber que implementação ela vai usar...
|
Sergio A Oliveira Jr. - saoj
ExperiMENTA:
Mentawai = http://www.mentaframwork.org - Full-stack Java Web Framework com Configuracão Programática
MentaLog = http://mentalog.soliveirajr.com - Non-intrusive, fast, garbage-less, colored and straightforward logging
MentaBean = http://mentabean.soliveirajr.com - Tiny ORM with SQL Builder
MentaRegex = http://mentaregex.soliveirajr.com - Perl-style regex for Java.
MentaContainer = http://mentacontainer.soliveirajr.com - Straightforward IoC, DI e Auto-Wiring
Space4J = http://www.space4j.org - Banco-de-dados de Objetos em Memória
Options-Lib = https://github.com/saoj/options-lib - Ruby classes para ter acesso as opcoes do Yahoo Finance
Selleto = http://www.selleto.com.br
Flipinion = http://www.flipinion.com
Kawai = http://www.kawaiwiki.org
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 04/06/2007 18:02:31
|
robertwgil
Debugger
Membro desde: 16/09/2006 11:16:01
Mensagens: 69
Offline
|
Eu acho q o saoj esta correto, imagina o tanto de classe que precisaria ser
criada pra fazer um simples crud..
poxa, jah temos uma interface UserDao, que abstrai o dao, entao criar mais
uma camada acho desnecessario minha opinião é
web -> action > model -> interface dao -> dao concreto -> banco
oque entendi estao querendo abstrair do model para o interface
web -> action > model -> repositorio > interface dao -> dao concreto -> banco
não vi finalidade apenas...
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 04/06/2007 18:42:38
|
Rodrigo Carvalho Auler
Virtual Machine Man
Membro desde: 14/02/2003 15:59:17
Mensagens: 576
Localização: Rio de Janeiro
Offline
|
É uma questão de conceito. Se você tem uma interface dao para cada entidade do sistema (UserDao, ClienteDao, NotaFiscaDao) que não deixa pistas que tem um banco de dados embaixo dela e seus daos só fazem insert, update, delete e buscas (buscas previstas pela regra de negócio), vc na prática está trabalhando com repositórios. O que não é legal é passar a sessão do hibernate ou um dao genérico pro objeto de negócio.
Se você vai dar o nome de UserDao, UserStore ou UserRepository pra interface é só um detalhe.
[]'s
Rodrigo Auler
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 04/06/2007 19:02:20
|
robertwgil
Debugger
Membro desde: 16/09/2006 11:16:01
Mensagens: 69
Offline
|
Exatamente, é ai que entra IoC (Inversion Of Control) para
injetar dentro do modelo o Dao.
ai sim o IoC funciona como um repositorio +- , porque ele que vai dizer qual
implementação de DAO que vc vai utilizar.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 04/06/2007 19:09:20
|
cv
Moderador
![[Avatar]](/images/avatar/210f760a89db30aa72ca258a3483cc7f.jpg)
Membro desde: 04/04/2003 00:32:12
Mensagens: 7839
Localização: São Paulo, SP
Offline
|
Antes que essa thread fique parecendo uma cacofonia em hospicio:
DAO: implementacao concreta do Repository. Nao deve ser usada por classes do dominio.
Repository: definicao da interace com o repositorio de dados (nao necessariamente uma interface, mas no maximo uma classe abstrata). Pode ser usada por classes do dominio, preferencialmente via injecao de dependencias.
Espero que fique mais facil se comunicar
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 04/06/2007 20:05:05
|
robertwgil
Debugger
Membro desde: 16/09/2006 11:16:01
Mensagens: 69
Offline
|
cv , agora não entendi mais nada, não consigo enchergar
isso na prática, e a verdadeira finalidade.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 04/06/2007 20:26:00
|
rflprp
GUJ Ranger
Membro desde: 27/04/2005 18:52:49
Mensagens: 822
Offline
|
A distribuição de classes seria mais ou menos isso ?
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 04/06/2007 21:42:52
|
cv
Moderador
![[Avatar]](/images/avatar/210f760a89db30aa72ca258a3483cc7f.jpg)
Membro desde: 04/04/2003 00:32:12
Mensagens: 7839
Localização: São Paulo, SP
Offline
|
Sim, so que sem essa putaria de ClientBO, ClientVO e ClientBOImpl.
Leia: http://en.wikipedia.org/wiki/Test-driven_development
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 04/06/2007 23:59:13
|
pcalcado
Moderador
![[Avatar]](/images/avatar/110eec23201d80e40d0c4a48954e2ff5.jpg)
Membro desde: 08/03/2004 17:19:35
Mensagens: 5174
Localização: Sydney - Australia
Offline
|
saoj wrote:DAO é uma coisa abstrata, não concreta. É uma interface que não é atrelada a nenhuma infra-estrutura.
Não, Sérgio. DAO é algo que mapeia uma coisa apra outra, é um DataMapper. Ao pedir seus objetos para um DataMapper você está automaticamente sabendo que seus objetos na verdade estão em outro lugar.
Seja este lugar Oracle, hibernate, MySQL, XML ou Lucene isso é algo que não tem a ver com sua Camada de negócios. A Camada de Negócios modela negócios, ponto final, e existem poucos ramos onde o cliente lida com coisas como persistência.
saoj wrote:
Se vc fala para o modelo de negócios não acessar o DAO, então ele acessaria o que? Acessar esse repositório, só estaríamos passando o problema do DAO para o repositório, não?
Não, Repositório é um conceito de negócios, é basicamente uma lsita com métodos mais interessantes.
saoj wrote:
Se o meu modelo de negócios não acessar o DAO acima ele vai acessar o que? Me interessei pelo que vc falou, mas estou com medo estarmos criando uma camada extra a troco de nada, o que seria um anti-pattern...
Você não está criando Camada alguma, você já criou (e está no título deste tópico): a camada de negócios. Repositório==negócios, DAO=persistência.
DAO abstrai apenas a lógica de persistência, não o fato de haver uma persistência, que deve ser abstraído da classe de negócios.
E
http://fragmental.com.br/wiki/index.php?title=Evitando_VOs_e_BOs
Não use VO/BO, use objetos
|
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 |
|
|
 |
|
|