面向对象发源于挪威奥斯陆计算机中心所设计的SIMULA。这个语言的目的在于设计一种可以用它进行分析作业而不只是计算作业的语言。所以说关于函数式编程与命令式编程的争论可以休矣。因为问题域不同,解决方案自然不同。并有除此两种以外,现存的或将来还可能会有更多种类的编程语言。虽然底层机器变化的可能性不太大,但建在其上的语言必将随着需求的改动或发展而变化。甚至到达一定的程度,硬件也要变。
这里面的一切,都植根于计算机的本质-形式化。
硬件是形式,软件也是形式,一切都是形式。
奥斯陆计算机中心设计这个东西是为了使用它进行主体演绎。你说没有它行不行,当然可以。你可以这么想,即使有了它,编译完成的代码放在机器上仍然是一样的,对于机器来说一切都没有变化,仍然是指令。但是有了它,人们便有了一种非常便利的形式化工具。
而形式化工具,是相对于人类本身来说的。比如数学就是一种最典型的形式化工具,但是数学它本身存在吗?它不存在。它并不存在于物理世界中,它只存在于人类的脑海中。对象也一样,并且同理可以推理过程。
再有就是关于面向对象本身的定义。关于面向对象的定义非常多,这里不可能讨论完我也不知道那么多所以就拿两个来说:
1,OBJECT ORIENTED PARADIGM;
2,OBJECT ORIENTED SYSTEM。
这个维基上面定义很清楚,PARADIGM是指一种范式,典范或者说即存的东西。它的语义是描述性的,非逻辑的。所以当说“面向对象范式”的时候,它没有任何逻辑上的暗示或分类的意义。它的意思是,这是现状。因此不能用来作逻辑讨论。唯一值得讨论的是ORIENTED。
ORIENTED有两个意思:一是方向,二是被动语态。即以...作方向。与OBJECT连 起来的意思就是以对象作方向。这个意思很清楚是吧,它的直译并不是面向对象,而是对象导向。所以说台湾的翻译比较准确。但同样地很容易引起歧“视”。其实其真正的意思是以对象作基本思路或者说基础认识观,也可以说是一种认知哲学。
也就是说,你使用对象作为你的认知基础。当然也是一种形式化基础。像前面提过的,程序都是形式,问题是你选择怎么形式化你的问题,你的问题域,你的解,以及你的解域。
关于问题域的理论,我认为这个不能太绝对。甚至问题我也不想太肯定。因为我觉得作为一种形式化手段,OBJECT ORIENTED具有独立的意义,它不需要其它的东西作陪衬。
形式化手段,有它本身的价值。它并不一定只能用来解决问题。它可以用来做很多东西,比如前面一开始说到的“分析作业”,或者用我的话说就是主体建模,或者其它可能应有到的场合。
这就象锤子一样,它不一定为砸东西而存在。它也不一定为问题而存在。它可以独立存在。比如,一个锤子必然具有一定的硬度,这个跟它的问题域其实已经不完全相关或完全对应。比如一个锤子必然占有一定的空间,这个也是可以用在其它地方而非问题域的。比如我就觉得它好看要收藏它,这样就不是问题域了吧。是不是。
所以说,关键还是形式化。
为什么面向对象这么难理解,就是因为学界没有从根本上解决过它的理论定位问题。甚至程序也一样,语言也一样。都没有进行过严肃的理论定位。即,它们到底是什么东西。
那么现在清楚了,面向对象主要是一种形式化手段,同样地可以应用于面向过程,或面向XX,YY,ZZ。都无所谓。都有意义。只要你STICK住形式化这个概念。因为一旦离开这个概念,一切就都将变得盲然。
是的,它必须依赖于人的系统而存在。一旦离开人的系统,它就不再有任何意义。而且这一点并不是什么很奇怪的事情,因为一切都是依赖于人的系统的。面向对象与它们之间的唯一区别就是,它是工具性的。它不是直接的价值系统,它是一个工具性的系统,它是通过其工具性体现它的价值的。
这是本博关于面向对象本身的最后一论,并不代表它是关于面向对象的最后一论。因为关于形式化理论以及面向对象开发方法,还是我的处女地。所以以后会陆续关于这两个主题的文章。但是关于面向对象本身,这就是最后一课。结论。