总体设计

系统设计:总体设计的基本目的就是回答“概括地说,系统应该如何实现”这个问题,因此,总体设计又称为概要设计或初步设计

结构设计:总体设计阶段的另一项重要任务是设计软件的结构 ,也就是要确定系统中每个程序是由哪些模块组成的,以及这些模块相互间的关系。


设计过程

1.设想供选择的方案(考虑应用逻辑背景和行政组织机构)

2.选取合理的方案(多个供选择)

对每个合理的方案,分析员都应该准备下列4份资料。     
(1) 系统流程图。         
(2) 组成系统的物理元素清单(硬件、软件/程序、文件/数据库组成)。     
(3) 成本/效益分析。     
(4) 实现这个系统的进度计划。

3.推荐最佳方案(推荐—>审查—>审批)

4.功能分解(一般工程上面数据流图化为5层)

5.设计软件结构(把模块组织成良好的层次系统)

6.设计数据库

7.制定测试计划

8.书写文档

(系统设计说明书),通常有下述几种
(1)系统说明
(2)用户手册
(3)测试计划
(4)详细的实现计划(进度)
(5)数据库设计结果

9.审查和复审(技术复查、管理角度复查)

设计原理

模块化(分而治之,使软件结构清晰,容易设计、容易阅读和理解、有助于软件开发工程的组织管理、容易测试与调试)

模块是由边界元素限定的相邻程序元素(例如:数据说明、可执行的语句等)的序列,而且有一个总体标识符代表它。模块是构成程序的基本构件

模块化就是把程序划分成独立命名且可独立访问的模块,每个模块完成一个子功能,把这些模块集成起来构成一个整体,可以完成指定的功能满足用户的需求

模块化的根据:把复杂的问题 分解成许多容易解决的小问题,原来的问题也就容易解决了

如果无限地分割软件,最后为了开发软件而需要的工作量也就小得可以忽略了。事实上,还有另一个因素在起作用,从而使得上述结论不能成立。
如图,当模块数目增加时每个模块的规模将减小,开发单个模块需要的成本(工作量)确实减少了; 但是,随着模块数目增加,设计模块间接口所需要的工作量也将增加。根据这两个因素,得出了图中的总成本曲线。每个程序都相应地有一个最适当的模块数目M,使得系统的开发成本最小

总体设计_第1张图片


抽象(模拟、共性)

抽象就是抽出事物的本质特性而暂时不考虑它们的细节

逐步求精

逐步求精定义为为了能集中精力解决主要问题而尽量推迟对问题细节的考虑
Miller法则:一个人在任何时候都只能把注意力集中在(7±2)个知识块上

信息隐藏与局部化

信息隐藏原理:应该这样设计和确定模块,使得一个模块内包含的信息(过程和数据)对于不需要这些信息的模块来说,是不能访问的

局部化是指把一些关系密切的软件元素物理(内容类似的放在一个系统)地放得彼此靠近。如果在测试期间和以后的软件维护期间需要修改软件,使用信息隐藏原理作为模块化系统设计的标准就会带来极大好处

模块独立

模块独立的重要性:1.有效的模块化(即具有独立性的模块)的软件比较容易开发出来
                              2.独立的模块比较容易测试和维护
模块的独立程度可以由两个定性标准度量,这两个标准分别称为内聚和耦

耦合

耦合是对一个软件结构内不同模块之间互连程度的度量。 耦合强弱取决于模块间接口的复杂程度,进入或访问一个模块 的点,以及通过接口的数据

① 数据耦合     
两个模块彼此间通过参数交换信息,而且交换的信息仅仅是数据, 那么这种耦合称为数据耦合。数据耦合是低耦合。系统中至少必须存 在这种耦合。
②控制耦合     
传递的信息中有控制信息(尽管有时这种控制信息以数据的形式出 现),则这种耦合称为控制耦合。控制耦合是中等程度的耦合。
③ 特征耦合     
当把整个数据结构作为参数传递而被调用的模块只需要使用其中一部分数据元素时,就出现了特征耦合
④ 公共环境耦合
当两个或多个模块通过一个公共数据环境相互作用时,它们之间的耦合称为公共环境耦合。
公共数据环境:全程变量、共享的通信区、内存的公共覆盖区、任何存储介质上的文件、物理设备等。
公共环境耦合的复杂程度随耦合的模块个数而变化,当耦合的模块个数增加时复杂程度显著增加。

如果只有两个模块有公共环境,公共环境耦合有下面两种可能。 (1) 一个模块往公共环境送数据,另一个模块从公共环境取数 据。这是数据耦合的一种形式,是比较松散的公共环境耦合。 (2) 两个模块都既往公共环境送数据又从里面取数据,这种公共环境耦合比较紧密,介于数据耦合和控制耦合之间

⑤ 内容耦合(应该坚决避免使用内容耦合)     
最高程度的耦合是内容耦合。如果出现下列情况之一,两个模块间就发生了内容耦合。
一个模块访问另一个模块的内部数据。
一个模块不通过正常入口而转到另一个模块的内部。
两个模块有一部分程序代码重叠(只可能出现在汇编程序中)。
一个模块有多个入口(这意味着一个模块有几种功能)。

