在《面向对象是什么》中,说得过于抽象。看来要把问题说清楚,还得画图才行。
前面说过,由于计算机体系结构的原因,所有的编程最终都会归结为数据结构和算法,二者一阴一阳,一静一动,阴中有阳,阳中有阴,恰如太极图,映射了现实世界。
如果用形式化的方式来表示,用圆圈表示数据,用方框表示过程,则计算的过程可以如下表示:
对于过程,输入数据,处理后输出数据;
对于数据,由过程产生,又输入新的过程。
历史上曾经有过数据为主还是过程为主之争,似乎到现在也没有定论。在我看来,二者地位相等,不能厚此薄彼。
随着问题的复杂化,上述的计算过程会变得相当复杂。于是人们研究出了“结构化方法”。“结构化方法”来自屡试不爽的“模块思想”:对于复杂问题,先划分成一个个模块,再逐步细化各个模块,直到问题能够解决。结构化的思想直接产生了面向过程的编程思想。如下图:
其中,属于整个程序的数据称为“全局变量”,可以被任何函数/过程使用;
属于函数/过程内部的数据称为“局部变量”,只能在函数内使用。
面向过程的思想在最初的混乱情形下增加了一层结构,使得全局变量极大地减少;似乎这种结构根据需要迭代下去,可以解决任何问题了;而且面向过程的研究还有一项重要的成果,就是把过程抽象为顺序、循环和分支三种结构的有限次组合。
如果人的欲望是有止境的,世界将是多么美好啊!可惜不是!随着问题的进一步复杂化,面向过程的方式又不能解决问题了。这是面向对象的方法出现了。面向对象的一个关键的概念是类。所有面向对象的方法都是在类上做文章。那么类到底是什么呢?其实从上图的结构中可以看出,如果进一步把一些数据结构(不是数据)和一些函数组合起来,赋予其明确的意义,就构成了类。类体现了一种抽象,这种抽象有助于人思考问题,但是并不会有助于计算机思考问题,在计算机看来,程序还是由数据和过程组成的。所以,虽然我们按照类来思考,却要按照对象来运行程序。对象是类的实例,是实际程序中数据和函数的组合。我想这也是称之为“面向对象”而不是“面向过程”的原因吧。
面向对象的方法是把人的抽象思维中的类映射到计算机思维中的对象的一种编程方法。这种方法是向计算机解释现实世界的诸多方式中的一种。其进步意义在于:人们可以按照自己的方式来思考问题,而不必按照计算机的方式进行思考。
既然是安装人的思维方式来思考问题,就可以搞很多名堂,比如继承,组合,多态,虚函数/接口等等。这都是人们为了助于提高程序的质量,特别是提高“可复用性”与“可扩充性”想出来的办法。关于这些最基本的概念,且听下回分解。
附1:如果参考
逻辑学中概念内涵和外延的定义
,类是概念,属性和方法都是概念的内涵;对象是概念的外延。
附2:最近好像“Function Programming(函数编程)”被提得比较多,我认为函数式编程是建立了这样一种结构:
HigherFunction可以把LowerFunction作为输入和输出(甚至可以把另一个HF作为输入?)。
这种方法对过程本身进行了“运算”,可以处理复杂的问题。究竟这种方式适合处理哪些问题,呵呵,我没有研究过。
本人的最新博客迁移到http://thinkinside.tk,使用GitHub Pages建立。我会陆续将所写的文章迁移过去,并进行补充和修正,
欢迎过来围观。