北京理工大学
软件工程实践
汤铭端
中国航天科工集团公司 706所
第四讲
软件设计
内容
? 包括软件结构设计和软件详细设计
? 软件设计的概念
? 软件设计的过程
? 软件设计的方法
? 软件设计的产品
目的
? 掌握软件设计基本概念
? 掌握软件设计过程
? 了解基本软件设计方法( SC+流程图)
? 了解软件设计说明的内容条目
设计
? 设计:为了能够足够详细地定义一种设备、一
个处理或一个系统,以便保证其物理实现,而
应用各种技术和原则的过程
? 设计者的目标是生成一个随后要构造的实体的
一种模型或表示
? 开发模型的过程综合了基于构造类似实体的经
验的直觉和判断、一系列指导模型演化路径的
原则和直观推断、一系列判断质量的标准以及
导出最终设计表示的迭代过程
软件设计的目标和目的
软件需求:解决, 做什么,
软件设计:解决, 怎么做,
问题结构 (软件需求 ) 软件结构
从软件需求规格说明书出发,形成软
件的具体设计方案
映射
将分析模型转换为软件设计
数据
字典
数据
流图
E-R图
状态变迁图
加 工


控制规约
数 据




数 据 设 计
体系结构设计
接口设计
过程设计
分析模型 设计模型
软件设计的任务
? 数据设计:将分析时创建的信息域模型
变换为实现软件所需的数据结构
? 结构设计:定义软件系统各主要部件之
间的关系
? 接口设计:描述软件内部、软件和协作
系统之间以及软件与人之间如何通信
? 过程设计:把系统结构部件转换成软件
单元的过程性描述
软件设计视图
数据设计
过程设计
结构设计
概要设计
详细设计
管理
角度
技术观点
开发阶段的信息流
正确的软件设计
? 软件设计是后续开发步骤及软件维护工
作的基础。如果没有设计,只能建立一
个不稳定的系统结构
软件设计的重要性 — 质量
? 设计是在软件开发中形成质量的环节
? 设计是能将用户需求转化为完整的软件
产品或系统的唯一方法
? 设计是软件工程和软件维护的基础
软件设计的过程
? 软件设计是一个迭代的过程
? 先进行高层次的结构设计
? 后进行低层次的过程设计
? 穿插进行数据设计和接口设计
软件设计过程
1,制定规范
? 在进入软件开发阶段之初,首先应为软件开发组制定
在设计时应该 共同遵守的标准,以便协调组内各成员
的工作。包括,
阅读和理解软件需求说明书,确认用户要求能否实现,
明确实现的条件,从而确定设计的目标,以及它们的
优先顺序
? 根据目标确定最合适的设计方法
? 规定设计文档的编制标准
? 规定编码的信息形式,与硬件,操作系统的接口
规约,命名规则
软件设计过程
? 2,软件系统结构的总体设计
基于功能层次结构建立系统。
? 采用某种设计方法,将系统按功能划分成
模块的层次结构
? 确定每个模块的功能
? 建立与已确定的软件需求的对应关系
? 确定模块间的调用关系
? 确定模块间的接口
? 评估模块划分的质量
软件设计过程
? 3,处理方式设计
? 确定为实现系统的功能需求所必需的算法,
评估算法的性能
? 确定为满足系统的性能需求所必需的算法和
模块间的控制方式
? 周转时间
? 响应时间
? 吞吐量
? 精度
? 确定外部信号的接收发送形式
软件设计过程
? 4,数据结构设计
? 确定软件涉及的文件系统的结构以及数据库
的模式、子模式,进行数据完整性和安全性
的设计
? 确定输入,输出文件的详细的数据结构
? 结合算法设计,确定算法所必需的逻辑数据
结构及其操作
? 确定对逻辑数据结构所必需的那些操作的程
序模块 (软件包 )
软件设计过程
? 限制和确定各个数据设计决策的影响范围
? 若需要与操作系统或调度程序接口所必须的控制表等数据时,确
定其详细的数据结构和使用规则
? 数据的 保护性设计
? 防卫性设计:在软件设计中就插入自动检错,报错和纠错的
功能
? 一致性设计,
? 保证软件运行过程中所使用的数据的类型和取值范围不变
? 在并发处理过程中使用封锁和解除封锁机制保持数据不被破

