Якщо кожну відповідь можна закодувати як рядок, ви можете зробити це:
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
залежати від них, коли вони їм не потрібні. Але це означає, що вам не доведеться перебудовувати тестові питання для кожного типу перегляду, який ви хочете використовувати.