冒号和他的学生们(连载7)——对象范式

对象范式

民为贵,社稷次之,君为轻         ——《孟子·尽心下》

短憩之后,引号迫不及待地问:“面向对象的范式应该是一种特殊的命令式吧?”

“面向对象?”冒号咕哝着,“姑且称之为OO或对象式吧,既不标新立异,也不以讹传讹。在回答你的问题之前,请先回答我的:什么是OOP?”

引号应答如流:“OOP是一种计算机编程模式,它以对象作为问题空间的基本元素,利用对象和对象间的相互作用来设计程序。所谓对象,是实际问题中实体的抽象,具有一定的属性和功能。OOP的三个基本特性是:封装性、继承性和多态性。所谓封装性就是——”

冒号作了个暂停的手势:“OOP的的基本特性相信大家早就耳熟能详了,那么根据你刚才的定义,能否得出OOP一定是命令式的结论?”

引号歪头想了一阵,答道:“从定义上好像并不能得出,难道C++、Java、C#不是命令式的吗?”

冒号回答:“当然是,但这不妨碍Clos成为OO版的Lisp,而Prolog也有不少融入OO特征的扩充,如Visual Prolog、Logtalk等。OOP虽然是在命令式的基础上发展起来的,但其基本思想可泛化为:以数据为中心组织逻辑,将系统视为相互作用的对象集合,并用继承与多态来增强重用性。这种思想也能应用到函数式和逻辑式中,只不过对象的方法从命令式中的过程分别换成函数式中的函数和逻辑式中的断言罢了。大致说来,命令式、函数式和逻辑式互相平行,而OOP与它们正交。”

问号提问:“OOP已经成为一种潮流,上堂课列举的十二种流行语言中只有C不是OO的,这是否意味着OOP将要一统天下?”

“严格说来,VB(VB.NET除外)和Javascript也不是OO的,只是基于对象的(Object Based)。” 冒号纠正道,“至于OOP是否会一统天下,答案是否定的。首先,纯粹的OOP是不存在的,必须结合其他范式,只有三类最基本的范式能独当一面;其次,世上没有包治百病的万灵丹方,OOP也不例外。需要指出的是,语言和范式的流行,与大公司支持和商业推动是密切相关的。有人说OO其实是MO(Money-Oriented),虽有过激之嫌,但有经验的股民都知道,有主力运作的股票总是涨得快一些的。当然OOP能流行,自有独到之处,谁能说说它到底好在哪里?”

逗号抢答:“OOP能提高软件可重用性、可扩展性和灵活性。”

冒号反问:“为什么过程式编程的可重用性、可扩展性和灵活性就差呢?”

感到来者不善,逗号有点发虚:“因为OOP具有信息隐藏、继承和多态的特征。”

冒号并不买帐:“首先,将可重用性、可扩展性和灵活性与OOP划等号,是只见树木,不见森林——那是所有范式和语言的共同目标。其次,以C语言为例,信息隐藏可用关键字static来实现;继承可用合成( composition)来代替;多态虽然困难些,也有变通之法。更何况这些只是手段而非目的,只要设计合理,C程序同样具有可重用性、可扩展性和灵活性,性能效率还更优越。即使在OOP日益风行的今天,C的占有率始终稳踞前列,许多大型复杂软件如操作系统、数据库等仍以C为主,这足以证明其仍堪大用。”

见逗号有些理屈词穷,冒号语气放缓:“请不要误解,我并非OOP的反对者,相反今后还要重点讨论它。但我希望大家少一点照本宣科和人云亦云,多一点独立思考和批判精神。”

稍作停顿,冒号继续发问:“过程式编程与OOP在设计理念上有什么区别?”

“过程式编程理念是重在过程,自顶向下,逐步求精。”引号一出口就自感有些“照本宣科”,见冒号正用鼓励的目光看着他,这才继续说下去,“OOP则正相反,重在数据,自底向上,逐步实现。”

冒号首肯道:“如果把整个流程看作一颗倒长的大树,过程式编程自树根向下,逐渐分支,直到每片树叶,类似数学证明中的分析法,即执果索因的逆推法;OOP则从每片树叶开始,逐渐合并,直到树根,类似数学证明中的综合法,即执因索果的正推法。”

句号心领神会:“倘若把树根看成主函数,离树根越近,离用户需求也越近。如果用过程式编程,由于是逆推法,树干改变容易导致树枝相应改变,因此一旦用户需求发生变化,可能会从树根波及到树枝甚至树叶,维护起来殊为不易。相反OOP从树叶开始设计,离用户需求较远,抽象程度较高,受波及的程度较小,因此更易维护和重用。”

时间: 2024-11-10 07:14:14

冒号和他的学生们(连载7)——对象范式的相关文章

冒号和他的学生们(连载24)——对象封装

24.对象封装 阴阳地理两分张,隐者为阴显者阳 --<玉髓经.曜星论> "用广东话说,真是有型有料又有性格啊!"叹号啧啧连声,"这哪里是在设计软件,分明是在设计心仪的对象嘛." "我们可不就是在谈对象设计吗?"冒号笑着反问,"在OOP的世界里,每位程序员都是造物主.保持热情.专注力和审美情趣,说不定哪一天就像希腊神话里的皮格玛利翁一样,雕塑的美女变活了." "哇,那可就美了!"逗号极尽夸张之调.

