Her yanıt bir dize olarak kodlanabilirse, bunu yapabilirsiniz:
interface Question {
int score(String answer);
void display(String answer);
void displayGraded(String answer);
}
Boş dize, henüz cevabı olmayan bir soru anlamına gelir. Bu, soruların, cevapların ve GUI'nin ayrılmasına izin verir, ancak polimorfizme izin verir.
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)
);
}
}
Metin kutusu, eşleştirme ve benzeri benzer tasarımlara sahip olabilir, hepsi soru arayüzünü uygular. Yanıt dizesinin yapısı görünümde gerçekleşir. Yanıt dizesi testin durumunu temsil eder. Öğrenci ilerledikçe saklanmalıdır. Bunları sorulara uygulamak, testin ve testin durumunun hem derecelendirilmiş hem de derecelendirilmemiş bir şekilde görüntülenmesini sağlar.
Çıktıyı ayırarak display()
ve displayGraded()
görünümün değiştirilmesine gerek yoktur ve parametrelerde dallanma yapılmasına gerek yoktur. Ancak, her görünüm, görüntüleme sırasında mümkün olduğunca çok görüntüleme mantığını yeniden kullanmakta serbesttir. Bunu yapmak için tasarlanan ne olursa olsun, bu koda sızması gerekmez.
Ancak, bir sorunun nasıl görüntüleneceği konusunda daha dinamik bir kontrole sahip olmak istiyorsanız bunu yapabilirsiniz:
interface Question {
int score(String answer);
void display(MultipleChoiceView mcv, String answer);
}
ve bu
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)
);
}
}
Bunun dezavantajı, görüntülemeyi score()
veya answerKey
ihtiyaç duymadıklarında onlara bağımlı olmayı amaçlamayan görünümler gerektirmesidir . Ancak bu, kullanmak istediğiniz her bir görünüm türü için test sorularını yeniden oluşturmanız gerekmediği anlamına gelir.