2012-03-22 8 views
5

Quando si ha un'entità, come UserEntity, la proprietà id deriva dalla sua chiave primaria nel db - si dovrebbe fornire un metodo setter come setId()?L'ID di entità come argomento costruttore o tramite un metodo setter?

Alcuni argomenti contro:

  • apre la porta a possibili sovrascritture accidentali di altre UserEntities nel db
  • due (o più) UserEntities potrebbero esistere in qualsiasi momento con le stesse id ma diverse proprietà . (Se ho tirato 3 diversi utenti dal db e impostare i loro valori id allo stesso)

Alcuni argomenti di:

  • se non ho per istanziare l'UserEntity con una id nel costruttore (dato che ha un metodo setter), posso usare i metodi dell'oggetto UserEntity con valori temporanei/falsi/nuovi utenti ... senza doverli prima persistere.

Fornire un setter (e non forzare un id nel costruttore), o forzare un id nel costruttore, e rimuovere il setter?

risposta

3

Il valore dell'identità di un'entità deve essere gestito dal livello di persistenza e idealmente non sarebbe impostabile da altro: il livello di persistenza dovrebbe assegnare un nuovo valore di identità alla persistenza e impostarlo al momento del recupero. Inoltre, dovresti essere in grado di utilizzare un'entità transitoria (non persistente) senza bisogno di accedere alla sua identità. Consentire all'identità di essere impostata tramite la funzione di costruzione può causare problemi perché non esiste una fonte autorevole per i valori di identità. Un esempio in cui le identità possono essere assegnate da fonti esterne è se un client richiede che un'entità di nuova persistenza abbia un valore UUID come identità, sebbene questo esempio sia forzato.

+0

Grazie per la risposta! Quando il livello di persistenza imposta l'identità, dovrebbe essere attraverso il costruttore o attraverso un setter? L'entità può essere istanziata senza l'identità? – johnnietheblack

+1

Dovrebbe essere attraverso un setter o tramite riflessione a seconda della lingua. E dovrebbe essere possibile instantiete senza identità, anche se bisogna essere consapevoli che quando un'entità transitoria diventa persistente, le sue caratteristiche di uguaglianza possono cambiare mentre l'oggetto rimane in memoria se ad esempio il codice hash è derivato dall'identità. – eulerfx

1

@johnnietheblack, preferisco creare un setter privato e getter pubblico agli ID entità. Le convalide saranno lì nel setter (se necessario) e ho impostato questo ID esclusivamente nei costruttori. Gli ID numerici vengono istanziati con valori zero che mi aiutano a monitorare il loro ciclo di vita.

Domain Driven Design di Eric Evans parla di domini di modelli quando Patterns of Enterprise Application Architecture di Martin Fowler approfondisce l'infrastruttura di queste applicazioni. Credo che siano complementari e lo raccomando.

+0

Grazie! Sono preoccupato che la semantica mi trattiene, qui, perché io uso PHP, e non sono sicuro di ciò che un setter privato realizzerebbe? In PHP significherebbe, un metodo setId() privato, e l'entità può usare quel metodo stesso, ma nessun'altra entità potrebbe? – johnnietheblack

+0

Trovo che molte volte cercare di essere indipendenti dalla lingua sia più difficile che chiedere semplicemente una lingua specifica ... haha – johnnietheblack