编程思想|深入理解面向过程与面向对象的区别
1 从抽象的角度去理解面向过程与面向对象:
2 从模块化的角度去理解面向过程与面向对象:
3 面向对象是面向过程的更高一层次的抽象:
4 用表格总结一下面向过程与面向对象的区别:
5 从数据约束的角度去理解
上图也可以清晰地看到
5.1 面向过程:子模块的树状结构,子模块与数据之间的耦合关系。
5.2 面向对象:子模块(类)之间的图状结构,数据耦合在类内作为数据成员。
数据与函数的耦合:
6 从代码的结构去理解:
附表格:
sn | 理解角度 | 面向过程 | 面向对象 |
0 | 共性 | 都有模块分解、抽象、封装,都有面向接口、高内聚、低耦合的要求 | |
1 | 模块抽象与分解的对象 | 任务或问题域中的动词 | 任务或问题域中的名词 |
2 | 模块逐级分解后的组合结构 | 树型 | 图型 |
3 | 数据与子模块的关系 | 分离 | 封装 |
4 | 面向接口与ADT | 用头文件去描述模块封装后的接口或ADT | ADT直接用类描述 |
5 | 模块分解方式 | 自顶向下 | 自底向上 |
6 | 模块的颗粒度 | 相对较小 | 相对较大 |
7 | 代码复用 | 有代码复用 | 更好 |
8 | 约束思想 | 约束代码指令方向(结构化控制语句形成一个入口一个出口结构) | 约束数据作用域(类作用域) |
9 | 高内聚、低耦合 | 完成一个功能的代码内聚为一个函数 | 处理相同数据对象的多个函数与其处理的数据对象一起内聚为一个类 |
10 | 分类 | 处理相同数据对象的多个函数放到同一个头文件中,如stack.h | 函数的二次分类,将处理相同数据对象的多个函数聚合成一个类,如stack类 |
11 | 抽象层次 | 相对低一层 | 相对高一层 |
12 | 编译 | 一一对应汇编代码 | 编译拆解封装,类拆解为结构,函数添加结构为参数,两者都有类作用域 |
13 | 代码扩展和维护 | 需求变动,功能改变,不容易扩展 | 容易扩展,新建子类,重写虚函数即可 |
14 | 类比产品生产 | 按工艺流程生产一个产品 | 按部件组装一个产品 |
15 | 适应性 | 天然适合流程性强的小问题(如嵌入式) | 天然适合模块性强的大系统,接口很重要(面向接口编程)。 |
16 | 实例1:人吃饭 | eat(person, rice); | person.eat(rice); |
17 | 实例2: | bool push(冰箱,大象); | 冰箱.open(); |
-End-