冒号和他的学生们(连载10)——超级范式

超级范式 智能繁衍:机器人生产机器人 --题记 引号忽然想起一事,问道:"有一本名为<C++模版元编程>的书,既然提到了模板,想来也属于泛型编程吧?" 冒号答道:"模板元编程即Template Metaprogramming,与GP密切相关但自成一派,隶属于另一种编程范式--元编程(Metaprogramming),简称MP.这里的前缀'meta-'常译作'元',其实就是'超级'.'行而上'的意思.比如,元数据(Metadata)是关于数据的数据,元对象(Meta

冒号和他的学生们程序员提高班纪事系列

冒号和他的学生们(连载27)--接口服务 冒号和他的学生们(连载26)--访问控制 冒号和他的学生们(连载25)--软件应变 冒号和他的学生们(连载24)--对象封装 冒号和他的学生们(连载23)--数据抽象 冒号和他的学生们(连载22)--抽象思维 冒号和他的学生们(连载21)--后台脚本 冒号和他的学生们(连载20)--前台语言 冒号和他的学生们(连载19)--平台语言 冒号和他的学生们(连载18)--系统语言 冒号和他的学生们(连载17)--语言讨论 冒号和他的学生们(连载16)--动态语

冒号课堂§2.3:对象范式

第二课 重要范式(3) 2.3 对象范式--民主制社会的编程法则 民为贵,社稷次之,君为轻 --<孟子·尽心下> 关键词:编程范式,OOP,面向对象,过程式编程 摘要: OOP简谈 ?提问 OOP是一种特殊的命令式吗? OOP的基本思想是什么? OOP到底好在哪里? OOP将要一统天下吗? 过程式编程与OOP在设计理念上有什么差异? :讲解 短憩之后,引号迫不及待地问:"面向对象的范式应该是一种特殊的命令式吧?" "面向对象?"冒号咕哝着,"姑

冒号和他的学生们(连载9)——泛型范式

泛型范式 算法是脊,数据是肉:思想是鸡,结论是蛋 --题记 冒号重新开讲:"你们会不会经常遇到这种情景:一遍又一遍地写着相似的代码,有心将其归并,却因种种原因无法践行." 逗号心有戚戚焉道:"是啊,有时明明两个函数的实现几乎一模一样的,就因为某些参数不匹配,无法合而为一." "有一种编程范式可以解决这个问题,它打破了不同数据结构之间的壁垒,让你的代码不再臃肿,这--就是泛型编程."冒号的语调和说辞不免令人联想到电视上的减肥广告,"Gen

冒号和他的学生们(连载1)——开班发言

开班发言 授人以鱼不如授人以渔 --古语 冒号开了个程序员提高班,今天迎来了首期学员,他们是问号.句号.逗号.引号和叹号,皆为IT业的新兵.望着台下洋溢着青春与渴望的脸庞,冒号开始了他的开班发言-- 大家好!先自我介绍一下,本人姓冒名号字解之.诸位不必叫我老师,就叫老冒好了.比在座各位痴长几岁,"老"是担得的,"师"却不敢妄言.在下编程多年,自觉小有所成,不敢专藏,特开此班与众共享.虽系一家之言.一孔之见,若能抛砖引玉,又何惧方家之哂?疏谬之处,还望海涵斧正,不致自

冒号和他的学生们(连载2)——首轮提问

首轮提问 敬畏老师莫如敬畏真理 --题记 众人面面相觑,一阵沉默后开始窃窃私语,显然有些不太习惯这种教学方式--笔记本上还没写两个字呢,老师就把球给踢回来了. 冒号也不说话,只是微笑地望着大家. 还是问号打破僵局,开始发问:"老师--" 冒号扬手打断他:"这里没有老师,唯一的老师是你自己.本班的一个特色是:师生角色模糊,大家自主学习,相互启发,教学相长." 问号顿了顿:"老冒--"全班哄堂大笑,"学软件开发,当然得先学语言,计算机语言这

冒号和他的学生们(连载27)——接口服务

27.接口服务 律己宜严,待人宜宽 --<洪应明·菜根谭> 叹号幡然反省:"以前我们做OOP编程时,总是专注于如何利用其他类来解决问题,而较少考虑自己设计的类对其他类的影响." 引号翻开以前的笔记:"前面提过,OOP的世界是民主制的,所有对象都是独立而平等的公民,有权利寻求服务,也有义务提供服务.看来我们是光惦着权利而忘了义务了." 冒号继而提出:"作为服务的提供者,最重要的是讲诚信.首先,服务要有可靠性,不能阳奉阴违--即接口必须履行它的承诺

冒号和他的学生们(连载26)——访问控制

26.访问控制 夫轻诺必寡信,多易必多难 --<老子·德经> 问号提问:"信息隐藏是否专指用private来控制访问?" "这正是我们的下一个焦点."冒号微颔,"访问修饰符(access modifier)除了可以应用于类成员外,在Java和C#中还能应用于整个类.public类自然是公开的,而缺省的类在Java 和C#中分别仅对同一package和assembly开放." 逗号不觉有异:"这有什么讲究吗?" &q