40 votes

Objets de valeur dans DDD - Pourquoi immuables ?

Je ne comprends pas pourquoi les objets de valeur dans DDD devraient être immuables, et je ne vois pas non plus comment cela est facilement réalisable. (Je me concentre sur C# et Entity Framework, si cela a de l'importance).

Par exemple, considérons l'objet classique de valeur Adresse. Si vous deviez changer "123 Main St" en "123 Main Rue "Pourquoi devrais-je construire un tout nouvel objet au lieu de dire myCustomer.Address.AddressLine1 = "123 Main Street" ? (Même si Entity Framework supportait les structs, ce serait toujours un problème, n'est-ce pas ?)

Je comprends (je pense) l'idée que les objets de valeur n'ont pas d'identité et font partie d'un objet de domaine, mais quelqu'un peut-il expliquer pourquoi l'immuabilité est une bonne chose ?


EDIT : Ma dernière question ici devrait vraiment être "Quelqu'un peut-il expliquer pourquoi l'immuabilité est une bonne chose" ? appliquée aux objets de valeur ?" Désolé pour la confusion !


EDIT : Pour clarifier, je ne pose pas de question sur les types de valeur CLR (vs les types de référence). Je m'interroge sur le concept DDD de niveau supérieur des Value Objects.

Par exemple, voici un moyen détourné d'implémenter des types de valeurs immuables pour Entity Framework : http://rogeralsing.com/2009/05/21/entity-framework-4-immutable-value-objects . En gros, il rend tous les régleurs privés. Pourquoi se donner la peine de faire ça ?

0 votes

Les types de valeur et de référence sont généralement mélangés, comme le montre votre question initiale en parlant du type de valeur Adresse (struct) et du type de référence Valeur de la propriété String (class). Y a-t-il un avantage à restreindre votre question aux seuls types de valeur ? Pouvez-vous l'ouvrir sans diluer votre intention ?

0 votes

Je ne suis pas sûr de comprendre. Je ne parle pas des types de valeurs CLR (structs, ints, etc.) par rapport aux types de référence (classes, etc.). Je parle du concept DDD de Value Objects (par opposition aux Entity Objects).

0 votes

J'ai parcouru la question, j'ai vu C# et mon esprit a sauté les contextes. Merci pour la clarification.

0voto

dpant Points 104

Cette question a été posée il y a longtemps mais j'ai décidé d'y répondre par un exemple que je trouve direct et très simple à retenir. En outre, SO sert de référence à de nombreux développeurs et je pense que quiconque se heurte à cette question peut en tirer profit.

Parce qu'ils sont définis par leurs attributs, les objets de valeur sont traités comme immuables. .

L'argent est un bon exemple d'objet de valeur. Peu importe que vous ne puissiez pas distinguer les cinq mêmes billets de un dollar dans votre poche. Vous ne vous souciez pas de l'identité de la monnaie, mais uniquement de sa valeur et de ce qu'elle représente. Si quelqu'un échangeait un billet de cinq dollars contre celui que vous avez dans votre portefeuille, cela ne changerait rien au fait que vous avez toujours cinq dollars.

Ainsi, par exemple, en C#, vous définissez l'argent comme un objet de valeur immuable :

public class Money
{
    protected readonly decimal Value;

    public Money(decimal value)
    {
        Value = value;
    }

    public Money Add(Money money)
    {
        return new Money(Value + money.Value);
    }

    // ...

    // Equality (operators, Equals etc) overrides (here or in a Value Object Base class). 
    // For example:

    public override bool Equals(object obj)
    {
        return Equals(obj as Money);
    }

    public bool Equals(Money money)
    {
        if (money == null) return false;
        return money.Value == Value;
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X