Entità vs Oggetti Valore: Le Differenze Chiave Che Devi Conoscere!

Ti sei mai chiesto quale sia la differenza tra entità e oggetti valore? E perché questa distinzione è così importante nel domain-driven design (DDD)? Scopriamolo insieme nei prossimi cinque minuti!
Se preferisci vedere un video, trovi lo stesso contenuto anche sul mio canale YouTube.
Definizioni
Entità e oggetti valore rappresentano concetti tangibili e intangibili all'interno di un'applicazione. In linguaggi come Java o C#, sono semplicemente classi con attributi e logica. Ma qual è la differenza?
Entità
Le entità hanno un'identità unica definita da identificatori. Ciò significa due istanze della stessa entità sono ben distinte, anche se hanno gli stessi attributi. Troviamo lo stesso concetto nel mondo reale. Due persone con lo stesso nome e cognome non sono la stessa persona, sono semplicemente omonimi. Un identificatore, come il numero della carta d’identità, le distingue.
Le entità sono anche mutabili. Il loro stato può cambiare, mentre la loro identità rimane costante. Ad esempio, il prezzo di un prodotto può essere aggiornato più volte, mentre il suo codice prodotto rimane costante
Oggetti Valore
Gli oggetti valore sono definiti esclusivamente dai loro attributi e non hanno identificatori. Due oggetti valore con gli stessi attributi sono considerati uguali e, concettualmente, sono la stessa cosa. Ad esempio, il colore bianco è definito dai suoi valori rosso, verde e blu, tutti uguali a 255. Non importa quanti oggetti di questo tipo esistano, rappresentano tutti lo stesso colore.
Gli oggetti valore sono immutabili. Una volta creati, il loro stato non può essere modificato. Questa immutabilità garantisce che l'uguaglianza tra due istanze non cambi mai. Se due oggetti sono uguali, lo saranno per sempre. Questa caratteristica previene modificazioni accidentali che potrebbero causare bug o incoerenze nel sistema.
Come utilizzarli
Ricapitolando, le entità hanno un'identità e sono mutabili, mentre gli oggetti valore hanno solo attributi e sono immutabili.
Questa è la differenza teorica. Ma in pratica, perché facciamo questa distinzione?
Il motivo per cui distinguiamo entità e oggetti valore è per rendere il nostro modello di dominio più espressivo, semplice e sicuro.
Le entità sono più difficili da implementare e gestire. Dobbiamo definirle, identificarle, e permettere la modifica dei lori attributi, sempre in linea con i requisiti imposti dal business o dal cliente.
Gli oggetti valore, d'altra parte, sono più facili da gestire. Senza un'identità da mantenere, la loro immutabilità garantisce il rispetto delle logica di business. Una volta creati, il loro stato non può essere modificato, il che li rende sicuri per il multithreading. Un altro vantaggio è ci forzano a creare funzioni senza effetti collaterali, dove invece di modificare un’istanza ne creiamo una copia nuova con le modifiche richieste. Questo rende il codice più prevedibile, affidabile e facile da testare.
Per questo motivo, dobbiamo preferire gli oggetti valore alle entità nella maggior parte dei casi.
Codice
Vediamo un esempio pratico in codice. Immagina di modellare un server nel contesto di cloud provider. Ecco una versione semplificata dell'entità server.
Come puoi vedere, questa classe è difficile da leggere, e il suo costruttore è complicato… per non dire incasinato. Immagina quanto diventerebbe complessa questa classe se aggiungessimo tutta la logica necessaria per implementare le regole di business.
Ora, ecco la stessa classe riscritta utilizzando oggetti valore.
Non solo abbiamo migliorato la leggibilità, ma tutta logica di business è nelle classi appropriate. Ad esempio, validiamo il formato dell’identificatore, codice server, e nome, nei costruttori degli oggetti valore che li rappresentano, garantendo anche che non siano mai nulli.
Inserendo la logica all'interno degli oggetti valore, possiamo riutilizzarla in tutto il sistema. Per esempio, se volessimo imporre un formato standard per gli identificatori, potremmo semplicemente creare un oggetto valore e usarlo in tutto il sistema.
Conclusione
Questi sono i motivi per cui dobbiamo usare le entità solo per gli elementi del dominio che devono essere identificati e che hanno un ciclo di vita durante il quale i loro attributi possono cambiare. Arricchiremo poi il modello con oggetti valore immutabili, che aiutano a raggruppare caratteristiche correlate e ad applicare la logica di business in modo coerente in tutto il sistema.
È importante capire che se un elemento debba essere un'entità o meno nel nostro dominio dipende dai requisiti del nostro cliente. Un indirizzo di consegna solitamente è un oggetto valore associato a un utente o account in un sistema di e-commerce. Tuttavia, lo stesso indirizzo potrebbe essere modellato come un'entità in un sistema logistico o di pubblica amministrazione. Ad esempio, potremmo aver bisogno di sapere quanti residenti vivono a un determinato indirizzo.
Spero che il video ti sia piaciuto. Se hai domande, lasciami un commento o contattami personalmente. Trovi tutte le informazioni sul mio sito. Faccio anche lezioni private, coaching e mentoring, ma ho pochissima disponibilità.
Metti anche un bel mi piace e condividi, così anche i tuoi amici impareranno qualcosa di nuovo!