第三章 结构化设计
3.1
数据设计:
数据模型及核心数据字典转变为数据结构。
体系结构设计:
功能模型中数据流图转变成计算机模块框架。
接口设计:
功能模型中数据流图转变成软件内部、软件与协作系统间、软件用户间通信方式。
过程设计:
行为模型及功能模型中的“处理规格说明”转换成软件构件过程描述。
3.2 结构化设计的概念与原理
3.2.1 模块化
- 模块(module):“模块”又称“构件”一般指用一个名字调用的相邻程序元素序列
- 模块化设计(modular design):按适当的原则把软件划分成一个个较小的、相关而又独立的模块。
3.2.2 抽象
抽出事物的本质特性,暂不考虑细节。
3.2.3 求精
求精是指为了能集中精力解决主要问题,尽量推迟对细节问题的考虑,实际上是一个细化过程,与抽象是互补的概念。
3.2.4 信息隐藏
每个模块的实现细节对于其他模块来说是隐藏的,模块中所包含的信息是不允许其他不需要这些信息的模块访问的。
每个用户只能通过接口来了解该模块,而所有的实现都隐藏起来,使模块之间的关系相对简单。
3.3 模块独立
- 容易分工合作
- 容易测试何维护,修改工作量较小,错误传播范围小,扩充功能容易。
两个定性度量标准:耦合和内聚。
3.3.1 耦合
定义: 软件结构中不同模块间互连程度度量。取决模块间接口复杂程度,通过接口数据。追求尽可能松散耦合系统。
- 非直接耦合
两个模块分别能独立地工作不需要另一模块存在。 - 数据耦合
两模块通过参数交换数据信息。 - 控制耦合
如果一个模块通过传送开关、标志、名字等控制信息,明显地控制选择另一模块的功能,就是控制耦合。
- 公共耦合
若一组模块都访问同一个公共数据环境,则它们之间的耦合就称为公共耦合。公共的数据环境可以是全局数据结构、共享的通信区、内存的公共覆盖区等。
- 内容耦合
- 一个模块直接访问另一个模块的内部数据;
- 一个模块不通过正常入口转到另一模块内部;
- 两个模块有一部分程序代码重迭(只可能出现 在汇编语言中);
- 一个模块有多个入口
设计原则: 尽量使用数据耦合,少用控制耦合,限制公共环境耦合,完全不用内容耦合。
3.3.2 内聚
(由高到低)
- 功能内聚
一个模块中各个部分都是完成某一具体功能必不可少的组成部分 - 顺序内聚
模块内处理元素同某功能密切相关,顺序执行。 - 通信内聚
一模块内各功能部分都使用相同输入数据,或产生相同输出数据。 - 过程内聚
使用流程图做为工具设计程序时,把流程图中的某一部分划出组成模块,就得到过程内聚模块。例如,把流程图中的循环部分、判定部分、计算部分分成三个模块,这三个模块都是过程内聚模块。 - 时间内聚
时间内聚又称为经典内聚。这种模块大多为多功能模块,但模块的各个功能的执行与时间有关,通常要求所有功能必须在同一时间段内执行。例如初始化模块和终止模块。 - 逻辑内聚
一模块完成功能在逻辑上属相同相似一类。 - 偶然内聚
模块内各部分间没有联系,即使有也很松散。
3.5 启发规则
- 改进软件结构提高模块独立性;
- 模块规模应该适中;
- 深度、宽度、扇出和扇入都应适当;
- 模块的作用域应该在控制域之内;
- 力争降低模块接口的复杂程度;
- 设计单入口单出口的模块;
- 模块功能应该可以预测;
3.6 面向数据流的设计方法
-变换流
信息沿输入通路进入系统,同时由外部形式变换成内部形式,进入系统的信息通过变换中心,经加工处理以后再沿输出通路变换成外部形式离开软件系统。当数据流图具有这些特征时,这种信息流就叫作变换流。
- 事物流
数据沿输入通路到达一个处理T,这个处理根据输入数据的类型在若干个动作序列中选出一个来执行。这类数据流应该划为一类特殊的数据流,称为事务流。
面向数据流设计过程
变换分析
第1步 复查基本系统模型。
复查的目的是确保系统的输入数据和输出数据符合实际。
第2步 复查并精化数据流图。
正确处理项完成相对独立功能。
第3步 确定数据流图具有变换特性还是事务特性。
没有明显事务中心,为变换型。
第4步 确定输入流和输出流的边界,从而孤立出变换中心。
第5步 完成第一级分解
第6步 完成第二级分解
事务分析
事务分析的设计步骤和变换分析的设计步骤大部分相同或类似,主要差别仅在于由数据流图到软件结构的映射方法不同。由事务流映射成的软件结构包括一个接收分支和一个发送分支。
一般说来,如果数据流不具有显著的事务特点,最好使用变换分析;反之,如果具有明显的事务中心,则应该采用事务分析技术。
3.7 过程设计
3.7.1 过程设计的任务
- 确定模块算法
- 确定模块使用数据结构
- 确定模块接口(系统外部接口、用户界面、内部模块间接口细节、输入数据和输出数据)
3.7.2 结构化过程设计
结构化程序设计技术是过程设计一关键技术。
- 经典定义:
程序代码通过顺序、选择、循环三种控制结构连接,
单入口单出口。 - 扩展定义:
可限制使用GOTO语句、DO_UNTIL和DO_CASE - 修正定义:
LEAVE和BREAK,可从循环中转移出来。
3.7.3 结构化程序设计工具
- 结构流程图
优点:
- 对控制流程描绘直观,便于初学者掌握。
缺点:
- 不是逐步求精好工具,过早考虑控制流程,非整体结构;
- 用箭头代表控制流,程序员随意转移控制;
- 不易表示数据结构和调用关系。
- N-S图(盒图)
特点:
- 功能域(一特定控制结构的作用域)明确;
- 不可能任意转移控制;
- 容易确定局部和全程数据的作用域;
- 容易表现嵌套关系,也可表示模块的层次结构。
- PAD图
优点:
- 使用PAD图设计的程序必然是结构化程序;
- PAD图描绘的程序结构十分清晰;
- 用PAD图表现程序逻辑,易读、易懂、易记;
- 容易将PAD图转换成高级语言源程序;
- 支持自顶向下逐步求精。
- 判定表
能清晰表示复杂的条件组合与应做动作间对应关系。
四部分:
左上部列出所有条件;
左下部所有可能做的动作;
右上部表示各种条件组合的一矩阵;
右下部是和每种条件组合相对应的动作。
-
判定树
判定表变种,表示复杂条件组合与应做动作间对应关系。
优点:
形式简单,易看出含义,易于掌握和使用。
缺点:
简洁性不如判定表,相同数据元素重复写多遍,
越接近叶端重复次数越多。 -
伪码
伪码,用正文形式表示数据和处理过程设计工具。
3.7.4 程序复杂度
McCabe方法
- 根据过程设计结果画出相应流图
流图描述程序控制流,基本图形符号如下图所示。
- 计算流图的环形复杂度
3.8 面向数据结构设计方法
Jackson图
-
顺序结构
-
选择结构
-
重复结构
JACKSON 图的优点
- 便于表示层次结构,而且是对结构进行自顶向下分解的有力工具;
- 形象直观可读性好;
- 既能表示数据结构也能表示程序结构(因为结构程序设计也只使用上述3种基本控制结构)。
JACKSON 图的缺点
- 用这种图形工具表示选择或重复结构时,选择条件或循环结束条件不能直接在图上表示出来,影响了图的表达能力,也不易直接把图翻译成程序;
- 此外,框间连线为斜线,不易在行式打印机上输出。
改进的JACKSON图