หากทุกคำตอบสามารถเข้ารหัสเป็นสตริงคุณสามารถทำสิ่งนี้:
interface Question {
int score(String answer);
void display(String answer);
void displayGraded(String answer);
}
ที่สตริงว่างหมายถึงคำถามที่ยังไม่มีคำตอบ สิ่งนี้จะช่วยให้คำถามคำตอบและ GUI แยกออกจากกัน แต่อนุญาตให้มีความหลากหลาย
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)
);
}
}
กล่องข้อความการจับคู่และอื่น ๆ อาจมีการออกแบบที่คล้ายกันทั้งหมดใช้ส่วนติดต่อคำถาม การสร้างสตริงคำตอบเกิดขึ้นในมุมมอง สตริงคำตอบแสดงถึงสถานะของการทดสอบ พวกเขาควรจะเก็บไว้ในขณะที่นักเรียนดำเนินการ การใช้คำถามเหล่านี้ช่วยให้สามารถแสดงผลการทดสอบได้และมีสถานะเป็นแบบให้คะแนนและไม่ให้คะแนน
ด้วยการแยกเอาต์พุตเข้าdisplay()
และdisplayGraded()
มุมมองไม่จำเป็นต้องถูกสลับและไม่จำเป็นต้องทำการแยกย่อยกับพารามิเตอร์ อย่างไรก็ตามแต่ละมุมมองมีอิสระที่จะใช้ตรรกะการแสดงผลได้มากเท่าที่จะทำได้เมื่อแสดงผล ไม่ว่ารูปแบบใดที่ได้รับการออกแบบมาเพื่อทำสิ่งนั้นไม่จำเป็นต้องรั่วไหลเข้าไปในรหัสนี้
อย่างไรก็ตามหากคุณต้องการควบคุมแบบไดนามิกมากขึ้นเกี่ยวกับวิธีการแสดงคำถามที่คุณสามารถทำได้:
interface Question {
int score(String answer);
void display(MultipleChoiceView mcv, String answer);
}
และนี่
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)
);
}
}
นี่มีข้อเสียเปรียบที่ต้องใช้มุมมองที่ไม่ต้องการแสดงscore()
หรือanswerKey
ขึ้นอยู่กับพวกเขาเมื่อพวกเขาไม่ต้องการ แต่หมายความว่าคุณไม่ต้องสร้างคำถามทดสอบสำหรับมุมมองแต่ละประเภทที่คุณต้องการใช้