710 likes | 878 Views
第 5 章 总体设计. 解决 “ 怎样做 ” —— 系统应该如何实现 划分出组成系统的物理元素:程序、文件、数据库、人工过程和文档等 设计软件结构,及划分模块. 正确的软件设计. 软件设计是后续开发步骤及软件维护工作的基础。如果没有设计,只能建立一个不稳定的系统结构. 结构化设计的目标与任务. 根据用信息域表示的软件需求,以及功能和性能需求,进行 系统结构设计 系统结构设计定义软件系统各主要成份之间的关系。 过程设计 过程设计则是把结构成份转换成软件的过程性描述。在编码步骤,根据这种过程性描述,生成源程序代码,然后通过测试最终得到完整有效的软件。 接口设计
E N D
解决“怎样做”——系统应该如何实现 • 划分出组成系统的物理元素:程序、文件、数据库、人工过程和文档等 • 设计软件结构,及划分模块
正确的软件设计 • 软件设计是后续开发步骤及软件维护工作的基础。如果没有设计,只能建立一个不稳定的系统结构
结构化设计的目标与任务 • 根据用信息域表示的软件需求,以及功能和性能需求,进行 • 系统结构设计 • 系统结构设计定义软件系统各主要成份之间的关系。 • 过程设计 • 过程设计则是把结构成份转换成软件的过程性描述。在编码步骤,根据这种过程性描述,生成源程序代码,然后通过测试最终得到完整有效的软件。 • 接口设计 • 描述了软件内部、软件与协作系统之间以及软件与使用它的人之间的沟通方式 • 数据设计 • 数据设计侧重于数据结构的定义 •
从分析到设计 • 软件设计必须依据对软件的需求来进行,结构化分析的结果为结构化设计提供了最基本的输入信息。
软件设计的步骤 • 从工程管理的角度来看,软件设计分两步完成。 • 概要设计,将软件需求转化为数据结构和软件的系统结构。 • 详细设计,即过程设计。通过对结构表示进行细化,得到软件的详细的数据结构和算法
5.1设计过程 • 5.2设计原理 • 5.3启发规则 • 5.4描绘软件结构的图形工具 • 5.5面向数据流的设计方
5.1设计过程 1. 设想供选择的方案 2. 选取合理的方案 3. 推荐最佳方案 4. 功能分解 5. 设计软件结构 6. 设计数据库 7. 制定测试计划 8. 书写文档 9. 审查和复审
软件总成本 最小成本区 接口成本 成本 成本 / 模块 模块数目 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、抽象(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 逐步求精
模块化原理 5.2.4 信息隐蔽于局部化 • 3、信息隐蔽(Information hiding) • 信息隐藏原理指出:应该这样设计和确定模块,使得一个模块内包含的信息(过程和数据)对于不需要这些信息的模块来说,是不能访问的。 • 如果在测试期间和以后的软件维护期间需要修改软件,那么使用信息隐藏原理作为模块化系统设计的标准就会带来极大的好处。因为绝大数数据和过程对于软件的其它部分是不可见的,在修改期间由于疏忽所引入的错误就很少可能传播到软件的其他部分
…… …… f1 f2 f3 fi fn gi(X,S) S S’ 输出 输出
模块化原理 5.2.5 模块独立性(Module independence) 好设计的关键:每个模块完成一个相对独立的子功能,并且与其它模块间的接口简单。 独立性的度量:耦合(Coupling)&内聚(Cohesion) 耦合:衡量不同模块彼此间互相依赖(连接)的紧密程度 内聚:衡量一个模块内部各个元素彼此结合的紧密程度 目标:低耦合、高内聚
Great deal of dependence Independent Highly coupled Loosely coupled Uncoupled 耦合
…… A B A: ………… ………… goto C1 ………… ………… C D C: ………… ………… C1: …… …… 耦合 (1)内容耦合(Content Coupling): One module modifies another. • 例1:A访问C的内部数据或不通过正常入口而转入C的内部。
A: ……………… ……………… entry 1: ……………… ……………… entry 2: ……………… ……………… A B 耦合 • 例2:部分代码重叠(常出现在汇编程序中) 例3:一个模块有多个入口(功能) The least desirable
Global : V1 V2 Global : V1 V2 A: ………… ………… A1=V1+V2 ………… ………… B: ………… ………… V1=B1 ………… ………… A: ………… ………… V1++ ………… ………… B: ………… ………… V2=B1+V1 ………… ………… 耦合 • (2)公共耦合(Common coupling):当两个或多个模块通过一个公共数据环境相互作用时,它们之间的偶合就是公共环境耦合。公共环境可以是全局变量,共享的通信区,内存的公共覆盖区、任何存储介质上的文件和物理设备 • 问题: 公共部分的改动将影响所有调用它的模块; • 公共部分的数据存取无法控制; • 复杂程度随耦合模块的个数增加而增加。
B Fn …… Flag A F2 …… Flag F1 耦合 • (3)控制耦合(Control coupling):两个模块彼此间通过参数交换信息,如果交换信息中有控制信息,则为控制耦合 接口单一,但仍然影响被控模块的内部逻辑。
耦合 (4)特征耦合:当被调用的模块只需要一部分数据元素,但是却把整个数据结构作为参数传递给被调用的模块。这将导致对数据的访问失去控制,从而给犯罪提供了机会 (5)数据耦合(Data coupling):两个模块彼此间通过参数交换信息,而且交换的仅仅是数据 The most desirable.
耦合 原则:尽量使用数据耦合,少用控制耦合,限制公共耦合的范围,完全不用内容耦合。
内聚 (1)偶然内聚(低内聚) :如果一个模块完成一组任务,这些任务彼此间即使有联系,关系也是松散的; 例如:有时在写完一个程序,发现一组语句在两处或多处出现,于是把这些语句作为一个模块; • 问题:不同功能混在一个模块中,有时共用部分编码,使局部功能的修改牵动全局。
from disk from tape from …… A: Read inputs 内聚 (2)逻辑内聚(低内聚) :一个模块完成的任务在逻辑上属于相同的或者相似的一类
内聚 (3)时间内聚(低内聚):一个模块包含的任务必须在同一段时间内执行 • 例如:系统的初始化 • 低内聚问题:不同功能混在一个模块中,有时共用部分编码,使局部功能的修改牵动全局。
enter data check data manipulate data 内聚 (4)过程内聚(中内聚) :如果一个模块内的处理元素是相关的,而且必须以特定顺序执行 例如:
内聚 (5)通信内聚(中内聚):如果模块内所有元素都使用同一个输入数据或产生同一个输出数据,则称为通信内聚 • 例如:从同一磁带上读取不相干的数据
内聚 • (6)顺序内聚(高内聚):如果一个模块内的处理元素和同一个功能密切相关,而且这些处理必须顺序执行,则称为顺序内聚 • (7)功能内聚(高内聚):如果模块内所有处理元素属于一个整体,完成一个单一功能,则为功能内聚
5.3 启发性规则 1. 争取低耦合、高内聚(增加内聚 > 减少耦合) • 2. 模块规模适中: 过大不易理解;太小则接口开销过大。注意分解后不应降低模块的独立性。 • 3. 适当控制 —— • 深度 = 分层的层数。过大表示分工过细。 • 宽度 = 同一层上模块数的最大值。过大表示系统复杂度大。
A A的扇出 A的扇入 A 启发性规则 • 扇出 = 一个模块直接调用\控制的模块数。 3 fan-out 9 扇入 = 直接调用该模块的模块数 在不破坏独立性的前提下,fan-in大的比较好。
启发性规则 • 尽可能减少高扇出结构,随着深度增大扇入。 • 如果一个模块的扇出数过大,就意味着该模块过分复杂,需要协调和控制过多的下属模块。应当适当增加中间层次的控制模块
M A C B 启发性规则 • 4、作用域在控制域内 • 控制域 • 作用域:M中的一个判定所影响的模块。 M的控制域为 {M,A,B,C} A: ………… if …… then goto C ………… ………… 作用域在控制域内 上例中A的作用超出了控制域。改进方法之一,可以把A中的 if移到M中;方法之二,可以把C移到A下面。
启发性规则 • 5、降低接口的复杂程度:接口复杂可能表明模块的独立性差。 • 6、单出单入,避免内容耦合。 • 7、模块功能可预测 —— 相同输入必产生相同输出。反例:模块中使用全局变量或静态变量,则可能导致不可预测。
5.4 描绘软件结构的图形工具 • 1 层次图和HIPO图 • 通常使用层次图描绘软件的层次结构。在图5.3中已经非正式地使用了层次图。在层次图中一个矩形框代表一个模块,框间的连线表示调用关系(位于上方的矩形框所代表的模块调用位于下方的矩形框所代表的模块)。
HIPO图是美国IBM公司发明的“层次图加输入/处理/输出图”的英文缩写。为了使HIPO图具有可追踪性,在H图(即层次图)里除了顶层的方框之外,每个方框都加了编号。
2 结构图 • Yourdon提出的结构图是进行软件结构设计的另一个有力工具。结构图和层次图类似,也是描绘软件结构的图形工具,图中一个方框代表一个模块,框内注明模块的名字或主要功能;方框之间的箭头(或直线)表示模块的调用关系。 • 在结构图中通常还用带注释的箭头表示模块调用过程中来回传递的信息。如果希望进一步标明传递的信息是数据还是控制信息,则可以利用注释箭头尾部的形状来区分:尾部是空心圆表示传递的是数据,实心圆表示传递的是控制信息。图5.5是结构图的一个例子。