最近打算翻译一些外国的文章,既长见识,有练习了英语,真是一石二鸟,一举两得,一箭双雕。下面就是第一篇:
动机:
我在一些技术电话访谈中发现,很多公司在寻找拥有“strong cs fundamental”的职员。我并不是很明白这样做的具体含义,但是我知道他们会问什么样的问题--经常它会是“写一个快速排序的函数”或者“写一个二叉树的搜索算法”。这些经常会成为难题,尤其是如果距离你最初作出这些题有几年时间了的话。对我而言,我认为更重要的是设计的质量以及对模式的实现。然而快速排序和BST是非常重要的,在很多语言及系统库中都会使用它。我认为设计更加高效复杂的算法的方法是了解算法的根本,但是更重要的是知道如何去组装他们。
所以,因为我认为设计可能滴最有价值并且稀缺的技能,我打算开始写一系列的文章来解释游戏设计中的那些基本的设计模式。
注意:我打算在这本书里好好解释尽可能多的设计模式。我并不认为我是个专家,所以没有顾忌地纠正我吧,我会尽力的修正我的观点。第一:工厂模式
工厂模式是一个相当基本的模式。它是把一个复杂类的生成过程抽象为一个用来生成该类的类方法。举个例子,下面的伪代码来自我的游戏《Total Toads》(暂定名称):
class Bug ...
class BugFalling implements Bug ...
class BugFirefly implements Bug ...
class BugMultiply implements Bug ...
在我的游戏中,你有一个想吃掉小虫的青蛙在屏幕的低端,那些小虫会以各种方式出现在屏幕上。每种小虫有不同的外观,而且就算是同一种的小虫也有不同的属性。比如,BugFalling 是静止的,有些是tutorial bugs,有些移动得很快,有些不活泼等等。我会把这些特别的属性整合到我的工厂类,而不是用一大串复杂而又难懂的初始化函数。我把这个工厂类叫做“BugFactory”,在BugFactory的有文件中,包含我之前提到的那些类,就像这样:
// BugFactory creates bugs for specific uses
class BugFactory
{
// BugFalling creation functions
static BugFalling bugFallingStatic();
static BugFalling bugFallingTutorial();
static BugFalling bugFallingAtSpeed(float speed);
static BugFalling bugFallingDontAnimate();
// Other bugs types might go below...
}
注意到BugFactory现在有四个类方法其返回值是BugFalling的实例。相比之前我需要在BugFalling类中写复杂的构造函数,而现在我只要实现简单的构造函数,而那些附加的初始化信息会由BugFactory来完成。现在我们来看一个BugFactory的函数, bugFallingStatic():
static BugFalling bugFallingStatic()
{
BugFalling bug = new BugFalling();
bug.speed = 0; // assume speed is a variable that controls the bug's fall
return bug;
}
正如你看到的,这是一个目标简单的函数,你可以想象在越来越复杂的游戏中有越来越复杂的对象,这些对象的实例化会让人抓狂。使用对象会让你有你个单独的地方来查看与修改对象的创造。你可以想象,在BugFactory中添加BugFirefly和BugMultiply的生成不用费什么劲(其实是要的。。)。并且因为他们是类似的对象(都继承于父类Bug),有一个工厂制造他们是很方便的,并且可以很方便的修改他们特定的初始化过程。
。。。。终于翻译完了,就这么短的文章翻译了一个多小时。。。真是很累啊。。
还有不懂 While quicksort and BST delete are important, they're oftentimes implemented in basic language/system libraries 和 write a binary search tree delete 这两句中的delete是什么意思?
翻译完才发现这文章一般般,不过工厂模式的确是很好很基本的设计模式,可能大家平时无意间都在用这个模式,的但是却不知道怎么称呼,而现在你就可以很逼的说我这段程序是用了工厂模式,没听说过的就会很仰慕的看着你,高手。。。