Uno dei concetti apparentemente più semplici del libro di Evans è quello di value object. Riporto fedelmente la sua definizione per non incorrere in errori e/o omissioni:
Ogni value object porta (o almeno dovrebbe) con se alcune peculiarità che lo caratterizzano come il fatto di essere immutable, “sharabile” tra varie entity e non avere alcun concetto di identità. Queste caratteristiche si traducono in esplicite richieste implementative che vanno assolutamente soddisfatte:
- ogni value object viene creato inizializzandone i suoi attributi e per tutto il suo life-cycle non deve avere la possibilità di modificare il suo stato interno
- per mia scelta personale, se possibile, evito di esporre lo stato interno di un value object. Se sono costretto a farlo (sotto tortura 🙂 ) lo faccio comunque solo in lettura
- se si vuole cambiare lo stato interno di un value object se ne crea uno nuovo
- non avendo intrinsecamente un concetto di identità deve ridefinire il modo in cui è possibile valutarne l’uguaglianza con un altro value object dello stesso tipo
Individuare correttamente i value object che decorano il nostro dominio non è un’attività semplice e soprattutto è un’attività spesso trascurata/tralasciata. Solo dopo un’attenta (l’ennesima) rilettura di alcune parti del libro di Evans ho colto l’importanza che viene data a questo particolare aspetto del nostro dominio.
Con poche accortezze, il nostro anemico object model acquisisce sostanza e ogni componente del puzzle si incastra perfettamente al suo posto.