第八讲
软件设计的启发式规则
面向数据流的设计方法
一、软件设计的启发式规则
1,提高模块独立性
2,设计规模适中的模块
3,深度、宽度、扇入、扇出适中
4,模块的作用域应该在控制域之内
5,降低接口复杂性
6,设计单入口和单出口的模块
7,设计功能可以预测的模块
启发式规则是一种经验规律,
对改进设计和提高软件质量
具有重要的参考价值,但不
要过分拘泥于这些规则
1) 提高模块独立性
? 是划分模块的最高准则。
? 高内聚,尽量一个模块一个功能;
? 低耦合,避免“病态连接”;
? 降低接口的复杂程度;
? 综合考虑模块可分解性、模块可组装性、
模块可理解性、模块连续性和模块保护
(因修改错误而引起的副作用被控制在
模块的内部)等。
2) 设计规模适中的模块
? W,M,Weinberg的研究表明:如果一个模块
长度超过 30条语句,其可理解性将迅速下降;
? F,T,Baker, 最好控制在 50行左右,能够打印
在一张纸上。
? 由于模块独立性是最高原则,对于一个设计
合理的功能性模块,即使长达千句或小到几
行,也是允许的。
? 分解模块不应该降低模块独立性。
3) 深度、宽度、扇入、扇出适中
? 深度:软件结构中控制的层数。一般而言
它与系统的复杂度和系统大小直接对应。
? 宽度:软件结构中同一个层次上的模块总
数的最大数。
? 扇出:一个模块直接控制(调用)的模块
数目。 扇出过大说明模块过分复杂;过小
也不好,不利于系统平衡分解,3到 9为宜。
? 扇入:一个模块的扇入是指直接控制该模
块的模块数目。扇入越大说明共享该模块
的上级模块越多。
? 整个系统结构呈现“椭圆外型”。
A
B C D F
G H
KJI
E
如图的系统中:深度为 4;宽度为 5;模块 A的扇出
为 5,扇入为 0。模块 K的扇出为 0;扇入为 2。
4) 模块的作用域应在控制域之内
? 控制域,控制范围,是包括模块本身以及
所有下属模块(直接调用模块和间接调用
模块)的集合。
? 作用域,作用范围,它是一个与条件判定
相联系的概念。是受该模块内一个判定影
响的所有模块的集合。
? 对作用域不在控制域的两种改进方法:判
定上移和在作用域但不在控制域的模块下
移。
A
C D
G H
KJI
E
如果 D中判定影响到 E,通常需在 D为判定结果设置
一标记,并把该标记通过上级模块 A传递给 E,导
致控制耦合。其作用域为 D,G,H,I,J,K和 E,作用
域在控制域内。
模块 D的控制域为
D,G,H,I,J,
K。
如果 D中有一个条件判
定仅影响到模块 G和 H,
其作用域为 G,H,I,J,K,
作用域在控制域内。
5) 降低接口复杂性
? 尽量少用 go to,避免病态连接和内容耦合。
? 注意全局变量的使用,控制外部耦合和公共
耦合的使用。
? 将数据结构的传递改成数据传递,例如:在
求一元二次方程根的模块 quad_root(Table,X)
中,利用系数数组 Table和根数组 X进行参数
传递。如果将其改为直接的系数和根传递,
即 quad_root(a,b,c,x1,x2),则特征耦合 → 数据
耦合。
6) 设计单入口和单出口的模块
? 符合结构化程序设计的思想
? 应避免病态连接和内容耦合。
?,一个功能一个模块” → 提高软件的可读
性和可理解性。
? 有效阻断“涟漪效应 (ripple effect)‖ → 提高
软件的可靠性和可维护性。
7) 设计功能可以预测的模块
? ―可以预测” ——模块的输入和输出之间的
关系比较简单。
? 功能可以预测的模块:如果一个模块可以
当作一个“黑盒子 (Black Box)‖来对待,对
于该模块的输入数据来说,可以在不考虑
其内部处理细节的情况下生成输出数据。
? 模块功能应该可以预测,但不要过分受其
局限。
二、面向数据流的设计方法
1,基于 DFD的结构化设计的基本概念
2,变换流结构
3,事务流结构
4,变换分析过程
5,示例
6,设计优化
1)基于 DFD的结构化设计的基本概念
? Yourdon等, Structured Design》
? 目标:使程序结构适应问题结构。结构
化设计方法( SD)
? 映射关系,DFD → HIPO or SC,即从
数据流图映射到软件结构图,其中数据
流(信息流)的类型决定了映射的方法。
? 两种类型的信息流( P95)
– 变换流
– 事务流
2)变换流结构
? 三个组成部分,(参见 P95图 5.8)
– 传入路径 (afferent path)
– 变换中心 (transform center)
– 传出路径 (efferent path)
? 分别对应的三种数据流
– 传入流
– 变换流
– 传出流
3) 事务流结构
? 三个组成部分:(参见 P95图 5.9)
– 至少一条接受路径 (reception path)
– 一个事务中心 T(transaction center)
– 多条动作路径 (action path)
? 事务中心的三个任务
– 接受输入数据(事务);
– 分析每个事务以确定它的类型;
– 选取一条动作路径(活动通路)。
? 说明
– 原则上所有信息流都可以归结为变换流结构;
– 混合型结构
4) 变换分析过程
? 复审基本系统模型
? 复审并精化 DFD
? 确定 DFD的类型
? 确定输入流和输出流的边界,从而孤立出变
换中心
? 完成“第一级分解” (确定顶层和第一层)
? 完成“第二级分解, (把每个处理映射到 SC的一
个模块 )
? 利用启发式规则和设计度量对软件结构进一
步精化
B CA
D
P
Q
R
W
U V
E
打印
显示
键盘输入
传感器
确定类型; 确定边界,即确定逻辑输入(离物理输入端最远,
但仍然可以被看作系统输入的那些数据流)和逻
辑输出(离物理输出端最远,但仍然可以被看作
系统输出的那些数据流)。
第一级分解,
确定顶层和
第一层 MC
MA MT ME
Q P RGet C Get E
Get B
Read A
B to C Read D D to E
A to B
Put UWrite W
U to V WriteV
从边界沿输出通路向外移动,将每个处理映射成
Me的子模块;在输入、输出路径上数据的内容
和形式也可能发生变化,但应区别于中心加工)
第 二 级分解:从边界沿输入通路向外移
动,将每个处理映射成 Ma的子模块;
将变换中心内的处理映射成 Mt的子模块
5)实例分析
? P96
例一:某企业销售管理系统的功能为:
( 1) 接受顾客的订单, 检验订单, 若库存有货,
进行供货处理, 即修改库存, 给仓库开备货单,
并将订单留底;若库存不足, 将缺货订单登入
缺货记录 。
( 2) 根据缺货记录进行缺货统计, 将缺货通知
单发给采购部门, 以便采购 。
( 3) 根据采购部门发来的进货通知单处理进货,
即修改库存, 并从缺货记录中取出缺货订单进
行供货处理 。
( 4) 根据留底的订单进行销售统计, 打印统计
表给销售经理 。
分析以上功能要求, 画出分层的数据流图, 并将
其转换成对应的软件结构 。
销售管理系统
顾客
采购部门
仓库
经理
缺货通知单
进货通知单
订单
备货单
统计表
进货通知单
销售统计
5
订单记录
统计表
原缺货现可供
货订单
供货处理
2
处理进货单
4
缺货统计
3
订单 可供货单
缺货记录 库存登记
备货单
缺货通知单
处理订单
1
0,销售管理系统
1,处理
订单
2.供货
处理
3.缺货
统计
4.处理
进货单
5.销售
统计
1.1
检
验
订
单
1.2
查
阅
库
存
1.3
确
定
能
否
供
货
2.1
修
改
库
存
2.2
开
备
货
单
3.1
处
理
缺
货
订
单
3.2
修
改
缺
货
记
录
4.1
打
印
缺
货
通
知
单
5.1
按
日
期
统
计
5.2
按
货
物
统
计
5.3
按
顾
客
统
计
例二:图书馆的预定图书系统有如下功能:
( 1) 由供书部门提供书目给订购组;
( 2) 订购组从各单位取得要订的书目;
( 3) 根据供书目录和订书书目产生订书文档留底;
( 4) 将订书信息 ( 包括数目, 数量等 ) 反馈给供书
单位;
( 5) 将未订书目通知订书者;
( 6) 对于重复订购的书目由系统自动检查, 并把结
果反馈给订书者 。
试根据要求画出该问题的数据流程图, 并把其转换
为软件结构图 。
订书
系统
0
订书组 供书单位
要订书目
订书结果
订书清单
供应书目
选择
检查
1
整理
归类
2
登陆
3
订书组
要订书目
订书结果
供书单位订书清单预定书目
供书单位
供应书目
订单记录
已订书目 归类书目
订单记录
新订书目
0,订 书 系 统
1,生成预
定书目
2,整理
归类
3.处理归
类书目
4.输出订
书清单
1.1
取
得
供
书
目
录
1.2
取
得
要
订
书
目
1.3
取
得
已
订
书
目
1.4
选
择
检
查
3.1
归
类
登
陆
3.2
更
新
留
底
清
单
1.4.1输出订
书结果
6)设计优化( p103)
? 对软件软件结构进行优化(启发式规则)
– 软件结构是否简洁?
– 设计风格?
– 效率?
? 对效率起决定作用的软件设计的优化
– 在不考虑时间因素的前提下开发并精化软件结
构。
– 孤立并在详细设计阶段重点关注那些对整个软
件效率起决定作用的模块( 10%到 20%的模块
开销 50%到 80%的时间)。
– 在使用高级语言编程的基础上,对孤立出来模
块重新用高效率的语言进行编写
1,看书,准备课程设计的内容
2,什么是软件?它有哪些特点?
3,原型模型和瀑布模型的主要区别?
4,需求分析的任务是什么?怎样理解需求
分析阶段的任务是决定“做什么”,而
不是“怎样做”?
5,总体设计的任务是什么?需要遵守哪些
规则?怎样理解这些“启发式规则”?
6,总结你对设计原理的理解。
7,什么是模块独立性?怎样度量之?
作业
软件设计的启发式规则
面向数据流的设计方法
一、软件设计的启发式规则
1,提高模块独立性
2,设计规模适中的模块
3,深度、宽度、扇入、扇出适中
4,模块的作用域应该在控制域之内
5,降低接口复杂性
6,设计单入口和单出口的模块
7,设计功能可以预测的模块
启发式规则是一种经验规律,
对改进设计和提高软件质量
具有重要的参考价值,但不
要过分拘泥于这些规则
1) 提高模块独立性
? 是划分模块的最高准则。
? 高内聚,尽量一个模块一个功能;
? 低耦合,避免“病态连接”;
? 降低接口的复杂程度;
? 综合考虑模块可分解性、模块可组装性、
模块可理解性、模块连续性和模块保护
(因修改错误而引起的副作用被控制在
模块的内部)等。
2) 设计规模适中的模块
? W,M,Weinberg的研究表明:如果一个模块
长度超过 30条语句,其可理解性将迅速下降;
? F,T,Baker, 最好控制在 50行左右,能够打印
在一张纸上。
? 由于模块独立性是最高原则,对于一个设计
合理的功能性模块,即使长达千句或小到几
行,也是允许的。
? 分解模块不应该降低模块独立性。
3) 深度、宽度、扇入、扇出适中
? 深度:软件结构中控制的层数。一般而言
它与系统的复杂度和系统大小直接对应。
? 宽度:软件结构中同一个层次上的模块总
数的最大数。
? 扇出:一个模块直接控制(调用)的模块
数目。 扇出过大说明模块过分复杂;过小
也不好,不利于系统平衡分解,3到 9为宜。
? 扇入:一个模块的扇入是指直接控制该模
块的模块数目。扇入越大说明共享该模块
的上级模块越多。
? 整个系统结构呈现“椭圆外型”。
A
B C D F
G H
KJI
E
如图的系统中:深度为 4;宽度为 5;模块 A的扇出
为 5,扇入为 0。模块 K的扇出为 0;扇入为 2。
4) 模块的作用域应在控制域之内
? 控制域,控制范围,是包括模块本身以及
所有下属模块(直接调用模块和间接调用
模块)的集合。
? 作用域,作用范围,它是一个与条件判定
相联系的概念。是受该模块内一个判定影
响的所有模块的集合。
? 对作用域不在控制域的两种改进方法:判
定上移和在作用域但不在控制域的模块下
移。
A
C D
G H
KJI
E
如果 D中判定影响到 E,通常需在 D为判定结果设置
一标记,并把该标记通过上级模块 A传递给 E,导
致控制耦合。其作用域为 D,G,H,I,J,K和 E,作用
域在控制域内。
模块 D的控制域为
D,G,H,I,J,
K。
如果 D中有一个条件判
定仅影响到模块 G和 H,
其作用域为 G,H,I,J,K,
作用域在控制域内。
5) 降低接口复杂性
? 尽量少用 go to,避免病态连接和内容耦合。
? 注意全局变量的使用,控制外部耦合和公共
耦合的使用。
? 将数据结构的传递改成数据传递,例如:在
求一元二次方程根的模块 quad_root(Table,X)
中,利用系数数组 Table和根数组 X进行参数
传递。如果将其改为直接的系数和根传递,
即 quad_root(a,b,c,x1,x2),则特征耦合 → 数据
耦合。
6) 设计单入口和单出口的模块
? 符合结构化程序设计的思想
? 应避免病态连接和内容耦合。
?,一个功能一个模块” → 提高软件的可读
性和可理解性。
? 有效阻断“涟漪效应 (ripple effect)‖ → 提高
软件的可靠性和可维护性。
7) 设计功能可以预测的模块
? ―可以预测” ——模块的输入和输出之间的
关系比较简单。
? 功能可以预测的模块:如果一个模块可以
当作一个“黑盒子 (Black Box)‖来对待,对
于该模块的输入数据来说,可以在不考虑
其内部处理细节的情况下生成输出数据。
? 模块功能应该可以预测,但不要过分受其
局限。
二、面向数据流的设计方法
1,基于 DFD的结构化设计的基本概念
2,变换流结构
3,事务流结构
4,变换分析过程
5,示例
6,设计优化
1)基于 DFD的结构化设计的基本概念
? Yourdon等, Structured Design》
? 目标:使程序结构适应问题结构。结构
化设计方法( SD)
? 映射关系,DFD → HIPO or SC,即从
数据流图映射到软件结构图,其中数据
流(信息流)的类型决定了映射的方法。
? 两种类型的信息流( P95)
– 变换流
– 事务流
2)变换流结构
? 三个组成部分,(参见 P95图 5.8)
– 传入路径 (afferent path)
– 变换中心 (transform center)
– 传出路径 (efferent path)
? 分别对应的三种数据流
– 传入流
– 变换流
– 传出流
3) 事务流结构
? 三个组成部分:(参见 P95图 5.9)
– 至少一条接受路径 (reception path)
– 一个事务中心 T(transaction center)
– 多条动作路径 (action path)
? 事务中心的三个任务
– 接受输入数据(事务);
– 分析每个事务以确定它的类型;
– 选取一条动作路径(活动通路)。
? 说明
– 原则上所有信息流都可以归结为变换流结构;
– 混合型结构
4) 变换分析过程
? 复审基本系统模型
? 复审并精化 DFD
? 确定 DFD的类型
? 确定输入流和输出流的边界,从而孤立出变
换中心
? 完成“第一级分解” (确定顶层和第一层)
? 完成“第二级分解, (把每个处理映射到 SC的一
个模块 )
? 利用启发式规则和设计度量对软件结构进一
步精化
B CA
D
P
Q
R
W
U V
E
打印
显示
键盘输入
传感器
确定类型; 确定边界,即确定逻辑输入(离物理输入端最远,
但仍然可以被看作系统输入的那些数据流)和逻
辑输出(离物理输出端最远,但仍然可以被看作
系统输出的那些数据流)。
第一级分解,
确定顶层和
第一层 MC
MA MT ME
Q P RGet C Get E
Get B
Read A
B to C Read D D to E
A to B
Put UWrite W
U to V WriteV
从边界沿输出通路向外移动,将每个处理映射成
Me的子模块;在输入、输出路径上数据的内容
和形式也可能发生变化,但应区别于中心加工)
第 二 级分解:从边界沿输入通路向外移
动,将每个处理映射成 Ma的子模块;
将变换中心内的处理映射成 Mt的子模块
5)实例分析
? P96
例一:某企业销售管理系统的功能为:
( 1) 接受顾客的订单, 检验订单, 若库存有货,
进行供货处理, 即修改库存, 给仓库开备货单,
并将订单留底;若库存不足, 将缺货订单登入
缺货记录 。
( 2) 根据缺货记录进行缺货统计, 将缺货通知
单发给采购部门, 以便采购 。
( 3) 根据采购部门发来的进货通知单处理进货,
即修改库存, 并从缺货记录中取出缺货订单进
行供货处理 。
( 4) 根据留底的订单进行销售统计, 打印统计
表给销售经理 。
分析以上功能要求, 画出分层的数据流图, 并将
其转换成对应的软件结构 。
销售管理系统
顾客
采购部门
仓库
经理
缺货通知单
进货通知单
订单
备货单
统计表
进货通知单
销售统计
5
订单记录
统计表
原缺货现可供
货订单
供货处理
2
处理进货单
4
缺货统计
3
订单 可供货单
缺货记录 库存登记
备货单
缺货通知单
处理订单
1
0,销售管理系统
1,处理
订单
2.供货
处理
3.缺货
统计
4.处理
进货单
5.销售
统计
1.1
检
验
订
单
1.2
查
阅
库
存
1.3
确
定
能
否
供
货
2.1
修
改
库
存
2.2
开
备
货
单
3.1
处
理
缺
货
订
单
3.2
修
改
缺
货
记
录
4.1
打
印
缺
货
通
知
单
5.1
按
日
期
统
计
5.2
按
货
物
统
计
5.3
按
顾
客
统
计
例二:图书馆的预定图书系统有如下功能:
( 1) 由供书部门提供书目给订购组;
( 2) 订购组从各单位取得要订的书目;
( 3) 根据供书目录和订书书目产生订书文档留底;
( 4) 将订书信息 ( 包括数目, 数量等 ) 反馈给供书
单位;
( 5) 将未订书目通知订书者;
( 6) 对于重复订购的书目由系统自动检查, 并把结
果反馈给订书者 。
试根据要求画出该问题的数据流程图, 并把其转换
为软件结构图 。
订书
系统
0
订书组 供书单位
要订书目
订书结果
订书清单
供应书目
选择
检查
1
整理
归类
2
登陆
3
订书组
要订书目
订书结果
供书单位订书清单预定书目
供书单位
供应书目
订单记录
已订书目 归类书目
订单记录
新订书目
0,订 书 系 统
1,生成预
定书目
2,整理
归类
3.处理归
类书目
4.输出订
书清单
1.1
取
得
供
书
目
录
1.2
取
得
要
订
书
目
1.3
取
得
已
订
书
目
1.4
选
择
检
查
3.1
归
类
登
陆
3.2
更
新
留
底
清
单
1.4.1输出订
书结果
6)设计优化( p103)
? 对软件软件结构进行优化(启发式规则)
– 软件结构是否简洁?
– 设计风格?
– 效率?
? 对效率起决定作用的软件设计的优化
– 在不考虑时间因素的前提下开发并精化软件结
构。
– 孤立并在详细设计阶段重点关注那些对整个软
件效率起决定作用的模块( 10%到 20%的模块
开销 50%到 80%的时间)。
– 在使用高级语言编程的基础上,对孤立出来模
块重新用高效率的语言进行编写
1,看书,准备课程设计的内容
2,什么是软件?它有哪些特点?
3,原型模型和瀑布模型的主要区别?
4,需求分析的任务是什么?怎样理解需求
分析阶段的任务是决定“做什么”,而
不是“怎样做”?
5,总体设计的任务是什么?需要遵守哪些
规则?怎样理解这些“启发式规则”?
6,总结你对设计原理的理解。
7,什么是模块独立性?怎样度量之?
作业