编程思想|深入理解面向过程与面向对象的区别

createh53个月前 (01-06)技术教程39

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();
冰箱.push(大象);
冰箱.close();
视角是冰箱,冰箱可以做什么。

关注的是数据(主体),这些数据可以做什么?以及一种数据上的抽象(类),比如对象由数据和行为(接口)构成,而对象本身也是一种数据,所以无论抽象、继承、封装其实都是针对的数据,因为行为也是数据的一部分。

-End-

相关文章

Java快速处理图片的方式(总结)

我们处理处理图片常见的一些处理操作有:生成图片缩略图(等比例缩放、指定图片大小缩放、按比例绽放)、裁判图片、旋转图片、给图片添加水印(文字水印、图片水印)、批量处理图片、水平翻转图片、图片转成黑白。今...

Android中TextView显示圆圈背景或设置圆角的方法

给TextView添加背景,或者是给TextView添加添加边框,以及怎么样设置TextView的形状。怎么在java代码部分设置TextView的背景,和TextView的形状及边框。方法如下:怎么...

页面绘制的来龙去脉

一、概述1.Android 中,用户编写的应用程序(Client)测量和计算布局,SurfaceFlinger(Server)用来渲染绘制界面,Client和Server通过匿名共享内存(Anonym...