`
庄表伟
  • 浏览: 1138621 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

敲响OO时代的丧钟!——面向对象的哲学破绽(2)

阅读更多

  2、形而上学

  当我写下这个标题的时候,内心无比惶恐。这么大个题目,是我这个半路出家,Google成才的家伙能够谈论的吗?多少哲学家一辈子“皓首穷经”,也不过就是研究个形而上学啊。

  当初,维特根斯坦去找罗素,问到:“你看我是不是一个十足的白痴?”罗素不知他为什么这样问,维特根斯坦说:“如果我是,我就去当一个飞艇驾驶员,但如果我不是,我将成为一个哲学家”。可见哲学这东西,只有真正的天才才有能力去研究它。

  还好,我并不是要研究形而上学,我只是要研究面向对象背后的形而上学哲学基础。
  我也不是要证实这个哲学基础的正确性与适用性。我只需要证明“面向对象背后的那个形而上学基础是不正确的、是不适用于软件开发的。”

  面向对象的两大核心概念是:“对象”与“类”。“一切皆是对象”是由朴素原子论而来的。“万物皆有类属”就是由亚里斯多德的形而上学来的。

  对于亚里斯多德的形而上学理论不熟悉的朋友,可以即时补课,中国人民大学哲学系的《西方哲学史》有好几节专门讲这个方面:《亚里斯多德的实体论I》、《亚里斯多德的实体论III》。还有就是到Google上去专门搜一下亚里斯多德的逻辑学说,看完以后,咱们回来接着说。

  咱们用自己的话说一下:“种”、“属”、“属差”以及“定义”这几个概念。

  种:是一个大的概念,假设已经预先定义好了的。
  属:所有属于某一种的概念,都是那一种下面的属。
  属差:同属一种的、同一级别的属之间的差别,或者说个性。
  定义:通过种加属差,可以定义一个属的概念。

  举例说明:人是二足直立动物。人是一个需要被定义的属,动物是人之所属的种,二足直立是人作为动物的共性之外,拥有的个性,也就是属差。

  懂得初步的面向对象编程的同志们,你们都看出来了吧,大多数OO语言也是这么定义类的。你定义一个Animal,再用Person去继承Animal。在Animal里有一些属性与方法,在Person里再加一些人所特有的。很多很多的面向对象的教科书里,甚至就是直接用这个定义来举的例子。

  问题出在哪里?或者有人会问:“这样有什么不对吗?”

  我们可以通过“种+属差”来定义一个新的属吗?定义成立的前提是什么?先要有种的定义。然后才可能有属的定义。种的定义又是哪里来的呢?在一个种的概念之上,必然存在一个更普遍的种,一个更大的范畴。在亚里斯多德来说,在所有的种之上的种是“存在”,而存在是无法被定义的。而在面向对象的哲学里,即使是这一个最基本的哲学困境也被忽略了,无法被定义的概念,被代换为无需由程序员定义的概念(Object)。属差的区别在哲学家看来,是本质的,是基于深刻认识才能提出的。而在面向对象的哲学里,种的共性就是基类所定义的“属性与方法”,而属的个性,就是对于基类的扩展。“种+属差”变成了“公用代码+扩展代码”。

  当概念定义这样一个“问题域的描述手段”,演变成“减少重复代码原则”之后。Class继承的概念就越发的模糊不清了。我们来总结一下:

  1、面向对象原本声称的描述真实世界的目标,采用的工具却是朴素的“种加属差”的方式。
  2、面向对象分析中,发现具体的对象还算是容易的,发现“种”的概念却是困难的。
  3、在实际应用中,种概念的发现与定义,被偷换为公共代码的抽取。
  4、由于基类的定义的随意性,导致子类不但可以扩展基类的行为与特性,还可以覆盖(改变)基类的行为与特性。
  5、由于哲学概念的与开发概念的混淆,使得在OO领域IS-A、Has-A、Like-A成为最为绕人的概念。

(哲学讨论到此结束,未完待续)

分享到:
评论
2 楼 xiaomin98 2009-04-20  
你的文章里说到一些面向对象的问题。比如说发现“种”的概念却是困难的,还有面向对象的概念比较绕等等。但是你的文章只破不立。让人感觉是为了批评而批评。看过食神,说完人家的菜做得不好以后。总得做个好菜给大家尝尝吧。否则你不还是得吃那不好吃的菜吗?这对软件从业者有什么帮助吗?
1 楼 xiaomin98 2009-04-20  
没看出来这篇文章的意义何在。面向对象只是一个统一的说法,并不是一个很精确的东西,它肯定是不完美的。但是,“面向对象背后的那个形而上学基础是不正确的、是不适用于软件开发的。”这句话不知从何说起。面向对象对软件开发的贡献是毋庸质疑的。smalltalk的发明人(也是面向对象概念的发明人)因此获得图灵奖,他说,当初发明这种语言和alto系统(图形界面)只是为了让儿童能更方便的使用电脑,但是没有想到面向对象获得如此大的发展。仅此而已。

相关推荐

Global site tag (gtag.js) - Google Analytics