Se ogni risposta può essere codificata come 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. Ciò consente di separare le domande, le risposte e la GUI ma 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)
);
}
}
Casella di testo, corrispondenza e così via potrebbero avere progetti simili, tutti implementando l'interfaccia della domanda. La costruzione della stringa di risposta avviene nella vista. La stringa di risposta rappresenta lo stato del test. Dovrebbero essere archiviati man mano che lo studente avanza. Applicandoli alle domande è possibile visualizzare il test ed è lo stato in modo sia graduale sia non classificato.
Separando l'output in display()
e displayGraded()
la vista non deve essere scambiata e non è necessario eseguire la ramificazione sui parametri. Tuttavia, ogni visualizzazione è libera di riutilizzare quanta più logica di visualizzazione possibile durante la visualizzazione. Qualunque schema sia stato concepito per fare ciò, non è necessario infiltrarsi in questo codice.
Se, tuttavia, desideri avere un controllo più dinamico su come 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)
);
}
}
Ciò ha lo svantaggio di richiedere viste che non intendono visualizzare score()
o answerKey
dipendere da esse quando non ne hanno bisogno. Ciò significa che non è necessario ricostruire le domande del test per ogni tipo di vista che si desidera utilizzare.