Jika setiap jawaban dapat dikodekan sebagai string, Anda dapat melakukan ini:
interface Question {
int score(String answer);
void display(String answer);
void displayGraded(String answer);
}
Di mana string kosong menandakan sebuah pertanyaan tanpa jawaban untuk itu. Ini memungkinkan pertanyaan, jawaban, dan GUI untuk dipisahkan namun memungkinkan untuk polimorfisme.
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)
);
}
}
Kotak teks, pencocokan, dan sebagainya dapat memiliki desain yang serupa, semua mengimplementasikan antarmuka pertanyaan. Konstruksi string jawaban terjadi dalam tampilan. String jawaban mewakili kondisi pengujian. Mereka harus disimpan ketika siswa berkembang. Menerapkannya pada pertanyaan memungkinkan menampilkan tes dan statusnya dalam cara yang bertingkat dan tidak bertingkat.
Dengan memisahkan output menjadi display()
dan displayGraded()
tampilan tidak perlu ditukar dan tidak perlu dilakukan percabangan pada parameter. Namun, setiap tampilan bebas untuk menggunakan kembali logika tampilan sebanyak mungkin saat menampilkan. Skema apa pun yang dirancang untuk melakukan itu tidak perlu bocor ke dalam kode ini.
Namun, jika Anda ingin memiliki kontrol yang lebih dinamis tentang bagaimana sebuah pertanyaan ditampilkan, Anda dapat melakukan ini:
interface Question {
int score(String answer);
void display(MultipleChoiceView mcv, String answer);
}
dan ini
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)
);
}
}
Ini memang memiliki kekurangan yang membutuhkan tampilan yang tidak bermaksud untuk menampilkan score()
atau answerKey
bergantung pada mereka ketika mereka tidak membutuhkannya. Tetapi itu berarti Anda tidak perlu membangun kembali pertanyaan tes untuk setiap jenis tampilan yang ingin Anda gunakan.