Consegui evitar os VOs e BOs ?  XML
Índice dos Fóruns » Arquitetura de Sistemas
Autor Mensagem
ronildobraga
JavaEvangelist

Membro desde: 29/03/2006 10:06:51
Mensagens: 443
Localização: sao paulo - sp
Offline

Ola, no começo da semana eu postei um topico com duvidas de como evitar VOs BOs, apos muita discussao eu nao tinha entendido mas depois de ler tudo novamente e inclusive os outros posts que falam sobre o mesmo assunto eu cheguei a seguinte conclusao e gostaria de saber se isto esta correto.


Observacoes:
A classe repositorio poderia ser uma interface, e vc poderia obter uma instancia dessa forma para abstrair aonde vc grava as informacoes

Mas eu acho que isso nao vem ao caso, o que importa é que uma Pessoa tem que possuir um repositorio e a Pessoa deve ser responsavel pela acoes de persistir um objeto do tipo pessoa ! correto ?
Portando a logica de negocio fica no proprio VO.

Se vc esta lendo esse post pela primeira vez, sugiro que leia primeiro os seguintes artigos
http://fragmental.com.br/wiki/index.php?title=Evitando_VOs_e_BOs
http://fragmental.com.br/wiki/index.php?title=MVC_e_Camadas
http://blog.caelum.com.br/2007/06/09/repository-seu-modelo-mais-orientado-a-objeto/
http://guj.com.br/posts/list/105/60916.java

Ronildo da Rocha Braga Jr.
Programador, nada mais.

blog: http://www.iprogramming.blogspot.com/
[Email] [WWW] [MSN]
felipec
Debugger

Membro desde: 05/04/2007 20:42:19
Mensagens: 67
Offline

Está correto..

Mas questão é mais quando uma logica de negocio de Pessoa for executada.. exemplo

Antigamente você teria



e sem BO e VO, você usa:



Já que agora, pessoa possui estado e comportamentos..

Quando você quiser exibir Pessoa num JSP, você manda o objeto e não um VO dele porque simplesmente não há necessiade de um VO, então veja que nesse caso ele seria inutil.

Só não chame Pessoa de VO.. Pessoa é um objeto de domínio.. VO/DTO tem oturo significado

obs: é importante valorizar as nomeclaturas...

loogica: http://www.loogica.net/wordpress
oyama
Virtual Machine Man

Membro desde: 19/04/2005 10:11:09
Mensagens: 572
Offline

Só acho que o seu exemplo não foi muito feliz...

pessoa.save() não é uma "logica de negócio". Salvar um dado em um banco de dados no fundo não é um problema do negócio, mas quase um "requisito não funcional" do seu sistema. Na minha opinião não seria errado delegar o "salvar" para outra classe (fora do domínio do negócio).

Se fosse tipo pessoa.definirIdade(20), e isto no fundo salva o dado, para mim ai estaria mais correto.
ronildobraga
JavaEvangelist

Membro desde: 29/03/2006 10:06:51
Mensagens: 443
Localização: sao paulo - sp
Offline

oyama wrote:Só acho que o seu exemplo não foi muito feliz...

pessoa.save() não é uma "logica de negócio". Salvar um dado em um banco de dados no fundo não é um problema do negócio, mas quase um "requisito não funcional" do seu sistema. Na minha opinião não seria errado delegar o "salvar" para outra classe (fora do domínio do negócio).

Se fosse tipo pessoa.definirIdade(20), e isto no fundo salva o dado, para mim ai estaria mais correto.

É por isso que o infeliz do Phillip Calçado nao citou exemplos, pois é dificil retrar a situação atraves de um exemplo.
Porem por mais que o exemplo seja ruim , eu espero que parte do conceito tenha sido entendido

Agora eu nao entendi o que vc quis dizer em relação a delegar o "salvar" para outra classe (fora do domínio do negócio).
Aonde por exemplo e porque ?

Obs.: Espero que ele nao fique ofendido com o infeliz rsrs

Ronildo da Rocha Braga Jr.
Programador, nada mais.

blog: http://www.iprogramming.blogspot.com/
[Email] [WWW] [MSN]
Rafael Nunes
Moderador
[Avatar]

Membro desde: 09/10/2003 13:41:06
Mensagens: 2890
Localização: sao bernardo do campo
Offline

A abordagem que eu costumo usar, você preserva de certa forma a idéia de um Active Record mas sem acoplar o objeto de domínio com a tecnologia de persistência.


