Nếu mọi câu trả lời có thể được mã hóa thành một chuỗi, bạn có thể làm điều này:
interface Question {
int score(String answer);
void display(String answer);
void displayGraded(String answer);
}
Trường hợp chuỗi trống biểu thị một câu hỏi chưa có câu trả lời nào. Điều này cho phép tách biệt các câu hỏi, câu trả lời và GUI cho phép đa hình.
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)
);
}
}
Hộp văn bản, khớp, v.v có thể có thiết kế tương tự, tất cả đều thực hiện giao diện câu hỏi. Việc xây dựng chuỗi câu trả lời xảy ra trong khung nhìn. Chuỗi câu trả lời đại diện cho trạng thái của bài kiểm tra. Chúng nên được lưu trữ khi học sinh tiến bộ. Áp dụng chúng cho các câu hỏi cho phép hiển thị bài kiểm tra và trạng thái theo cả cách phân loại và không được phân loại.
Bằng cách tách đầu ra thành display()
và displayGraded()
khung nhìn không cần phải hoán đổi và không cần thực hiện phân nhánh trên các tham số. Tuy nhiên, mỗi chế độ xem được tự do sử dụng lại càng nhiều logic hiển thị càng tốt khi hiển thị. Bất cứ kế hoạch nào được đưa ra để làm điều đó không cần phải rò rỉ vào mã này.
Tuy nhiên, nếu bạn muốn có quyền kiểm soát năng động hơn về cách hiển thị một câu hỏi, bạn có thể làm điều này:
interface Question {
int score(String answer);
void display(MultipleChoiceView mcv, String answer);
}
và điều này
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)
);
}
}
Điều này có nhược điểm là nó yêu cầu các chế độ xem không có ý định hiển thị score()
hoặc answerKey
phụ thuộc vào chúng khi chúng không cần chúng. Nhưng điều đó có nghĩa là bạn không phải xây dựng lại các câu hỏi kiểm tra cho từng loại chế độ xem bạn muốn sử dụng.