面向过程
分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。
面向对象
是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描述某个事物在整个解决问题的步骤中的行为。
例如五子棋
面向过程的设计思路就是首先分析问题的步骤:1,开始游戏,2,黑子先走,3,绘制画面,4,判断输赢,5,轮到白子,6,绘制画面,7,判断输赢,8,回到步骤2,9,给出结果。把上面的每个步骤用分别的函数来实现,问题就解决了。
而面向对象的设计是从另外一个思路来解决问题。整个五子棋分为1,黑白双方,这两方的行为模式是一样的,2,棋盘系统,绘制画面,3,规则系统,用于判定诸如犯规,输赢等。第一类对象(玩家对象)负责接收用户的输入,并告知第二类对象(棋盘对象)棋子的布局变化,棋盘对象接收这种变化就要负责绘制出这种变化,同时利用第三类对象(规则系统)来判定棋局的输赢。
功能上的统一保证了面向对象设计的可扩展性。例如如果要加入悔棋功能,如果要改动面向过程的设计,那么从输入,到显示,到判定的每一个步骤都需要改动,甚至顺序也要改动。如果是面向对象的话,只需要改动棋盘对象就可以了,棋盘对象保存了黑白双方的棋谱,简单回溯就可以了,而显示和规则判断则不用顾及,同时对整个对象功能的调用顺序没有变化,改动是局部的。
再比如我要把一个五子棋游戏改成围棋游戏,如果是面向过程,那么五子棋的规则就分布在了你程序的每个角落,要改动还不如重写。如果你当初是面向对象的设计,那么只需要改动规则对象就可以了,五子棋和围棋的区别不就是规则的不同吗?而下棋的大致步骤从面向对象的角度来看没有任何变化。