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 es una pregunta que aún no tiene respuesta. Esto permite que las preguntas, las respuestas y la GUI se separen, 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 ocurre en la vista. Las cadenas de respuesta representan el estado de la prueba. Deben almacenarse a medida que el alumno progresa. Aplicarlas a las preguntas permite mostrar la prueba y su estado de manera calificada y no calificada.
Al separar la salida en display()
y displayGraded()
la vista no necesita intercambiarse y no es necesario realizar ramificaciones en los parámetros. Sin embargo, cada vista es libre de reutilizar tanta lógica de visualización como sea posible cuando se visualiza. Cualquiera sea el esquema diseñado para hacer eso, no necesita filtrarse 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
depender de ellas cuando no las necesitan. Pero significa que no tiene que reconstruir las preguntas de la prueba para cada tipo de vista que desea usar.