모든 답변을 문자열로 인코딩 할 수 있다면 다음과 같이하십시오 :
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
의존 하지 않는 뷰가 필요하다는 단점이 있습니다. 그러나 사용하려는 각 유형의보기에 대해 테스트 질문을 다시 작성할 필요가 없습니다.