第三章 软件设计 SD方法
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一个好的软件结构的形态准则是:顶部宽度小, 中部宽度最大,底部宽度次之;在结构顶部有较高的 扇出数,在底部有较高的扇入数。
二、软件独立性准则
模块独立性是模块化、抽象和信息隐蔽的直接产物, 每个模块只要完成独立的功能,与其它模块联系越小,则 模块的独立性就越强。
独立:模块完成独立的功能 符合信息隐蔽和信息局部化原则 模块间关联和依赖程度尽量小
如果一个模块完成的任务在逻辑上属于相 同或相似的一类,则称之为逻辑性内聚。
例如:把几种相关的功能(逻辑上相似的功能)组 合在一模块内,每次调用时,由传给模块的判定参数来确 定该模块应执行哪一个功能。
• 3)时间内聚——低级内聚
如果一个模块包含的任务必须在同一时间段内执行,则 称之为时间性内聚。 例如:系统初始化模块、系统结束模块、紧急故障处 理模块等均是时间性内聚模块 例如:财务软件中,“年终结算”就是在年终时需 要做的一系列任务,如第四季度结算、年结算、年度 经费结余额转入下一年度的“经费来源”、“下一年 度”的“支出”取初始值为0等,把这些任务放在同一 模块中。
顺序型 功能型 强
偶然型 内聚性 弱
逻辑型
瞬时型
通信型
软件结构设计优化原则
模块结构图的改进
按照“降低块间联系,提高块内联系”的设计总则进行 修改,完善系统的模块图,写出模块的功能说明。
具体从以下方面改进: 1)尽可能建立功能模块 功能模块具有最强的内聚性,应满足信息屏蔽原则: 一个模块内所包含的信息(过程和数据)对不需要这些 信息的模块是不能访问的(黑盒)。
模块独立程度的定性标准
• 内聚性
度量模块的内部特征,标志一个模块内各个元素 彼此结合的紧密程度,也称块内联系。 • 耦合性 度量模块的外部特征,是对一个软件结构内不同 模块之间互连程度的度量,也称块间联系。 每个模块只要完成独立的功能,与其它模块联系 越少,则模块的独立性就越强。通过模块与模块之间 的耦合性和模块内部的内聚性来衡量模块的独立性。
• 4)过程内聚——中级内聚 过程性内聚:模块内成分彼此相关,并且必须按特 定的次序执行。
举例:使用流程图作为工具设计程序时,把流程图 中的某一部分划出来组成模块,就得到过程内聚模块。 例如,把流程图中的循环部分、判定部分、计算部分 分成三个模块,这三个模块都是过程内聚模块。
• 5)通信内聚——中级内聚 通信性内聚:模块中所有元素都使用同一个输 入数据和产生同一个输出数据。
1.输入系数 求一元二次方程
2.求解 3.打印方程的解
思考:过程内聚和顺序内聚区别?
顺序内聚中是数据流从一个处理元流到另一个处理元; 过程内聚是控制流从一个动作流到另一动作。
• 7)功能内聚——高级内聚
功能性内聚:如果模块内所有成分形成一个整体,完成 单个功能,则称功能内聚,功能内聚是最高程度的内聚形式。 例如,一个模块仅完成一个矩阵的输出,就是一个具 有功能性内聚的模块。
»尽量使用数据耦合; »少用控制耦合; »限制公共耦合的范围; »坚决避免使用内容耦合。
软件独立性的度量标准是两个定性指标: 耦合性 用于描述模块之间联系的紧密程度。
耦合性的几种类型
内容耦合 耦合性 高 公共耦合 控制耦合 复合耦合 数据耦合 低
内聚性
用于描述模块内部联系的紧密程度。
内聚性的几种类型
例如:控制耦合通常会增加系统的复杂性,有时 适当分解模块可消除控制耦合。 去除模块间控制耦合的方法: ①将被调用模块内的判定上移到调用模块中进行; ②被调用模块分解成若干单一功能模块。
• 5)外部耦合 外部耦合:一组模块都访问同一全局简单变量。 外部耦合必不可少,但这种模块数目应尽量少。
• 6)公共耦合
解决的办法有下面两种:
(1) 将A中的判定点上移至W模块
(2)把模块F移到A的控制域 内,成为它的直接下级模块
4)模块的大小适当
模块大小指其篇幅,一般模块大小为 50100行为宜。
5)模块的扇入/扇出数不宜太多 扇出数 一个模块调用其他模块的个数。 扇入数 一个模块被其他模块调用的个数。
除服务性模块外,模块的扇入扇出数不宜太 多,否则块间联系增加。
模块数目与开发成本间的关系
模块间的关系
软件结构表示软件的系统结构,它是软件模块间关系 的表示,均表示为层次关系。
扇出为3
A
B
深度
0层
软 件 结 构 示 意 图
C
D
来自百度文库
1层
E
I J N K
F
L
扇入为2
扇入为3
G
M
H
2层 3层
4层
宽度
有 关 指 标 ① 深度:表示软件结构中从顶层模块到最底层模块 的层数。 ② 宽度:表示控制的总分布。 ③ 扇出数:指一个模块直接控制下属的模块个数。 ④ 扇入数:指一个模块的直接上属模块个数。
一、软件设计阶段的任务 总体设计的任务是回答“概括的说,系统应该如 何实现”的问题。
主要任务: 将需求分析阶段获得的需求说明书转换为计 算机中可实现的系统,确定系统的软件结构,形 成软件的模块结构图,最终得到软件总体设计说 明书。
具体过程:
– – – – – 系统设计 结构设计 数据库设计 编写总体设计文档 审查和复审
2)消除重复功能 若两模块含有重复的部分,应设法将重复的功能 消去。
X Y X Y X Y
Q’2 Q1 Q2 Q’1 Q Q’2 Q Q
X
Y
重复部分
(a)
(b)
(c)
(d)
3)模块的作用范围应在控制范围之内 控制范围 — 结构方面的特点,包括 模块本身以及其所有下属模块(直接 或间接从属于它的模块)的集合。 作用范围 — 判断所涉及的模块,指 受该模块内一个判定影响的所有模块 的集合。
A TOP
X
B B1
T
B2
如果再设计过程中,发现模块作用范围不在其控 制范围之内,可以用“上移判点”或“下移受判断 影响的模块,将它下移到判断所在模块的控制范围 内”的方法加以改进。
模块A的控制域:ABCDE模块的集合
– 当A中的判定只影响B时,满足规则; – 若A中的一个判定影响F时,则模块A的作用范围不在它 的控制范围内。
具体任务:
确定软件结构,划分子系统模块
确定系统的数据结构
设计用户界面
3.2 软件设计基本原理
•
软件的模块化
•
• •
模块独立性
抽象和逐步求精 信息隐蔽和局部化
一、模块化准则
模块:构成程序的基本构件,在一个模块中,功能、 状态和接口反映模块的外部特性,逻辑(即内部数据和程 序代码)反映它的内部特性。 模块化:解决一个复杂问题时自顶向下逐层把软件系 统化分成若干模块的过程。就是将系统划分成若干模块, 每个模块完成一个特定的子功能,所有的模块按某种方法 组装起来,成为一个整体,完成整个系统所要求的功能。 模块化是软件解决复杂问题所具备的手段。 我们利用模块化来降低软件复杂度。注意选择分解的 最佳模块数。
如果发生下列情形之一,两模块之间就产生了内容耦合: 一个模块直接访问另一模块的内部数据; 一个模块不通过正常入口转到另一模块的内部; 两个模块有部分程序代码重叠; 一个模块有多个入口。
小结:
模块耦合越弱,则说明模块的独立性越强 ①与内聚度正好相反,在设计软件时应追求尽可能松散耦合 的系统。因为对这类系统中任一模块的设计、测试和维护相对 独立。由于模块间联系较少,错误在模块间传播的可能性也随 之变小。 ②如何降低模块间的耦合度:
• 3)特征耦合
两个模块通过传递数据结构(不是简单的 数据,而是记录、数组等)加以联系。当被调 用模块只使用数据结构中的一部分数据元素时, 就出现了特征耦合。
思考:如何将特征耦合改为数据耦合??
• 4)控制耦合 如果两模块间通过参数交换信息,此时若传递的 信息中含有控制信息,则耦合度上升为控制耦合。
例如,财务软件中的 流水账文件中含有某个 月内全部收支流水账记 录,利用该文件可分别 产生该月上旬、中旬、 下旬的三种不同统计表, 以及该月总统计报表。
流水账文件
产生上旬 统计表
产生中旬 统计表
产生下旬 统计表
产生月 统计表
• 6)顺序内聚——高级内聚
顺序性内聚:若一个模块内的各处理成分均与同一功 能相关,且这些处理必须顺序执行,则称顺序内聚; 通常, 一个处理成分的输出是另一个处理成分的输入。
思考回答: 为什么模块独立性很重要?
三、信息隐蔽
指在设计和确定模块时,使得一个模块内包含的信息 (过程或数据),对于不需要这些信息的其它模块来说, 是不能访问的。 通过信息隐蔽,可以定义和实施对模块的过程细节和 局部数据结构的存取限制。
结构化设计方法的启发式原则
改进软件结构以提高模块独立性 力求降低耦合、提高内聚 软件结构的模块规模应该适中 过大,可理解程度很低;过小,则开销大于有效操作 深度、宽度、扇出和扇入都应适当 经验证明,一个设计好的软件结构,通常顶层扇出比 较高,中层扇出比较少,底层有高扇入。 模块接口简单清晰
公共耦合:一组模块引用同一个公用数据区(也称全局 数据区、公共数据环境)。 其中,公共数据区指:全局数据结构 共享的通讯区 内存的公共覆盖区等
公共环境耦合存在的问题: § 软件可理解性降低 § 诊断错误困难 § 软件可维护性差 § 软件可靠性差
• 7)内容耦合 内容耦合:当一个模块使用另一个模块内部的数 据或控制信息;一个模块直接转移到另一个模块内 部等。
模块的内聚
内聚度按其高低程度可分为七级,内聚度越高越好。 内聚性:又称为块内联系,指模块的功能强度的度量,即一 个模块内部各个元素彼此结合的紧密程度的度量。 • (1)偶然内聚 • (2)逻辑内聚 • (3)时间内聚 • (4)过程内聚 • (5)通信内聚 • (6)顺序内聚 • (7)功能内聚 内聚按紧密程度从高到低排列: 功能内聚、顺序内聚 、通信内聚、过程内聚、时间 内聚、逻辑内聚、偶然内聚。
习题:确定模块之间的耦合类型
表 模块接口描述
P
1
编号
2
输入 飞机类型 飞机零件清单 功能代码
输出 状态标志
q
3
4
1 2 3
r
5
s
6
4 5
6
飞机零件清单 零件编号
零件标号
零件制造商
零件名词
t
u
模块q 、t 和u更新同一个数据库
结构化设计图(SC图)
1. 结构图的符号 • (1)方框代表模块,框内注明模块 的名字和主要功能。同一名字的模块 只允许出现一次。 • (2)方框之间的大箭头或直线表示 模块的调用关系。 • (3)带注释的小箭头表示模块调用 时传递的信息及其传递方向。 尾部加空心圆的小箭头表示 传递数据信息。 尾部加实心圆的小箭头表示 传递控制信息。 • (4)选择结构,菱形表示有条件的 调用 • (5)循环结构,模块 H 循环调用模 块 A,B,C,由左到右顺序调用
模块分解的目的:
假设: 函数C(X)——问题X的复杂性; 函数E(X)——求解问题X需要花费的工作量(时间); 对于问题P1和P2,如果 : C(P1)>C(P2) 则有 : E(P1)>E(P2) * 结论:解决一个复杂问题总比解决一个简单问题耗费更多的 工作量。 同时 有:C(P1+P2)>C(P1)+C(P2) * 结论:由P1、P2组合而成的问题的复杂性往往比考虑 单个问题复杂性的和更大。 于是有: E(P1+P2)>E(P1)+E(P2)
小结:
• 设计软件时,应该能够识别内聚度的高低, 并通过修改设计尽可能提高模块内聚度, 从而获得较高的模块独立性。 • 力求做到高内聚,尽量少用中内聚,不用 低内聚
模块的耦合
耦合度是对软件结构中模块间关联程 度的一种度量,耦合度也可以分为七级。
• 非直接耦合 • 数据耦合 • 控制耦合 • 特征耦合
• 1)偶然内聚——低级内聚 偶然内聚:是指一个模块内各成分为完成一组功能而 组合在一起,它们相互之间即使有关系,也很松散。 如:A、B两个模块含有相同的一段代码C,程序员 为了节约内存,而将A、B放在同一模块内,以共享C, 模块AB即为偶然内聚。
缺点:可理解性差, 可修改性差
• 2)逻辑内聚——低级内聚
• 公共环境耦合
• 内容耦合
• 1)非直接耦合——最松散的耦合
如果两模块中任一个都不依赖于对方能独立 工作,意味着模块间无任何连接,则称这两模 块为非直接耦合,这类耦合度最低。
• 2)数据耦合
数据耦合:如果两模块间通过参数交换信息, 而信息仅限于数据,则称这两模块为数据耦合。 一般软件系统中都存在数据耦合,它是完成大 多数功能所必需的。
第3章 软件设计
主要内容: 软件设计步骤 软件结构设计 软件结构设计的图形工具:HIPO图和结构图 面向数据流设计方法 过程设计工具 系统人机界面设计 数据代码设计 面向数据结构的设计方法 软件设计文档
• • • • • • • • •
3.1 软件设计概述
软件设计是软件开发的关键步骤,直接影响软 件质量。软件设计阶段要解决“如何做”的问题。