写在前面
看的网上教程出的简答题,简单记录一下。参考资料如下:
基本概念
1.面向过程 procedure oriented programming POP
以事件为中心的编程思想。就是分析出解决问题所需的各个步骤,然后用函数把这些步骤按顺序实现,并按顺序调用。
特性:模块化 流程化
2.面向对象 object oriented programming OOP
把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。
特性:抽象 封装 继承 多态
实例参考
以五子棋游戏为例。
面向过程的设计思路就是首先分析问题的步骤:
- 开始游戏,
- 黑子先走,
- 绘制画面,
- 判断输赢,
- 轮到白子,
- 绘制画面,
- 判断输赢,
- 返回步骤2,
- 输出最后结果
把上面每个步骤用不同的方法来实现。
面向对象的设计则是从另外的思路来解决问题。整个五子棋可以分为:
- 黑白双方,这两方的行为是一模一样的,
- 棋盘系统,负责绘制画面,
- 规则系统,负责判定诸如犯规、输赢等。
第一类对象(玩家对象)负责接受用户输入,并告知第二类对象(棋盘对象)棋子布局的变化,棋盘对象接收到了棋子的变化就要负责在屏幕上面显示出这种变化,同时利用第三类对象(规则系统)来对棋局进行判定。
如果要加一个悔棋功能,面向过程则需要改动很多地方,黑子撤回棋,棋盘变化,然后载绘制,再判断,可能很多要变化;随着功能的越来越多,系统无法应付功能需求的规则的复杂而膨胀,最终导致奔溃;但是面向对象只需要得到悔棋命令后,绘制棋盘系统将棋盘重新绘制,调用规则系统判定即可,减少了大的改动;保证了面向对象程序的可扩展性;
所以从上可以看出,面向对象是以功能来划分问题,而不是步骤。面向对象会从宏观的角度思考要解决的问题,将问题抽象成一个系统,进而分析系统中相互作用的各个对象,将问题的解决看做的系统中的对象相互作用的结果。而面向过程则更加“直截了当”,聚焦于某一个特殊问题的解决,用编程语言实现解决问题的方法步骤。
简言之,面向过程,效率更高;面向对象,通用更好。
对比的优缺点
1.面向过程
优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源,比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发,性能是最重要的因素。
缺点:没有面向对象易维护、易复用、易扩展
2.面向对象
优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护
缺点:性能比面向过程低
具体而言的区别
1、出发点不同
面向对象方法是用符合常规思维的方式来处理客观世界的问题,强调把问题域的要领直接映射到对象之间的接口上。
面向过程方法则强调的则是过程的抽象化与模块化,它是以过程为中心构造或处理客观世界问题的。
2、层次逻辑关系不同
面向过程的方法则是用计算机逻辑来模拟客观世界中的物理存在的,以对象的集合类作为处理问题的单位,尽可能地使计算机世界向客观世界靠拢,以使问题的处理更清晰直接。
面向对象方法是用类的层次结构来体现类之间的继承与发展。面向过程方法处理问题的基本单位是能清晰准确地表达过程的模块,用模块的层次结构概括模块或模块间的关系与功能,把客观世界的问题抽象成计算机可以处理的过程。
3、数据处理方式与控制程序方式不同
面向过程方法是直接通过程序来处理数据,处理完毕后即可显示处理的结果,在控制方式上是按照设计调用或返回程序,不能自由导航,各模块之间存在着控制与被控制,调动与被调用的关系。
面向对象方法将数据与对应的代码封装成一个整体,原则上其他对象不能直接修改其数据,即对象的修改只能由自身的成员函数完成,控制程序方式上是通过“事件驱动”来激活和运行程序。
4、分析设计与编码转换方式不同
面向过程方法强调分析、设计及编码之间按规则进行转换贯穿于软件生命周期的分析、设计及编码中,实现的是一种有缝的连接。
面向对象方法贯穿于软件生命周期的分析,设计及编码中,是一种平滑过程,从分析到设计再到编码是采用一致性的模型表示,即实现的是一种无缝连接。
二者不是完全对立
面向过程与面向对象不是完全对立的,不是在编程的时候必须要选择某一种思想作为唯一的。实际问题的解决中,往往是要首先对问题进行分析,建立模型,构建系统,设计对象,具体进行类的设计,这都是面向对象的思想的体现。而具体到类的设计过程中,具体到类的某一种方法的实现,还是需要面向过程的思想来参考的。