| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/06/2006 12:36:53
|
pcalcado
Moderador
![[Avatar]](/images/avatar/110eec23201d80e40d0c4a48954e2ff5.jpg)
Membro desde: 08/03/2004 17:19:35
Mensagens: 5174
Localização: Sydney - Australia
Offline
|
Num esquema de Camadas empilhadas a Camada de cime depende da interface da Camada de baixo, isso faz com que objetos que façam parte da interface da Camada de Baixo (como objetos de negócio quem entrem e saiam) possam ser utilizados.
Quanto à TOs, por que simplesmente não utilizar os objetos de domínio ao invés de copiar dados entre objetos, manter hierarquias paralelas, criar objetos de dados sem comportamento e todos os outros problemas de TOs?
Se você não quer que a Camada de cima tenha acesso à métodos específicos faça-a manipular uma interface. Exemplo:
Se eu não quero que minha Camada de Apresentação consiga chamar o método depositar (que é um método que muda o estado do Objeto e só deve ser chamado de outras Camadas) basta criar uma interface:
Fazer C/C implementá-la e a Camada de Apresentação lidar apenas com ela. Sem repetiçãod e dados, sem objetos burros.
Note que mesmo esta solução é um tanto drástica demais, eu mesmo nunca vi real necessidade em meus projetos.
|
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) 12/06/2006 13:13:33
|
rodrigoallemand
GUJ Ranger
![[Avatar]](/images/avatar/d7b431b1a0cc5f032399870ff4710743.jpg)
Membro desde: 21/02/2005 20:19:47
Mensagens: 972
Localização: Rio de Janeiro, Recreio!!!
Offline
|
O que eu quiz dizer foi:
Em uma consulta, por exemplo:
- Meu Controller recebe uma interface Service a partir de uma fabrica
- Meu Controller chama um método e recebe um objeto de dominio (DTO, que tb é utilizado para espelhar a minha tabela, por exemplo, no hibernate).
Em um caso de criação:
- Meu controler recebe os campso do formulário e cria um DTO populado com tais valores.
- Meu Controller recebe uma interface Service a partir de uma fabrica
- Meu Controller chama um método e passa o objeto de dominio (DTO, que tb é utilizado para espelhar a minha tabela, por exemplo, no hibernate).
O que vc acha disso?
|
Rodrigo Allemand
A culpa é minha e eu a coloco em quem eu quizer!. (Homer Simpson)
http://blog.rodrigoallemand.com.br |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/06/2006 13:27:37
|
Rafael Nunes
Moderador
![[Avatar]](/images/avatar/d072677d210ac4c03ba046120f0802ec.png)
Membro desde: 09/10/2003 13:41:06
Mensagens: 2890
Localização: sao bernardo do campo
Offline
|
Ainda achei a criação de uma interface melhor do que ter VO´s espalhados pela aplicação.
Mas por exemplo se você não cria esta interface e deixa a camada de apresentação conhecer os objetos de domínio, o que impede de a camada de apresentação fazer uma chamada para um método que não deveria?
|
------------------------------------------------------------------
"Think different? I'd be happy if most people would just think..."
http://www.yaw.com.br
http://twitter.com/rafanunes
http://twitter.com/youandwe
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/06/2006 14:25:48
|
rodrigoy
GUJ Ranger
![[Avatar]](/images/avatar/cf79ae6addba60ad018347359bd144d2.jpg)
Membro desde: 18/04/2006 01:06:28
Mensagens: 758
Localização: São Paulo
Offline
|
Não vejo problemas (até agora não ví) da camada de aplicação ou apresentação conhecer e usar entidades do Domain. É exatamente esse sentimento que gera muitas coisas desnecessárias no projeto (TOS, DTOS) e tendem a levar ao código procedural (já sofri bastante com essas más definições arquiteturais, meu projeto atual está bem procedural e o refactoring disso vai levar mais de um ano, exatamente por essa tentativa dos arquitetos anteriores de isolar o negócio de tudo, pra quê?).
Se existir uma necessidade da interface que o Philip falou, será mais por questões de arquitetura do que por necessidade de negócio. Por exemplo, se um pedido pode ser faturado [pedido.faturar()], não seria a camada que ele se encontra que limitaria a chamada do método. O que limitaria seriam as regras de negócio do próprio pedido.
|
Rodrigo Yoshima
www.ASPERCOM.com.br
Próximas Turmas:
São Paulo: Scrum 28/agosto | OOAD-UML 13/setembro
Débito Técnico Blog: blog.aspercom.com.br
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/06/2006 14:27:57
|
rodrigoallemand
GUJ Ranger
![[Avatar]](/images/avatar/d7b431b1a0cc5f032399870ff4710743.jpg)
Membro desde: 21/02/2005 20:19:47
Mensagens: 972
Localização: Rio de Janeiro, Recreio!!!
Offline
|
Isso se aplica quando está executando rotinas que não tem objetos de retorno...
Neste mesmo exemplo, como vc colocaria o retorno da interface para o método getDetalhesCliente(idCliente)?
|
Rodrigo Allemand
A culpa é minha e eu a coloco em quem eu quizer!. (Homer Simpson)
http://blog.rodrigoallemand.com.br |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/06/2006 14:33:23
|
Fabricio Cozer Martins
GUJ Ranger
![[Avatar]](/images/avatar/2ecd2bd94734e5dd392d8678bc64cdab.jpg)
Membro desde: 08/05/2004 10:22:03
Mensagens: 935
Localização: Salvador/Brasil
Offline
|
Rafael Nunes wrote:Ainda achei a criação de uma interface melhor do que ter VO´s espalhados pela aplicação.
Mas por exemplo se você não cria esta interface e deixa a camada de apresentação conhecer os objetos de domínio, o que impede de a camada de apresentação fazer uma chamada para um método que não deveria?
Esse ponto que eu ia colocar, nessa forma você vai ter uma interface a mais, porém não vai impedir que haja quebra de encapsulação. E se a proposta for reduzir a complexidade, diminuir uma classe VO e adicionar outra interface, daria no mesmo, não ?
|
Fabrício Cozer Martins
Analista de Sistemas
Bacharel em Ciência da Computação da UFBa
Sun Certified Programmer for Java 2 Platform 1.4
Sun Certified Web Component Developer for J2EE 1.4 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/06/2006 15:22:35
|
Rafael Nunes
Moderador
![[Avatar]](/images/avatar/d072677d210ac4c03ba046120f0802ec.png)
Membro desde: 09/10/2003 13:41:06
Mensagens: 2890
Localização: sao bernardo do campo
Offline
|
Uma sugestão, seria colocar as classes que compõe a camada de aplicação, no mesmo pacote das classes de domínio. Assim, os métodos que a view poderia acessar marcaria-os como públicos, e os que seriam acessíveis somente pela camada de aplicação marcaria-os como acesso default ou protected.
|
------------------------------------------------------------------
"Think different? I'd be happy if most people would just think..."
http://www.yaw.com.br
http://twitter.com/rafanunes
http://twitter.com/youandwe
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/06/2006 17:52:04
|
pcalcado
Moderador
![[Avatar]](/images/avatar/110eec23201d80e40d0c4a48954e2ff5.jpg)
Membro desde: 08/03/2004 17:19:35
Mensagens: 5174
Localização: Sydney - Australia
Offline
|
rodrigoallemand wrote:
- Meu Controller chama um método e recebe um objeto de dominio (DTO,
DTOs não são objetos de domínio, são objetos usados apenas apra transmitir dados entre Camadas Físicas, não tem nada a ver com o Domínio da Aplicação.
rodrigoallemand wrote:
que tb é utilizado para espelhar a minha tabela, por exemplo, no hibernate).
Você não precisa (e nem deveria) usar DTOs com Hibernate. Isso é uma herança de Entity Beans que não faz o menor sentido quando se usa uma ferramenta de ORM para POJOs.
http://www.hibernate.org/hib_docs/online/javapolis2003_presentation/hibernate_javapolis2003.pdf
Rafael Nunes wrote:
Mas por exemplo se você não cria esta interface e deixa a camada de apresentação conhecer os objetos de domínio, o que impede de a camada de apresentação fazer uma chamada para um método que não deveria?
Eu nunca vi necessidade disso mas se você precisa se precaver basta criar a interface.
rodrigoy wrote:
Se existir uma necessidade da interface que o Philip falou, será mais por questões de arquitetura do que por necessidade de negócio.
Eu diria que esta interface em específico seria mais relacionado com a estrutura de desenvolvimento. Imagino que um projeto onde times diferentes desenvolvemas Camadas você queira se rpecaver da outra equipe trapacear nos métodos, mas como disse nunca vi acontecer com tanta importância.
rodrigoallemand wrote:
Neste mesmo exemplo, como vc colocaria o retorno da interface para o método getDetalhesCliente(idCliente)?
Ué, faria um método na interface que retorna um objeto.. não entendi sua dúvida.
Fabrício Cozer Martins wrote:
Esse ponto que eu ia colocar, nessa forma você vai ter uma interface a mais, porém não vai impedir que haja quebra de encapsulação. E se a proposta for reduzir a complexidade, diminuir uma classe VO e adicionar outra interface, daria no mesmo, não ?
Por isso que eu falei que não é comum utilizar esta técnica e as diferenças mais básicas são que você não rpecisa manter duas hierarquias de lasses nem ficar copiando dados para objetos de transferência.
Rafael Nunes wrote:Uma sugestão, seria colocar as classes que compõe a camada de aplicação, no mesmo pacote das classes de domínio. Assim, os métodos que a view poderia acessar marcaria-os como públicos, e os que seriam acessíveis somente pela camada de aplicação marcaria-os como acesso default ou protected.
Acho que isso limitaria demais a escolha de hierarquia de pacotes, mais do que estou disposto, mas é uma saída...
|
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) 14/06/2006 10:51:39
|
rodrigoy
GUJ Ranger
![[Avatar]](/images/avatar/cf79ae6addba60ad018347359bd144d2.jpg)
Membro desde: 18/04/2006 01:06:28
Mensagens: 758
Localização: São Paulo
Offline
|
Phillip, vamos trocar mais experiências aí.
No seu artigo você comentou a respeito de Domain Model vs Transaction Scripts, algo do tipo "nem todo sistema exige a complexidade de um domain model... blá blá blá...".
Bom, atualmente com mecanismos ORM um mapeamento fica mais simples. Isto é, é mais fácil atualmente ter uma estrutura OO persistente e convenhamos 90% dos projetos são aplicações de banco de dados. Se você tem o seu banco espelhado em objetos, potencialmente, já seria um Domain Model. Desse modo, não seria sempre mais fácil ter um Domain Model do que trabalhar com TranScripts?
Digo isso porque não acredito que é a complexidade que vai ditar o uso ou não de um domain model. Acho que para aplicações de banco de dados o Domain Model vai sempre existir, com doses maiores ou menores de TranScripts dependendo do caso.
Abraços!
|
Rodrigo Yoshima
www.ASPERCOM.com.br
Próximas Turmas:
São Paulo: Scrum 28/agosto | OOAD-UML 13/setembro
Débito Técnico Blog: blog.aspercom.com.br
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 14/06/2006 11:00:21
|
Rafael Nunes
Moderador
![[Avatar]](/images/avatar/d072677d210ac4c03ba046120f0802ec.png)
Membro desde: 09/10/2003 13:41:06
Mensagens: 2890
Localização: sao bernardo do campo
Offline
|
rodrigoy wrote:Se você tem o seu banco espelhado em objetos, potencialmente, já seria um Domain Model.
Acredito que não, pois o Domain Model seria formado também por classes de negócios, que realizam processamento de use-cases e que não são obrigatoriamente espelhadas em tabelas.
|
------------------------------------------------------------------
"Think different? I'd be happy if most people would just think..."
http://www.yaw.com.br
http://twitter.com/rafanunes
http://twitter.com/youandwe
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 20/06/2006 10:49:00
|
rodrigoy
GUJ Ranger
![[Avatar]](/images/avatar/cf79ae6addba60ad018347359bd144d2.jpg)
Membro desde: 18/04/2006 01:06:28
Mensagens: 758
Localização: São Paulo
Offline
|
Rafael Nunes wrote:
rodrigoy wrote:Se você tem o seu banco espelhado em objetos, potencialmente, já seria um Domain Model.
Acredito que não, pois o Domain Model seria formado também por classes de negócios, que realizam processamento de use-cases e que não são obrigatoriamente espelhadas em tabelas.
Isso não responde a minha pergunta. Que situação você teria Entities e Transaction Scripts que não justificam um Domain Model?
|
Rodrigo Yoshima
www.ASPERCOM.com.br
Próximas Turmas:
São Paulo: Scrum 28/agosto | OOAD-UML 13/setembro
Débito Técnico Blog: blog.aspercom.com.br
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 20/06/2006 11:34:08
|
louds
Moderador
![[Avatar]](/images/avatar/1e48c4420b7073bc11916c6c1de226bb.jpg)
Membro desde: 29/04/2003 23:09:15
Mensagens: 4061
Localização: São Paulo
Offline
|
rodrigoy wrote:
Isso não responde a minha pergunta. Que situação você teria Entities e Transaction Scripts que não justificam um Domain Model?
Transaction Scripts e Entities são uteis quando você não tem uma aplicação rica em comportamento, com predominancia de crud por exemplo, e a maioria dos casos de uso são apenas manipulação do banco de dados sem muita lógica de negocio (sumariza todos registros X, insere na tabela Y e atualiza na Z).
|
http://www.kumpera.net/blog/
http://www.mono-project.com/
"Each individual should work for himself. People will not sacrifice themselves for the company. They come to work at the company to enjoy themselves."
Soichiro Honda |
|
|
 |
|
|