| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 02/05/2008 12:43:41
|
Gustavo Serafim
Thread.start()
![[Avatar]](/images/avatar/975ae6d3ce8ae6e0711821a97a9f5fae.jpg)
Membro desde: 04/09/2006 15:33:40
Mensagens: 49
Offline
|
emerleite wrote:Já discuti isso (e muito) com o Gustavo pessoalmente nesta semana, então não vou me repetir textualmente.
O ponto que eu acho que a maioria defende é o fato de não fazer BDUF e a filosofia de YAGNI. Não faz muito sentido fazer implementações na base da suposição, como por exemplo: Vou interfaciar usando DTOs, pois estou prevendo acesso remoto.
Mas sempre concordamos, o simples é melhor.
This message was edited 1 time. Last update was at 02/05/2008 12:49:52
|
Gustavo S. Sinis
|
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 02/05/2008 13:07:34
|
Alessandro Lazarotti
Virtual Machine Man
![[Avatar]](/images/avatar/2aaaddf27344ee54058548dc081c6541.jpg)
Membro desde: 21/01/2004 14:12:54
Mensagens: 610
Offline
|
Gustavo Serafim wrote:
sergiotaborda wrote:
Por outro lado, o desenho do exemplo de funcionário não contém métodos que alteram o estado do sistema, logo, não ha nenhum perigo em invocar esses métodos de qualquer outra camada.
Alterar um atributo de instância de um objeto de negócio não é alterar o estado do sistema? Se você esta falando de base, esses objetos podem ser gerenciados por um mapeamento objeto relacional como, por exemplo, o Hibernate.
É discutível.
1)Gostando ou não de getters and setters, eles mantém o encapsulamento na camada de domínio. Você não mudou o estado em outra camada, você sugeriu para o setter(que esta no domínio) assim o fazer ... Dependendo da implementação deste útlimo, ele altera o estado do objeto (de forma persistível ou não).
2)Mesmo se assim não fosse (suponhamos que o atributo fosse público), o objeto de negócio poderia ter seu estado de forma transitória, já que a classificação de alterado poderia ser somente quando este atinge o status de 'pronto', através de alguma implementação de sustentação deste estado (persistindo ou serializando por exemplo). Nestes casos, alterar um atributo pode não significar mudar seu estado, já q ele não esta 'pronto' (se alguém solicitar pelo seu identificador, atraves de um repositório este mesmo objeto, ele estaria com outro estado, diferente que o seu).
O ponto 2 que coloquei é verdade dependendo de implementacoes de cache e proxies utilizadas no sistema.
This message was edited 1 time. Last update was at 02/05/2008 13:13:30
|
... Lezinho
------------------------
twitter: @lazarotti
http://alessandrolazarotti.wordpress.com/
http://jbossbrasil.ning.com/
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 02/05/2008 13:15:16
|
sergiotaborda
Forum Spammer
![[Avatar]](/images/avatar/b4a0e0fbaa9f16d8947c49f4e610b549.png)
Membro desde: 22/03/2005 20:57:48
Mensagens: 3165
Offline
|
Gustavo Serafim wrote:
sergiotaborda wrote:
Por outro lado, o desenho do exemplo de funcionário não contém métodos que alteram o estado do sistema, logo, não ha nenhum perigo em invocar esses métodos de qualquer outra camada.
Alterar um atributo de instância de um objeto de negócio não é alterar o estado do sistema?
Não. É apenas alterar o estado do objeto.
O estado do sistema é o conjunto de todos os objetos consistentes e válidos. Mesmo que invocar o set não dê erro, ainda têm que ser tomadas outras providencias para que esse objeto passe a integrar o estado do sistema. Normalmente alterações de estado do sistema são feitas dentro de transações. Invocar set() não tem que ser feito numa transação.
|
Criando sua própria API de Validação
Blog do MiddleHeaven |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 02/05/2008 13:59:15
|
Gustavo Serafim
Thread.start()
![[Avatar]](/images/avatar/975ae6d3ce8ae6e0711821a97a9f5fae.jpg)
Membro desde: 04/09/2006 15:33:40
Mensagens: 49
Offline
|
Lezinho wrote:
Gustavo Serafim wrote:
sergiotaborda wrote:
Por outro lado, o desenho do exemplo de funcionário não contém métodos que alteram o estado do sistema, logo, não ha nenhum perigo em invocar esses métodos de qualquer outra camada.
Alterar um atributo de instância de um objeto de negócio não é alterar o estado do sistema? Se você esta falando de base, esses objetos podem ser gerenciados por um mapeamento objeto relacional como, por exemplo, o Hibernate.
É discutível.
1)Gostando ou não de getters and setters, eles mantém o encapsulamento na camada de domínio. Você não mudou o estado em outra camada, você sugeriu para o setter(que esta no domínio) assim o fazer ... Dependendo da implementação deste útlimo, ele altera o estado do objeto (de forma persistível ou não).
2)Mesmo se assim não fosse (suponhamos que o atributo fosse público), o objeto de negócio poderia ter seu estado de forma transitória, já que a classificação de alterado poderia ser somente quando este atinge o status de 'pronto', através de alguma implementação de sustentação deste estado (persistindo ou serializando por exemplo). Nestes casos, alterar um atributo pode não significar mudar seu estado, já q ele não esta 'pronto' (se alguém solicitar pelo seu identificador, atraves de um repositório este mesmo objeto, ele estaria com outro estado, diferente que o seu).
O ponto 2 que coloquei é verdade dependendo de implementacoes de cache e proxies utilizadas no sistema.
Acredito que pode ser discutível, depende da abstração.
No caso usei um prefixo set.., mas estou representando um método de negócio.
|
Gustavo S. Sinis
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 02/05/2008 15:07:56
|
Alessandro Lazarotti
Virtual Machine Man
![[Avatar]](/images/avatar/2aaaddf27344ee54058548dc081c6541.jpg)
Membro desde: 21/01/2004 14:12:54
Mensagens: 610
Offline
|
Gustavo wrote: No caso usei um prefixo set.., mas estou representando um método de negócio.
Então melhor ainda. Quem tem o método de negócio, como você mesmo descreveu, é o método "set" é ele que pode (mas não necessariamente faz) a alteração de estado. O execute do Command é um delegador para o domínio (entre outras atividades), mas não tem regra quanto a ele.
|
... Lezinho
------------------------
twitter: @lazarotti
http://alessandrolazarotti.wordpress.com/
http://jbossbrasil.ning.com/
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 02/05/2008 19:08:49
|
Gustavo Serafim
Thread.start()
![[Avatar]](/images/avatar/975ae6d3ce8ae6e0711821a97a9f5fae.jpg)
Membro desde: 04/09/2006 15:33:40
Mensagens: 49
Offline
|
Lezinho wrote:
Gustavo wrote: No caso usei um prefixo set.., mas estou representando um método de negócio.
Então melhor ainda. Quem tem o método de negócio, como você mesmo descreveu, é o método "set" é ele que pode (mas não necessariamente faz) a alteração de estado. O execute do Command é um delegador para o domínio (entre outras atividades), mas não tem regra quanto a ele.
Não vejo problema nessa abordagem, mas não tive ainda oportunidade de trabalhar em um sistema tão simples, que não justifica um "Service Layer"
Fowler wrote: A camada de serviço encapsula a lógica de negócio da aplicação, controlando as transações e coordenando as respostas na implementação das suas operações.
Então, neste caso, fica estranho um método transacional de negócio sendo executado fora da API da aplicação. Não chamaria o método setSalario na apresentação. Por isso eu comentei:
Gustavo Serafim wrote: Na verdade, esse exemplo é muito simples e não vai justificar uma abordagem mais complexa como decomposição em camadas. (LayeringPrinciples) Abordagens como Business layer, CBD e Manter o estado dos objetos consistentes se destinam, na maioria das vezes, a supera limitações humanas, como lidar com grande quantidade de informações ou complexas (regras de negócio complexas ).
This message was edited 1 time. Last update was at 02/05/2008 19:11:48
|
Gustavo S. Sinis
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 02/05/2008 21:36:44
|
pcalcado
Moderador
![[Avatar]](/images/avatar/110eec23201d80e40d0c4a48954e2ff5.jpg)
Membro desde: 08/03/2004 17:19:35
Mensagens: 5169
Localização: Sydney - Australia
Offline
|
Gustavo Serafim wrote:
pcalcado wrote: O que se ganha nisso?
Phillip, qual parte? "Proteger a implementação" ajuda diminuir o acoplamento. "Manter objetos sempre em estado consistente" ajuda muito quando temos muitas regras complexas. Quando temos muitas trocas de mensagens para cumprir uma regra complexa, podemos inserir erros de lógica de negocio mais facilmente quando os objetos ficam inconsistentes em algum momento.
Eu perguntei o que se ganha com objetos burros comparados à simplesmente ter interfaces.
Gustavo Serafim wrote:
Se você diz que manter uma hierarquia de interfaces e fabricas não é mais trabalhoso, então eu acredito.
Tanto interfaces quanto objetos "burros" protegem a implementação de um componente de negócio, então acredito que as duas abordagem são úteis para componentes de negócio.
São úteis e possuem aplicação, mas interfaces não vão representar uma hierarquia paralela nem requerer código de mapeamento. Se você for pagar o preço de ter que mudar UsuarioDTO e CoisaQueTransformaUsuarioEmUsuarioDTO toda vez que Usuario mudar é bom ter uma razão para isso ou é simplesmente desperdício.
|
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) 03/05/2008 08:44:46
|
Alessandro Lazarotti
Virtual Machine Man
![[Avatar]](/images/avatar/2aaaddf27344ee54058548dc081c6541.jpg)
Membro desde: 21/01/2004 14:12:54
Mensagens: 610
Offline
|
Lezinho wrote:Invocação não significa implementação do domínio... o código continuara na camada adjacente. O que obviamente não seria interessante é o domínio conhecer algo da application, o que não é o caso.
PS: Não estou entrando no mérito de façades pq acho que não é o ponto.
O ponto onde você atacou era duplicar os objetos Gustavo, e não criar uma façade de serviço, por isso minha observação acima.
Utilizar ServiceLayer ou não, não diz coisa alguma quanto a isso.
[outro-assunto-que-vc-tocou]Além de tudo,existem muitas outras formas de se fazer controle transacional do que utilizar Service Layer, se você ja utilizou controle transacional otimista + Open Session In View, sabe do que estou falando. [/outro-assunto-que-vc-tocou]
|
... Lezinho
------------------------
twitter: @lazarotti
http://alessandrolazarotti.wordpress.com/
http://jbossbrasil.ning.com/
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 03/05/2008 16:20:56
|
Gustavo Serafim
Thread.start()
![[Avatar]](/images/avatar/975ae6d3ce8ae6e0711821a97a9f5fae.jpg)
Membro desde: 04/09/2006 15:33:40
Mensagens: 49
Offline
|
Lezinho wrote: O ponto onde você atacou era duplicar os objetos Gustavo, e não criar uma façade de serviço, por isso minha observação acima.
Comentamos varias coisas, mas tem duas questões principais: 1 - Melhor forma de proteger a implementação de um componente de negócio - para controlar o acoplamento - que acaba influenciando como/se objeto de negócio vai parar na camada de apresentação. (soluções discutidas: interfaces para objetos de negócio ou objetos burros). 2 - Operações de negócio devem ser chamadas apenas atrás de uma API "Service Layer", considerando uma aplicação complexa ou CBD.
This message was edited 3 times. Last update was at 03/05/2008 16:25:34
|
Gustavo S. Sinis
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 03/05/2008 23:39:13
|
Alessandro Lazarotti
Virtual Machine Man
![[Avatar]](/images/avatar/2aaaddf27344ee54058548dc081c6541.jpg)
Membro desde: 21/01/2004 14:12:54
Mensagens: 610
Offline
|
Desculpe, mas o que tenho postado até aqui não tem nada haver com ServiceLayer, tem haver com sua solução na duplicação de objetos como solução para não vazer "regras". Se vc discutia outra coisa, que só ficou clara no ultimo post, não era comigo.
|
... Lezinho
------------------------
twitter: @lazarotti
http://alessandrolazarotti.wordpress.com/
http://jbossbrasil.ning.com/
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 04/05/2008 09:44:23
|
Gustavo Serafim
Thread.start()
![[Avatar]](/images/avatar/975ae6d3ce8ae6e0711821a97a9f5fae.jpg)
Membro desde: 04/09/2006 15:33:40
Mensagens: 49
Offline
|
Lezinho wrote:Desculpe, mas o que tenho postado até aqui não tem nada haver com ServiceLayer, tem haver com sua solução na duplicação de objetos como solução para não vazer "regras". Se vc discutia outra coisa, que só ficou clara no ultimo post, não era comigo.
Estávamos no mesmo assunto, duplicação de objetos (objetos burros) como solução para não vazar "regras", mas em contextos diferentes. Na próxima vez vou especificar melhor, desculpa.
This message was edited 1 time. Last update was at 04/05/2008 09:45:50
|
Gustavo S. Sinis
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 05/05/2008 07:49:18
|
rob1980a
HelloWorld
Membro desde: 25/06/2007 23:52:18
Mensagens: 20
Localização: BH
Offline
|
alguma solucao pratica para o problema? Mapear com interfaces quando necessario? Como mapearia o meu MB?
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 05/05/2008 07:53:47
|
pcalcado
Moderador
![[Avatar]](/images/avatar/110eec23201d80e40d0c4a48954e2ff5.jpg)
Membro desde: 08/03/2004 17:19:35
Mensagens: 5169
Localização: Sydney - Australia
Offline
|
rob1980a wrote:alguma solucao pratica para o problema? Mapear com interfaces quando necessario? Como mapearia o meu MB?
Acho que não entendi esse comentário.
As soluções apresentadas neste tópico são bem práticas. Receita de bolo não existe, você ode procurar as referências dadas aqui e descobrir o que é melhor no seu caso.
|
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) 05/05/2008 09:09:11
|
rob1980a
HelloWorld
Membro desde: 25/06/2007 23:52:18
Mensagens: 20
Localização: BH
Offline
|
mas ainda terá duplicidades dos campos no mapeamento no MB
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 05/05/2008 09:14:32
|
pcalcado
Moderador
![[Avatar]](/images/avatar/110eec23201d80e40d0c4a48954e2ff5.jpg)
Membro desde: 08/03/2004 17:19:35
Mensagens: 5169
Localização: Sydney - Australia
Offline
|
O que tera (qual estrategia) e por quê?
|
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 |
|
|
 |
|
|