- 浏览: 83658 次
- 性别:
- 来自: 东莞
文章分类
最新评论
-
0769:
呵呵,你是你们厉害而已....像我不厉害的....当然觉得它变 ...
变态级JAVA程序员面试32问(附答案) -
tmhbc:
这很正常呀。基础而且实际。
变态级JAVA程序员面试32问(附答案) -
lordhong:
这些是基本常识... 哪里变态来着? 去面试都是这些题目.. ...
变态级JAVA程序员面试32问(附答案) -
cocal:
Visual Basic 这辆车, 开着你.
好像前面说那 ...
假如编程语言是私家车 -
shuaiwawa:
Visual Basic 这辆车, 开着你.
假如编程语言是私家车
[翻译]沙发之争——过程与对象的对话
译文作者:意识
信息来源:邪恶八进制信息安全团队(www.eviloctal.com)
某天在某一家软件公司里,那令人讨厌的项目经理要求两名程序员完成同样的一个任务。经理并且承诺谁先完成任务的发给一张带转轮的真皮沙发代替原来的木质靠背椅。杰习惯过程式编程的程序员,而涛是一个面向对象的程序员。他们都知道这是一个不错的机会。
任务是这样的,在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。
当然这篇文章只是一个启发性的东西。要了解并且熟悉面向对象,需要的是时间和实践。你自己不去看点东西,写点东西,当然会被什么类啊,对象啊搞得云里雾里的啊。
这是一个令人浮躁的年代。什么动画啊,视频教程的汗牛充栋。不能否认,这些东西生动直观。然而轻易得来得东西,也会轻易的忘记的快。
我又多嘴了。最后再唠叨几句吧。面向对象是个好东西啊。当然如果你写程序只是为了编译一些什么溢出工具什么的,那可以不去理解什么是面向对象。但如果你真的想搞点大的,有商业前途的东西,面向对象的思想是一定要有的。
文章原著地址如下:
《Head Frist Java》
http://www.oreilly.com/catalog/hfjava/chapter/HFSample2PS.pdf
发表评论
-
6个变态的C语言Hello World程序
2013-02-19 13:54 761下面的六个程序片段主要完成这些事情: 输出Hel ... -
从C++转到Java需注意的地方
2010-08-31 22:33 8691.Java在虚拟机上运行 Jav ... -
ASP.NET和PHP性能对比
2010-08-31 22:28 938经过一些筛选,只选择一些代表性的看法进行翻译, 对于英文不是太 ... -
classpath的理解
2010-08-23 23:19 913jvm的类加载分三中方式: 系统级别:rt.jar ... -
用JavaScript的事件代理实现互动
2010-01-27 00:53 1147用JavaScript的事件代理实现互动 2009年01月 ... -
变态级JAVA程序员面试32问(附答案)
2008-08-08 00:55 1325变态级JAVA程序员面试32问(附答案) ... -
七月开发语言排行榜出炉 PowerShell有望成为年度黑马(图)
2008-07-11 00:17 2869转自:http://java.csdn.net/pag ... -
下一代浏览器脚本语言——C?
2008-07-11 00:08 1018Adobe的Scott Petersen上周在M ... -
一个定时重启关机的小程序
2008-07-02 14:55 1579此小程序只实现了定时重启或关机功能,我代表原作者欢迎大家增强它 ... -
假如编程语言是私家车
2008-05-11 11:52 1864假如编程语言是私家车 (If programming lang ... -
TC2.0下写汇编
2008-01-25 12:22 1745按照TC2.0的帮助系统所 ... -
计算机语言妙语录 软件就像性一样
2007-12-26 16:44 1083计算机语言妙语录 软件就像性一样 来自:译言 应当知道 ... -
写好C程序的10条秘籍
2007-08-08 17:59 995神乎其技,惟C程序, ... -
Linux 下 C 语言编程
2007-06-29 11:20 1094... -
猴子吃桃问题。
2007-06-28 17:03 2004基于C语言实现, 猴子吃桃问题: 猴子第一天摘下若干个桃,当即 ... -
Windows程序设计
2007-06-28 11:56 1108书不可以尽信!! 尽信书不如无书,书只是人类进步的阶梯!! 进 ... -
C++中的指针(一) 简单指针
2007-06-26 14:07 1031C++中的指针(一) 简单指针 简单总结一下C++ ... -
C/C++编程新手错误语录
2007-06-26 14:04 865C/C++编程新手错误语录 ... -
明晰C++内存分配的五种方法的区别
2007-06-26 14:01 1229明晰C++内存分配的五种方法的区别 ... -
解Joseph(约瑟夫)环问题的牛代码
2007-06-26 13:48 1982解Joseph(约瑟夫)环问题的牛代码 问题描 ...
相关推荐
《凯恩斯与哈耶克之争——思想背后的经济现实》 在经济学领域,约翰·梅纳德·凯恩斯和弗里德里希·哈耶克是两位极具影响力的思想家,他们的理论对20世纪乃至现代经济政策产生了深远影响。凯恩斯主义和哈耶克主义,...
《K9 VS Core核心架构之争——CPU发展趋势解析》 CPU的发展历程中,核心架构的演变始终扮演着关键角色。在Intel与AMD的竞争中,两大巨头分别推出了各自的核心架构,以应对日益增长的性能需求和效率挑战。本文主要...
【HOMEDEPOT之争——宜家、东方家园、旺市百利经营案例】 这篇文档主要探讨了家居零售行业的竞争情况,特别关注了采用Homedepot模式经营的三家知名企业:宜家、东方家园和旺市百利。Homedepot模式是一种现代仓储式...
综上所述,大数据时代的被遗忘权之争反映了个人信息保护与公开信息自由之间的紧张关系。在搜索引擎这一关键节点上,解决这一问题需要法律、技术和社会伦理的多维度思考,以实现对个人信息的合理保护,同时维护信息...
大数据时代下,个人信息的留存与被遗忘权之间存在张力。本文将探讨被遗忘权的概念、发展历程,以及在搜索引擎实践中的...在这一过程中,需要法律与技术的紧密配合,以及社会对于隐私权和个人数据权益的深入理解与协调。
《规范杠杆收购,促进经济结构调整——基于“宝万之争”视角的杠杆收购研究》.pdf
【阿里巴巴与雅虎的股权之争】是IT领域中一次典型的控制权博弈案例,涉及创业公司与投资者之间的权力分配和利益冲突。阿里巴巴,由马云等人创立,是中国乃至全球领先的电子商务公司,而雅虎作为早期互联网巨头,曾是...
专题资料
董宇在其发表的《互联网企业不正当竞争的司法认定研究——以视频广告与屏蔽软件之争为视角》一文中,详细探讨了互联网企业在商业模式上的摩擦及其在司法认定中的现状和存在的问题。 首先,文章指出互联网企业间的...
交通运输行业月度报告(2019年7月):高速公路ETC之争愈演愈烈.pdf
总结来说,2019中国新能源汽车大赛(CEVC)不仅是新能源汽车技术实力的竞技场,也是连接消费者与新能源汽车的桥梁,通过实际比赛和多样的互动活动,提升了新能源汽车的社会认知度,推动了行业的健康发展。
本文将围绕“电商平台经营者侵权责任研究——连带责任与按份责任之争”这一主题进行深入探讨。 首先,我们需要了解什么是电商平台经营者的侵权责任。电商平台经营者作为网络交易的中介,对在其平台上发生的交易行为...
总之,Windows与Linux之间的成本之战揭示了企业在选择操作系统时面临的复杂考量。虽然微软通过广告活动试图证明Windows的经济性,但Linux的开源特性和潜在的长期效益同样不容忽视。这场较量不仅是技术层面的竞争,更...
这种情况下,消费者可以起诉任一侵权方或双方共同,而电商经营者由于其作为平台的主导作用和更容易被追责的地位,通常成为了消费者的首选起诉对象。连带责任的本质是对外连带,对内按份,即在侵权责任的内部承担上,...
JVM(Java虚拟机)内部锁升级的过程是指Java对象在多线程环境中通过synchronized关键字实现同步时,锁的状态从无锁到轻量级锁再到重量级锁的转换过程。这个机制是为了在多线程操作共享资源时,保证数据的一致性和...
### Oracle性能诊断之——Latch Free:深入理解与分析 在探讨Oracle数据库的性能优化与故障诊断时,"Latch Free"事件往往成为关注的焦点。这一主题不仅涉及Oracle内存管理的核心机制,还触及到多线程环境下的并发...
然后,文章进一步讨论了提单制度下可能出现的“一物二卖”现象,即货物在运输过程中可能被多次转让,这在传统的债权理论中难以解释,但在物权理论中可以通过提单的转让来合理化。此外,文章回顾了提单法定关系的发展...
随着我国旅游业的快速发展及在旅游经济的刺激下,越来越多的地方开始关注并发展旅游业,致使我国...地方政府支持、经济发展需要、文化资源稀缺及地方情感依恋是推动"名人故里之争"的重要方面,其中经济利益之争是其核心。
本文通过研究广药与加多宝“王老吉”之争的案例,揭示了企业家精神配置如何影响企业内部和企业之间的双重均衡,以及这对企业绩效的影响。 首先,文章构建了一个理论框架,即“企业家精神配置-企业内/企业间双重均衡...
【标题】:“百花齐放 神州争春——2008春季国际半导体展会报道集锦.pdf” 这篇报道集中体现了2008年春季国际半导体展会的盛况,聚焦了半导体行业在中国市场的发展和创新。2007年虽然对半导体厂商来说是个挑战,但...