Penso che questo sia soggettivo e dipende dal tuo design.
Principalmente, però, questo sembra essere un progetto che proviene da un record attivo . In un record attivo la tua entità ha metodi per eseguire operazioni sul database e quindi deve anche conoscere l'identificatore del database.
Quando si utilizzano altri modelli come un repository con un mappatore di dati che memorizza questi dati nell'oggetto diventa inutile e forse inappropriato.
Prendi ad esempio un Person
oggetto. Mi viene dato un nome che può essere o non essere unico all'interno di una famiglia. Poiché la popolazione è cresciuta, i nomi più grandi non sono più univoci e così abbiamo creato identificatori surrogati per sistemi sempre più grandi. Esempi di questi includono: la mia patente di guida e il numero di previdenza sociale. Non sono nato assegnato un ID, tutti questi ID devono essere richiesti.
La maggior parte di questi non fornisce buone chiavi / ID primari per il software, in quanto non sono universali. Almeno non al di fuori del loro sistema specifico, ovviamente un SSN è unico e coerente per l'amministrazione della previdenza sociale. Dal momento che non siamo generalmente i fornitori di queste informazioni, non li chiameresti id
ma piuttosto i dati che rappresentano, ad es SSN
. A volte contiene persino l'oggetto composto completo, ad esempio un oggetto DriversLicense
che può contenere tutte le informazioni contenute nella patente di guida.
Tutti gli ID generali sono quindi chiavi surrogate nel sistema e potrebbero essere sostituiti con riferimenti in memoria, contenenti solo gli ID per semplificare la ricerca e la persistenza dei record.
Dato che an id
non è un pezzo di dati concettuali, dubito che (generalmente) appartenga all'oggetto, in quanto non proviene dal dominio. Piuttosto dovrebbe essere mantenuto al suo scopo che è quello di identificare un oggetto che non ha altro modo di rappresentare un'identità unica. Questo potrebbe essere fatto in un repository / collection con facilità.
Nel software, se è necessario rappresentare l'oggetto come un elenco o persisterlo, è possibile farlo semplicemente dall'oggetto repository / collection o da qualche altro oggetto associato. Quando passi al Data Mapper (se è separato), puoi semplicemente passare .update( id, obj )
.
Dichiarazione di non responsabilità : non ho ancora provato a costruire un sistema che non contenga l'id all'interno dell'entità e quindi possa dimostrarmi errato.