it-swarm-fr.com

Valeur vs objets d'entité (conception axée sur le domaine)

Je viens de commencer à lire DDD. Je ne parviens pas à comprendre complètement le concept d'objets Entity vs Value. Quelqu'un peut-il expliquer les problèmes (maintenabilité, performances, etc.) qu'un système peut rencontrer lorsqu'un objet Value est conçu comme un objet Entity? L'exemple serait génial ...

79
StackUnderflow

Réduite à la distinction essentielle, l'identité importe pour les entités, mais pas pour les objets de valeur. Par exemple, le nom de quelqu'un est un objet de valeur. Une entité client peut être composée d'un nom de client (objet de valeur), List <Order> OrderHistory (liste d'entités) et éventuellement d'une adresse par défaut (généralement un objet de valeur). L'entité client aurait un identifiant et chaque commande aurait un identifiant, mais pas un nom. généralement, dans le modèle objet, l'identité d'une adresse n'a probablement pas d'importance.

Les objets de valeur peuvent généralement être représentés comme des objets immuables. La modification d'une propriété d'un objet de valeur détruit essentiellement l'ancien objet et en crée un nouveau, car l'identité et le contenu ne vous intéressent pas. De manière appropriée, la méthode d'instance Equals sur Name renverrait "true" tant que les propriétés de l'objet sont identiques à celles d'une autre instance.

Toutefois, la modification de certains attributs d'une entité telle que Client ne détruit pas le client. une entité client est généralement modifiable. L'identité reste la même (au moins une fois l'objet persistant).

Vous créez probablement des objets de valeur sans vous en rendre compte; chaque fois que vous représentez un aspect d'une entité en créant une classe fine, vous avez un objet de valeur. Par exemple, une classe IPAddress, qui comporte des contraintes sur les valeurs valides mais est composée de types de données plus simples, serait un objet de valeur. EmailAddress peut être une chaîne ou un objet de valeur avec son propre ensemble de comportements.

Il est fort possible que même les éléments qui ont une identité dans votre base de données n'aient pas d'identité dans votre modèle d'objet. Mais le cas le plus simple est composé de certains attributs qui ont un sens ensemble. Vous ne voulez probablement pas avoir Customer.FirstName, Customer.LastName, Customer.MiddleInitial et Customer.Title lorsque vous pouvez les composer ensemble en tant que Customer.Name; vous aurez probablement plusieurs champs dans votre base de données lorsque vous penserez à la persistance, mais votre modèle d’objet n’a aucune importance.

91
JasonTrue

Tout objet défini collectivement par tous ses attributs est un objet de valeur. Si l'un des attributs change, vous avez une nouvelle instance d'un objet de valeur. C'est pourquoi les objets de valeur sont définis comme immuables.

Si l'objet n'est pas entièrement défini par tous ses attributs, un sous-ensemble d'attributs constitue l'identité de l'objet. Les attributs restants peuvent changer sans redéfinir l'objet. Ce type d'objet ne peut pas être défini comme immuable.

Une manière plus simple de distinguer les objets de valeur consiste à considérer les objets de valeur comme des données statiques qui ne changeront jamais et les entités comme des données évoluant dans votre application.

30
Richard Dorman

Je ne sais pas si ce qui suit est correct, mais je dirais que dans le cas d'un objet Address, nous voulons l'utiliser comme objet de valeur plutôt que comme entité car les modifications apportées à l'entité seraient répercutées sur tous les objets liés ( une personne par exemple).

Prenons le cas suivant: vous vivez chez vous avec d'autres personnes. Si nous utilisions Entité pour Adresse, je dirais qu'il y aurait une adresse unique à laquelle tous les objets Personne sont liés. Si une personne déménage, vous souhaitez mettre à jour son adresse. Si vous souhaitez mettre à jour les propriétés de l'entité d'adresse, toutes les personnes auront une adresse différente. Dans le cas d'un objet de valeur, nous ne pourrions pas éditer l'adresse (car elle est immuable) et nous serions obligés de fournir une nouvelle adresse pour cette personne.

Est-ce que ça sonne bien? Je dois dire que j'étais aussi/je suis toujours aussi confus à propos de cette différence, après avoir lu le livre DDD.

Pour aller plus loin, comment cela serait-il modélisé dans la base de données? Auriez-vous toutes les propriétés de l'objet Address sous forme de colonnes dans la table Person ou créeriez-vous une table Address distincte qui aurait également un identifiant unique? Dans ce dernier cas, les personnes vivant dans la même maison auraient chacune une instance d'objet Address différente, mais ces objets seraient les mêmes, à l'exception de leur propriété ID.

6
Christophe Herreman

adresse peut être une entité ou un objet de valeur qui dépend du processus de l’entreprise. adresse peut être une entité dans une application de service de messagerie, mais adresse peut être un objet de valeur dans une autre application. dans les applications d'identité de messagerie pour l'objet adresse 

3
Dharmesh

J'ai demandé à ce sujet dans un autre fil et je pense que je suis toujours confus. Je peux confondre les considérations de performances avec la modélisation des données. Dans notre application de catalogage, un client ne change pas avant d'avoir besoin de le faire. Cela semble stupide - mais les "lectures" de données client dépassent de loin le nombre "d'écritures" et comme de nombreuses requêtes Web sollicitent toutes le "jeu actif" d'objets, je ne veux pas continuer à charger les clients encore et encore. Je me suis donc dirigé vers une voie immuable pour l'objet Client: chargez-le, mettez-le en cache et transmettez le même objet aux 99% de demandes (multithreads) qui souhaitent voir le Client. Ensuite, lorsqu'un client change quelque chose, demandez à un "éditeur" de créer un nouveau client et d'invalider l'ancien.

Mon problème est que si de nombreux threads voient le même objet client et qu'il est mutable, alors lorsqu'un thread commence à changer, il peut en découler d'autres.

Mes problèmes sont maintenant, 1) est-ce raisonnable, et 2) comment le faire sans dupliquer beaucoup de code sur les propriétés.

2
n8wrl

Types de valeur:  

  • Les types de valeur n'existent pas par lui-même, dépend des types d'entité.
  • L'objet Type de valeur appartient à un objet Type d'entité.
  • La durée de vie d'une instance de type valeur est limitée par la durée de vie de l'instance de l'entité propriétaire.
  • Trois types de valeur: base (types de données primitifs), composite (adresse) et collection (carte, liste, tableaux).

Entités:  

  • Les types d'entité peuvent exister par eux-mêmes (identité)
  • Une entité a son propre cycle de vie. Il peut exister indépendamment de toute autre entité.
  • Par exemple: Personne, Organisation, Collège, Mobile, Maison, etc. chaque objet a sa propre identité.
2
Premraj

3 distinction entre Entities et Value Objects 

  • Identifiant vs égalité structurelle: Les entités ont un identifiant, les entités sont identiques si elles ont le même Identifiant . Valeur Les objets situés au-delà de la main ont une égalité structurelle, nous considérons deux objets de valeur .__ égaux lorsque tous les champs sont les mêmes. Les objets de valeur ne peuvent pas avoir d'identificateur.

  • Mutabilité vs immuabilité: Les objets de valeur sont des structures de données immuables alors que les entités changent au cours de leur vie.

  • Durée de vie: les objets de valeur doivent appartenir à des entités

0
Ramin Farajpour