Wenn jede Antwort als Zeichenfolge codiert werden kann, können Sie dies tun:
interface Question {
int score(String answer);
void display(String answer);
void displayGraded(String answer);
}
Wo die leere Zeichenfolge eine Frage bedeutet, auf die es noch keine Antwort gibt. Auf diese Weise können die Fragen, die Antworten und die Benutzeroberfläche getrennt werden, ohne dass ein Polymorphismus auftritt.
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)
);
}
}
Textfelder, Übereinstimmungen usw. könnten ähnliche Designs aufweisen und alle die Fragenschnittstelle implementieren. Der Aufbau des Antwortstrings erfolgt in der Ansicht. Die Antwortzeichenfolgen geben den Status des Tests an. Sie sollten im Verlauf des Studiums gespeichert werden. Wenn Sie sie auf die Fragen anwenden, können Sie den Test und seinen Status sowohl benotet als auch unbenotet anzeigen.
Durch das Trennen der Ausgabe in display()
und muss displayGraded()
die Ansicht nicht ausgetauscht werden und es muss keine Verzweigung der Parameter vorgenommen werden. Es steht jedoch jeder Ansicht frei, so viel Anzeigelogik wie möglich beim Anzeigen wiederzuverwenden. Welches Schema auch immer entwickelt wurde, es muss nicht in diesen Code eindringen.
Wenn Sie jedoch eine dynamischere Steuerung der Anzeige einer Frage wünschen, können Sie dies tun:
interface Question {
int score(String answer);
void display(MultipleChoiceView mcv, String answer);
}
und das
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)
);
}
}
Dies hat den Nachteil, dass Ansichten erforderlich sind, die das nicht anzeigen score()
oder answerKey
von ihnen abhängig sind, wenn sie sie nicht benötigen. Dies bedeutet jedoch, dass Sie die Testfragen nicht für jede Art von Ansicht neu erstellen müssen, die Sie verwenden möchten.