
1.1 面向过程和面向对象
1.1.1 两种分析问题的思维方式
设计程序是为了解决问题,而分析问题所采用的思维方式不同,将会导致编码方式的不同。面向过程和面向对象是目前主要的两种思维方式。我们先通过一个例子来初步了解一下。
例子:张三使用洗衣机洗衣服。
1)从面向过程的思想来看,张三先打开洗衣机的电源,打开洗衣机盖子,放衣服进去,洗好后关闭电源。
2)从面向对象的思想来看,张三告诉洗衣机自己要洗衣服,“洗衣机.打开电源”,“洗衣机.打开盖子”,“洗衣机.放衣服进去”,“洗衣机.关闭电源”。
对上面洗衣的过程做一个比较如下(见图1-1)。
面向过程:张三是主体,需要完成一系列操作洗衣机的动作,如接电源、打开盖子⋯⋯;
面向对象:洗衣机是主体,它就像是一个写好代码的机器人,张三只需要提出自己的要求,洗衣机会主动地打开电源、打开盖子⋯⋯。
由上面的例子可知,面向过程和面向对象本质上都是可以解决问题的,相对而言,面向过程主要关注的是解决问题的每个步骤,面向对象会显得更为方便些,可直接使用某个对象(如洗衣机)提供的功能,当然,前提条件是对象事先已具备了这些功能。

图1-1 面向过程和面向对象分析问题的比较
1.1.2 两种程序设计方法
面向过程的程序设计方法,是针对解决问题的一系列步骤,编写相应的一系列函数来完成,且每个函数又通过基本程序结构(顺序、选择和循环结构),来描述对数据的操作。因此,这种程序设计方法,是以功能为中心来设计函数,但函数和对其操作的数据是分离开来的。
面向对象的程序设计方法,是先提炼数据,再编写一系列操作这些数据的函数,并将函数与其操作的数据有机地组装在一起,作为一个整体来处理。所以,这种方法是以数据为中心来描述系统的,相对而言,数据较功能更具稳定性,程序也就更加易于维护。
由于面向过程的程序设计结构与问题的解决流程相对应,所以,整个程序的执行控制流程也是由预先确定的顺序来决定的;而面向对象程序在运行时,是根据用户的实际需要,去触发相应的函数执行,如洗衣机打开电源后,可以多次或多人去洗衣服(即多次放衣服进去),最后再关闭电源,因此,这种方法更符合实际需要。
下面再通过使用上述两个方法设计“五子棋”游戏(见图1-2),进一步了解各自的特点。

图1-2 面向过程和面向对象分析五子棋游戏的比较
有人形象地将面向过程和面向对象程序方法分别比喻为蛋炒饭和碟头饭(盖浇饭),蛋炒饭是所有材料味道融为一体,你要么接受这种混合味道,要么放弃,无法改变部分;而碟头饭是由饭、菜拼放一起,各自独立,你可以只要部分,还可以再加些什么。显然,面向对象中“各司其职”的特点,使得其可扩展性强,比如,“五子棋”要加入悔棋功能,面向过程的设计中的2~7步都必须修改,甚至调用顺序也要调整;而面向对象的设计中,只要修改棋盘对象,根据棋谱回溯一下即可,其他不变。
表1-1对面向过程和面向对象进行了比较,也让我们有了更全面的认识。
表1-1 面向过程和面向对象比较

总之,面向过程是分析得到解决问题的步骤,然后用函数把这些步骤逐个实现,使用的时候逐个依次调用。面向对象是把构成问题的事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题步骤中的行为。它们都遵循将问题分解再解决的基本原则,但对问题的思考、处理方式以及编码实现却迥然不同,不能简单地评判孰优孰劣,而是要从实际出发,考虑系统规模、应用领域、扩展需要、执行效率等方面,选择适用的方法,或是结合起来运用,以达到最佳开发效益的最终目标。