? 冗余性设计,针对同一问题,由两个开发者采用不同的程序设计
风格不同的算法设计软件,当两者运行结果之差不在允许范围内
时,利用检错系统予以纠正,或使用表决技术决定一个正确结果。
软件设计过程
? 5.可靠性设计
? 可靠性设计也叫做质量设计
? 在运行过程中,为了适应环境的变化和用户
新的要求,需经常对软件进行改造和修正。
在软件开发的一开始就要确定软件可靠性和
其它质量指标,考虑相应措施,以使得软件
易于修改和易于维护
良好设计的特征(设计目标)
? 设计必须实现所有包含在分析模型中的
明示需求,并且必须满足客户希望的所
有潜在需求
? 设计对于软件的编码、测试、维护人员
必须是可读的、可理解的
? 设计应该提供软件的完整面貌,包括从
实现角度所见的数据、功能、流程
设计的指南
1 设计应该展示一种层次化结构
2 设计应该模块化,即逻辑地划分成完成特定功能和子功
能的构件
3 设计应该包括对数据、结构、界面和部件的清楚表述
4 设计应该导出适于实现目的和由公认的数据模式导出的
数据结构
5 设计应该导出具有独立功能特征的模块
6 设计应该导出降低模块和外部环境间连接复杂度的接口
7 设计应该通过使用可重复的方法来得到,这些方法被来
源于软件需求分析的信息所驱动
设计原则
? 设计过程不应该受, 隧道视野, 的限制
? 设计对于分析模型应该是可追踪的
? 设计不应该从头做起
? 设计应该缩短软件和现实世界的, 智力距离,
? 设计应该表现出一致性和集成性
? 设计应该构造以适应修改
? 设计应该构造以使得即使遇到异常的数据、事件或操作条件
时也能够平滑、轻巧地降级
? 设计不是编码,编码不是设计
? 在创建设计时就应该可以评估质量,而不是在事情完成之后
? 应该复审设计以减少概念性错误
设计概念
? 抽象
? 求精
? 模块化
? 软件结构体系
? 控制层次
? 结构划分
? 数据结构
? 软件过程
? 信息隐藏
模块化原理
经验 1:工作量 E(P1+P2)>E(P1)+E(P2)
经验 2,


成本 / 模块
最小成本区
接口成本
软件总成本
模块数目
信息隐蔽 (Information Hiding)
? 模块所包含的信息,不允许其它不需要
这些信息的模块访问,独立的模块间仅
仅交换为完成系统功能而必须交换的信

? 信息隐蔽的目的,
? 提高模块的独立性
? 减少修改或维护时的影响面
设计的独立性判别
? 内聚:模块相对功能密度的度量
? 耦合:模块间相对独立性的度量
内聚
? 内聚指的是一个模块内部各组成部分的
处理动作的组合强度, 又称块内联系 。
? 软件结构设计的设计原则是, 要求每一
个模块的内部都具有很强的内聚性, 它
的各个组成部分彼此都密切相关, 是为
了完成一个共同的功能而组合在一起的 。
减弱模块之间的耦合和提高模块内的内
聚性, 是两个相辅相成的设计原则 。
G.Myers的内聚七等级
? 偶然内聚:模块内各成分无实质性的联系, 只是偶然地被凑到一
起 。
? 逻辑内聚:模块内部各组成部分的处理动作在逻辑上相似, 但功
能却彼此不同或无关 。
? 时间内聚:将若干在同一个时间带内进行的工作集中在一个模块
内, 但这些工作彼此无关 。
? 过程内聚:模块内部包含的各个成分按照某种确定的顺序进行,
但所做工作没有什么关系 。
? 通讯内聚:模块内的各个组成部分都使用相同的输入数据或产生
相同的输出数据 。
? 顺序内聚:模块中各个组成部分顺序执行, 前一个成分的输出就
是后一个成分的输入 。
? 功能内聚:模块内的各个组成部分全都为完成同一个功能而存在,
共同完成一个单一的功能, 并且只完成一个功能 。
内聚图示

巧合性
内聚
逻辑
内聚
过程
内聚
通信
内聚
时间
内聚
信息
内聚
功能
内聚

