当前课程知识点:计算思维导论 >  第七单元 >  7.3 面向过程的结构化设计方法学 >  Video

返回《计算思维导论》慕课在线视频课程列表

Video在线视频

Video

下一节:Video

返回《计算思维导论》慕课在线视频列表

Video课程教案、知识点、字幕

大家好

这一节我们介绍

面向过程的结构化设计方法学

早期的计算机存储量很小

人们设计程序时

首先考虑的问题是

如何减少存储器开销

程序本身短小

逻辑简单

程序设计体现的

是一种技艺

但是

随着技术的升级及其广泛应用

程序规模不断增大

程序编写越来越困难

程序设计慢慢变成了一门学问

就是在这样的背景下

大约于20世纪

60年代末70年代初

人们提出了

结构化程序设计方法

面向过程的结构化方法

由结构化分析

结构化设计

和结构化编码三部分

有机组合而成

它的基本思想是

把一个复杂问题

按自顶向下的原则逐层分解

使得分解后的子问题

都控制在人们容易理解

和处理的范围内

按照分治法的思想分而治之

结构化程序设计方法的本质

是功能分解

将系统按功能分解为

若干个模块

每一个模块都具有输入

输出和过程等基本特性

负责实现系统某一个功能

输入和输出分别是

模块需要的和产生的数据

过程则是对模块具体处理

细节的描述和表示

数据在模块间流动

功能是一种主动的行为

数据是受功能影响的信息载体

从编码的角度来说

每个模块可用一个

或多个函数 function

或者过程procedure来表示

模块内描述任何

实体的操作序列

只需采用顺序 选择 重复

三种基本控制结构即可

并且每个模块

最好只有一个入口

和一个出口

简单来说

面向过程的结构化方法

它的基本要点是

一 基于自顶向下

逐步求精的问题分解方法

二 模块化设计技术

三 结构化编程

事实上

面向过程的结构化方法

属于哲学方法论的范畴

其思维方法可广泛用于

其他领域的问题求解

只是具体的技术手段

不一样而已

为了更好地理解

这种解决问题的思维方法

我们有必要分别展开来讨论

一 基于自顶向下

逐步求精的问题分解方法

不管哪一个领域

当人们面对一个

大型问题需要求解时

都应该首先考虑

怎么对问题进行分解

比如

组建一个汽车厂

生产轿车

就汽车的生产而言

需要解决汽车各零部件的生产

以及装配检验等问题

就组织生产而言

需要解决各个环节的管理问题

如果我们把汽车分成

发动机

底盘

变速箱

车架

仪器仪表

轮胎

等等零部件

则可以考虑组建若干个分厂

以及一个总装厂

每个分厂只负责生产

一个零部件

比如发动机或者变速箱

这样分工就很明确

对一个分厂来说

又可以根据需要

下设

产品

研发

设计

生产

仓储

管理等部门

各部门各负其责

功能明确

各部门还可进一步划分

比如一个部门划分为

若干个班组

每个班组职责明确

工作任务与要求清清楚楚

管理方面可以分设

财务

销售

人事

行政办公

宣传等部门

根据需要还可以下设二级机构

实行分级管理

这就是自顶向下

逐步求精的方法

经过层层分解

以至于到最后每一个子问题

都控制在人们容易理解

和处理的范围之内

我们再看一个例子

假设我们要做一个

学生信息管理系统

首先要弄清楚的是

被管理的对象

这个一方面是指

哪一个范围内的学生

比如说一个班级

一个学院

还是整个学校

甚至更大范围的学生

另一个方面就是要明确

管理学生的哪些信息

比如学号

姓名

专业

班级

籍贯等等

被管理的对象最终都以

数据集的形式

存放于计算机之中

其次

就是系统

应该提供什么样的功能

这应该由

实际管理工作的需求来确定

比如

系统应该提供数据怎么初始化

按某种方法进行排序

根据指定的信息进行查询

打印报表

数据维护等功能

每个功能还可进一步划分

比如就查询而言

可以分为按姓名查询

按性别查询

按籍贯查询

按专业查询

或者按课程查询等等

不难想象

按照自顶向下

逐步求精的问题分解方法

最后设计出来的程序系统就具有这样的结构

如果仔细考察客观世界的对象

比如说学生

他怎么映射成计算机世界的数据

以及抽象出的各功能模块如何处理这些数据

我们可以进一步用这样的图

来描述面向过程方法学的程序结构

这个图反映了客观世界的问题结构

到计算机世界程序结构的映射过程

显然

自顶向下的出发点

是从问题的总体目标开始

抽象低层的细节

先专心构造高层的结构

然后再一层一层地分解和细化

这使设计者能把握主题

高屋建瓴

避免一开始就陷入复杂的细节之中

使复杂的设计过程变得简单明了

过程的结果也容易做到正确可靠

二 模块化设计

为什么要把程序分解为若干个模块呢

为什么要采用模块化设计呢

模块化是程序的一个重要属性

它使得一个程序易于为人们所理解

设计 测试和维护

如果一个大的程序只有一个模块

是很难让人理解的

因为

一个大型程序的控制流程

数据结构

业务逻辑等等是非常复杂的

人们要了解

处理和管理这样复杂的程序系统

几乎是不太可能的

反过来

如果把程序无限地分解

开发程序所需要的总工作量

是不是可以小得可以忽略不计呢

显然这样的结论是不能成立的

因为随着模块数目的增加

模块之间接口的复杂程度

和为接口设计

所需的工作量也在随之增加

在模块化设计中

模块独立性是一个非常重要的概念

它是模块化

抽象和信息隐藏概念的直接产物

