Upload
channary-khin
View
49
Download
3
Embed Size (px)
DESCRIPTION
第 5 章 总体设计. 解决 “ 怎样做 ” —— 系统应该如何实现 划分出组成系统的物理元素:程序、文件、数据库、人工过程和文档等 设计软件结构,及划分模块. 正确的软件设计. 软件设计是后续开发步骤及软件维护工作的基础。如果没有设计,只能建立一个不稳定的系统结构. 结构化设计的目标与任务. 根据用信息域表示的软件需求,以及功能和性能需求,进行 系统结构设计 系统结构设计定义软件系统各主要成份之间的关系。 过程设计 过程设计则是把结构成份转换成软件的过程性描述。在编码步骤,根据这种过程性描述,生成源程序代码,然后通过测试最终得到完整有效的软件。 接口设计 - PowerPoint PPT Presentation
Citation preview
第第 55 章章总体设计 总体设计
解决“怎样做”——系统应该如何实现解决“怎样做”——系统应该如何实现
1.1.划分出组成系统的物理元素:程序、文件、划分出组成系统的物理元素:程序、文件、
数据库、人工过程和文档等数据库、人工过程和文档等
2.设计软件结构,及划分模块
正确的软件设计正确的软件设计软件设计是后续开发步骤及软件维护工作的基础。如果软件设计是后续开发步骤及软件维护工作的基础。如果
没有设计,只能建立一个不稳定的系统结构没有设计,只能建立一个不稳定的系统结构
结构化设计的目标与任务结构化设计的目标与任务根据用信息域表示的软件需求,以及功能和性能需求,进行 系统结构设计
系统结构设计定义软件系统各主要成份之间的关系。系统结构设计定义软件系统各主要成份之间的关系。 过程设计
过程设计则是把结构成份转换成软件的过程性描述。在编码步骤,根据这种过程设计则是把结构成份转换成软件的过程性描述。在编码步骤,根据这种过程性描述,生成源程序代码,然后通过测试最终得到完整有效的软件。过程性描述,生成源程序代码,然后通过测试最终得到完整有效的软件。
接口设计 描述了软件内部、软件与协作系统之间以及软件与使用它的人之间的沟通方描述了软件内部、软件与协作系统之间以及软件与使用它的人之间的沟通方
式式 数据设计
数据设计侧重于数据结构的定义数据设计侧重于数据结构的定义
软件设计必须依据对软件的需求来进行,结构化分析的结果为结构化设计提供了最基本的输入信息。
从分析到设计从分析到设计
不同阶段的信息流不同阶段的信息流
软件设计的步骤软件设计的步骤从工程管理的角度来看,软件设计分两步完成。从工程管理的角度来看,软件设计分两步完成。
概要设计概要设计,将软件需求转化为数据结构和软件的系统结构。,将软件需求转化为数据结构和软件的系统结构。 详细设计详细设计,即过程设计。通过对结构表示进行细化,得到软,即过程设计。通过对结构表示进行细化,得到软
件的详细的数据结构和算法件的详细的数据结构和算法
5.15.1 设计过程设计过程
5.25.2 设计原理设计原理
5.35.3 启发规则启发规则
5.45.4 描绘软件结构的图形工具描绘软件结构的图形工具
5.55.5 面向数据流的设计方面向数据流的设计方
5.15.1 设计过程设计过程1. 设想供选择的方案2. 选取合理的方案3. 推荐最佳方案4. 功能分解5. 设计软件结构6. 设计数据库7. 制定测试计划8. 书写文档9. 审查和复审
5.2 5.2 设计原理设计原理1 、模块化经验 1 :工作量 E(P1+P2)>E(P1)+E(P2)
经验 2 : P.58 图 4.1
成本
成本 / 模块
最小成本区接口成本
软件总成本
模块数目
模块化原理模块化原理程序结构程序结构
程序结构表明了程序各个部件程序结构表明了程序各个部件 ((模块模块 ))的组织情况,是软件的过程表示的组织情况,是软件的过程表示。。
模块化原理模块化原理 模块的调用关系和接口:模块之间用单向箭头联结,箭头从调用模块的调用关系和接口:模块之间用单向箭头联结,箭头从调用
模块指向被调用模块,表示调用模块调用了被调用模块。模块指向被调用模块,表示调用模块调用了被调用模块。 模块间的信息传递:当一个模块调用另一个模块时,调用模块把模块间的信息传递:当一个模块调用另一个模块时,调用模块把
数据或控制信息传送给被调用模块,以使被调用模块能够运行。数据或控制信息传送给被调用模块,以使被调用模块能够运行。而被调用模块在执行过程中又把它产生的数据或控制信息回送给而被调用模块在执行过程中又把它产生的数据或控制信息回送给调用模块调用模块
模块化原理模块化原理例 1 :寻找并输出 11~999 之间的数 m ,它满足 m 、 m2
和 m3 均为回文数。 回文:各位数字左右对称的整数。 例如: 11 满足上述条件
112=121 , 113=1331 。
分析:10 取余的方法,从最低位开始,依次取出该数的各位
数字。按反序重新构成新的数,比较与原数是否相等,若相等,则原数为回文。
例 2 :
2 、抽象 (Abstraction) : 忽略细节,分层理解问题,自顶向下层层加细。
例:开发一个 CAD 软件,实现一个二维绘图系统的全部功能,供低级计算机辅助设计使用。 抽象层次 I:用问题所处环境的术语来描述这个软件。
该软件包括一个计算机绘图界面,向绘图员显示图形,以及一个数字化仪界面,用以代替绘图板和丁字尺。所有直线、折线、矩形、圆及曲线的描画、所有的几何计算、所有的剖面图和辅助视图都可以用这个 CAD 软件实现……。
模块化原理模块化原理
抽象层次 II:任务需求的描述。列出“ What”而不是“ How”。
CAD SOFTWARE TASKS:
user interaction task;
2-D drawing creation task;
graphics display task;
drawing file management task;
END
模块化原理模块化原理
抽象层次 III :程序过程表示。以 2-D 绘图生成任务为例: PROCEDURE 2-D drawing creation REPEAT UNTILE (drawing creation task terminates) DO WHILE (digitizer interaction occurs) Digitizer interface task; DETERMINE drawing request CASE Line: line drawing task; Rectangle: rectangle drawing task; Circle: circle drawing task; …… END ; DO WHILE (keyboard interaction occurs) keyboard interaction task; PROCESS analysis/computation CASE View: auxiliary view task; Section: cross sectioning task; …… END ; …… END REPETITION ; END PROCEDURE. 在这个抽象层次上,给出了初步的过程表示,所用的术语
都已面向软件,而且模块化的工作已经开始显露。
模块化原理模块化原理
5.2.3 逐步求精
模块化原理模块化原理
3 、信息隐蔽 (Information hiding)
信息隐藏原理指出:应该这样设计和确定模块,使得一个模块内包
含的信息 ( 过程和数据 ) 对于不需要这些信息的模块来说,是不能
访问的。
如果在测试期间和以后的软件维护期间需要修改软件,那么使用信
息隐藏原理作为模块化系统设计的标准就会带来极大的好处。因为
绝大数数据和过程对于软件的其它部分是不可见的,在修改期间由
于疏忽所引入的错误就很少可能传播到软件的其他部分
5.2.4 信息隐蔽于局部化
模块化原理模块化原理
f1 f2 f3 …… fi ……fn
Sgi(X,S)
S’ 输出
输出
5.2.5 模块独立性 (Module independence)
好设计的关键:每个模块完成一个相对独立的子功能,并且与其它模块间的接口简单。 独立性的度量:耦合 (Coupling)& 内聚 (Cohesion)
耦合:衡量不同模块彼此间互相依赖(连接)的紧密程度 内聚:衡量一个模块内部各个元素彼此结合的紧密程度 目标:低耦合、高内聚
模块化原理模块化原理
耦合耦合Great deal of dependence Independent
Highly coupled Loosely coupled Uncoupled
Goal: as loose as possible as independent as possible
例 1 : A 访问 C 的内部数据或不通过正常入口而转入 C 的内部。
……
A B
C DA:……………………goto C1……………………
C:……………………C1: …… ……
(1) 内容耦合 (Content Coupling): One module modifies another.
耦合耦合
例 2 :部分代码重叠(常出现在汇编程序中)
B
A
例 3 :一个模块有多个入口(功能)
A:………………………………entry 1:………………………………entry 2:………………………………
The least desirable
耦合耦合
(2) 公共耦合 (Common coupling) :当两个或多个模块通过一个公共数据环境相互作用时,它们之间的偶合就是公共环境耦合。公共环境可以是全局变量,共享的通信区,内存的公共覆盖区、任何存储介质上的文件和物理设备
Global : V1
V2
A:……………………A1=V1+V2……………………
B:……………………V1=B1……………………
Global : V1
V2
A:……………………V1++……………………
B:……………………V2=B1+V1……………………
问题: 公共部分的改动将影响所有调用它的模块; 公共部分的数据存取无法控制; 复杂程度随耦合模块的个数增加而增加。
耦合耦合
( 3 )控制耦合 (Control coupling) :两个模块彼此间通过参数交换信息,如果交换信息中有控制信息,则为控制耦合
A
B
Flag F2
F1
Fn……
……Flag
接口单一,但仍然影响被控模块的内部逻辑。
耦合耦合
( 4 )特征耦合:当被调用的模块只需要一部分数据元素,但是却把整个数据结构作为参数传递给被调用的模块。这将导致对数据的访问失去控制,从而给犯罪提供了机会
( 5 )数据耦合 (Data coupling):两个模块彼此间通过参数交换信息,而且交换的仅仅是数据
The most desirable.
耦合耦合
耦合耦合原则:尽量使用数据耦合,少用控制
耦合,限制公共耦合的范围,完全不用内容耦合。
(1)偶然内聚(低内聚) :如果一个模块完成一组任务,这些任务彼此间即使有联系,关系也是松散的; 例如:有时在写完一个程序,发现一组语句在两处或多处出现,于是把这些语句作为一个模块;
问题:不同功能混在一个模块中,有时共用部分编码,使局部功能的修改牵动全局。
内聚 内聚
内聚内聚( 2 )逻辑内聚(低内聚) :一个模块完成的任务在
逻辑上属于相同的或者相似的一类
A:
Read
inputs
from disk
from tape
from ……
( 3 )时间内聚(低内聚):一个模块包含的任务必须在同一段时间内执行 例如:系统的初始化
低内聚问题:不同功能混在一个模块中,有时共用部分编码,使局部功能的修改牵动全局。
内聚内聚
内聚内聚( 4 )过程内聚(中内聚) :如果一个模块内的处理
元素是相关的,而且必须以特定顺序执行
例如:
enter data
check data
manipulate data
( 5 )通信内聚(中内聚):如果模块内所有元素都使用同一个输入数据或产生同一个输出数据,则称为通信内聚
例如:从同一磁带上读取不相干的数据
内聚内聚
内聚内聚( 6 )顺序内聚(高内聚):如果一个模块内的处理元
素和同一个功能密切相关,而且这些处理必须顺序执行,则称为顺序内聚
( 7 )功能内聚(高内聚):如果模块内所有处理元素属于一个整体,完成一个单一功能,则为功能内聚
内聚内聚
2. 模块规模适中: 过大不易理解;太小则接口开销过大。注意分解后不应降低模块的独立性。
3. 适当控制 —— 深度 = 分层的层数。过大表示分工过细。 宽度 = 同一层上模块数的最大值。过大表示系统复杂
度大。
1. 争取低耦合、高内聚(增加内聚 > 减少耦合)
5.3 5.3 启发性规则启发性规则
启发性规则启发性规则
扇出 = 一个模块直接调用 \控制的模块数。 3 fan-out 9
A
A 的扇出
A
A 的扇入
扇入 = 直接调用该模块的模块数
在不破坏独立性的前提下, fan-in 大的比较好。
启发性规则启发性规则
尽可能减少高扇出结构,随着深度增大扇入。 如果一个模块的扇出数过大,就意味着该模块过分复杂,需要协调和控制过多的下属模块。应当适当增加中间层次的控制模块
启发性规则启发性规则
4 、作用域在控制域内 控制域
作用域: M中的一个判定所影响的模块。
M
A C
B
M 的控制域为 {M , A , B , C}
A: ………… if …… then goto C ………… …………
作用域在控制域内上例中 A 的作用超出了控制域。改进方法之一,可以把 A 中的 if 移到 M中;方法之二,可以把 C 移到 A 下面。
启发性规则启发性规则
5 、降低接口的复杂程度:接口复杂可能表明模块的独立性差。
6 、单出单入,避免内容耦合。7 、模块功能可预测 —— 相同输入必产生相同输出。反例:
模块中使用全局变量或静态变量,则可能导致不可预测。
启发性规则启发性规则
1 层次图和 HIPO 图
通常使用层次图描绘软件的层次结构。在图
5.3 中已经非正式地使用了层次图。在层次图
中一个矩形框代表一个模块,框间的连线表示
调用关系 ( 位于上方的矩形框所代表的模块调
用位于下方的矩形框所代表的模块 ) 。
5.4 5.4 描绘软件结构的图形工具描绘软件结构的图形工具
图 5.3 正文加工系统的层次图
HIPO 图是美国 IBM 公司发明的“层次图加输入 / 处
理 / 输出图”的英文缩写。为了使 HIPO 图具有可追
踪性,在 H 图 ( 即层次图 ) 里除了顶层的方框之外,
每个方框都加了编号。
图 5.4 正文加工系统的 H 图
IPO 图的一个例子
改进的 IPO图 (IPO表 )的形式
2 结构图
Yourdon 提出的结构图是进行软件结构设计的另一个有力工具。结构图和层次图类似,也是描绘软件结构的图形工具,图中一个方框代表一个模块,框内注明模块的名字或主要功能;方框之间的箭头 ( 或直线 ) 表示模块的调用关系。
在结构图中通常还用带注释的箭头表示模块调用过程中来回传递的信息。如果希望进一步标明传递的信息是数据还是控制信息,则可以利用注释箭头尾部的形状来区分:尾部是空心圆表示传递的是数据,实心圆表示传递的是控制信息。图 5.5 是结构图的一个例子。
图 5.5 结构图的例子——产生
图 5.6 判定为真时调用 A,为假时调用 B
图 5.7 模块M循环调用模块 A, B,C
面向数据流的设计方法的目标是给出设计软件结构的一个系统化的途径。
在软件工程的需求分析阶段,信息流是一个关键考虑因素,通常用数据流图描绘信息在系统中加工和流动的情况。面向数据流的设计方法定义了一些不同的“映射”,利用这些映射可以把数据流图变换成软件结构。因为任何软件系统都可以用数据流图表示,所以面向数据流的设计方法理论上可以设计任何软件的结构。通常所说的结构化设计方法,也就是基于数据流的设计方法。
5.5 5.5 面向数据流的设计方法面向数据流的设计方法
1 概念
面向数据流的设计方法把信息流映射成软件结构,信息流的类型
决定了映射的方法。信息流有下述两种类型。
1. 变换流
2. 事务流
图 5.8 变换流
图 5.9 事务流
图 5.10 面向数据流方法的设计过程
2 变换分析
变换分析是一系列设计步骤的总称,经过这些步骤把具有变换流
特点的数据流图按预先确定的模式映射成软件结构。下面通过一
个例子说明变换分析的方法。
1. 例子
2. 设计步骤(1) 复查基本系统模型。(2) 复查并精化数据流图。(3) 确定数据流图具有变换特性还是事务特性。(4) 确定输入流和输出流的边界,从而孤立出变换中心。(5) 完成“第一级分解”。(6) 完成“第二级分解”。(7) 使用设计度量和启发规则对第一次分割得到的软件结构进
一步精化。
读和效验
计算Gal/h
计算燃料消耗
产生 mile/Gal显示
读旋转信号
收集和求平均
转换成转 /分 (r/min)
计算 mile/h和超速值
产生 mile/h显示
发出铃声
计算里程
产生里
程显示
确定加速/减速 产生加 /
减速显示
燃料流传感器信号
燃料流
Gal/h
Mile/Gal
Mile/Gal 显示
旋转信号
信号 / 每秒
Signal/s
r/min
r/min
mile/hmile/h
mile/h 显示
超速
铃声
英里
显示
Signal/s
显示
孤立出变换中心
图 5.13 第一级分解的方法
图 5.14 数字仪表板系统的第一级分解
图 5.15 第二级分解的方法
3 事务分析
虽然在任何情况下都可以使用变换分析方法设计软件结构,但是在数据流具有明显的事务特点时,也就是有一个明显的“发射中心” ( 事务中心 ) 时,还是以采用事务分析方法为宜。
事务分析的设计步骤和变换分析的设计步骤大部分相同或类似,主要差别仅在于由数据流图到软件结构的映射方法不同。
对于一个大系统,常常把变换分析和事务分析应用到同一个数据流图的不同部分,由此得到的子结构形成“构件”,可以利用它们构造完整的软件结构。
图 5.20 事务分析的映射方法
4 设计优化
考虑设计优化问题时应该记住,“一个不能工作的‘最佳设计’的
价值是值得怀疑的”。软件设计人员应该致力于开发能够满足所有
功能和性能要求,而且按照设计原理和启发式设计规则衡量是值得
接收的软件。
应该在设计的早期阶段尽量对软件结构进行精化。可以导出不同的
软件结构,然后对它们进行评价和比较,力求得到“最好”的结果。
这种优化的可能,是把软件结构设计和过程设计分开的真正优点之
一。