设计原则:尽量使用数据耦合,少用控制耦合和特征耦合,限制公共环境耦合的范围,完全不用内容耦合。 模块之间耦合程度越低越好

内聚

内聚衡量一个模块内部各个元素彼此结合的紧密程度
理想内聚的模块只做一件事情
内聚和耦合是密切相关的,模块内的高内聚往往意味着模块间的松耦合
内聚分为三大类低内聚、中内聚和高内聚

① 低内聚     
一个模块完成一组任务,这些任务彼此间即使有关系,关系也是很松散的,就叫做偶然内聚。     
一个模块完成的任务在逻辑上属于相同或相似的一类,则称为逻辑内聚。
一个模块包含的任务必须在同一段时间内执行,就叫时间内聚

② 中内聚
一个模块内的处理元素是相关的,而且必须以特定次序执行,则称为过程内聚。
模块中所有元素都使用同一个输入数据和(或)产生同一个输出数据,则称为通信内聚。

③ 高内聚
一个模块内的处理元素和同一个功能密切相关,而且这些处理必须顺序执行(通常一个处理元素的输出数据作为下一个处理元素的输入数据),则称为顺序内聚。
模块内所有处理元素属于一个整体,完成一个单一的功能, 则称为功能内聚。功能内聚是最高程度的内聚。

事实上,没有必要精确确定内聚的级别。 重要的是设计高内聚,并且能够辨认出低内聚的模块,有能力通过修改设计以提高模块的内聚程度并且降低模块间的耦合程度,从而获得较高的模块独立性

启发规则

1.改进软件结构提高模块独立性     
设计出软件的初步结构以后,应该审查分析这个结构,通过模块分解或合并,力求降低耦合提高内聚。
2. 模块规模应该适中     
一个模块的规模不应过大,最好能写在一页纸内(通常不超过60行语句)。
3.深度、宽度、扇出和扇入都应适当    
深度:软件结构中控制的层数;     
宽度:软件结构内同一个层次上的模块总数的最大值;     
扇出:一个模块直接控制(调用)的模块数目;     
扇入:一个模块被多少个上级模块直接调用的数目
4.模块的作用域应该在控制域之内     
作用域:受该模块内一个判定影响的所有模块的集合。     
控制域:模块本身以及所有直接或间接从属于它的模块的集合
在一个设计得很好的系统中,所有受判定影响的模块应该都从属于做出判定的那个模块,最好局限于做出判定的那个模块及它的直属下级模块,即模块的作用域是控制域的子集
5.力争降低模块接口的复杂程度
模块接口复杂是软件发生错误的一个主要原因。应该仔细设计模块接口,使得信息传递简单并且和模块的功能一致
6.设计单入口单出口的模块
这条启发式规则警告软件工程师不要使模块间出现内容耦合。当从顶部进入模块并且从底部退出来时,软件是比较容易理解的,因此也是比较容易维护的。
7.模块功能应该可以预测
模块的功能应该能够预测,但也要防止模块功能过分局限

描绘软件结构的图形工具

层次图(软件结构图/功能模块图)

层次图用来描绘软件的层次结构。形式与数据结构的层次方框图(见需求分析)相同,但是表现的内容却完全不同。层次图的一个矩形框代表一个模块,方框间的连线表示调用关系而不像层次方框图那样表示组成关系。层次图很适于在自顶向下设计软件的过程中使用。

总体设计_第2张图片

HIPO图

为了能使HIPO图具有可追踪性,在H图(层次图)里除了最顶层的方框之外,每个方框都加了编号。和H图中的每个方框对应,应该有一张IPO图描绘这个方框代表的模块的处理过程。

总体设计_第3张图片
结构图

面向数据流的设计方法

面向数据流的设计方法把信息流映射成软件结构,信息流的类型决定了映射的方法。信息流有下述两种类型
1)变换流(90%)     
信息沿输入通路进入系统, 由外部形式变换成内部形式, 进入系统的信息通过变换中心, 经加工处理以后再沿输出通路变换成外部形式离开软件系统。 当数据流图具有这些特征时, 这种信息流就叫作变换流
总体设计_第4张图片

2)事务流(10%)
数据沿输入通路到达一个处理T,这个处理根据输入数据的类型在若干个动作序列中选出一个来执行。这类数据流应该划为一类 特殊的数据流,称为事务流。 图中的处理T称为事务中心, 它完成下述任务。 ⑴接收输入数据(输入数据又称为事务)。 (2) 分析每个事务以确定它的类型。 (3) 根据事务类型选取一条活动通路。
总体设计_第5张图片

设计优化(先使它能工作,然后再使它快起来)

设计人员应该致力于开发能够满足所有功能和性能要求,而且按照设计原理和启发式设计规则衡量是值得接收的软件。 设计的早期阶段尽量对软件结构进行精化。 对时间起决定性作用的软件进行优化是合理的。
(1) 在不考虑时间因素的前提下开发并精化软件结构。
(2) 在详细设计阶段选出最耗费时间的那些模块,仔细地设计它们的处理过程(算法),以求提高效率。
(3) 使用高级程序设计语言编写程序。
(4) 在软件中孤立出那些大量占用处理机资源的模块。
(5) 必要时重新设计或用依赖于机器的语言重写上述大量占用资源的模块的代码,以求提高效率


你可能感兴趣的:(软件工程导论)