------------------------------------------------------------------
"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
[Email]
Leozin
JWizard
[Avatar]

Membro desde: 18/06/2005 21:01:26
Mensagens: 2310
Localização: São Paulo/SP
Offline

mas utilizando ActiveRecord não transformaria o sistema em uma sopa de camadas? A idéia parece legal, uma entidade "completa" que trabalha "sozinha"?

Bom, pelo menos o DAO a gente elimina com esse pattern. Mas e quanto a BOs/TOs? No blog da fragmental não achei/entendi (ainda) como eliminar isso

http://www.leozin.com.br/blog
[ICQ]
cv
Moderador
[Avatar]

Membro desde: 04/04/2003 00:32:12
Mensagens: 7842
Localização: São Paulo, SP
Offline

O que vc quer dizer com "sopa de camadas"?
[Email] [WWW] [Yahoo!] [MSN] [ICQ]
ronildobraga
JavaEvangelist

Membro desde: 29/03/2006 10:06:51
Mensagens: 443
Localização: sao paulo - sp
Offline

Leozin wrote:
Bom, pelo menos o DAO a gente elimina com esse pattern. Mas e quanto a BOs/TOs? No blog da fragmental não achei/entendi (ainda) como eliminar isso

Na verdade nao eliminamos nada, A unica coisa que foi feita é definir um objeto de dominio que estava fragmentado no classico BO, TO, DAO.

Agora o objeto de dominio ressurgi como uma entidade que difine os atributos de uma pessoa e ainda contem as funcoes para demonstrar como funciona um Pessoa.

Note que o repository pode ser algo qualquer, um DAO ou seja o que for, eu na verdade so mudei o nome das classes quando me referi ao repositorio, pois antes nos tinhamos:

Esse codigo era definido no PessoaBO, e ela era responsavel por executar as rotinas do repositorio, agora nos definimos isso na propria classe Pessoa, porem as interfaces recebem a nomenclatura de Repository, pois as interfaces de fato sao o repositorio, mas nos nao queremos saber que tipo de repositorio é usado, e para isso nos usamos uma fabrica para resolver o tipo de repositorio usado.

O titulo pode soar meio estranho quando o artigo dizia que deveriamos evitar o uso de VO e BO, isso me deu a impressao que eles iriam sumir do sistema, porem como vc viu nos ainda continuamos a usar o VO o BO, porem nos usamos de uma forma mais organizada e respeitando as regras do DDD.


Rafael Nunes wrote:A abordagem que eu costumo usar, você preserva de certa forma a idéia de um Active Record mas sem acoplar o objeto de domínio com a tecnologia de persistência.

Eu nao entendi muito bem, estou vendo o artigo que vc indicou, vc pode passar mais alguns detalhes

Ronildo da Rocha Braga Jr.
Programador, nada mais.

blog: http://www.iprogramming.blogspot.com/
[Email] [WWW] [MSN]
felipec
Debugger

Membro desde: 05/04/2007 20:42:19
Mensagens: 67
Offline

ronildobraga wrote:
O titulo pode soar meio estranho quando o artigo dizia que deveriamos evitar o uso de VO e BO, isso me deu a impressao que eles iriam sumir do sistema, porem como vc viu nos ainda continuamos a usar o VO o BO, porem nos usamos de uma forma mais organizada e respeitando as regras do DDD.


1 colocação..

Nós não estamos usando mais VO nem BO. Estamos usando um objeto de domínio para cumprir o papel do VO e do BO.


loogica: http://www.loogica.net/wordpress
Leozin
JWizard
[Avatar]

Membro desde: 18/06/2005 21:01:26
Mensagens: 2310
Localização: São Paulo/SP
Offline

cv wrote:O que vc quer dizer com "sopa de camadas"?


O ActiveRecord "parece" não trabalhar com POJOs, ou seja, a tua entidade faz tudo, o que me referi a sopa de camadas era a respeito de você juntar uma entidade do sistema + DAO, tal como mostrado no exemplo

http://www.leozin.com.br/blog
[ICQ]
ronildobraga
JavaEvangelist

Membro desde: 29/03/2006 10:06:51
Mensagens: 443
Localização: sao paulo - sp
Offline

felipec wrote:
Nós não estamos usando mais VO nem BO. Estamos usando um objeto de domínio para cumprir o papel do VO e do BO.

Entendi, obrigado por corrigir.
Eu so me pergunto como ficaria isso mapeado no hibernate, eu teria um Pessoa.hbm.xml referenciando o objeto de dominio e nao mais a um VO ?

