Ecco un requisito semplificato:
L'utente crea un
Question
con piùAnswer
s.Question
deve averne almeno unoAnswer
.Chiarimento: pensare
Question
eAnswer
come in un test : c'è una domanda, ma diverse risposte, dove poche possono essere corrette. L'utente è l'attore che sta preparando questo test, quindi crea domande e risposte.
Sto cercando di modellare questo semplice esempio in modo che 1) corrisponda al modello di vita reale 2) per essere espressivo con il codice, in modo da ridurre al minimo potenziali abusi ed errori e dare suggerimenti agli sviluppatori su come utilizzare il modello.
La domanda è un'entità , mentre la risposta è un oggetto valore . La domanda contiene risposte. Finora ho queste possibili soluzioni.
[A] Fabbrica dentroQuestion
Invece di creare Answer
manualmente, possiamo chiamare:
Answer answer = question.createAnswer()
answer.setText("");
...
Ciò creerà una risposta e la aggiungerà alla domanda. Quindi possiamo manipolare la risposta impostandone le proprietà. In questo modo, solo le domande possono creare una risposta. Inoltre, impediamo di avere una risposta senza una domanda. Tuttavia, non abbiamo il controllo sulla creazione di risposte, in quanto è codificato nel file Question
.
C'è anche un problema con la 'lingua' del codice sopra. L'utente è colui che crea risposte, non la domanda. Personalmente, non mi piace che creiamo un oggetto valore e, a seconda dello sviluppatore, lo riempia di valori: come può essere sicuro di ciò che è necessario aggiungere?
[B] Factory Inside Question, prendi # 2
Alcuni dicono che dovremmo avere questo tipo di metodo in Question
:
question.addAnswer(String answer, boolean correct, int level....);
Simile alla soluzione precedente, questo metodo prende i dati obbligatori per la risposta e ne crea uno che verrà aggiunto anche alla domanda.
Il problema qui è che dupliciamo il costruttore del Answer
senza una buona ragione. Inoltre, la domanda crea davvero una risposta?
[C] Dipendenze del costruttore
Siamo liberi di creare entrambi gli oggetti da soli. Esprimiamo anche la dipendenza proprio nel costruttore:
Question q = new Question(...);
Answer a = new Answer(q, ...); // answer can't exist without a question
Ciò fornisce suggerimenti allo sviluppatore, poiché la risposta non può essere creata senza una domanda. Tuttavia, non vediamo la "lingua" che dice che la risposta è "aggiunta" alla domanda. D'altra parte, dobbiamo davvero vederlo?
[D] Dipendenza del costruttore, prendere # 2
Possiamo fare il contrario:
Answer a1 = new Answer("",...);
Answer a2 = new Answer("",...);
Question q = new Question("", a1, a2);
Questa è la situazione opposta di cui sopra. Qui le risposte possono esistere senza una domanda (che non ha senso), ma la domanda non può esistere senza una risposta (che ha un senso). Inoltre, il 'linguaggio' qui è più chiaro su tale questione si hanno le risposte.
[E] Modo comune
Questo è ciò che chiamo il modo comune, la prima cosa che di solito ppl:
Question q = new Question("",...);
Answer a = new Answer("",...);
q.addAnswer(a);
che è la versione "libera" delle due risposte precedenti, poiché sia la risposta che la domanda possono esistere l'una senza l'altra. Non v'è alcun accenno speciale che ha per legare insieme.
[F] Combinato
O dovrei combinare C, D, E - per coprire tutti i modi in cui è possibile stabilire una relazione, in modo da aiutare gli sviluppatori a utilizzare ciò che è meglio per loro.
Domanda
So che le persone possono scegliere una delle risposte sopra basate sul "sospetto". Ma mi chiedo se una qualsiasi delle varianti sopra è migliore dell'altra con una buona ragione per questo. Inoltre, per favore non pensare all'interno della domanda sopra, vorrei spremere qui alcune migliori pratiche che potrebbero essere applicate nella maggior parte dei casi - e se sei d'accordo, la maggior parte dei casi d'uso della creazione alcune entità sono simili. Inoltre, lascia che la tecnologia sia agnostica qui, ad es. Non voglio pensare se ORM verrà utilizzato o meno. Voglio solo una buona modalità espressiva.
Qualche saggezza su questo?
MODIFICARE
Si prega di ignorare altre proprietà di Question
e Answer
, non sono rilevanti per la domanda. Ho modificato il testo sopra e modificato la maggior parte dei costruttori (dove necessario): ora accettano tutti i valori di proprietà necessari. Potrebbe trattarsi solo di una stringa di domanda o di una mappa di stringhe in diverse lingue, stati, ecc. - qualunque sia la proprietà passata, non è un punto focale per questo;) Quindi supponiamo che stiamo superando i parametri necessari, a meno che non sia detto diversamente. Grazie!