Jeśli każdą odpowiedź można zakodować jako ciąg, możesz to zrobić:
interface Question {
int score(String answer);
void display(String answer);
void displayGraded(String answer);
}
Gdzie pusty ciąg oznacza pytanie, na które nie ma jeszcze odpowiedzi. Umożliwia to rozdzielenie pytań, odpowiedzi i GUI, a jednocześnie pozwala na polimorfizm.
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)
);
}
}
Pole tekstowe, dopasowanie itp. Mogą mieć podobne projekty, wszystkie implementują interfejs pytań. Konstrukcja ciągu odpowiedzi ma miejsce w widoku. Łańcuchy odpowiedzi reprezentują stan testu. Powinny być przechowywane w miarę postępów ucznia. Zastosowanie ich do pytań pozwala wyświetlić test i jego stan zarówno w sposób stopniowany, jak i niesklasyfikowany.
Poprzez oddzielenie wyjście do display()
i displayGraded()
widok nie muszą być zamienione na zewnątrz, bez rozgałęzień do zrobienia na parametrach. Jednak każdy widok może ponownie wykorzystać tyle logiki wyświetlania, ile może podczas wyświetlania. Niezależnie od tego, jaki plan zostanie stworzony, nie trzeba wyciekać do tego kodu.
Jeśli jednak chcesz mieć bardziej dynamiczną kontrolę nad sposobem wyświetlania pytania, możesz to zrobić:
interface Question {
int score(String answer);
void display(MultipleChoiceView mcv, String answer);
}
i to
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)
);
}
}
Ma to tę wadę, że wymaga widoków, które nie zamierzają wyświetlać score()
lub answerKey
polegać na nich, gdy ich nie potrzebują. Oznacza to jednak, że nie musisz odbudowywać pytań testowych dla każdego typu widoku, którego chcesz użyć.