DDD e Value Objects  XML
Índice dos Fóruns » Arquitetura de Sistemas
Autor Mensagem
mochuara
GUJ Master
[Avatar]
Membro desde: 20/05/2009 11:21:32
Mensagens: 1776
Offline

tnaires wrote:
mochuara wrote:Porque Repository so pode ser usado para recuperar agregados, e o root do agregado tem que ser uma entidade.

Então todo VO está necessariamente acoplado a um aggregate?

Acredito que meu ultimo post foi editado depois da sua resposta, o ultimo paragrafo acho que responde a sua pergunta certo?
tnaires
GUJ Master
[Avatar]

Membro desde: 22/12/2003 08:05:58
Mensagens: 1678
Localização: Porto Alegre/RS - Natal/RN
Offline

mochuara wrote:Na verdade se o domínio precisa obter uma lista de Estados que não pertence a nenhum agregado é sinal que vc precisa de um servico de domínio para retornar objetos Estado (com @Embedded) ou de uma entidade que contém essa lista (Pais por exemplo).

Recentemente construí um software em que eu não precisava de países, precisava apenas de estados. Eu poderia ter modelado os estados como um enum por exemplo, mas decidi manter uma tabela e ter um ponto de acesso global para acessá-los que simulava uma collection em memória - o repositório no caso. Isso porque havia várias páginas no sistema em que eu listava os estados em um combo box. Haveria uma forma melhor de fazer isso?

Tarso Nunes Aires

Blog - http://cabritin.wordpress.com/
Delicious - http://delicious.com/tnaires
Twitter - @tnaires

mochuara
GUJ Master
[Avatar]
Membro desde: 20/05/2009 11:21:32
Mensagens: 1776
Offline

tnaires wrote:
mochuara wrote:Na verdade se o domínio precisa obter uma lista de Estados que não pertence a nenhum agregado é sinal que vc precisa de um servico de domínio para retornar objetos Estado (com @Embedded) ou de uma entidade que contém essa lista (Pais por exemplo).

Recentemente construí um software em que eu não precisava de países, precisava apenas de estados. Eu poderia ter modelado os estados como um enum por exemplo, mas decidi manter uma tabela e ter um ponto de acesso global para acessá-los que simulava uma collection em memória - o repositório no caso. Isso porque havia várias páginas no sistema em que eu listava os estados em um combo box. Haveria uma forma melhor de fazer isso?


Era o que eu suspeitava...

Se estamos falando de um requisito exclusivamente de apresentação (popular comboboxes) o melhor a fazer é KISS o domínio, ou seja, fazer a aplicação acessar a informação diretamente, ignorando o domínio por completo (e portanto repositorios, services, entidades).

Lembre-se que o domínio deve modelar o negócio, e não suas aplicações. Na verdade o domínio não conhece nada sobre eventuais aplicação que irão fazer uso dele. Me parece que, se o Estado (VO) não pertence a nenhum agregado provavelmente é porque o domínio não precisa ser responsavel por uma lista de Estados, neste caso, muito menos de uma entidade artificial como Pais.

This message was edited 2 times. Last update was at 24/07/2009 13:09:09

spinow
Thread.start()
[Avatar]

Membro desde: 16/07/2009 20:00:33
Mensagens: 27
Offline

Gente, muito obrigado a todos, este tópico está sendo muito construtivo pra mim!
Seguinte, usando o hibernate tools e fazendo engenharia reversa, quando temos alguma tabela com chave composta, automaticamente a ferramenta gera duas classes, uma (ID) que acredito ser um VO. Exemplo:





Neste exemplo, ItemDePedido representa uma tabela m:n e ItemDePedidoId representa sua chave.
ItemDePedido é um VO (nítidamente), e ItemDePedido, é mesmo uma entidade, mesmo sabendo que seus valores (que no caso é sua chave) nunca se repetirão? E mochuara, então se não é @Embeddable, quer dizer que não é um VO?

Editado: Outra coisa, quando se trata de um VO, então se "olha" para os valores, desprezando sua chave, correto? Acontece que se eu instanciar um novo objeto, com os valores de um objeto que já exista (i.e. UF), e desprezar o valor da chave, este seria um novo objeto, acontecendo diversas replicações toda vez que eu precisar de um objeto desse... Tudo bem, daí vc pode pensar, mas se o Id do UF é a sigla, é só setar a sigla que eu já sei qual o valor do nome do estado, por exemplo. Mas então ainda assim este objeto é uma Entidade, pois a sigla funcionaria como um CPF.. ou não? Isso que eu não entendo...

valew!

This message was edited 3 times. Last update was at 24/07/2009 17:33:54


powered by
[WWW]
Bruno Laturner
GUJ Expert
[Avatar]

Membro desde: 18/02/2008 16:17:53
Mensagens: 3002
Offline

Ok, segunda parte sobre o que é um value object:

http://c2.com/cgi/wiki?ValueObject

Value objects são objetos usados para representar valores. Eles são tão simples quanto dos tipos de dados simples de uma linguagem, e normalmente tem algumas operações básicas associados a eles, como somas, comparação. Eles são para representar coisas como dinheiro, datas, até mesmo o String pode ser considerado um VO por ser tão básico e abstrair a implementação de array de caracter dentro dele.

Por isso que o conteúdo é mais importante que a referência dos objetos, aliás é a única coisa que sobra pois eles são só conteúdo. Também por este motivo eles são ótimos candidatos para serem imutáveis.

Com isso dito não acho que deva considerar esse item de pedido como um VO, nem entidade, ele não existe sem o pedido.

A resposta acima foi achada em menos de 5 minutos no google.
The prisoner falls in love with his chains. --E.W. Dijkstra
[WWW]
spinow
Thread.start()
[Avatar]

