すべての回答を文字列としてエンコードできる場合、これを行うことができます:
interface Question {
int score(String answer);
void display(String answer);
void displayGraded(String answer);
}
空の文字列は、まだ答えのない質問を意味します。これにより、質問、回答、およびGUIを分離できますが、ポリモーフィズムも可能です。
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)
);
}
}
テキストボックス、マッチングなどに同様のデザインを使用し、すべて質問インターフェイスを実装できます。回答文字列の構築は、ビューで行われます。回答文字列はテストの状態を表します。生徒の進行に合わせて保存する必要があります。それらを質問に適用すると、テストとその状態を段階的な方法と非段階的な方法の両方で表示できます。
出力を分離することによってdisplay()
、およびdisplayGraded()
ビューをスワップアウトする必要はありませんし、何の分岐ニーズがパラメータに行われないことを。ただし、各ビューは、表示時に可能な限り多くの表示ロジックを自由に再利用できます。どのようなスキームが考案されていても、このコードにリークする必要はありません。
ただし、質問の表示方法をより動的に制御したい場合は、これを行うことができます。
interface Question {
int score(String answer);
void display(MultipleChoiceView mcv, String answer);
}
この
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)
);
}
}
これには、表示する必要がないビューscore()
や、必要のないビューanswerKey
に依存するビューが必要になるという欠点があります。ただし、使用するビューのタイプごとにテスト問題を再作成する必要はありません。