强 弱
内聚 性
模块独立性
(1)偶然内聚 (巧合内聚 )
? 模块内各部分间无联系
? 模块 M中的三个语句没有任何联系
? 缺点,可理解性差,可修改性差
A B C
M MOVE O TO R
READ FILE F
MOVE S TO T
(2) 逻辑内聚
? 把几种相关功能(逻辑上相似的功能)
组合在一模块内,每次调用由传给模块
的参数确定执行哪种功能。
逻辑内聚模块
A B C
E F G
A B C
EFG
A1 B1 C1
EFG模块内部逻辑
E,F,G逻辑
功能相似,组
成新模块 EFG
缺点, 增强了耦合程度 (控制耦合 )
不易修改,效率低
公用代码段
公用代码段
(3) 时间内聚 (经典内聚 )
? 模块完成的功能必须在同一时间内执行,
这些功能只因时间因素关联在一起。
? 例如,
? 初始化系统模块
? 系统结束模块
? 紧急故障处理模块
(4) 过程内聚(顺序性组合)
? 模块内各处理成分相关
? 必须以特定次序执行
读入
成绩单
审查
成绩单
统计
成绩
打印
成绩
读入并审查成
绩单
统计并打印成
绩单
(5) 通信内聚
? 模块内各部分使用相同的输入数据
? 或产生相同的输出结果
产生工资报表
计算平均工资
职工工资记录
职工工资报表
产生职工工资报表并计算平均工资模块
平均工资
(6) 信息内聚
? 模块完成多个功能
? 各功能都在同一数据结构上操作
? 每一功能有唯一入口
符 号 表
查找 登录 删除 修改
几个加工同时引用一个共同的数据
(7) 功能内聚
? 模块仅包括为完成某个功能所必须的所
有成分
? (模块所有成分共同完成一个功能,缺一
不可 )
? 内聚性最强
高内聚的要求
? 避免使用低内聚的模块, 多用中高内聚,
特别是功能内聚的模块,
? 遵守, 一个模块, 一个功能, 原则, 它
是衡量模块独立性的最高标准
耦合
? 耦合 ( coupling) 指的是两个模块之间的相互依赖关系,
又称块间联系 。
? 模块之间的联系越多或越复杂, 它们之间的依赖程度
就越高, 每一个模块的独立性就越低 。
? 要求尽可能地减弱系统中模块之间的耦合程度, 提高
每一个模块的独立性, 这是因为,
? 1 ) 模块之间的耦合程度越弱, 相互影响就越小,
产生连锁反应的概率就越低;
? 2 ) 在修改一个模块时, 要能使修改范围控制在最
小限度以内;
? 3 ) 在对一个模块进行维护的时候, 不必担心任何
其它模块的内部运行程序是否会受到影响 。
耦合强度依赖的因素
? 一模块对另一模块的引用
? 一模块向另一模块传递的数据量
? 一模块施加到另一模块的控制的数量
? 模块间接口的复杂程度
G.Myers的耦合七等级
? 非直接耦合:调用和被调用模块之间不存在直接的数据联
系。
? 数据耦合:调用和被调用模块之间存在简单变量这样的数
据传递。
? 特征耦合:调用和调用模块之间存在诸如数组这样的数据
结构的数据传递。
? 控制耦合:耦合的模块之间传递的不是数据信息,而是控
制信息,或称开关量或标志量。
? 外部耦合:允许多个模块访问同一个全局变量。
? 公共耦合:允许多个模块访问同一个全局性数据结构。
? 内容耦合:允许一个模块直接调用另一个模块中的数据。
? 非直接耦合、数据耦合、特征耦合属于弱耦合。非直接耦
合是最希望的情况。
耦合图示

内容
耦合
公共
耦合
控制
耦合
特征
耦合
外部
耦合
数据
耦合
非直接
耦合

弱 强
耦合性
模块独立性
(1) 无直接耦合
? 两个模块没有直接关系 (模块 1和模块 2)
? 模块独立性最强
模块 1 模块 2
模块 3 模块 4
(2) 数据耦合
? 一模块调用另一模块时,被调用模块的
输入、输出都是简单的数据 (若干参数 )
? 属松散耦合。
开发票
计算水费
单价
数量 金额
(3)特征耦合 (标记耦合 )
? 如两个模块通过传递 数据结构 (不是简单
数据,而是记录、数组等 )加以联系,或
都与一个 数据结构 有关系,则称这两个
模块间存在特征偶合。
特征耦合举例
?, 住户情况, 是一个 数据结构,图中模块都与
此数据结构有关
?, 计算水费, 和, 计算电费, 本无关,由于引
用了此数据结构产生依赖关系,它们之间也是
特征偶合
计算水电费
计算水费 计算电费
住户情况 水费
电费
住户情况
将特征耦合改为数据耦合举例
计算水电费
计算水费 计算电费
本月
用水量
本月
用电量 水费
电费
(4) 控制耦合
? 一模块向下属模块传递的信息 (开关量、
标志等控制被调用模块决策的变量 ) 控
制了被调用模块的内部逻辑。
控制耦合举例
A
计算平均分
或最高分
B
平均 /最高
(控制信号 ) 成绩
读入分数
输出结果
计算平均分 计算最高分
平均 /最高?
B
改控制耦合为数据耦合举例
? 控制耦合增加了理解和
编程的复杂性,调用模
块必须知道被调模块的
内部逻辑,增加了相互
依赖
? 去除模块间控制耦合的
方法,
? (1)将被调用模块内的判
定上移到调用模块中进行
? (2)被调用模块分解成若
干单一功能模块
A
计算平
均分
B1
平均成绩 最高成绩
计算最
高分
B2
(5) 外部耦合
? 一组模块均与同一外部环境关联 (例
如,I/O模块与特定的设备、格式和通信
协议相关联 ),它们之间便存在外部耦合
? 外部偶合必不可少,但这种模块数目应尽
量少
(6) 公共耦合 (公共数据区耦合 )
? 一组模块引用同一个公用数据区 (全局数据区、公共数据环境 )
? 公共数据区 指,
? 全局数据结构
? 共享通讯区
? 内存公共覆盖区等

