先来看生活中的一个例子。
想必每个人都下过五子棋吧?在下棋的整个过程中可以有两种不同的思路来实现:
1、按步骤来看:
(1)、开始游戏,(2)、黑子先走,(3)、绘制画面,(4)、判断输赢,(5)、轮到白子,(6)、绘制画面,(7)、判断输赢,(8)、返回步骤(2),(9)输出最后结果
2、按组成模块来看:
(1)、黑白双方模块,(2)、棋盘模块,(3)、规则模块
以上两种完全不同的设计思路,正好对应于编程中完全不同的两种思想:前者侧重于游戏步骤的设计,对应于编程中的面向过程思想;后者着重于分层,有模块化设计理念,对应于编程中的面向对象思想。可以很明显地看出:面向对象是以功能来划分问题,而不是步骤。同样是绘制棋局,这样的行为在面向过程的设计中分散在了多个步骤中,很可能出现不同的绘制版本,因为通常设计人员会考虑到实际情况进行各种各样的简化。而面向对象的设计中,绘图只可能在棋盘对象中出现,从而保证了绘图的统一。
C语言是典型的“面向过程”设计语言。面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。“面向过程”是一种以过程为中心的编程思想。“面向过程”也可称之为“面向记录”编程思想,它们不支持丰富的“面向对象”特性(比如继承、多态)。如下图:
JAVA是典型的“面向对象”设计语言。“面向对象”是一种以事物为中心的编程思想。是把构成问题的事物分解成各个对象,建立对象的目的不是为了完成某一个步骤,而是为了描述某个事物在整个解决问题的步骤中的行为。如下图:
面向过程适合于一个人的小量工作,而面向对象更侧重于团队合作,需要很多人完成的大量工作。面向过程思想是我们每一个人天生具备的。在编程时,我们总会不自觉的去考虑怎么来完成某一需求,分析出具体的步骤,然后按照步骤来一步步实现。但是在现实生活当中,并不是每一件事都可以自己独立来完成,我们需要团队,需要合作才可以完成某一项复杂的工作。这样来看的话,面向对象思想似乎更符合人们的做事方式,也更生活化。是的呢,不管是生活中,亦或是编程中,面向对象才是我们更应该具备的一种思想,先来看几组概念。
对象:对象是人们要进行研究的任何事物,从最简单的整数到复杂的飞机等均可看做对象,它不仅能表示具体的事物,还能表示抽象的规则、计划或事件等。
类:具有相同特性(数据元素)和行为(功能)的对象的抽象就是类。因此,对象的抽象是类,类的具体化就是对象,也可以说类的实例化是对象,类实际上就是一种数据类型。
面向对象三大特征:封装、继承、多态。
封装:封装是一种把代码和代码所操作的数据捆绑在一起,使这两者不受外界干扰和误用的机制。封装可被理解为一种用作保护的包装器,以防止代码和数据被包装器外部所定义的其它代码任意访问。
继承:继承是指一个对象从另一个对象中获得属性和方法的过程。它支持按层次分类的概念,如果不使用层次的概念,每个对象需要明确定义各自的全部特征,通过层次分类方式,一个对象只需要在它的类中定义使它成为唯一的各个属性和方法。
多态:多态是指同一个实体同时具有多种形式。同一操作作用于不用的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的引用,来调用实现派生类中的方法。
面向过程
优点:性能比面向对象高。
缺点:没有面向对象易维护、易复用、易扩展。
面向对象
优点:易维护、易复用、易扩展。由于面向对象有封装、继承、多态性的特征,可以设计出低耦合的系统,使系统更加灵活,更加易于维护和扩展。
缺点:性能比面向过程低。