Do Value classes contain behaviour?
Evans, Design guidato dal dominio
An object that represents a descriptive aspect of the domain with no conceptual identity is called a VALUE OBJECT.... Treat the VALUE OBJECT as immutable. Don't give it any identity, and avoid the design complexities necessary to maintain entities.
Gli oggetti valore sono rappresentazioni di stato immutabile, utilizzando le ortografie tratte dalla lingua del tuo dominio.
Che in genere significa che supporteranno query che restituiscono altri oggetti Value, ma non supporteranno alcun comando e non avranno effetti collaterali.
Un altro modo di esprimere la stessa idea: sono un rimedio contro ossessione primitiva .
Sono un modo per isolare il modello di dominio dai dettagli del sottostante modello di dati .
Nella programmazione orientata agli oggetti, "comportamento" è normalmente associato a un cambiamento di stato. Quindi no, un oggetto Value non lo fa. In genere, invece di cambiare se stesso, ciò che farà il valore dell'oggetto è restituire un nuovo oggetto immutabile che descrive lo stesso stato.
Ad esempio, considera List.add (...)
Se List è una entità , la normale implementazione di add è quella di mutare la rappresentazione interna della lista (cioè la struttura dati nascosta dietro l'astrazione).
List theList = List.of(1,2,3)
assert theList.size() == 3
theList.add(4);
assert theList.size() == 4
Se List è un oggetto valore , la normale implementazione di add restituisce un nuovo oggetto List senza modificare l'originale.
List source = List.of(1,2,3)
assert source.size() == 3
List target = source.add(4)
assert target.size() == 4
assert source.size() == 3