Se ogni risposta può essere codificata come una stringa puoi farlo:
interface Question {
int score(String answer);
void display(String answer);
void displayGraded(String answer);
}
Dove la stringa vuota indica una domanda senza risposta ancora. Ciò consente di separare le domande, le risposte e la GUI e consente il polimorfismo.
class MultipleChoice implements Question {
MultipleChoiceView mcv;
String question;
String answerKey;
String[] choices;
MultipleChoice(
MultipleChoiceView mcv,
String question,
String answerKey,
String... choices
) {
this.mcv = mcv;
this.question = question;
this.answerKey = answerKey;
this.choices = choices;
}
int score(String answer) {
return answer.equals(answerKey); //Or whatever scoring logic
}
void display(String answer) {
mcv.display(question, choices, answer);
}
void displayGraded(String answer) {
mcv.displayGraded(
question,
answerKey,
choices,
answer,
score(answer)
);
}
}
La casella di testo, la corrispondenza e così via potrebbero avere disegni simili, tutti implementati nell'interfaccia della domanda. La costruzione della stringa di risposta avviene nella vista. La stringa di risposta rappresenta lo stato del test. Dovrebbero essere archiviati mentre lo studente progredisce. Applicandoli alle domande è possibile visualizzare il test e il suo stato sia in modo graduale che non classificato.
Separando l'output in display()
e displayGraded()
la vista non ha bisogno di essere scambiata e nessuna ramificazione deve essere eseguita sui parametri. Tuttavia, ciascuna vista è libera di riutilizzare la logica di visualizzazione quanto più possibile durante la visualizzazione. Qualunque schema sia concepito per farlo non ha bisogno di filtrare in questo codice.
Se, tuttavia, desideri avere un controllo più dinamico sul modo in cui viene visualizzata una domanda, puoi farlo:
interface Question {
int score(String answer);
void display(MultipleChoiceView mcv, String answer);
}
e questo
class MultipleChoice implements Question {
String question;
String answerKey;
String[] choices;
MultipleChoice(
String question,
String answerKey,
String... choices
) {
this.question = question;
this.answerKey = answerKey;
this.choices = choices;
}
int score(String answer) {
return answer.equals(answerKey); //Or whatever scoring logic
}
void display(MultipleChoiceView mcv, String answer) {
mcv.display(
question,
answerKey,
choices,
answer,
score(answer)
);
}
}
Questo ha lo svantaggio di richiedere viste che non intendono visualizzare score()
o answerKey
per dipendere da esse quando non ne hanno bisogno. Ma significa che non devi ricostruire le domande del test per ogni tipo di vista che desideri utilizzare.