Se todas as respostas puderem ser codificadas como uma sequência, você poderá fazer o seguinte:
interface Question {
int score(String answer);
void display(String answer);
void displayGraded(String answer);
}
Onde a cadeia vazia significa uma pergunta sem resposta ainda. Isso permite que as perguntas, as respostas e a GUI sejam separadas, mas permite polimorfismo.
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)
);
}
}
Caixa de texto, correspondência e assim por diante podem ter designs semelhantes, todos implementando a interface da pergunta. A construção da sequência de respostas acontece na exibição. A sequência de respostas representa o estado do teste. Eles devem ser armazenados à medida que o aluno progride. Aplicá-los às perguntas permite exibir o teste e seu estado, tanto de forma graduada quanto não.
Ao separar a saída em display()
e displayGraded()
a visualização não precisa ser trocada e nenhuma ramificação precisa ser feita nos parâmetros. No entanto, cada exibição é livre para reutilizar o máximo de lógica de exibição possível durante a exibição. Qualquer que seja o esquema planejado para fazer isso, não precisa vazar para esse código.
Se, no entanto, você deseja ter um controle mais dinâmico de como uma pergunta é exibida, faça o seguinte:
interface Question {
int score(String answer);
void display(MultipleChoiceView mcv, String answer);
}
e isto
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)
);
}
}
Isso tem a desvantagem de exigir visualizações que não pretendem exibir score()
ou answerKey
depender delas quando não precisam delas. Mas isso significa que você não precisa recriar as perguntas do teste para cada tipo de visão que deseja usar.