VO-03 · Un value object est immuable et naît complet
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.