it-swarm-pt.tech

Objetos Value vs Entity (Domain Driven Design)

Acabei de começar a ler o DDD. Não consigo entender completamente o conceito de objetos Entidade versus Valor. Alguém pode explicar os problemas (manutenção, desempenho, etc.) que um sistema pode enfrentar quando um objeto Value é projetado como um objeto Entity? Exemplo seria ótimo ...

79
StackUnderflow

Reduzida à distinção essencial, a identidade é importante para entidades, mas não importa para objetos de valor. Por exemplo, o nome de alguém é um objeto de valor. Uma entidade de cliente pode ser composta de um nome de cliente (objeto de valor), lista <Order> OrderHistory (lista de entidades) e talvez um endereço padrão (normalmente um objeto de valor). A Entidade do Cliente teria um ID e cada pedido teria um ID, mas um Nome não deveria; Geralmente, dentro do modelo de objeto, a identidade de um endereço provavelmente não importa.

Objetos de valor geralmente podem ser representados como objetos imutáveis; alterar uma propriedade de um objeto de valor essencialmente destrói o objeto antigo e cria um novo, porque você não está tão preocupado com a identidade quanto com o conteúdo. Corretamente, o método da instância Equals em Name retornará "true", desde que as propriedades do objeto sejam idênticas às propriedades de outra instância.

No entanto, alterar algum atributo de uma entidade como o cliente não destrói o cliente; uma entidade de cliente é normalmente mutável. A identidade permanece a mesma (pelo menos uma vez que o objeto foi persistido).

Você provavelmente cria objetos de valor sem perceber; sempre que você estiver representando algum aspecto de uma entidade criando uma classe refinada, você terá um objeto de valor. Por exemplo, uma classe IPAddress, que possui algumas restrições em valores válidos, mas é composta por tipos de dados mais simples, seria um objeto de valor. Um EmailAddress pode ser uma string, ou pode ser um objeto de valor com seu próprio conjunto de comportamentos.

É bem possível que até mesmo itens que possuem uma identidade em seu banco de dados não tenham uma identidade em seu modelo de objeto. Mas o caso mais simples é um composto de alguns atributos que fazem sentido juntos. Você provavelmente não quer ter Customer.FirstName, Customer.LastName, Customer.MiddleInitial e Customer.Title quando você pode compor os juntos como Customer.Name; Eles provavelmente serão múltiplos campos em seu banco de dados quando você pensar em persistência, mas seu modelo de objeto não se importa.

91
JasonTrue

Qualquer objeto definido coletivamente por todos os atributos é um objeto de valor. Se algum dos atributos mudar, você terá uma nova instância de um objeto de valor. É por isso que os objetos de valor são definidos como imutáveis.

Se o objeto não estiver totalmente definido por todos os seus atributos, haverá um subconjunto de atributos que formam a identidade do objeto. Os atributos restantes podem mudar sem redefinir o objeto. Esse tipo de objeto não pode ser definido como imutável.

Uma maneira mais simples de fazer a distinção é pensar em objetos de valor como dados estáticos que nunca serão alterados e entidades como dados que evoluem em sua aplicação.

30
Richard Dorman

Eu não sei se o seguinte está correto, mas eu diria que, no caso de um objeto de endereço, queremos usá-lo como um objeto de valor em vez de uma entidade porque as alterações para a entidade seriam refletidas em todos os objetos vinculados ( uma pessoa por exemplo).

Tome este caso: Você está morando em sua casa com algumas outras pessoas. Se usássemos Entity for Address, eu diria que haveria um endereço exclusivo ao qual todos os objetos Person se vinculam. Se uma pessoa sair, você quer atualizar o endereço dele. Se você atualizasse as propriedades da Entidade de Endereço, todas as pessoas teriam um endereço diferente. No caso de um objeto de valor, não poderíamos editar o endereço (já que é imutável) e seríamos forçados a fornecer um novo endereço para essa pessoa.

Isso soa certo? Devo dizer que eu também ainda estou confuso sobre essa diferença, depois de ler o livro DDD.

Indo um passo adiante, como isso seria modelado no banco de dados? Você teria todas as propriedades do objeto Address como colunas na tabela Person ou criaria uma tabela Address separada que também teria um identificador exclusivo? No último caso, as pessoas que moram na mesma casa teriam cada uma uma instância diferente de um objeto Address, mas esses objetos seriam os mesmos, exceto por sua propriedade de ID.

6
Christophe Herreman

endereço pode ser entidade ou objeto de valor que depende do processo de negócio. O objeto de endereço pode ser entidade no aplicativo de serviço de correio, mas o endereço pode ser objeto de valor em algum outro aplicativo. em questões de identidade de aplicação de correio para objeto de endereço 

3
Dharmesh

Eu perguntei sobre isso em outro tópico e acho que ainda estou confuso. Eu posso estar confundindo considerações de desempenho com modelagem de dados. Em nosso aplicativo de catalogação, um cliente não muda até que seja necessário. Isso soa idiota - mas as "leituras" dos dados do cliente superam em muito as "gravações" e, como muitas solicitações da Web estão atingindo o "conjunto ativo" de objetos, não quero continuar carregando o tempo dos clientes novamente. Então, eu estava indo por uma estrada imutável para o objeto Customer - carregá-lo, armazená-lo em cache e servir o mesmo para as solicitações de 99% (multi-threaded) que querem ver o cliente. Então, quando um cliente muda alguma coisa, peça a um "editor" para criar um novo cliente e invalidar o antigo.

Minha preocupação é que, se muitos segmentos verem o mesmo objeto de cliente e ele for mutável, então, quando um thread começar a mudar, o caos ocorrerá nos outros.

Meus problemas agora são, 1) isso é razoável, e 2) a melhor forma de fazer isso sem duplicar muito código sobre as propriedades.

2
n8wrl

Tipos de valor:  

  • Tipos de valor não existem por si só, depende dos tipos de entidade.
  • O objeto Value Type pertence a um objeto de tipo de entidade.
  • A vida útil de uma instância de tipo de valor é limitada pela vida útil da instância da entidade proprietária.
  • Três tipos de valor: Basic (tipos de dados primitivos), Composite (Address) e Collection (Map, List, Arrays)

Entidades:  

  • Tipos de entidades podem existir por conta própria (identidade)
  • Uma entidade tem seu próprio ciclo de vida. Pode existir independentemente de qualquer outra entidade.
  • Por exemplo: Pessoa, Organização, Colégio, Celular, Casa etc. todo objeto tem sua própria identidade
2
Premraj

3 distinção entre Entities e Value Objects 

  • Identificador vs igualdade estrutural: Entidades têm identificador, entidades são as mesmas se tiverem o mesmo identificador . Valor Objetos além da mão têm igualdade estrutural, consideramos dois objetos de valor iguais quando todos os campos são iguais. Objetos de valor não podem Ter identificador.

  • Mutabilidade vs imutabilidade: Objetos de valor são estruturas de dados imutáveis, enquanto entidades mudam durante Seu tempo de vida.

  • Tempo de vida: objetos de valor devem pertencer a entidades

0
Ramin Farajpour