Ecco un requisito semplificato:
User creates a
Question
with multipleAnswer
s.Question
must have at least oneAnswer
.Clarification: think
Question
andAnswer
as in a test: there is one question, but several answers, where few may be correct. User is the actor who is preparing this test, hence he creates question and answers.
Sto provando a modellare questo semplice esempio in modo che 1) corrisponda al modello di vita reale 2) di essere espressivo con il codice, in modo da minimizzare potenziali abusi e errori e dare suggerimenti agli sviluppatori su come utilizzare il modello.
La domanda è un'entità , mentre la risposta è oggetto valore . La domanda contiene le risposte. Finora, ho queste possibili soluzioni.
[A] Fabbrica all'interno di Question
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 impostando le sue proprietà. In questo modo, solo le domande possono ottenere una risposta. Inoltre, impediamo di avere una risposta senza una domanda. Tuttavia, non abbiamo il controllo sulla creazione di risposte, dato che è codificato in Question
.
C'è anche un problema con la 'lingua' del codice precedente. L'utente è colui che crea risposte, non la domanda. Personalmente, non mi piace creare oggetti valore e, a seconda dello sviluppatore, riempirlo di valori: come può essere sicuro di cosa è necessario aggiungere?
[B] Factory inside Question, take # 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à anche aggiunto alla domanda.
Il problema è che noi duplichiamo il costruttore di Answer
senza una buona ragione. Inoltre, la domanda crea davvero una risposta?
[C] dipendenze del costruttore
Siamo liberi di creare entrambi gli oggetti da noi stessi. Esprimiamo anche la dipendenza nel costruttore:
Question q = new Question(...);
Answer a = new Answer(q, ...); // answer can't exist without a question
Questo dà 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, abbiamo davvero bisogno di vederlo?
[D] Dipendenza del costruttore, prendi # 2
Possiamo fare il contrario:
Answer a1 = new Answer("",...);
Answer a2 = new Answer("",...);
Question q = new Question("", a1, a2);
Questa è la situazione opposta di sopra. Qui le risposte possono esistere senza una domanda (che non ha senso), ma la domanda non può esistere senza risposta (che ha senso). Inoltre, la "lingua" qui è più chiara su quella domanda avere le risposte.
[E] modo comune
Questo è ciò che chiamo il modo comune, la prima cosa che ppl di solito fa:
Question q = new Question("",...);
Answer a = new Answer("",...);
q.addAnswer(a);
che è la versione "libera" di sopra di due risposte, poiché sia la risposta che la domanda possono esistere l'una senza l'altra. Non c'è nessun suggerimento speciale per avere per unirli insieme.
[F] Combinato
O dovrei combinare C, D, E - per coprire tutti i modi in cui è possibile creare 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 in base alla "sensazione". Ma mi chiedo se una delle varianti precedenti sia migliore dell'altro con una buona ragione per questo. Inoltre, per favore non pensare nella domanda sopra, vorrei spremere qui alcune best practice che potrebbero essere applicate nella maggior parte dei casi - e se sei d'accordo, la maggior parte dei casi di creazione di uso di alcune entità sono simili. Inoltre, lascia qui la tecnologia agnostica, ad es. Non voglio pensare se ORM sarà usato o meno. Voglio solo una buona modalità espressiva.
Qualche saggezza su questo?
Modifica
Ignora le altre proprietà di Question
e Answer
, non sono rilevanti per la domanda. Ho modificato il testo sopra e ho modificato la maggior parte dei costruttori (laddove necessario): ora accettano tutti i valori di proprietà necessari necessari. Potrebbe trattarsi solo di una stringa di domande, o di una mappa di stringhe in lingue diverse, di stati ecc. - qualsiasi proprietà venga passata, non sono un punto focale per questo; Quindi, supponiamo solo che stiamo superando i parametri necessari, a meno che non siano diversi. Grazie!