Si chaque réponse peut être codée sous forme de chaîne, vous pouvez le faire:
interface Question {
int score(String answer);
void display(String answer);
void displayGraded(String answer);
}
Où la chaîne vide signifie une question sans réponse pour le moment. Cela permet de séparer les questions, les réponses et l'interface graphique tout en permettant le polymorphisme.
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 zone de texte, la correspondance, etc. pourraient avoir des conceptions similaires, implémentant toutes l'interface de question. La construction de la chaîne de réponse se produit dans la vue. Les chaînes de réponse représentent l'état du test. Ils doivent être conservés au fur et à mesure que l'élève progresse. Les appliquer aux questions permet d'afficher le test et son état à la fois gradué et non gradué.
En séparant la sortie display()
et displayGraded()
la vue n'a pas besoin d'être échangée et aucune ramification ne doit être effectuée sur les paramètres. Cependant, chaque vue est libre de réutiliser autant de logique d'affichage que possible lors de l'affichage. Quel que soit le schéma conçu pour le faire, il n'a pas besoin de fuir dans ce code.
Si, cependant, vous souhaitez avoir un contrôle plus dynamique de l'affichage d'une question, vous pouvez le faire:
interface Question {
int score(String answer);
void display(MultipleChoiceView mcv, String answer);
}
et ça
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)
);
}
}
Cela présente l'inconvénient de nécessiter des vues qui n'ont pas l'intention d'afficher score()
ou answerKey
de dépendre d'eux lorsqu'elles n'en ont pas besoin. Mais cela signifie que vous n'avez pas à reconstruire les questions de test pour chaque type de vue que vous souhaitez utiliser.