某天在某一家软件公司里,那令人讨厌的项目经理要求两名程序员完成同样的一个任务。经理并且承诺谁先完成任务的发给一张带转轮的真皮沙发代替原来的木质靠背椅。Jackie,习惯过程式编程的程序员,而Paul是一个面向对象的程序员。他们都知道这是一个不错的机会。
任务是这样的,在GUI的程序界面里有一个正方形,一个圆形和一个正三角形。但用户点击这个图形时,图形会顺时针旋转360°并且播放相应的AIF音效。
Jackie坐在自己的办公室里,对自己说:“这个程序要做什么?我们需要那些过程?”“旋转并且播放音效。”她又回答了自己。所有她的程序就是去完成这两个过程。
Paul带着他的笔记本坐在休息室里。他也在思索着:“程序中都有什么东西啊?谁是主要的角色啊?他最先想到的就是形状。当然他也想到了其他的一些对象,比如用户,音效和点击事件。因为已经有现成的库支持其他的对象了。因此因此他把重点放在创建形状类上。
在Jackie的办公室
就像曾经写过千百的的程序一样,Jackie把他的程序认为是重要的过程,并且没有用什么时间就完成了旋转和播放音效的过程。他的程序大概是这样的
rotate (shapeNum) {
// make the shape rotate 360°
}
playSound (shapeNum) {
// use shapeNum to lookup
which AIF sound to play, and play it
}
|
Paul和他的笔记本在休息室
Paul为每个形状写了一个类
class Square {
rotate () {
// code to rotate a square
}
playSound() {
// code to play the AIF
file for a square
}
}
class Circle
{
rotate () {
// code to rotate a circle
}
playSound() {
// code to play the AIF
file for a circle
}
}
class Triangle{
rotate () {
// code to rotate a triangle
}
playSound() {
// code to play the AIF
file for a triangle
}
}
|
Jackie的程序基本是完成了,她觉得她赢了,她似乎已经感觉到那张真皮沙发了。但是请等一下,任务有所变动
“现在你是快一点,Jackie”,项目经理说着,“但我还要加一点小小的功能在程序里。这对你们这样高水平的程序员来说,应该是毫无问题的。”
“如果只是个小改动,我可以接受。”Jackie想着,她知道经理所说的毫无代价的改动是胡扯。“为什么Paul会显得如此的平静呢?”Jackie不解的想着。Jackie一直执着认为面向对象只是个花架子,完全是浪费时间。
新增的任务是在GUI界面里多了一个不规则图形,当用户点击该个图形时,图形也会旋转360°,并且播放一个 .hif的音效。
Jackie回到办公室
旋转的过程依然时可以用的,因为代码使用的是shapeNum来对于相应的图形。然而播放音效的过程需要修改。“为什么非要播放 .hif的音效呢?”,Jackie愤愤的说着。
playSound (shapeNum) {
// if the shape is not an amoeba,
//use shapeNum to lookup with AIF
sound to play, and play it
//else
//play amoeba .hif sound
}
|
这不是一个很大的改动,但是Jackie依然不得不重新修改她已经调试成功过的代码。Paul在他的笔记本前,微笑着,呷了一口茶。随手写了一个新的类。有时他觉得他最喜欢面向对象中的这个优点,就是对已经编译调试过的代码可以不要任何改动。灵活和课扩展形……,Paul沉醉在面向对象的优点中了。
class Amoeba{
rotate () {
// code to rotate an amoeba
}
playSound() {
// code to play the new .hif file
for an amoba
}
}
|
Jackie这一次只比Paul领先一步