公共数据区
C B
公共耦合存在的问题
(1)软件可理解性降低
(2)诊断错误困难
(3)软件可维护性差,
(4)软件可靠性差
(公共数据区及全程变量无保护措施 )
慎用公共数据区和全程变量 !!!
(7) 内容耦合
最不好的耦合形式 !!!
A B A
B
Entry1
……
Entry1
……
模块代码重叠 一模块直接访问另
一模块的内部信息
(程序代码或数据) 多入口模块
低耦合的要求
控制耦合是一种中等程度的耦合。应尽可能少用。
外部耦合和公共耦合是较强程度的耦合。尽管有
时无法避免,但要特别注意、严加控制。
内容耦合是耦合程度最强的耦合,极大增强了软
件的复杂性,给维护带来严重困难,是, 病态
联系,,应禁止使用。实际完全可以避免。
启发性规则
1.争取低耦合、高内聚(增加内聚 > 减少耦合)
2.模块规模适中,
? 过大不易理解;
? 太小则接口开销过大
? 注意分解后不应降低模块的独立性
3.适当控制,
? 深度 = 分层的层数。过大表示分工过细
? 宽度 = 同一层上模块数的最大值。过大表示系统复杂度

启发性规则
? 系统结构
启发性规则
? 扇出 = 一个模块直接
调用 \控制的模块数。
3 ? fan-out ? 9
A
A的扇出
A
A的扇入
? 扇入 = 直接调用该模
块的模块数
在不破坏独立性的前提
下,fan-in 大的比较好。
启发性规则
? 尽可能减少高扇出结构,随着深度增大扇入 。
如果一个模块的扇出数过大,就意味着该模块
过分复杂,需要协调和控制过多的下属模块。
应当适当增加中间层次的控制模块
高扇入低扇出
? 尽可能地减少高扇出结构,随着深度增
大扇入
? 扇出,指模块调用其下属模块数目
? 扇入,指模块的上级模块数 (即共有多少
个模块需要调用这个模块 )
M M
P
P
P1 P2
Q
Q1 Q2 Q3
Q
启发性规则
4、作用域在控制域内
? 控制域
M
A C
B
M的控制域为 {M,A,B,C}
? 作用域,M中的一个判定所影响的模块。
例如,A,
…………
if ……
then goto B1
…………
…………
B,
…………
…………
B1,
…………
…………
作用域在控制域内
A,
…………
if ……
then goto M1
…………
…………
M,
…………
…………
M1,goto C1
…………
…………
作用域超出了控制域
上例中 A的作用超出了控制域。改进方法之一,可以把 A中的 if 移到 M中;
方法之二,可以把 C移到 A下面。
模块的 控制范围
? 包括模块本身及其所有的从属模块 (即供
它调用的模块 ) A
B D C
E F G
关于模块的 控制范围示意图
模块的 作用范围
?与条件判定相关联的所有模
块 Top
A B
C D
E G G
控制
耦合
理想的情况
? 使模块的作用范围在
控制范围之内
? 所有受到一个判定影
响的模块应该都从属
该判定所在的模块,
最好位于作出判定的
那个模块本身及它的
直接下属模块
Top
C D
E B2
B
G
C G
A
启发性规则
5、降低接口的复杂程度:接口复杂可能表明模
块的独立性差。
6、单出单入,避免内容耦合。
7、模块功能可预测 —— 相同输入必产生相同输
出。反例:模块中使用全局变量或静态变量,
则可能导致不可预测。
数据设计
? 选择需求定义和规格说明过程中提出的数据对象的逻
辑表示
? 数据设计的任务
? 确定输入、输出文件的详细数据结构
? 结合算法设计,确定算法所必须的逻辑数据结构及
其操作
? 确定对逻辑数据结构所必须的那些操作的程序模块,
限制和确定各个数据设计决策的影响范围
? 需要与操作系统或调度程序接口所必须的控制表进
行数据交换时,确定其详细的数据结构和使用规则
? 数据的保护性设计:防卫性、一致性、冗余性设计
数据设计的原则
? 用于功能和行为的系统分析原则也应用于数据
? 应该标识所有的数据结构以及其上的操作
? 应当建立数据字典,并用于数据设计和程序设计
? 低层的设计决策应该推迟到设计过程的后期
? 只有那些需要直接使用数据结构内部数据的模块
才能看到该数据的表示
? 应该开发一个由有用的数据结构和应用于其上的
操作组成的库
? 软件设计和程序设计语言应该支持抽象数据类型
的规格说明和实现
结构设计
? 开发一个模块化的程序结构
? 表示出模块之间的控制关系
? 将程序设计和数据结构相结合
? 为数据在程序中的流动定义接口
结构设计的任务
? 采用某种设计方法,将一个复杂的系统按功能
划分为模块的层次结构
? 确定模块之间的调用关系
? 确定每个模块的功能,建立与已确定的软件需
求的对应关系
? 确定模块之间的接口,即模块间传递的信息,
并设计模块接口的信息结构
? 评估模块划分的质量及导出模块结构的规则
SC--结构图 (Structure Chart )
? 描述软件系统的层次和分块结构关系 。
? 在结构图中可以看到模块与模块之间的
联系与通讯 。
? 基本符号,
? 结构图的图示符号以用矩形表示的模块
? 用模块间带箭头的连线表示的调用关系
? 在调用关系边上用短箭头表示的模块间信息
传递关系 。
SC图中的主要内容
1、模块 --在 SC图中用 矩形框 表示,并用名字来标记它
2、模块的调用关系和接口
A
-- 模块调用关系
B
调用模块
调用模块
A( 查询学生 )
B( 查找学生记录 )
数据信号 控制信号 学 号
查找
成功
信号
-- 模块间接口的表示
SC使用说明
a.为每一个成分 ( 模块或数据 ) 适当地命名使人们能直
观理解 。
b.一个模块在结构图中只能出现一次以避免修改时出错成
错误 。
c.尽可能将整个画在一张纸上以便于整体理解 。
d.一般习惯是:输入模块在左, 输出模块在右, 计算模块
居中 。
e.结构图和习惯使用的程序流程图是完全不同的 。 程序有
层次性和过程性两方面的特点, 通常应该先考虑层次
特性, 再考虑过程特性 。 结构图描述的是程序的层次
特性, 即某个模块负责管理哪些模块, 这些模块又依
次管理什么模块等 。
结构图示例
报表加工
计算 合法性检验 印出报表
信息编辑 检验
读入 编辑
印出表头 印出表尾
计算
( 8) ( 1)
( 2) ( 3)
( 3) ( 2) ( 5)
( 5)
( 2) ( 5) ( 6)
( 2)
( 6)
( 7) ( 8) ( 9)
( 8)
典型的系统 结构形式
? 原子模块
? 传入模块
? 传出模块
? 变换模块
? 协调模块
? 变换型 系统结构图
? 事务型 系统结构图
原子模块
? 在系统结构图中通常是指不能再分割的
底层模块
? 完全因子分解系统
? 如果一个软件系统,它的全部实际加
工 (即数据计算或处理 )都是由底层的
原子模块来完成,而其它所有非原子
模块仅仅执行控制或协调功能
传入模块
? 从下属模块取得数据,进行某些处理,
再将其结果传给上级模块。在此,将它
传送的数据流称为逻辑输入数据流
传入模块
A
A
逻辑输
入数据流
成绩
处理
传出模块
? 从上级模块获得数据,进行某些处理,
再将其结果传给下属模块。在此,将它
传送的数据流称为逻辑输出数据流
传出模块
D
D
逻辑输
出数据流
成绩
处理
变换模块
? 也叫加工模块。它是从上级模块获得数
据,进行特定的处理,将其转换为其他
形式,再传回上级模块它所加工的数据
流叫做变换数据流
变换模块
C B
变换
数据流
审查并
开发票
发票
协调模块
? 对所有下属模块进行协调和管理的模块。
在一个好的系统结构图中,协调模块应
在较高层出现
协调模块
Y X Y X
变换型 系统结构图
主模块
C变换成 D 取得 C 给出 D
取得 B B变换成 C D变换成 E 给出 E
取得 A A变换成 B
A A B
B B C
C
D C
D
E D
取得
数据
C D 变换
数据
给出
数据
协调模块
变换模块 传出模块
DFD--SC
事务型 系统结构图
? 事务,引起、触发或启动某一动作或一
串动作的任何数据、控制信号、事件或
状态的变化
? 由它接受一项事务,根据事务处理的特
点和性质选择分配一个适当的处理单元,
然后给出结果
输入
------ 事务型 数据流图
1 A B C 3
D
E
F
G
H 2
4
5
6 7
中心变换
输出
逻辑
输入
物理
输入
逻辑
输出
物理
输出
1 A B C 3
D
E
F
G
H 2
4
5
6 7
MT
3 逻辑输入 逻辑输出
C
D C
D,E,F
4 5 6
------ 事务型 数据流图 (DFD)
------ 事务型 系统结构图 (SC)
事务中心
输入已分
析的作业
内部表示
的作业
结果
------ 事务型 系统结构 (层次 )图
输出结果 调度
作业
信息
读入作业 分析作业 事务 1 事务 2 事务 3 事务 4
操作 2 操作 3 操作 4 操作 5 操作 6 操作 1
细节 2 细节 3 细节 4 细节 5 细节 6 细节 1 细节 7
结果
------简化的 事务型 系统结构图
事务中心
得到作业
作业 结果
输出结果
分析 调度
事务 1 事务 2 事务 3
面向数据流的结构设计过程
1 建立数据流类型
2 指明流的边界
3 将 DFD映射到程序结构
4 用, 因子化, 的方法定义控制的层次结

