第二课 重要范式(3)
2.3 对象范式——民主制社会的编程法则
民为贵,社稷次之,君为轻 ——《孟子·尽心下》
关键词:编程范式,OOP,面向对象,过程式编程
摘要: OOP简谈
?提问
OOP是一种特殊的命令式吗?
OOP的基本思想是什么?
OOP到底好在哪里?
OOP将要一统天下吗?
过程式编程与OOP在设计理念上有什么差异?
:讲解
短憩之后,引号迫不及待地问:“面向对象的范式应该是一种特殊的命令式吧?”
“面向对象?”冒号咕哝着,“姑且称之为OO或对象式吧,既不标新立异,也不以讹传讹。在回答你的问题之前,请先回答我的:什么是OOP?”
引号应答如流:“OOP(Object-Oriented programming)是一种计算机编程模式,它以对象作为问题空间的基本元素,利用对象和对象间的相互作用来设计程序。所谓对象,是实际问题中实体的抽象,具有一定的属性和功能。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)[1]。” 冒号纠正道,“至于OOP是否会一统天下,答案是否定的。首先,与能独当一面的三类最基本的范式不同,纯粹的OOP是不存在的[2],必须结合其他范式;其次,世上没有包治百病的万灵丹方,OOP也不例外。用软件业的行话来说:没有银弹(No silver bullet)[3]。OOP最适用于大型复杂的、交互式的、尤其是与现实世界密切相关的系统,但在小型应用、数学计算、符号处理等方面并无优势。需要指出的是,语言和范式的流行,与大公司支持和商业推动是密切相关的。有人说OOP其实是MOP(Money-Oriented Programming),即以金钱为导向的。虽有过激之嫌,但有经验的股民都知道,有主力运作的股票总是涨得快一些的。当然OOP能流行,自有独到之处,谁能说说它到底好在哪里?”
逗号抢答:“OOP能提高软件可重用性、可扩展性和灵活性。”
冒号反问:“为什么过程式编程的可重用性、可扩展性和灵活性就差呢?”
感到来者不善,逗号有点发虚:“因为OOP具有信息隐藏、继承和多态的特征。”
冒号并不买帐:“首先,将可重用性、可扩展性和灵活性与OOP划等号,是只见树木,不见森林——那是所有范式和语言的共同目标。其次,以C语言为例,信息隐藏可用关键字static来实现;继承可用合成( composition)来代替;多态虽然困难些,也有变通之法。更何况这些只是手段而非目的,只要设计合理,C程序同样具有可重用性、可扩展性和灵活性,性能效率还更优越。即使在OOP日益风行的今天,C的占有率始终稳踞前列,许多大型复杂软件如操作系统、数据库等仍以C为主,这足以证明其仍堪大用。”