球员使用JavaScript得分
在面向对象的设计中,建模的关键是确定应用程序将如何响应消息。消息可以是对信息的请求、做某事的请求,或者是发生了某些事情的通知。
在您的示例中,应用程序可能会收到一条消息,“下一个问题是什么?”在仔细考虑之后,您可能会决定Quiz对象将负责提供该信息,在这种情况下,您将需要一个具有响应消息的方法的Quiz类。
代码语言:javascript复制function Quiz() {
...
}
Quiz.prototype.nextQuestion = function () {
...
};现在,您还没有真正的问题,所以您的应用程序必须处理的另一个明显的信息是,“添加这个问题的答案选择和正确的答案。”
不要简单地匆忙地向Quiz添加一个新方法来处理新消息;相反,您需要重复思考过程,并决定哪个对象最适合响应。在这种情况下,它还是一个Quiz对象,因为回答“下一个问题是什么?”之前的消息需要一些问题。因此,您可以相应地更新您的Quiz类。(在创建表示问题的结构和跟踪当前问题的索引时,您可以找到下一个问题。)
代码语言:javascript复制function Quiz() {
this.questions = [];
this.index = 0;
}
Quiz.prototype.addQuestion = function (text, choices, answer) {
this.questions.push(new Question(text, choices, answer));
};
Quiz.prototype.nextQuestion = function () {
if (this.index < this.questions.length)
return this.questions[this.index++];
return null;
};
function Question(text, choices, answer) {
this.text = text;
this.choices = choices;
this.answer = answer;
}我将跳过您的应用程序可能需要处理的有关播放器管理的消息,并跳过那些需要您的对象进行协作的消息。
比如说,你的应用程序收到一条消息,“玩家已经用这个答案回答了这个问题。”通过与前面相同的思维过程,您可以决定Quiz对象将处理这个问题,然后添加一个新的方法。
代码语言:javascript复制Quiz.prototype.answer = function (player, question, answer) {
...
};然而,这一次,作为响应该消息的一部分,您需要检查答案是否正确。但是哪个对象可以做到呢?当然,Question结构有正确答案的知识,因此它成为它的责任。Question刚刚从一个简单的结构提升到一个完整的类,它也可以响应消息;在这种情况下,“这个答案正确吗?”因此--
代码语言:javascript复制Question.prototype.isCorrect = function (answer) {
return this.answer === answer;
};然后.
代码语言:javascript复制Quiz.prototype.answer = function (player, question, answer) {
if (question.isCorrect(answer)) {
// score some points for player
}
}正如您所看到的,面向对象的设计不仅仅是查找类并向它们添加方法。您需要考虑这些消息以及它们是如何处理的;换句话说,消息是关键--不是类,不是方法。
祝好运!