5 用设计测量和启发信息对结构进行求精









开 始
细化修改 SRS中
的 DFD图
判断 DFD图的结构类型
是变换型吗?
F
事务分析 变换分析
完善 SC 图
T
对最终的 SC 图进行评审
结束
变换分析
变换
分析
从物理输入、物理输出及
变换中心进行由顶向下的分解
得出各个分支的所有组成模块
在数据流图上区分系统的
逻辑输入、逻辑输出和变换中
心部分,并标出它们的分界。
进行一级分解,设计系统
模块结构的顶层和第一层。
进行二级分解,设计中,
下层模块。
变换分析 1,
在 DFD 图上标出逻辑输入、逻辑输出和变换中心的分界
A
e
B a C b
D
c
E d
P
Q
R
w
u v
w
u
v
r
p
变换中心
c,e 逻
辑输入
w,u 逻
辑输出
-------- 具有变换型 数据流图
变换分析 2,
完成第一级分解
A a b
c P w
u
v
r
p
B C
D d e E Q
R
W
U V
Mc
MA MT ME
C,e
C,e U,w
U,w
变换中心
顶层
第一层
第一级分解后的 SC 图
协调模块
Y X Y X
第一级分解后的 SC 图 (另一种画法 )
A a b
c P w
u
v
r
p
B C
D d e E Q
R
W
U V
Mc
MA1 ME1
C
e U
MA2 Q P R ME2
e
c,p
p
r
r w,u
w
变换分析 3,
完成第二级分解
A a b
c P w
u
v
r
p
B C
D d e E Q
R
W
U V
MA
变换中心
对逻辑输入的分解
C E
B
A
D
a
b d
e c
c b a
A B C
MA
E D
d e
逻辑输入模块的调用与执行过程
信息传递
MA
C E
B
A
D
a
b d
e c
MA
Get C Get E
BtoC
AtoB
DtoE
a
e c
ReadD Get B
Read A
c,e
a b
b b c d e
继续分解
A a b
c P w
u
v
r
p
B C
D d e E Q
R
W
U V
ME
变换中心
对输出的分解
W U
V
v
u w MT
Q P R
e
C,p r
U,w
对变换中心加工的分解
p r
w,u
变换分析 4,
获得完整的 SC图
MA
C
B
A
E
D
MT
Q P R
从变换分析导出的初始 SC 图
ME
W U
V
MC
c,e W,u
W,u C,e
运用变换分析建立 SC时需注意
模块设计的次序时,应遵循对一个模块
的全部直接下属模块都设计完成后,再转向
另一个模块的下层模块的设计。
在设计下层模块时,应考虑模块的耦合
和内聚问题,以提高设计初始 SC图的质量。
注意“黑盒”技术的使用。
工作顺序
主模块
A B C
A1 A2 A3
A11 A12 A13
导出变换型 DFD图的 SC图
A1 A2
a1
a2
P
B
b1
C1
c1
C2
c1
p1
P2
事务分析
? 对具有 事务型 的 DFD图导出 SC图
I A
L
M
N
O
B
C
D
E
F
G
H
事务中心
事务源
I A
L
M
N
O
B
C
D
E
F
G
H
主模块
给出 H 取得 A L M N
A
G
H B
E
C
F
D
将采购 DFD图转换成 SC图
2.1 2.2
2.3 书库 保管员
F2
F1 F5 F6
F7
加工名称,
2.1 按书号汇总缺书
2.2 按出版社汇总缺书
2.3 修改教材库存和待
购量
文件名称,
F1 教材存量表
F2 缺书登记表
F5 待购教材表
F6 教材一览表
F7 进书登记表
采 购
按书号
汇总
缺书
登记表
统计缺书 登记进书
按出版社
汇总
打印
缺书单
修改
教材存量表
修改
教材待购量
统计
命令
登记
命令
待购
教材表
暂缺
书单
暂缺
书单
进书
通知 进书 通知
------ 采购子系统的 SC 图 -------
缺书登记表 ={班号 +姓名 +书号 +数量 }
SC的修改
1)减少块间联系,降低耦合度:可从方式、作用、数量等方面着手,
其中最常用的是减少模块间传递的参数个数;
2)消除管道性模块,提高内聚度:管道性模块的块内联系很弱,只
是像管道一样将一些参数从主模块传送到它的几个下层模块,对
这样的模块,应予以消除;
3)适当考虑系统将来可能发生的变化;
4)注意模块的大小:限制模块大小是降低复杂性的手段之一;
5)适当调整调用和被调用的次数,即深度、宽度、扇出和扇入都要
适当。一个模块调用或被调用过多,往往是设计不好的迹象;
6)整体考虑问题:即尽可能研究整张结构图,而不是只分别考虑一
张结构图的各个部分。
相似模块合并方案示意图
X Y
R1 R2
物理
输入
相似
部分
X Y
R1 R2
R
X+R1 Y+R2
R
模块大小适中
? 模块的大小可以用模块中所含语句的数
量的多少来衡量
? 60-120( 200)代码行
设计准则
1 评估初始软件结构以降低耦合提高内聚
2 尽量减少高扇出的结构;当深度增加时争取提
高扇入
3 将模块的影响限制在模块的控制范围内
4 评估模块接口以降低复杂度和冗余,并提高一
致性
5 定义功能可以预测的模块,但避免对模块过分
限制
6 通过避免, 病态连接, 力争, 受控入口, 的模