您可能会问

为什么模块独立性这么重要

这是因为模块化程度较高的程序

其功能易于划分

接口简化

因此开发比较容易

特别是多个人共同开发一个大型软件时

这一点尤为突出

另外

这样的程序也比较容易测试和维护

修改所引起的副作用也小

而且

模块从系统中取出

或者插入也比较容易

模块独立性可用聚合和耦合

这两个定量准则来度量

聚合是信息隐藏概念的一种自然延伸

是模块功能相对强度的量度

一个聚合度高的模块只完成

比较单一的任务

与其他模块交互作用很少

耦合则是模块之间

相对独立性的量度

它关注的是模块之间关联度

耦合的强弱取决于

模块间接口的复杂性

调用模块的方式

以及通过界面传递数据的多少

聚合和耦合是相关的

一个模块的聚合度高

耦合度就低

反之亦然

降低模块间的耦合度

能减少模块间的影响

防止对某一个模块的修改

引起牵一发而动全身的

水波效应

模块化设计的总体原则

是提高模块的聚合度

降低模块的耦合度

也就是说

模块的根本特征是

相对独立

功能单一

一个好的模块必须具有高度的独立性

和相对较强的功能

三 结构化编码

模块确定以后

就要借助于具体的程序设计语言

编写程序代码

以实现模块的预定功能

结构化编码主张使用

顺序 选择 循环三种基本结构

及其嵌套连结来构造复杂的

结构化程序

程序中不主张或严格控制

GOTO语句的使用

以免产生控制流混乱的

面条程序

通过结构化编码

获得的程序具有以下意义

一 以控制结构为单位

一个入口

一个出口

可以从上到下顺序地阅读程序

便于理解

提高了程序的可读性

二 由于程序的静态描述

与执行时的控制流程相对应

所以能够方便正确地理解

程序的执行过程

面向过程的结构化程序设计方法学

确实给程序设计带来了巨大进步

某种程度上部分地缓解了软件危机

也就是软件开发与维护中

面临的种种困境

但是我们必须看到

当面对大型软件开发时

似乎很难得心应手

原因是这个方法以算法为核心

把数据和过程作为相对独立的实体

这样做虽然与计算机内部

数据和程序分开存储比较一致

却忽略了数据和操作之间的内在联系

因此

用这种方法所设计出来的软件系统

其解空间与问题空间并不一致

令人感到难以理解

且把维持数据和操作一致性的责任

交给了程序员

这一节就讲到这儿

谢谢大家

计算思维导论课程列表:

第一单元

-1.1 计算思维及其教育

--Video

第二单元

-2.1 计算是什么

--Video

-2.2 计算与自动计算

--Video

-2.3 计算机及其计算本质特征(I)

--Video

-2.4 计算机及计算的本质特征(II)

--Video

第三单元

-3.1 数的表示与模拟计算

--Video

-3.2 数的表示与数字计算

--Video

-3.3 二进制加法运算的机器化

--Video

-3.4 “九九归一”的加法运算

--Video

-3.5 二进制之优越性及问题与代价

--Video

第四单元

-4.1 从数学危机到图灵机

--Video

-4.2 图灵机的计算能力

--Video

-4.3 什么问题都能计算吗?

--Video

-4.4 冯•诺依曼机及其发展与演化

--Video

-4.5 从算盘到图灵机——机械计算的本质

--Video

-4.6 电子计算机——透过现象看本质

--Video

第五单元

-5.1 思维可机械计算吗(I)

--Video

-5.2 思维可机械计算吗(II)

--Video

第六单元

-6.1 量子理论

--Video

-6.2 量子计算机

--Video

第七单元

-7.1 人类求解问题之过程

--Video

-7.2 基于计算(机)的问题求解过程

--Video

-7.3 面向过程的结构化设计方法学

--Video

-7.4 面向对象之方法学

--Video

-7.5 面向对象技术

--Video

-7.6 抽象

--Video

-7.7 计算学科中的抽象

--Video

-7.8 时间与空间及其相互转换

--Video

-7.9 技术层面的其他方法学

--Video

-7.10 认知层面的其他方法学

--Video

第八单元

-8.1 算法与程序

--Video

-8.2 算法设计方法——枚举

--Video

-8.3 算法设计方法——递推

--Video

-8.4 算法设计方法——递归

--Video

-8.5 算法设计方法——分治

--Video

-8.6 算法设计方法——仿生

--Video

第九单元

-9.1 机器间的通信方式

--Video

-9.2 数据转发方法

--Video

-9.3 网络分层体系结构

--Video

-9.4 有趣的对称加密技术

--Video

-9.5 难解的非对称加密技术

--Video

-9.6 数字签名及其应用

--Video

-9.7 从自然智能到人工智能

--Video

-9.8 符号主义的基本思想

--Video

-9.9 连接主义Ⅰ

--Video

-9.10 连接主义Ⅱ

--Video

-9.11 行为主义的基本思想

--Video

-9.12 机器翻译的愿景与困难

--Video

-9.13 峰回路转的自然语言处理

--Video

-9.14 信息传输中的问题与挑战

--Video

-9.15 重复传输与冗余编码

--Video

-9.16 校验与校验和

--Video

-9.18 自纠错技术及应用

--Video

-9.19 两种简单的数据压缩方法

--Video

-9.20 哈夫曼编码

--Video

-9.21 数据压缩极限与LZ压缩方法

--Video

-9.22 大海捞针的搜索引擎

--Video

-9.23 网页排序方法(PageRank)

--Video

第十单元

-10.1 计算文化

--Video

期末考试

-期末考试--作业

Video笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。