`
gkm422
  • 浏览: 82496 次
  • 性别: Icon_minigender_1
  • 来自: 太原
社区版块
存档分类
最新评论

沙发之争(过程与对象的对话)

阅读更多

某天在某一家软件公司里,那令人讨厌的项目经理要求两名程序员完成同样的一个任务。经理并且承诺谁先完成任务的发给一张带转轮的真皮沙发代替原来的木质靠背椅。杰,习惯过程式编程的程序员,而涛是一个面向对象的程序员。他们都知道这是一个不错的机会。

任务是这样的,在GUI的程序界面里有一个正方形,一个圆形和一个正三角形。但用户点击这个图形时,图形会顺时针旋转360°并且播放相应的AIF音效。

杰,坐在自己的办公室里,对自己说:"这个程序要做什么?我们需要那些过程?""旋转并且播放音效。"他又回答了自己。所有他的程序就是去完成这两个过程。

涛带着他的笔记本坐在休息室里。他也在思索着:"程序中都有什么东西啊?谁是主要的角色啊?他最先想到的就是形状。当然他也想到了其他的一些对象,比如用户,音效和点击事件。因为已经有现成的库支持其他的对象了。因此因此他把重点放在创建形状类上。

在杰的办公室

就像曾经写过千百的的程序一样,杰把他的程序认为是重要的过程,并且没有用什么时间就完成了旋转和播放音效的过程。他的程序大概是这样的

rotate (shapeNum) {
  // make the shape rotate 360°
}
playSound (shapeNum) {
// use shapeNum to lookup which AIF sound to play, and play it
}

 

涛和他的笔记本在休息室

涛为每个形状写了一个类

  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
                }
        }

 

杰的程序基本是完成了,他觉得他赢了,他似乎已经感觉到那张真皮沙发了。

但是请等一下,任务有所变动

"现在你是快一点,杰",项目经理说着,"但我还要加一点小小的功能在程序里。这对你们这样高水平的程序员来说,应该是毫无问题的。"

"如果只是个小改动,我可以接受。"杰想着,他知道经理所说的毫无代价的改动是胡扯。"为什么涛会显得如此的平静呢?"杰不解得想着。杰一直执着认为面向对象只是个花架子,完全是浪费时间。

新增的任务
在GUI界面里多了一个不规则图形,当用户点击该个图形时,图形也会旋转360°,并且播放一个 .hif的音效。

杰回到办公室
旋转的过程依然时可以用的,因为代码使用的是shapeNum来对于相应的图形。然而播放音效的过程需要修改。"为什么非要播放 .hif的音效呢?",杰愤愤的说着。

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
   }

 

这不是一个很大的改动,但是杰依然不得不重新修改他已经调试成功过的代码。

涛在他的笔记本前
涛微笑着,呷了一口茶。随手写了一个新的类。有时他觉得他最喜欢面向对象中的这个优点,就是对已经编译调试过的代码可以不要任何改动。灵活和课扩展形......,涛沉醉在面向对象的优点中了。

class Amoeba{
                rotate () {
                // code to rotate an amoeba
                }
                playSound() {
                // code to play the new .hif file for an amoba
                }
     }

 

杰这一次只比涛领先一步
"面向对象都是在胡扯,浪费时间!"杰正在暗笑着涛。"不规则图形不是这样旋转的。"
项目经理失望的说。
原来,杰和涛都是这样写的
用一个矩形围住不规则图形,然后计算矩形的中心,最后让图形以中心旋转。

项目经理接着说:"它应该以一个给定的坐标旋转。"

"我真像是一块砧板上任人宰割的肉。",杰想着"但我可以再加上一些if...else 语句就可以搞定了。"然而天知道经理会又有什么改动呢?

杰的办公室
他思索着旋转的过程。很多的代码受到影响的。杰又要重新编译调试。终于有了结果。

                rotate ( shapeNum, xPt, yPt) {
                // if the shape is not an amoeba,
                        //calculate the center point base on the rectangle, the rotate
                //else
                        //use the xPt and yPt as the rotation point offset an the rotate
                }

 

涛在他的笔记本前
为了不把沙发拱手让给杰,涛也在修改他的旋转方法,但仅仅是在Amoeba的类里。对于其他的测试好的类,是原封不动的。为了给不规则图形一个旋转点,他给Amoeba加肋两个属性,然后他测完成后通过无线网络提交了任务。

class Amoeba{
                int xPoint;
                int yPoint;
                rotate () {
                // code to rotate an amoeba using amoeba's x and y
                }
                playSound() {
                // code to play the new .hif file for an amoba
                }
}

 

那涛得到了沙发对吗?

并没有那么快,杰找到涛程序里的一个缺陷。并且他知道如果能得到沙发的话就可以取悦会计室的婷,因此他不希望就这样就输了。

下面是杰和涛的对话
杰:你的代码大量重复,你的旋转过程在四个图形的东西里都有。

涛:这是方法,不是过程。还有他们是类,不叫做东西。

杰:不管叫什么,你的设计简直是垃圾。你要处理四个不同旋转"方法"。你怎么处理啊?

涛:我猜你是没看见最后的设计。让我告诉你继承在面向对象中书如何工作的。看这四个类是有共同点的。它们都有rotate()和playSound()


于是我抽象出一个Shape类来

abstract class Shape(){
        rotate();
        playSound();
}

 

然后我让这四个类继承这个抽象的类

class Square extends Shape {
                rotate () {
                // code to rotate a square
                }
                playSound() {
                // code to play the AIF file for a square
                }
}

class Circle extends Shape {
                rotate () {
                // code to rotate a circle
                }
                playSound() {
                // code to play the AIF file for a circle
                }
}
class Triangle extends Shape {
                rotate () {
                // code to rotate a triangle
                }
                playSound() {
                // code to play the AIF file for a triangle
                }
}

class Amoeba extends Sharpe{
                int xPoint;
                int yPoint;
                rotate () {
                // code to rotate an amoeba using amoeba's x and y
                }
                playSound() {
                // code to play the new .hif file for an amoba
                }
}

 

那Amoeba的类旋转呢?
杰:问题不是就在这吗?Amoeba有完全不同的旋转和播放音效的过程吗?

涛:是方法。

杰:不管是它叫什么了。Amoeba怎么能实现与他说继承的类shape不同的事呢?

涛:这是最后一遍了。Amoeba重骑(overrides)了Shape类的方法。在运行时(runtime)Java的虚拟机(JVM)知道但程序需要Amoeba去旋转时应该调用相应的方法。

杰:你怎么告诉Amoeba去旋转啊?难道你们不要调用过程,哦不对,是方法然后告诉它应该那个图形去旋转吗?

涛:这就是面向对象的好处所在了。比如说,要让三角形旋转。程序调用Triangle对象的rotate( )方法。程序的其他部分不知道也不在于三角形形是怎么转的。当你要想添加一点功能到程序中时,你只要写一个为新的对象类型写一个新的类,那个新的对象有自己的特性。

杰:我希望我也能成为一个面向对象的程序员,这太神奇了。

后记

这是半年多来,我所看过的Java的文章中,对面向对象讲解的最生动的一篇。因为是英文的,所以一直放在那里。也曾试着写一个类似的例子。因为水平有限一直没有完成。很久没有给论坛点好东西了。于是用了三天的时间把它翻译改编出来了。也找到这篇原版的PDF。

当然这篇文章只是一个启发性的东西。要了解并且熟悉面向对象,需要的是时间和实践。你自己不去看点东西,写点东西,当然会被什么类啊,对象啊搞得云里雾里的啊。

这是一个令人浮躁的年代。什么动画啊,视频教程的汗牛充栋。不能否认,这些东西生动直观。然而轻易得来得东西,也会轻易的忘记的快。

我又多嘴了。最后再唠叨几句吧。面向对象是个好东西啊。当然如果你写程序只是为了编译一些什么溢出工具什么的,那可以不去理解什么是面向对象。但如果你真的想搞点大的,有商业前途的东西,面向对象的思想是一定要有的。

 

分享到:
评论

相关推荐

    旅游“井喷”背景下的“名人故里之争”研究

    随着我国旅游业的快速发展及在旅游经济的刺激下,越来越多的地方开始关注并发展旅游业,致使我国...地方政府支持、经济发展需要、文化资源稀缺及地方情感依恋是推动"名人故里之争"的重要方面,其中经济利益之争是其核心。

    家电投资策略报告:从“格局”之争到“渗透率”之争.pdf

    2019年的投资策略报告明确提出了从“格局”之争到“渗透率”之争的转变,显示出投资者对家电行业未来发展的新期望。 报告中提到的“新人口代际更替”、“城市分割”和“新渠道快速迁移”是影响家电需求变化的三个新...

    视频标准之争

    ### 视频标准之争:Google WebM 与 H.264 的较量 #### 背景概述 互联网时代深刻地改变了人们的生活方式,视频内容逐渐成为网络生活的核心部分。然而,缺乏一个开放且免费的视频格式标准一直是互联网视频领域的痛点...

    智能指针的标准之争+再论智能指针的标准之争

    当智能指针对象被销毁时,其所持有的原始指针所指向的对象也会被自动删除,这个过程通常通过`析构函数`来实现。这样就避免了经典的内存泄漏问题,即程序员忘记手动删除不再使用的动态内存。 接下来,我们讨论智能...

    管理层派系之争:公司内的零和博弈.doc

    "管理层派系之争:公司内的零和博弈" 公司内部的派系之争是一种...在公司管理过程中,需要注意到管理层派系之争的危险性,并采取相应的措施来防止和化解这种派系之争。只有这样,公司才能确保其健康发展和长久的利益。

    财务案例分析案例-雷士照明股权之争.pptx

    财务案例分析案例-雷士照明股权之争 本篇财务案例分析案例主要讲述了雷士照明有限公司的股权之争,涵盖了公司简介、案例概述、案例分析、案例启示等方面。通过对案例的分析,我们可以了解到财务管理、股权结构、...

    基于反并购策略视角的“宝万之争”案例分析 万科.zip

    "宝万之争"是中国资本市场中一次著名的并购与反并购事件,涉及到房地产巨头万科集团与宝能系企业之间的股权争夺战。在这个案例中,我们可以深入理解反并购策略的重要性以及其在实际商业操作中的应用。 首先,我们...

    舌尖之争,休闲食品成长实录,万亿市场谁与争锋-东吴证券-20190908.pdf

    本报告基于《舌尖之争,休闲食品成长实录,万亿市场谁与争锋》这一研究,旨在探讨休闲食品行业的现状和发展趋势,并针对投资者关心的问题提供深入分析。 #### 二、问题解析 ##### 1. 市场空间与竞争格局 - **市场...

    鸡啄米:腾讯vs新浪-中国的社交图谱之争.docx

    这场社交图谱之争并非仅仅局限于腾讯与新浪两家。其他社交网络如人人网、开心网、豆瓣网和51.com,它们各自在特定的细分市场中找到了自己的位置,但是它们的影响力和市场份额还未能对腾讯构成实质性的威胁。此外,...

    交通运输行业月度报告(2019年7月):高速公路ETC之争愈演愈烈.pdf

    交通运输行业月度报告(2019年7月):高速公路ETC之争愈演愈烈.pdf

    国潮消费系列(三):2021年中国线下美妆集合店行业概览:线上与线下渠道的流量之争(36页).pdf

    报告标题:“国潮消费系列(三):2021年中国线下美妆集合店行业概览:线上与线下渠道的流量之争(36页)” 该报告聚焦于2021年中国美妆市场的线下零售业态,特别是美妆集合店的发展状况。在这个数字化高度发达的...

    案例:达能VS娃哈哈品牌之争(并购).pptx

    争议条款指出,娃哈哈使用其品牌生产其他产品需经达能同意或与之合资。十年间,双方成立了39家合资公司,占据娃哈哈公司总数的39%。在此期间,宗庆后领导的娃哈哈决定通过职工集资成立非合资公司,这些公司在西部和...

    物质与思想之争.docx

    【物质与思想之争】 物质与思想的争议是一个贯穿人类历史的哲学问题,它涉及到我们对世界的本质理解。物理学,作为探讨物质世界最基本的科学,自古以来就与哲学、神学等紧密相连。物理学的起源可以追溯到古希腊,...

    95页2023年第二季中国卓越技术团队访谈录:大模型之争-极客传媒-20230819.pdf

    大模型之争将会继续影响AI技术的发展,基础模型与应用层之间的中间层将会变得越来越重要。向量数据库作为中间层的重要组成部分将会继续受到关注和投资。AI技术的发展趋势将会继续推动大模型之争的发展。

    Google和微软模式之争

    《Google和微软模式之争》这一文章深入探讨了2005年末Google与微软在争夺AOL(美国在线)合作权过程中的激烈竞争,以及这场竞争背后所反映的新旧商业模式的碰撞与融合。文章由本刊记者关洁撰写,不仅剖析了事件本身...

    面积之争.vsdx

    面积之争.vsdx

    单车智能与车路协同之争

    "单车智能与车路协同之争" 在自动驾驶技术的发展中,单车智能和车路协同是两大方向。单车智能指的是单一车辆的智能化,可以通过感知层面、决策层面和执行模块来实现自动驾驶。而车路协同则是指车辆和道路基础设施...

    WINDOWS与LINUX之争的启示.pdf

    WINDOWS与LINUX之争的启示.pdf

    浅谈医学人道主义与功利主义之争 医德理论的困惑.doc

    与之相对的功利主义,则更注重行动结果的效用,即最大化整体的幸福或利益。在功利主义者看来,行动的道德价值在于其是否能带来最大多数人的最大幸福。这种差异导致了医学人道主义与功利主义在面对具体问题时的冲突。...

Global site tag (gtag.js) - Google Analytics