Domain na Camada de Apresentação (Preciosismo?)  XML
Índice dos Fóruns » Arquitetura de Sistemas
Autor Mensagem
Gustavo Serafim
Thread.start()
[Avatar]

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
[Email] [WWW]
Alessandro Lazarotti
Virtual Machine Man
[Avatar]

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/

[Email] [MSN]
sergiotaborda
Forum Spammer
[Avatar]

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
[WWW]
Gustavo Serafim
Thread.start()
[Avatar]

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
[Email] [WWW]
Alessandro Lazarotti
Virtual Machine Man
[Avatar]

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/

[Email] [MSN]
Gustavo Serafim
Thread.start()
[Avatar]

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
[Email] [WWW]
pcalcado
Moderador
[Avatar]

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
[Email] [WWW] [Yahoo!] [MSN]
Alessandro Lazarotti
Virtual Machine Man
[Avatar]

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/

[Email] [MSN]
Gustavo Serafim
Thread.start()
[Avatar]

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
[Email] [WWW]
Alessandro Lazarotti
Virtual Machine Man
[Avatar]

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/

[Email] [MSN]
Gustavo Serafim
Thread.start()
[Avatar]

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
[Email] [WWW]
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?
pcalcado
Moderador
[Avatar]

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
[Email] [WWW] [Yahoo!] [MSN]
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
pcalcado
Moderador
[Avatar]

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
[Email] [WWW] [Yahoo!] [MSN]
 
Índice dos Fóruns » Arquitetura de Sistemas
Ir para:   
Powered by JForum 2.1.8 © JForum Team