前面一篇文章探讨了C++、OC以及C语言之间的关系,其中C++和OC作为面向对象的程序设计语言,而C作为面向过程的设计语言。或许我们的脑海中隐隐出现到底什么是面向过程设计,什么是面向对象设计呢?
其实这个问题,可以认为是一个哲学的问题。我个人问题,两者之间的区别就类似与到底机器人与人的差别的什么呢?机器人就是按照某种规则在做事情,而人就是在规则的指导下会加上自己的思维,从而以一种更加智能化的方式去处理问题。从这里可以看出,面向过程设计是一种按照固定的思维,以事物为中心,按照事物发展的时间顺序或者是逻辑顺序来完成某个任务;而面向对象设计则是按照人的思维,强调直接以现实世界中的事物为中心来思考问题、认识问题,并根据这些事物的本质特征和要解决的问题实际语境,解决问题。简而言之,面向过程设计只是简单的处理问题,而面向对象设计语言不仅要处理问题,还要强调思考问题、认识问题。下面列举出两种程序设计思想的差异:
1.面向过程是是一种以过程为中心的编程思想,其思想体现在:
- 是一种最基础的方法,考虑的是实际的实现。
- 认为一个系统应该划分为数据和功能,并且数据和加工数据的功能是分离的。
- “面向过程”也可称之为“面向记录”编程思想,他们不支持丰富的“面向对象”特性(比如继承、多态),并且它们不允许混合持久化状态和域逻辑。
- 分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了,即面向过程最重要的是模块化的思想方法。
2.面向对象主要是把事物给对象化,它的思想体现在:
- 包含了面向过程的特征,是一种更高级的解决问题的思路——从现实世界中的客观对象出发,尽量运用人类的自然思维方式(如抽象和分类)来构造软件系统
- 摒弃了数据和功能独立的特点,而是定义为一组正在交互的对象。对象可以完成一些事情(即功能,具体实现表现为类方法),也知道一些事情(即数据,具体实现表现为属性)
- 用对象的属性表示事物的静态特征,用对象的方法来表示事物的动态特征
- 运用人类的思维对事物进行分类
- 类具有封闭性,即把类内部的属性和服务隐藏起来,只有公共的服务对外是可见的
- 复杂的对象可以用简单的对象作为其构成部分(聚合的思想)
- 对事物进行分层,采用继承的思想对事物一般化和特殊化
- 对象之间通过消息进行通信,来实现对象之间的动态联系(消息机制)
从上面的思想可以看出面向对象的三大基本特征:
- 封装:把客观事物封装成抽象的类。类包含数据和方法,封装即只让可信的类或者对象操作,对不可信的类进行信息隐藏。通过接口,类隐藏其中的属性和方法的具体实现。
- 继承:按层分类的概念。继承实现了子类和父类:子类可以使用父类的所有功能,并且对这些功能进行扩展。继承的过程,就是从一般到特殊的过程。
-
多态:同种事物,多种状态,即同一个接口名称,但是体现为不同的功能。多态有两种方式:覆盖和重载。覆盖是指子类重新定义父类的方法,而重载是指同一个中允许存在多个同名方法,而这些方法的参数不同(或者是参数个数不同,或者是参数类型不同,或者两种都不同)。
说了这么说,还是借用百科中的例子来说明两者的差异吧!
学生早上起来的事情来说说这种面向过程吧.粗略的可以将过程拟为:
(1)起床
(2)穿衣
(3)洗脸刷牙
(4)去学校
那么面向过程设计的思路为,将四个过程分为四个子程序,然后在主程序中按照这四步一步步的顺序调用子程序完成即可。而如果是用面向对象的方法的话,可能就只抽象出一个学生的类,它会包括这四个方法,但是具体的顺序就不需要体现出来。
如果学生又可分为文科生、理科生的话,他们的上课科目不一样。那么面向过程就需要重新分情况来设计子模块,使得维护成本大大增加。而面向对象设计则在重用学生类的基础上只需要采用将学生类特殊化为理科生和文科生,可扩展性和维护性较高。
从这个例子中可以看出,面向对象的代码更加支持重用,能降低软件开发和维护的成本,提高软件的质量。因此面向对象在实际的软件设计中应用广泛——这就是思维高度发展的必然趋势吧!