Membro desde: 16/07/2009 20:00:33
Mensagens: 27
Offline

ok, então esse ItemDePedido faz parte do aggregate onde o root é Pedido, e não é nem VO nem Entity? Eu pensava que em um modelo de domínio só teríamos esses dois tipos de objeto...

This message was edited 1 time. Last update was at 25/07/2009 11:17:32


powered by
[WWW]
spinow
Thread.start()
[Avatar]

Membro desde: 16/07/2009 20:00:33
Mensagens: 27
Offline

ok, vamos lá... pra ver se eu estou conseguindo entender:

Um objeto Menu, com os atributos id (por causa do BD), nome, descricao, imagem, url.

Tenho duas instâncias, com o mesmo nome, descrição, imagem e url. Digo que as duas instâncias representam o mesmo Menu, pois em meu contexto, não faz sentido dois menus apontando para o mesmo local...

Tenho então, neste caso, uma Entidade, certo? Pois a url garante que o Menu seja único.

Posso ter duas instâncias de um objeto, com TODOS os atributos iguais e essas instâncias estarem representando indivíduos distintos?
SIM = esse objeto é um Entity.
NÃO = trata-se de um VO.

Pode-se perguntar de outra maneira:
Posso ter dois objetos (ou mais) cadastrados no sistema (BD) com todos os atributos iguais?
SIM = Deverá ser um entity.
NÃO = Deverá ser um VO.

Certo ou errado?

This message was edited 2 times. Last update was at 25/07/2009 15:38:43


powered by
[WWW]
Bruno Laturner
GUJ Expert
[Avatar]

Membro desde: 18/02/2008 16:17:53
Mensagens: 3002
Offline

spinow wrote:ok, vamos lá... pra ver se eu estou conseguindo entender:

Um objeto Menu, com os atributos id (por causa do BD), nome, descricao, imagem, url.

Tenho duas instâncias, com o mesmo nome, descrição, imagem e url. Digo que as duas instâncias representam o mesmo Menu, pois em meu contexto, não faz sentido dois menus apontando para o mesmo local...

Tenho então, neste caso, uma Entidade, certo? Pois a url garante que o Menu seja único.


Não, o motivo pela qual ele é uma entidade é por que ele tem uma identidade, algo que o identifique e que o faça ser diferente de outros Menus. Por acaso essa url é a identidade dele.

Antes que diga que troquei seis por meia dúzia, digo que o conceito é importante.


Posso ter duas instâncias de um objeto, com TODOS os atributos iguais e essas instâncias estarem representando indivíduos distintos?
SIM = esse objeto é um Entity.
NÃO = trata-se de um VO.


A identidade de um objeto é a mesma do outro? Então eles são a mesma entidade.

O objetos não tem identidade? Então eles não são entidades.


Pode-se perguntar de outra maneira:
Posso ter dois objetos (ou mais) cadastrados no sistema (BD) com todos os atributos iguais?
SIM = Deverá ser um entity.
NÃO = Deverá ser um VO.


Se eles eles tiverem a mesma identidade, não pode.
Se eles não tiverem identidade, não importa qual você vai pegar. Pode, mas para quer ter dois se poder ter um?

A resposta acima foi achada em menos de 5 minutos no google.
The prisoner falls in love with his chains. --E.W. Dijkstra
[WWW]
mochuara
GUJ Master
[Avatar]
Membro desde: 20/05/2009 11:21:32
Mensagens: 1776
Offline

spinow wrote:
Posso ter duas instâncias de um objeto, com TODOS os atributos iguais e essas instâncias estarem representando indivíduos distintos?
SIM = esse objeto é um Entity.
NÃO = trata-se de um VO.


Numa Entidade o identificador é um dos atributos do objeto e que por si só representa sua singularidade no domínio, ou falando mais fácil, o identifica. Portanto duas instancias com mesmo atributo são considerada iguais. Value Objects também possuem identificador, que é o mesmo que o conjunto de seus atributos.

Portanto a resposta para sua pergunta é não para ambos entidade e value objects.

spinow wrote:
Pode-se perguntar de outra maneira:
Posso ter dois objetos (ou mais) cadastrados no sistema (BD) com todos os atributos iguais?
SIM = Deverá ser um entity.
NÃO = Deverá ser um VO.

Certo ou errado?


Se estamos falando de DDD, então não existe o BD e o domínio É o "sistema".
Juk
JavaChild
[Avatar]

Membro desde: 14/07/2006 18:09:33
Mensagens: 104
Offline

Uma dica importante pra implementar VOs é não se esquecer que os VOs devem possuir atributos (data) e quando aplicável comportamento (behavior). É comum vermos VOs anêmicos contendo apenas data, o que não é correto.

Meu blog: http://blogdojuk.blogspot.com
spinow
Thread.start()
[Avatar]

Membro desde: 16/07/2009 20:00:33
Mensagens: 27
Offline


Numa Entidade o identificador é um dos atributos do objeto e que por si só representa sua singularidade no domínio, ou falando mais fácil, o identifica. Portanto duas instancias com mesmo atributo são considerada iguais.


Ok, então não é o conjunto de TODOS os atributos, mas sim algum atributo em comum que o faz diferente dos outros (Entity)? E isso independe de como eu trate em questão de persistencia? Ou seja, mesmo que eu não anote o atributo url com um @Id, mas crie um campo id para tanto?

Posso definir que, se todos os atributos (juntos) de um objeto, formam sua singularidade, é VO. Se nenhum dos atributos o faz, necessitando então de um campo identificador, ou mesmo se um (ou mais) satisfaz essa singularidade, é Entity?

This message was edited 2 times. Last update was at 28/07/2009 21:49:53


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