Ronildo da Rocha Braga Jr.
Programador, nada mais.

blog: http://www.iprogramming.blogspot.com/
[Email] [WWW] [MSN]
sergiotaborda
GUJ Expert
[Avatar]

Membro desde: 22/03/2005 20:57:48
Mensagens: 3433
Offline



ronildobraga wrote:(...) cheguei a seguinte conclusao e gostaria de saber se isto esta correto.


Sim. Mas pode fazer melhor.
1) Vc tem pessoa referenciando repositorio só para que pessoa delegue para ele. Não precisa. Use apenas o repositório



2) O repositório não precisa depender do banco



Seria




E dentro do método vc decide. Pode usar um properties ou outra coisa para decidir. Isto elimina mais uma dependencia.
Por outro lado vc só precisa de uma instancia de Repositor. O factory deve controlar o numero de instanciações e para simplificar torne os métodos de Repository estáticos e genericos.

Vc pode ainda separar o acesso ao banco com DAO se quiser.

E ficaria assim.





Criando sua própria API de Validação



Blog do MiddleHeaven
[WWW]
Rafael Nunes
Moderador
[Avatar]

Membro desde: 09/10/2003 13:41:06
Mensagens: 2890
Localização: sao bernardo do campo
Offline

ronildobraga wrote:Eu nao entendi muito bem, estou vendo o artigo que vc indicou, vc pode passar mais alguns detalhes


Na verdade no link só tem um breve resumo deste padrão, no livro do Fowler tem uma explicação maior.
Mas em suma, Active Record seria além das propriedades e lógica de negócio, inserir nos objetos de domínio também a lógica de acesso a dados. No próprio livro Fowler diz que active record é uma boa solução para sistemas que não tenham uma lógica de negócio muito complexa, tipo CRUDs, e sugere que para domínios com relacionamentos mais complexos, seja utilizado alguma forma de Data Mapper, como DAO por exemplo.
O exemplo que eu dei utiliza as duas estratégias, porém ao invés de o objeto de domínio conter a lógica de acesso a dados, ele delega essa responsabilidade para um Data Mapper.

------------------------------------------------------------------
"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
[Email]
ronildobraga
JavaEvangelist

Membro desde: 29/03/2006 10:06:51
Mensagens: 443
Localização: sao paulo - sp
Offline

sergiotaborda wrote:
1) Vc tem pessoa referenciando repositorio só para que pessoa delegue para ele. Não precisa. Use apenas o repositório

2)O repositório não precisa depender do banco

3)O factory deve controlar o numero de instanciações e para simplificar torne os métodos de Repository estáticos e genericos.


1)Eu entendo que o objeto de dominio seja a Pessoa, se colocarmos a funcao salvar dentro do repositio e a funcao salvar necessitar de logica, a logica ficaria fora do dominio, a nao ser que o objeto de dominio seja composto por Pessoa + Repositorio, e por isso eu usei composição pois uma pessoa contem um repositorio.

2)Perfeito, realmente tava pessimo aquela dependencia

3)Tornar os metodos do repositorio estatico e generico, nao entendi como fazer, pode ser mais claro.


Rafael Nunes wrote:
Mas em suma, Active Record seria além das propriedades e lógica de negócio, inserir nos objetos de domínio também a lógica de acesso a dados.

Eu nao achei pratica essa solução, e se eu mudar a logica de acesso a dados, por exemplo: Hoje eu uso hibernate mas amanha eu gostaria de usar JDBC, seguindo o Active Record eu teria de configurar novamente todos os objetos de dominio, nao achei muito inteligente nao

Ronildo da Rocha Braga Jr.
Programador, nada mais.

blog: http://www.iprogramming.blogspot.com/
[Email] [WWW] [MSN]
Fabio Kung
JavaEvangelist

Membro desde: 08/03/2004 08:24:47
Mensagens: 445
Localização: São Paulo
Offline

Pessoal, não vamos misturar duas discussões né?

Domain Model x BO + DTO é uma coisa.
ActiveRecord (pessoa.save()) x DataMapper (dao.save(pessoa) / repositorio.store(pessoa)) é outra!

Procurando por oportunidades de emprego?
OndeTrabalhar.com
OndeTrabalhar.com Java?


http://blog.caelum.com.br


Fabio Kung
[WWW] [MSN] [ICQ]
 
Índice dos Fóruns » Arquitetura de Sistemas
Ir para:   
Powered by JForum 2.1.8 © JForum Team