面向数据结构的 Jackson方法
文件
记录
数据项 1 数据项 2 数据项 3
处理文件
处理记录
处理项 1 处理项 2 处理项 3
可靠性安全性设计
? 应根据系统的可靠性要求,按照可靠性设计准
则开展设计工作,并在必要时,进行容错、避
错等专门的可靠性设计工作。要特别注意对软
件出错处理的设计工作,不仅要设计对硬件等
软件外系统出错时的处理,而且还要在假定最
终软件产品必定还会有错的情况下,进行软件
出错的处理设计
? 在体系结构设计中应充分考虑系统对软件的安
全性需求,进行安全性分析,确定安全性关键
的软件部件,采取相应的安全性设计措施。
接口设计
? 设计软件模块间的接口
? 设计模块和其它非人的信息生产者和消
费者的接口
? 设计人(用户)和计算机之间的接口
(人机界面)
过程设计
? 单独考虑每个模块
? 确定模块内部的详细执行过程,包括局
部数据组织、控制流、每一步具体处理
要求和各种实现细节等
? 目的是确定应该怎样来具体实现所要求
的系统
基本的描述方法
? 流程图
? NS图 (Nassi-Shneiderman1973)
? PAD(Problem Analysis Diagram 1973)
? 决策表
? 决策树
? PDL(Program Design Language)
基本的控制结构
IF_THEN_ELSE
CASE DO_WHILE
DO_UNTIL
流程图
控制流 加工步骤
逻辑条件
标准化程序流程图规定符号
X1
起止端点 输入 /输出 一般处理 准备或预处理 预定义处理
条件判断 循环上界 循环下界 文件或文档 外接 内接
流程线 虚线 省略线 并行方式 注解或注释
----- 具有嵌套形式的程序流程图
X1
F
T
a
X4
c
T
f
T
F
F
入口
b
X2
X3
d
e
g
h
i
X5
X6
F
T
F
T
=1
=2
=3
流程图特点
? 任何复杂的程序流程图都应由以上五种基本结
构组合而成
? 优点
? ISO 认可的规定符号
? 容易掌握,且历史“悠久”,使用广泛
? 缺点
? 本质上不具备逐步求精的特点,
? 对于提高大型系统的可理解性作用甚微;
? 不易表示数据结构;
? 转移控制太方便。
NS图 (Nassi-Shneiderman1973)
任务 1
任务 2
任务 3
条件
ELSE THEN
条件
=1 =2 … =N
A1 A2 A3 A4
循环条件
循环体
循环条件
循环体
IF_THEN_ELSE CASE
DO_WHILE DO_UNTIL
零件号 10001 10002 10003 10004 10005 10006
库存量 1000 1250 886 69 2020 3450
建立零件库 (s数组 ),i=0
输入零件号 x
do while(x!=s[0][i])
i++
i++ x==s[0][i]) Y N
s[0][i]
输出 s[1][i] 输入错误 !
继续查询? Y N
跳出循环
NS特点
① 没有箭头,不允许随意转移控制;
② 每个矩形框 (Case中条件取值例外 )都是
一个功能域 (即一个特定结构的作用域 ),
结构表示明确;
③ 局部及全程数据的作用域易见;
④ 易表现嵌套关系 (embedded structure)以
及模块的层次结构。
PAD(Problem Analysis Diagram 1973)
A
B
A
B 条件
WHILE A
UNTIL A
A1
An
A2
条件 A3
s[17]~s[22]=0
while
num(1-1000)
输入 age
age
=17 s[17]++
s[18]++ =18
s[19]++ =19
s[20]++ =20
s[21]++ =21
s[22]++ =22
while
i(17-22) 输出 s[i]
begin
end
PAD特点
① 结构清晰,层次分明,易读;
② 支持逐步求精的设计思想;
③ 容易将 PAD自动转换为高级语言源程序。
决策表
? 矩阵的每一列均可以看成一条在什么条件下进
行什么操作的处理规则
? 决策表按下列步骤制定,
1) 列出与一个具体过程有关的全部操作 。
2) 列出该过程执行期间的所有条件或作出的判定
3) 找出每个可能的组合, 将各组特定的条件与特定
操作相结合, 并消去那些不可能发生的条件组合 。
4) 规定处理规则, 即指出在什么样的一组条件下将
采取什么样的操作 。 对满足某些条件组合下应做的
操作, 在相应位置上标以, √” 号 。
所有条件 所有条件组合
所有处理 与条件组合相应的处理
决策表 ( Decision Table)
1 2 3 4 5 6 7 8 9
国内旅客 T T T T F F F F
头等舱 T F T F T F T F
残疾旅客 F F T T F F T T
行李重量 ≤30 T F F F F F F F F
免费 √
( W-30) × 2 √
( W-30) × 3 √
( W-30) × 4 √ √
( W-30) × 5 √ √
( W-30) × 8 √
( W-30) × 10 √
决策树





