欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-07-16 17:04:04
...

  2、形而上学

  当我写下这个标题的时候,内心无比惶恐。敲响OO时代的丧钟!——面向对象的哲学破绽(2)
            
    
    
        OOGoogle编程Smalltalk 这么大个题目,是我这个半路出家,Google成才的家伙能够谈论的吗?多少哲学家一辈子“皓首穷经”,也不过就是研究个形而上学啊。

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

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

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

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

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

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

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

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

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

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

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

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

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