Si cada respuesta puede codificarse como una cadena, puede hacer esto:
interface Question {
int score(String answer);
void display(String answer);
void displayGraded(String answer);
}
Donde la cadena vacía significa una pregunta que aún no tiene respuesta. Esto permite separar las preguntas, las respuestas y la GUI, pero permite el 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)
);
}
}
El cuadro de texto, la coincidencia, etc. podrían tener diseños similares, todos implementando la interfaz de preguntas. La construcción de la cadena de respuesta pasa en la vista. Las cadenas de respuesta representan el estado de la prueba. Deben ser almacenados a medida que el estudiante progresa. Aplicarlas a las preguntas permite mostrar la prueba y su estado tanto de forma gradual como no gradual.
Al separar la salida en display()
y displayGraded()
, no es necesario cambiar la vista y no es necesario realizar bifurcaciones en los parámetros. Sin embargo, cada vista es libre de reutilizar toda la lógica de visualización que pueda cuando se muestra. Cualquiera que sea el esquema que se diseñe para hacer eso, no es necesario filtrarlo en este código.
Sin embargo, si desea tener un control más dinámico de cómo se muestra una pregunta, puede hacer esto:
interface Question {
int score(String answer);
void display(MultipleChoiceView mcv, String answer);
}
y esto
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)
);
}
}
Esto tiene el inconveniente de que requiere vistas que no pretenden mostrar score()
o answerKey
para depender de ellas cuando no las necesiten. Pero significa que no tiene que reconstruir las preguntas de la prueba para cada tipo de vista que desee utilizar.