行李重量> 30
行李重量 ≤30
国内旅客
国内旅客
国内旅客
外籍旅客
国内旅客
外籍旅客
残疾旅客 —— ( W-30) × 2
正常旅客 —— ( W-30) × 4
残疾旅客 —— ( W-30) × 3
正常旅客 —— ( W-30) × 6
残疾旅客 —— ( W-30) × 4
正常旅客 —— ( W-30) × 8
残疾旅客 —— ( W-30) × 5
正常旅客 —— ( W-30) × 10
一律免费
PDL(Program Design Language)
? 顺序
? 条件,IF/THEN/ELSE/ENDIF
? 循环,DO WHILE/ENDDO
? 循环,REPEAT UNTIL/ENDREPEAT
? 分支:
CASE_OF/WHEN/SELECT/WHEN/SELEC
T/ENDCASE
PDL特点
? 优点
? 易于实现由 PDL到源代码的自动转换
? 缺点
? 不够直观
过程设计工具比较
流程图 N-S图 PAD图 PDL语言 决策表 (树)
容易使用 好 好 好 很好 尚好
逻辑表示 尚好 好 好 好 很好
易编码 尚好 好 好 很好 好
易维护 不好 不好 尚好 好 好
自动处理 不好 不好 尚好 很好 很好
结构化构造 不好 很好 好 好 不适用
数据表示 不好 不好 不好 好 不好
块结构 不好 好 尚好 好 不适用
逻辑验证 不好 尚好 尚好 尚好 很好
使用频率 高 低 低 中等 低
软件设计说明文档条目
1 范围
2 引用文档
3 概要设计
3.1 概述
3.1.1 结构
3.1.2 系统状态和模式
3.1.3 内存和进程时间分配
3.2 设计说明
3.2.1 软件部件 X
3.2.X.Y X的子部件 Y
4 详细设计
4.X 部件 X
4.X.Y 单元 Y
4.X.Y.1 Y的设计约束
4.X.Y.2 Y的设计
5 数据
6 数据文件
6.1 数据文件的交叉引用
6.2 数据文件说明
7 需求可追踪性
练习题
? 10分
? 对以下软件建立软件设计说明文档,
? 图书馆图书管理软件系统
? 与需求分析的练习题相一致
? 缺少条件可自行假设
? 电子文档
? 3星期后( 2003年 9月 17日前)提交
谢谢!
68389085( O)
68389504( H)
mdtang@btamail.net.cn