面向过程与面向对象的本质区别
一位计算机界的大师曾说过,“我认为,面向对象的目标从来都不是复用和扩展,而是提供一种处理复杂问题的方法”。
面向过程讲究自顶向下逐步求精。找到一个系统的入口然后顺藤摸瓜,分析出每一步以及影响这一步的其他因素,我们就能够定义这个系统。
面向对象认为世界是有很多对象组成的,各个对象之间相互独立,平时并没有什么关系。在某些外力的作用之下对象之间相互协作,表现出一定的行为,最终塑造了这个复杂的世界。面向过程和面向对象都是人们认识和了解这个世界的手段和方法,并无优劣之分,只有是否适用之差别。
面向对象和面向过程的最根本区别就是提供了一种新的认识和了解复杂系统的方法。面向对象有一个术语:抽象层次。比如对一辆汽车来说,从整体上来看,它是由底盘、悬挂、发动机、变速箱、外壳等部件组成的。而从发动机这个抽象层次来看,它是由活塞、曲轴、连杆、火花塞、油底壳、缸壁等组成。不同的抽象层次上会有不同的认识。通过不断变换抽象层次,我们能对系统有个更好的认识。在每个层次上我们只需要关心当前层次上的对象和它们之间的交互。其他层次上的东西,与本层次无关。这样带来的好处是:无论出于哪个层次上,我们都面临有限的对象和复杂度,从而可以更专心的了解这个层次上的对象是如何工作的。通过不断分离关注点,达到降低复杂度的目的。
抽象层次的另一个好处就是更换低层次的零件不会对高层次进行影响。比如,更换全新的发动机之后不会导致汽车无法行驶,更换火花塞之后不会导致发动机无法运转。低层次的信息对高层次隐藏,高层次不知道也不想知道低层次的零件如何工作。
回到大师的话,面向过程需要分析出整个系统的所有细节,当系统规模足够复杂,复杂到了超越其处理能力,使用结构化程序设计常常有无处下手的无力感。采用面向对象方法,引入了有个抽象层次的概念,我们就能通过不断提升抽象级别来构建更大更复杂的系统。
抽象层次越高,具体信息越少,细节也就越少,也就越容易理解。而抽象层次越低,具体信息越多,细节也越多。细节越多越容易陷入枝枝叶叶的泥潭而无法自拔。一旦超越人脑的处理极限,就很难去理解了。人们认识事物总是习惯从表面到本质,由表及里的一步步去分析。刚认识一件事物时我们可以从外观、整体较高的抽象层次去认识,然后逐步深入。比如对一个不了解汽车的人讲汽车,我们可以从整体介绍汽车包括底盘、发送机、变速箱、悬挂等。这时我们的抽象层次是很高的。当介绍清楚之后,我们可以深入到下一个层次,比如讲发动机结构。在发动机结构讲清楚以后,我们在从力学、热学的角度讲述发动机的工作原理。这样逐步深入,结构清晰,听的人也容易理解。逐步的深入中我们的抽象层次是逐渐降低的。反过来如果上来就讲发动机工作原理,听的人必定一头雾水。上面这个由表面到机理的过程其实就是自顶向下方法。另一种方法是自底向上。先从内部、底层讲起,逐步提高抽象层次。
这两种方法都是分析、研究问题的方法。在软件开发过程中,主体上应该采用自顶向下的方法,用少量的概念抽象、概括系统,再逐步降低抽象层次,直到代码编写。同时辅以自底向上的方法,通过总结在较低抽象层次的实践经验,来改进较高层次的概念以提升软件质量。
抽象层次高了,具体信息越少,分析问题简单了,但是随之而来也会带来另一个问题:抽象层次太高。抽象层次太高具体信息太少,又会导致信息量不足。所以在面向对象的分析过程中,在适当的时候选择适当的抽象层次是十分重要的。
层次确定好了,接下来就是在该层次上进行面向对象的分析工作了。无论任何时候在同一个抽象层次上,都应当将对象看成一个不可分割的整体。无论对象的规模多么大,大到一个国家、一座工厂,只要我们认为它是对象,它与其他对象交互时就是一个整体,不能分割。这就是说的对象的原子性,一旦破坏了原子性,就表示在同一抽象层次上 的对象不具备同一粒度,就将使得分析工作陷入混乱 。
在分析工作中,应该牢记对象有一个边界,不应该打破边界去窥探对象内部。形象一点来说,对象看上去就像是一个鸡蛋,蛋壳就是鸡蛋的边界。在分析对象的过程中。对鸡蛋的所有关系都是通过蛋壳发生。如果我们试图了解对象内部的细节,就像打破蛋壳去窥探鸡蛋内部,内部一团黏黏糊糊,无从下手。
在分析过程中得到的所有对于对象的认识都是依赖于对象的边界,在实现这个对象之前不要去理会其内部细节。这被称为面向接口编程。
http://blog.csdn.net/lan_liang/article/details/6619430