Aller au contenu
Filtrer les règles par style d’implémentation
Style
Tactique
Sévérité
majeure
S’applique à
  • Modèle (domain)

VO-03 · Un value object est immuable et naît complet ​

Style
Tactique
Sévérité
majeure
S’applique à
  • Modèle (domain)

Signal ​

  • Un value object avec des setters publics, des champs non readonly, ou une méthode qui change son état après la construction.
  • Un value object rempli morceau par morceau après sa création.
  • Un value object qui porte une entity pour la modifier à travers la valeur.

Pourquoi ​

Un value object ne change jamais après sa création. Son constructeur reçoit tout ce dont son état dépend et le pose d’un coup. Seul le constructeur affecte les attributs, par des setters privés qui vérifient leurs préconditions.

Un value object peut référencer une entity pour être plus expressif, jamais pour la modifier. Quand l’entity change, la valeur change avec elle, et l’immuabilité est perdue.

Exceptions ​

Si l’objet doit changer, c’est une entity (ENT-01).

Correction ​

Un constructeur privé, une factory method statique qui vérifie les préconditions, des champs readonly.

Adaptation ​

En TypeScript, readonly n’est vérifié qu’à la compilation, et il est superficiel. Un tableau ou un objet imbriqué reste modifiable, sauf s’il est lui aussi immuable (ReadonlyArray, copies, value objects imbriqués).

Voir aussi ​

ENT-15 détaille les préconditions, avec l’exemple de HolderName.