Если каждый ответ может быть закодирован как строка, вы можете сделать это:
interface Question {
int score(String answer);
void display(String answer);
void displayGraded(String answer);
}
Где пустая строка означает вопрос без ответа. Это позволяет разделять вопросы, ответы и графический интерфейс, но при этом допускает полиморфизм.
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
зависят от них, когда они не нужны. Но это означает, что вам не нужно перестраивать тестовые вопросы для каждого типа представления, которое вы хотите использовать.