1、总体设计内容提要n总体设计的必要性n总体设计的任务n总体设计过程n总体设计原理n启发式规则n描绘软件结构的图形工具n面向数据流的设计方法总体设计的必要性n可以站在全局高度上,花较少成本,从较抽象的层次上分析对比多种可能的系统实现方案和软件结构,从中选出最佳方案和最合理的软件结构,从而用较低成本开发出较高质量的软件系统。总体设计的任务n总体设计的基本目的:回答“概括地说,系统应该如何实现?”n总体设计的任务:划分出组成系统的物理元素程序、文件、数据库、人工过程和文档等等,每个物理元素处于黑盒子级,其具体内容将在以后仔细设计。设计软件的结构,也就是要确定系统中每个程序是由哪些模块组成的,以及这些模
2、块相互间的关系。总体设计过程n系统设计阶段:确定系统的具体实现方案;设想供选择的方案选取合理的方案推荐最佳方案n结构设计阶段:确定软件结构。功能分解设计软件结构设计数据库制定测试计划书写文档审查和复审系统设计阶段1n设想供选择的方案分析员应该考虑各种可能的实现方案,并且力求从中选出最佳方案。需求分析阶段得出的数据流图是总体设计的极好的出发点。系统设计阶段2n选取合理的方案从前一步得到的一系列供选择的方案中选取低成本、中等成本和高成本的三种方案。对每个合理的方案应该准备下列4份资料:n(1)系统流程图;n(2)组成系统的物理元素清单;n(3)成本/效益分析;n(4)实现这个系统的进度计划。系统设
3、计阶段3n推荐最佳方案分析员综合分析对比各种合理方案的利弊,推荐一个最佳的方案,并且为推荐的方案制定详细的实现计划。用户和有关的技术专家应该认真审查分析员所推荐的最佳系统。如果该系统确实符合用户的需要,并且是在现有条件下完全能够实现的,则应该提请使用部门负责人进一步审批。结构设计阶段1n功能分解设计出组成这个系统的所有程序和文件(或数据库)。对程序(特别是复杂的大型程序)的设计,通常分为两个阶段完成:n(1)结构设计:确定程序由哪些模块组成及模块之间的关系,它是总体设计阶段的任务;从实现角度把复杂的功能进一步分解细化,经过分解之后应该使每个功能对大多数程序员而言都是明显易懂的。用IPO图或其他
4、适当的工具简要描述细化后每个处理的算法。n(2)过程设计:确定每个模块的处理过程,它是详细设计阶段的任务。把模块组织成良好的层次系统,最下层的模块完成最具体的功能。软件结构可以用层次图或结构图来描绘。如果数据流图已经细化到适当的层次,则可以直接从数据流图映射出软件结构,即面向数据流的设计方法。结构设计阶段2n设计数据库软件工程师应该在需求分析阶段所确定的系统数据需求的基础上,进一步设计数据库。n制定测试计划在软件开发的早期阶段考虑测试问题,能促使软件设计人员在设计时注意提高软件的可测试性。结构设计阶段3n书写文档(1)系统说明n系统设计阶段得到的文档。(2)初步的用户手册n修改在需求分析阶段产
5、生的初步的用户手册。(3)测试计划n包括测试策略,测试方案,预期测试结果,测试进度计划等。(4)详细的实现计划(5)数据库设计结果结构设计阶段4n审查和复审对总体设计的结果进行严格的技术审查;在技术审查通过之后再由使用部门的负责人从管理角度进行复审。总体设计原理n模块化n抽象n逐步求精n信息隐藏和局部化n模块独立(内聚和耦合)模块化n模块:由边界元素限定的相邻程序元素的序列,而且有一个总体标识符代表它。模块是构成程序的基本构件。n模块化:把程序划分成独立命名且可独立访问的模块,每个模块完成一个子功能,把这些模块集成起来构成一个整体,可以完成指定的功能满足用户的需求。n模块化的根据:“各个击破”
6、的理论,即把复杂的问题分解成许多容易解决的小问题,原来的问题也就容易解决了。模块化2n例:设函数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)模块化3n模块化和软件成本的关系模块化4n模块化的好处可以使软件结构清晰,不仅容易设计也容易阅读
7、和理解。有助于提高软件的可靠性,因为程序错误通常局限在有关的模块及它们之间的接口中,所以模块化使软件容易测试和调试。能够提高软件的可修改性,因为变动往往只涉及少数几个模块。有助于软件开发工程的组织管理,一个复杂的大型程序可以由许多程序员分工编写不同的模块,并且可以进一步分配技术熟练的程序员编写困难的模块。抽象n抽象:把在现实世界中一定事物、状态或过程之间存在着某些相似的方面(共性)集中和概括起来,暂时忽略它们之间的差异。n化分抽象层次是处理复杂系统的有效方法最高层次:使用问题环境的语言,以概括的方式叙述问题的解法;较低抽象层次:采用更过程化的方法,把面向问题的术语和面向实现的术语结合起来叙述问
8、题的解法;最低的抽象层次:用可直接实现的方式叙述问题的解法。抽象2n软件过程的抽象化过程在可行性研究阶段:软件作为系统的一个完整部件;在需求分析期间:软件解法使用在问题环境内熟悉的方式描述的;由总体设计向详细设计过渡时:抽象的程度也就随之减少了;源程序写出来以后:也就达到了抽象的最低层。逐步求精n逐步求精:为了能集中精力解决主要问题而尽量推迟对问题细节的考虑。n为什么要逐步求精:一个人在任何时候都只能把注意力集中在(72)个知识块上(Miller法则)。n逐步求精的作用:帮助软件工程师把精力集中在与当前开发阶段最相关的那些方面上,而忽略那些对整体解决方案来说虽然是必要的,然而目前还不需要考虑的
9、细节,这些细节将留到以后再考虑。n抽象与求精的关系:是一对互补的概念。抽象看作是一种通过忽略多余的细节同时强调有关的细节,而实现逐步求精的方法;求精则帮助设计者在设计过程中逐步揭示出低层细节,即自顶向下逐步细化。信息隐藏和局部化n信息隐藏原理:应该这样设计和确定模块,使得一个模块内包含的信息(过程和数据)对于不需要这些信息的模块来说,是不能访问的。n局部化:指把一些关系密切的软件元素物理地放得彼此靠近。局部化有助于实现信息隐藏。n“隐藏”的作用:可以通过定义一组独立的模块实现有效的模块化,这些独立的模块彼此间仅仅交换那些为了完成系统功能而必须交换的信息。模块独立n模块独立:具有独立功能而且和其
10、他模块之间没有过多的相互作用的模块,是模块化、抽象、信息隐藏和局部化概念的直接结果。n模块独立性的作用:有效的模块化(即具有独立的模块)的软件比较容易开发出来。独立的模块比较容易测试和维护。n模块独立程度的度量标准:内聚和耦合。耦合n耦合:对一个软件结构内不同模块之间互连程度的度量。n影响耦合强弱的因素:模块间接口的复杂程度进入或访问一个模块的点通过接口的数据n软件设计中应该追求尽可能松散耦合的系统。耦合的类别1n数据耦合:如果两个模块彼此间通过参数交换信息,而且交换的信息仅仅是数据。数据耦合是低耦合,系统中至少必须存在这种耦合。一般来说,一个系统可以只包含数据耦合。n控制耦合:如果传递的信息
11、中有控制信息(尽管有时这种控制信息以数据的形式出现)。控制耦合是中等程度的耦合,它增加了系统的复杂程度。控制耦合往往是多余的,在把模块适当分解之后通常可以用数据耦合代替它。n特征耦合:把整个数据结构作为参数传递而被调用的模块只需要使用其中一部分数据元素。被调用的模块可以使用的数据多于它确实需要的数据,这将导致对数据的访问失去控制,从而给计算机犯罪提供了机会。耦合的类别2n公共环境耦合:两个或多个模块通过一个公共数据环境相互作用。公共环境可以是全程变量、共享的通信区、内存的公共覆盖区、任何存储介质上的文件、物理设备等。公共环境耦合的复杂程度随耦合的模块个数的增加而显著增加。对于两个模块的公共环境
12、,有下面两种耦合:n(1)一个模块往公共环境送数据,另一个模块从公共环境取数据,这种耦合是松散的。n(2)两个模块都既往公共环境送数据又从里面取数据,这种耦合比较紧密,介于数据耦合和控制耦合之间。耦合的类别3n内容耦合:如果出现下列情况之一,两个模块间就发生了内容耦合:一个模块访问另一个模块的内部数据;一个模块不通过正常入口而转到另一个模块的内部;两个模块有一部分程序代码重叠(只可能出现在汇编程序中);一个模块有多个入口(这意味着一个模块有几种功能)。n内容耦合是最高程度的耦合,应该坚决避免。n耦合设计原则:尽量使用数据耦合,少用控制耦合和特征耦合,限制公共环境耦合的范围,完全不用内容耦合。内
13、聚n内聚:标志一个模块内各个元素彼此结合的紧密程度,它是信息隐藏和局部化概念的自然扩展。n内聚设计原则:力求做到高内聚,可以采用中内聚,不要使用低内聚。n内聚与耦合的关系:模块内的高内聚往往意味着模块间的松耦合,但是实践表明内聚比耦合更重要。通过修改设计提高模块的内聚程度降低模块间的耦合程度,从而获得较高的模块独立性。低内聚n偶然内聚:如果一个模块完成一组任务,这些任务彼此间即使有关系,关系也是很松散的。偶然内聚的模块出现修改错误的概率比其他类型的模块高得多。n逻辑内聚:如果一个模块完成的任务在逻辑上属于相同或相似的一类。逻辑内聚的模块中,不同功能混在一起,合用部分程序代码,这类模块的修改也比
14、较困难。n时间内聚:如果一个模块包含的任务必须在同一段时间内执行。时间关系在一定程度上反映了程序的某些实质,所以时间内聚比逻辑内聚好一些。中内聚n过程内聚:如果一个模块内的处理元素是相关的,而且必须以特定次序执行。使用程序流程图作为工具设计软件时,常常通过研究流程图确定模块的划分,这样得到的往往是过程内聚的模块。n通信内聚:如果模块中所有元素都使用同一个输入数据和(或)产生同一个输出数据。高内聚n顺序内聚:如果一个模块内的处理元素和同一个功能密切相关,而且这些处理必须顺序执行(通常一个处理元素的输出数据作为下一个处理元素的输入数据)。根据数据流图划分模块时,通常得到顺序内聚的模块,这种模块彼此
15、间的连接往往比较简单。n功能内聚:如果模块内所有处理元素属于一个整体,完成一个单一的功能。功能内聚是最高程度的内聚。内聚的评价n由Constantine,Yourdon,Myers和Stevens等人提出:功能内聚 10分时间内聚 3分顺序内聚9分逻辑内聚 1分通信内聚7分偶然内聚 0分过程内聚5分启发式规则n启发式规则:人们在开发计算机软件的长期实践中总结积累出来的丰富经验。n几条启发式规则:改进软件结构提高模块独立性模块规模应该适中深度、宽度、扇出和扇入都应适当模块的作用域应该在控制域之内力争降低模块接口的复杂程度设计单入口单出口的模块模块功能应该可以预测启发式规则2n改进软件结构提高模块
16、独立性通过模块分解或合并,力求降低耦合提高内聚。n模块规模应该适中经验表明,一个模块的规模不应过大,最好能写在一页纸内(通常不超过60行语句)。过大的模块往往需要进一步分解,一般说来,分解后不应该降低模块独立性。过小的模块开销大于有效操作,而且模块数目过多将使系统接口复杂。启发式规则3n深度、宽度、扇出和扇入都应适当深度:表示软件结构中控制的层数,它往往能粗略地标志一个系统的大小和复杂程度。宽度:软件结构内同一个层次上的模块总数的最大值,宽度越大系统越复杂。扇出:一个模块直接控制(调用)的模块数目,扇出过大意味着模块过分复杂,一个设计得好的系统的平均扇出通常是3或4(扇出的上限通常是59)。扇
17、入:表明有多少个上级模块直接调用它,扇入越大则共享该模块的上级模块数目越多,但不能违背模块独立原理单纯追求高扇入。软件结构中合理的扇出扇入:顶层扇出比较高,中层扇出较少,底层扇入到公共的实用模块中去(底层模块有高扇入)。启发式规则4n模块的作用域应该在控制域之内作用域:受该模块内一个判定影响的所有模块的集合。控制域:模块本身以及所有直接或间接从属于它的模块的集合。启发式规则5n力争降低模块接口的复杂程度模块接口的信息传递简单并且和模块的功能一致。接口复杂或不一致(即看起来传递的数据之间没有联系),是紧耦合或低内聚的征兆,应该重新分析这个模块的独立性。n设计单入口单出口的模块不要使模块间出现内容
18、耦合。n模块功能应该可以预测只要输入的数据相同就产生同样的输出,这个模块的功能就是可以预测的。描绘软件结构的图形工具n层次图:用来描绘软件的层次结构,一个矩形框代表一个模块,方框间的连线表示调用关系。nHIPO图:即层次图加输入/处理/输出图。在H图(层次图)里除了最顶层的方框之外,每个方框都加了编号。和H图中每个方框相对应,有一张IPO图描绘这个方框代表的模块的处理过程。描绘软件结构的图形工具2n结构图一个方框代表一个模块,框内注明模块的名字或主要功能;方框之间的箭头(或直线)表示模块的调用关系;用带注释的箭头表示模块调用过程中来回传递的信息,尾部是空心圆表示传递的是数据,实心圆表示传递的是
19、控制信息。n几点注意层次图和结构图并不严格表示模块的调用次序。层次图和结构图并不指明什么时候调用下层模块。通常用层次图作为描绘软件结构的文档。结构图示例判定为真时调用A,为假时调用B模块M循环调用模块A、B、C面向数据流的设计方法n面向数据流的设计方法:面向数据流的设计方法把信息流映射成软件结构,信息流的类型决定了映射的方法。n变换流:信息沿输入通路进入系统,同时由外部形式变换成内部形式,进入系统的信息通过变换中心,经加工处理以后再沿输出通路变换成外部形式离开软件系统。n事务流:数据沿输入通路到达一个处理T(事务中心),这个处理根据输入数据的类型在若干个动作序列中选出一个来执行。事务中心完成下
20、述任务:接收输入数据(输入数据又称为事务);分析每个事务以确定它的类型;根据事务类型选取一条活动通路。变换流 事务流变换分析n变换分析:经过一系列设计步骤,把具有变换流特点的数据流图按预先确定的模式映射成软件结构。变换分析步骤n复查基本系统模型。确保系统的输入数据和输出数据符合实际。n复查并精化数据流图。确保数据流图给出了目标系统的正确的逻辑模型;使数据流图中每个处理都代表一个规模适中相对独立的子功能。n确定数据流图具有变换特性还是事务特性。根据数据流图中占优势的属性(变换流、事务流),确定数据流的全局特性。把具有和全局特性不同的特点的局部区域孤立出来,以后再进一步精华软件结构。n确定输入流和
21、输出流的边界,孤立出变换中心,至此便完成“第一级分解”。n完成“第二级分解”:把数据流图中的每个处理映射成软件结构中一个适当的模块。软件结构最顶层的控制模块Cm协调输入信息处理控制模块Ca,变换中心控制模块Ct,输出信息处理控制模块Ce的控制功能。先从变换中心的边界开始沿着输入通路向外移动,把输入通路中每个处理映射成软件结构中Ca控制下的一个低层模块;然后沿输出通路向外移动,把输出通路中每个处理映射成直接或间接受模块Ce控制的一个低层模块;最后把变换中心内的每个处理映射成受Ct控制的一个模块;此外,还应该为每个模块写一个简要说明,描述接口、内部信息、过程、约束等。n使用设计度量和启发式规则对第
22、一次分割得到的软件结构进一步精化。根据模块独立原理进行精化,得到尽可能高的内聚、尽可能松散的耦合的软件结构。一级分解二级分解事务分析n一般使用变换分析方法设计软件结构,但有一个明显的“发射中心”(事务中心)时,还是以采用事务分析方法为宜。n由事务流映射成的软件结构包括一个接收分支和一个发送分支。接收分支:从事务中心的边界开始,把沿着接收流通路的处理映射成模块。发送分支:包含一个调度模块,它控制下层的所有活动模块;然后把数据流图中的每个活动流通路映射成与它的流特征相对应的结构。事务分析的映射方法设计优化n指导思想:“一个不能工作的最佳设计的价值是值得怀疑的”,因此“先使它能工作,然后再使它快起来。”n优化原则:力求做到在有效的模块化的前提下使用最少量的模块,以及在能够满足信息要求的前提下使用最简单的数据结构。n优化方法开发能够满足所有功能和性能要求,而且按照设计原理和启发式设计规则衡量是值得接收的软件。在设计的早期阶段尽量对软件结构进行精化。