1、0总体设计的任务总体设计的任务第5章总体设计1)系统设计系统设计确定系统的具体实现方案,由需求分析阶段得确定系统的具体实现方案,由需求分析阶段得到的数据流图导出。到的数据流图导出。若干合理的方案若干合理的方案系统流程图系统流程图组成系统组成系统的物理元素、成本效益分析、进度计划的物理元素、成本效益分析、进度计划最佳方最佳方案案数据库设计、测试计划等数据库设计、测试计划等引言12总体设计的任务总体设计的任务第5章总体设计2)结构设计结构设计确定系统中每个程序是由哪些模块组成的,以及这些模块相互间的关系。引言3主要内容主要内容主要内容 5.1 5.1 设计过程设计过程 5.2 5.2 设计原理设计
2、原理 5.3 5.3 启发规则启发规则 5.4 5.4 描绘软件结构的图形工具描绘软件结构的图形工具 5.5 5.5 面向数据流的设计方法面向数据流的设计方法 第5章总体设计4主要内容主要内容 5.1 5.1 设计过程设计过程 5.2 5.2 设计原理设计原理 5.3 5.3 启发规则启发规则 5.4 5.4 描绘软件结构的图形工具描绘软件结构的图形工具 5.5 5.5 面向数据流的设计方法面向数据流的设计方法 5.1 设计过程第5章总体设计55.1 设计过程5.15.1 设计过程设计过程总体设计过程系统设计阶段结构设计阶段1.设想供选择的方案2.选取合理的方案3.推荐最佳方案4.功能分解5.
3、设计软件结构6.设计数据库7.制定测试计划8.书写文档9.审查和复审第5章总体设计65.15.1 设计设计过程过程典型的总体设计步骤典型的总体设计步骤1. 设想供选择的方案设想供选择的方案在总体设计阶段分析员应该考虑各种可能的实现方案,并且力求从中选出最佳方案。需求分析阶段得出的数据流图是总体设计的极好的出发点。5.1 设计过程第5章总体设计75.15.1 设计设计过程过程2.选取合理的方案选取合理的方案选取若干个合理的方案选取若干个合理的方案,通常至少选取低成本、中等成本和高成本的3种方案。在判断哪些方案合理时应该考虑在问题定义和可行性研究阶段确定的工程规模和目标,有时可能还需要进一步征求用
4、户的意见。对每个合理的方案,分析员都应该准备下列4份资料。(1) 系统流程图。(2) 组成系统的物理元素清单。(3) 成本/效益分析。(4) 实现这个系统的进度计划。5.1 设计过程第5章总体设计85.15.1 设计设计过程过程3.推荐最佳方案推荐最佳方案用户和有关的技术专家应该认真审查分析员所推荐的最佳系统,如果该系统确实符合用户的需要,并且是在现有条件下完全能够实现的,则应该提请使用部门负责人进一步审批审批。在使用部门的负责人也接受了分析员所推荐的方案之后,将进入总体设计过程的下一个重要阶段结构设计。5.1 设计过程第5章总体设计95.15.1 设计设计过程过程4.功能分解功能分解为了最终
5、实现目标系统,必须设计出组成这个系统的所有程序和文件(或数据库)。对程序(特别是复杂的大型程序)的设计,通常分为两个阶段完成:首先进行结构设首先进行结构设计(模块组成及相互之间的关系),然后进行过程设计计(模块组成及相互之间的关系),然后进行过程设计(模块内部的处理过程)(模块内部的处理过程)。5.1 设计过程第5章总体设计105.15.1 设计设计过程过程5. 设计软件设计软件结构结构通常程序中的一个模块完成一个适当的子功能。应该把模块组织成良好的层次系统层次系统,顶层模块调用它的下层模块以实现程序的完整功能,每个下层模块再调用更下层的模块,完成程序的一个子功能,最下层的模块完成最具体的功能
6、。5.1 设计过程第5章总体设计115.15.1 设计设计过程过程6. 设计数据库设计数据库对于需要使用数据库的那些应用系统,软件工程师应该在需求分析阶段所确定的系统数据需求的基础上,进一步设计数据库。5.1 设计过程第5章总体设计125.15.1 设计设计过程过程7.制定制定测试计划测试计划在软件开发的早期阶段考虑测试问题,能促使软件设计人员在设计时注意提高软件的可测试性。第7章具体讨论第5章总体设计5.1 设计过程135.15.1 设计设计过程过程8. 书写书写文档文档应该用正式的文档记录总体设计的结果,在这个阶段应该完成的文档通常有下述几种。1)系统说明:)系统说明:最佳方案、系统流程图
7、、精化的数据流最佳方案、系统流程图、精化的数据流程图、模块算法等程图、模块算法等2)用户手册)用户手册3)测试计划:)测试计划:测试策略,测试方案,预期的测试结果,测试进度计划等4)详细的实现计划)详细的实现计划5)数据库)数据库设计设计结果结果第5章总体设计5.1 设计过程145.15.1 设计设计过程过程9.审查和复审审查和复审最后应该对总体设计的结果进行严格的技术审查,在技术审查通过之后再由客户从管理角度进行复审。5.1 设计过程第5章总体设计15主要内容主要内容 5.1 5.1 设计过程设计过程 5.2 5.2 设计原理设计原理 5.3 5.3 启发规则启发规则 5.4 5.4 描绘软
8、件结构的图形工具描绘软件结构的图形工具 5.5 5.5 面向数据流的设计方法面向数据流的设计方法 5.2 设计原理第5章总体设计165.25.2 设计原理设计原理5.2.15.2.1 模块化模块化模块是由边界元素限定的相邻程序元素(例如,数据说明,可执行的语句)的序列,而且有一个总体标识符代表它。模块是构成程序的基本构件模块是构成程序的基本构件。模块化模块化就是把程序划分成独立命名且可独立访问的模块,每个模块完成一个子功能,把这些模块集成起来构成一个整体,可以完成指定的功能满足用户的需求。第5章总体设计5.2.1 模块化17为什么要进行模块化? 跟人类思维模式相关 考虑实际例子:设计一条路径,
9、考虑因素分别为1个4个。 得到结论:越复杂的问题解决所花费的时间也很长185.25.2 设计原理设计原理函数C(x):定义问题x的复杂程度,函数E(x):解决问题x需要的工作量(时间)。对于两个问题P1和P2,如果C(P1)C(P2)显然 E(P1)E(P2) 越复杂的问题,所需要的工作量越多。越复杂的问题,所需要的工作量越多。第5章总体设计5.2.1 模块化195.25.2 设计原理设计原理根据人类解决一般问题的经验,一个有趣的规律是:C(P1+P2)C(P1)+C(P2)也就是说,如果一个问题由P1和P2两个问题两个问题组合而成,那么它的复杂程度大于分别考虑每个问题复杂程度大于分别考虑每个
10、问题时的复杂程度之和。时的复杂程度之和。第5章总体设计5.2.1 模块化205.25.2 设计原理设计原理 两个问题两个问题组合的复杂程度大于分别考虑每个问复杂程度大于分别考虑每个问题时的复杂程度之和。题时的复杂程度之和。C(P1+P2)C(P1)+C(P2)E(P1+P2)E(P1)+E(P2)这个不等式导致“各个击破各个击破”的结论把复杂的问题把复杂的问题分解成许多容易解决的小问题分解成许多容易解决的小问题,原来的问题也就容易解决了。这就是模块化的根据。第5章总体设计5.2.1 模块化215.25.2 设计原理设计原理无限地分割软件:开发软件而需要的工作量也就小得可以忽略了,但是设计模块间
11、接口所需要的工作量也将增加。第5章总体设计5.2.1 模块化225.25.2 设计原理设计原理虽然目前还不能精确地决定M的数值,但是在考虑模块化的时候总成本曲线确实是有用的指南。在第六章和5.3节讲解。采用模块化原理可以使软件结构清晰,不仅容采用模块化原理可以使软件结构清晰,不仅容易设计也容易阅读和理解。模块化也有助于软件开易设计也容易阅读和理解。模块化也有助于软件开发工程的组织管理,发工程的组织管理,一个复杂的大型程序可以由许多程序员分工编写不同的模块,并且可以进一步分配技术熟练的程序员编写困难的模块。第5章总体设计5.2.1 模块化235.25.2 设计原理设计原理5.2.25.2.2 抽
12、象抽象在现实世界中一定事物、状态或过程之间总存在着某些相似的方面(共性)。把这些相似的方面集中和概括起来,暂时忽略它们之间的差异,这就是抽象。或者说抽象就是抽出抽象就是抽出事物的本质特性而暂时不考虑它们的细节。事物的本质特性而暂时不考虑它们的细节。处理复杂系统的唯一有效方法是用层次的层次的方式构造和分析方式构造和分析。第5章总体设计5.2.2 抽象24抽象的层次 解决实际问题时常用不同层次的抽象: 1)最高层次的抽象最高层次的抽象:使用问题环境语言,以概况方式叙述问题; 2)较低层次较低层次:采用更加过程化的方法,把面向问题的术语和面向实现的术语结合起来叙述问题的解法; 3)最低层次最低层次:
13、源程序25【例】考虑适用于低级【例】考虑适用于低级CAD的图形软件包的图形软件包抽象抽象 该该CAD软件系统配有能与绘图员进行可软件系统配有能与绘图员进行可视化通信的图形界面,能用鼠标代替绘图工具视化通信的图形界面,能用鼠标代替绘图工具,画各种直线和曲线;能完成所有几何计算以,画各种直线和曲线;能完成所有几何计算以及所有截面视图和辅助视图的设计。图形设计及所有截面视图和辅助视图的设计。图形设计的结果存在图形文件中,图形文件可包含几何的结果存在图形文件中,图形文件可包含几何的、正文的和其他各种补充设计信息。的、正文的和其他各种补充设计信息。 在这一抽象级别上,用问题域本身的术语来描在这一抽象级别
14、上,用问题域本身的术语来描述问题的解。述问题的解。26【例】考虑适用于低级【例】考虑适用于低级CAD的图形软件包的图形软件包抽象抽象 CAD软件任务;软件任务; 用户界面子任务;用户界面子任务; 创建二维图形子任务;创建二维图形子任务; 显示图形子任务;显示图形子任务; 管理图形文件子任务;管理图形文件子任务; end CAD. 在这一抽象级别上,给出了组成在这一抽象级别上,给出了组成CAD软件任务软件任务的所有主要子任务,尽管术语已与问题域有所的所有主要子任务,尽管术语已与问题域有所不同,但仍然不是实现所用的语言。不同,但仍然不是实现所用的语言。27【例】考虑适用于低级【例】考虑适用于低级C
15、AD的图形软件包的图形软件包抽象抽象(仅以(仅以“创建二维图形子任务创建二维图形子任务”为例)为例) PROCEDURE 创建二维图形创建二维图形 REPEAT UNTIL DO WHILE 数字仪接口任务;数字仪接口任务; 判断作图请求:判断作图请求: 线:画线任务;线:画线任务; 圆:画圆任务;圆:画圆任务; END;28【例】考虑适用于低级【例】考虑适用于低级CAD的图形软件包的图形软件包 DO WHILE 键盘接口任务;键盘接口任务; 选择分析或计算:选择分析或计算: 辅助视图:辅助视图任务;辅助视图:辅助视图任务; 截面视图:截面视图任务;截面视图:截面视图任务; END; END
16、REPEAT;END PROCEDURE.29【例】考虑适用于低级【例】考虑适用于低级CAD的图形软件包的图形软件包 在这一抽象级别上,给出了初步的过程性表示在这一抽象级别上,给出了初步的过程性表示,此时所有术语都是面向软件(比如采用,此时所有术语都是面向软件(比如采用do while结构)并且模块结构也开始明朗。结构)并且模块结构也开始明朗。求精过程还可继续下去,直至产生源代码。求精过程还可继续下去,直至产生源代码。305.25.2 设计原理设计原理5.2.25.2.2 抽象抽象软件工程过程的每一步都是对软件解法的软件工程过程的每一步都是对软件解法的抽象层次的一次精化。抽象层次的一次精化。在
17、可行性研究阶段,软件作为系统的一个完整部件;在需求分析期间,软件解法是使用在问题环境内熟悉的方式描述的;当由总体设计向详细设计过渡时,抽象的程度也就随之减少了;最后,当源程序写出来以后,也就达到了抽象的最低层。第5章总体设计5.2.2 抽象315.25.2 设计原理设计原理5.2.25.2.2 抽象抽象逐步求精和模块化的概念与抽象是紧密结合的。层次结构的上一层是下一层的抽象,下一层次结构的上一层是下一层的抽象,下一层是上一层的求精。层是上一层的求精。第5章总体设计5.2.2 抽象325.25.2 设计原理设计原理5.2.35.2.3 逐步求精逐步求精逐步求精定义为:为了能集中精力解决主集中精力
18、解决主要问题要问题而尽量推迟对问题细节的考虑。逐步求精最初是由Niklaus Wirth提出的一一种自顶向下的设计策略种自顶向下的设计策略。第5章总体设计5.2.3 逐步求精33逐步求精逐步求精N.Wirth曾经做过如下说明:曾经做过如下说明: “我们对付复杂问题的重要办法是抽象,因此我们对付复杂问题的重要办法是抽象,因此,对一个复杂的问题不应该立即用计算机指令,对一个复杂的问题不应该立即用计算机指令、数字和逻辑符号来表示,而应该用较自然的、数字和逻辑符号来表示,而应该用较自然的抽象语言来表示,从而得出抽象程序。抽象程抽象语言来表示,从而得出抽象程序。抽象程序对抽象的数据进行某些特定的运算并用
19、某些序对抽象的数据进行某些特定的运算并用某些合适的记号(可能是自然语言)来表示。对抽合适的记号(可能是自然语言)来表示。对抽象程序做进一步分解,进入下一个抽象层次,象程序做进一步分解,进入下一个抽象层次,重复这一精化过程直到程序能被计算机接受为重复这一精化过程直到程序能被计算机接受为止。这时的程序可能是用某种高级语言或机器止。这时的程序可能是用某种高级语言或机器指令书写的。指令书写的。”345.25.2 设计原理设计原理5.2.35.2.3 逐步求精逐步求精一种自顶向下的设计策略:一种自顶向下的设计策略:按照这种设计策略,程序的体系结构是通过逐步精化处理过程的层次而设计出来的。通过逐步分解对功
20、能的宏观陈述而开发出层次结构,直至最终得出用程序设计语言表达的程序。p求精实际上是细化过程。p抽象与求精是一对互补的概念。第5章总体设计5.2.3 逐步求精355.25.2 设计原理设计原理5.2.45.2.4 信息信息隐藏和局部化隐藏和局部化 1)信息隐藏原理信息隐藏原理:应该这样设计和确定模块,使得:应该这样设计和确定模块,使得一个一个模块内包含的信息模块内包含的信息( (过程和数据过程和数据) )对于不需要这些信息的模块对于不需要这些信息的模块来说,是不能访问的来说,是不能访问的。(仅仅公开必须要让外界知道的信息)。(仅仅公开必须要让外界知道的信息) 2) 局部化局部化是指把一些是指把一
21、些关系密切的关系密切的软件元素物理地放得软件元素物理地放得彼彼此靠近此靠近。 如果在测试期间和以后的软件维护期间需要修改软件,如果在测试期间和以后的软件维护期间需要修改软件,使用信息隐藏原理作为模块化系统设计的标准就会带来极大使用信息隐藏原理作为模块化系统设计的标准就会带来极大好处。好处。第5章总体设计5.2.4 信息隐藏和局部化365.25.2 设计原理设计原理5.2.55.2.5 模块独立模块独立模块的独立性很重要,因为 有效的模块化(即具有独立的模块)的软件比较容易开发出来。 独立的模块比较容易测试和维护。第5章总体设计5.2.5 模块独立375.25.2 设计原理设计原理 模块的独立程
22、度可以由两个定性标准度量,这两个标准分别称为耦合和内聚耦合和内聚。 1)耦合 衡量不同模块彼此间互相依赖的紧密程度模块彼此间互相依赖的紧密程度; 2)内聚 衡量一个模块内部各个元素彼此结合的紧密程度内部各个元素彼此结合的紧密程度。上一页 下一页返回381耦合 耦合是对一个软件结构内各个模块之间互连程度的度量各个模块之间互连程度的度量。耦合强弱取决于模块间接口的复杂程度、调用模块的方式及通过接口的信息。 在软件设计中应该尽可能采用松散耦合尽可能采用松散耦合的系统。在这样的系统中可以研究、测试或维护任何一个模块,而不需要对系统的其他模块有很多了解和影响。此外,由于模块间联系简单,发生在一处的错误传
23、播到整个系统的可能性就很小。因此,模块间的耦合程度强烈影响系统的可理解性、可测试性、可靠性和可维护性。上一页 下一页返回39 具体区分模块间耦合程度强弱的标准如下。 1)非直接耦合 如果两个模块都能够独立地工作而不需要另一个的存在,那么它们彼此完全独立,模块间无任何连接,耦合程度低。上一页 下一页返回40 fac与prt之间为非直接耦合41 2)数据耦合 两个模块彼此之间通过参数交换信息(仅为数据),即为数据耦合。也是低耦合。上一页 下一页返回42 main与prt之间为数据耦合;43返回 3)控制耦合 如果传递的信息中有控制信息,则这种耦合称为控制耦合。控制耦合是中等程度的耦合,增加了系统的
24、复杂程度。通常把模块适当分解之后可以用数据耦合代替控制耦合。44454 4)特征耦合)特征耦合特征耦合(特征耦合(stamp coupling)介于数据耦合介于数据耦合和控制耦合之间。特征耦合只需要参数传和控制耦合之间。特征耦合只需要参数传递中的一部分数据。例如,传递了求平均递中的一部分数据。例如,传递了求平均成绩以外的参数:成绩以外的参数:producereport cardscalculateaverage printreport cardstudent recordaveragestudent recordaverage46 main和add3之间为特征耦合47 5)公共环境耦合 当两个
25、或多个模块通过一个公共环境相互作用时,它们之间的耦合称为公共环境耦合。公共环境可以是全程变量、共享的通信区、内存的公共覆盖区、任何存储介质上的文件、物理设备等。公共环境耦合的复杂程度随耦合的模块个数而变化,当耦合的模块个数增加时复杂程度显著增加。上一页 下一页返回48 如果只有两个模块有公共环境,那么这种耦合有下述两种可能: 一个模块往公共环境送数据,另一个模块从公共环境取数据。这是数据耦合的一种形式,是比较松散的耦合。 两个模块都既往公共环境送数据又从里面取数据,这种耦合比较紧密,介于数据耦合和控制耦合之间。如果两个模块共享的数据很多,都通过参数传递可能很不方便,这时可以利用公共环境耦合。上
26、一页 下一页返回49 6)内容耦合内容耦合 最高程度的耦合是内容耦合。如果出现下列情况之一,两个模块间就发生了内容耦合。 一个模块访问另一个模块的内部数据。 一个模块不通过正常入口而转到另一个模块的内部。 两个模块有一部分程序代码重叠。 一个模块有多个入口(多个功能)。 应该避免使用内容耦合。上一页 下一页返回50内容耦合返回514.3 软件设计的基本概念 7)外部耦合 一组模块都访问同一全局简单变量而不是同一全局数据结构,而且不是通过参数表传递该全局变量的信息,则称之为外部耦合。上一页 下一页返回52外部耦合53几种耦合类型的关系返回 耦合是影响软件复杂程度的一个重要因素。 应该采取的原则是
27、:尽量使用数据耦合,少用控制耦合和尽量使用数据耦合,少用控制耦合和特征耦合,限制公共环境耦合的范围,完全不用内容耦合特征耦合,限制公共环境耦合的范围,完全不用内容耦合。542内聚 内聚标志一个模块内各个元素彼此结合的紧密程度模块内各个元素彼此结合的紧密程度,它是信息隐蔽和局部化概念的自然扩展。简单地说,理想内聚的模块只做一件事情。设计时应该力求做到高内聚,通常中等程度的内聚也是可以采用的,而且效果和高内聚相差不多,但是,低内聚不要使用。 内聚和耦合是密切相关的,模块内的高内聚往往意味着模块间的松耦合。内聚和耦合都是进行模块化设计的有力工具,但是实践表明内聚更重要,应该把更多注意力集中到提高模块
28、的内聚程度上。上一页 下一页返回55 1)偶然内聚偶然内聚 如果一个模块完成一组任务,这些任务彼此间即使有关系,关系也是很松散的,称之为偶然内聚。 有时在写完一个程序之后,发现一组语句在两处或多处出现,于是把这些语句作为一个模块以节省内存,这样就出现了偶然内聚的模块。上一页 下一页返回56 2)逻辑内聚逻辑内聚 如果一个模块完成的任务在逻辑上属于相同或相似的一类(如一个模块产生各种类型的全部输出),则称为逻辑内聚。上一页 下一页返回572 2)逻辑性内聚)逻辑性内聚低级内聚低级内聚又如:模块又如:模块X、Y分别调用分别调用A、B,A、B相相似,将其合并为模块似,将其合并为模块AB,模块,模块A
29、B即为逻即为逻辑性内聚。辑性内聚。XYSABXYSAB58 3)时间内聚时间内聚 如果一个模块包含的任务必须在同一段时间内执行(如模块完成各种初始化工作),就叫时间内聚。 时间关系在一定程度上反映了程序的某些实质,所以时间内聚比逻辑内聚好一些。 4)过程内聚过程内聚 如果一个模块内的处理元素是相关的,而且必须以特定次序执行,则称为过程内聚。使用程序流程图作为工具设计软件时,常常通过研究流程图确定模块的划分,这样得到的往往是过程内聚的模块。上一页 下一页返回59 5)通信内聚 如果模块中所有元素都使用同一个输入数据和(或)产生同一个输出数据,则称为通信内聚。 例如,模块例如,模块A的处理单元是由
30、同一数据文件的数的处理单元是由同一数据文件的数据产生不同的表格据产生不同的表格上一页 下一页返回模块模块A从文件从文件FILE读出数据读出数据1. 由数据产生报表一由数据产生报表一2. 由数据产生报表二由数据产生报表二60 6)顺序内聚 顺序内聚模块能完成多种顺序执行的功能,各个功能都在同一数据结构上操作,每一项功能有一个唯一的入口点,如图所示的有4 个功能,即这个模块将根据不同的要求,确定执行哪一功能。但这个模块都基于同一数据结构,即符号表。上一页 下一页返回61 7)功能内聚 如果模块内所有处理元素属于一个整体,完成一个单一的功能,则称为功能内聚。功能内聚是最高程度的内聚。 例如例如,一个
31、模块仅完成一个矩阵的输出,就是一个具有功,一个模块仅完成一个矩阵的输出,就是一个具有功能性内聚的模块。能性内聚的模块。上一页 下一页返回62 在软件设计中,没有必要精确确定内聚的级别。重要的是设计时力争做到高内聚力争做到高内聚,并且能够辨认出低内聚的模块,有能力通过修改设计提高模块的内聚程度降低模块间的耦合程度,从而获得较高的模块独立性。上一页 下一页返回635.25.2 设计原理设计原理耦合和内聚的概念是Constantine,Yourdon,Myers和Stevens等人提出来的。上述7种内聚的优劣评分,将得到如下结果:功能内聚顺序内聚通信内聚过程内聚时间内聚逻辑内聚偶然内聚10分9分7分
32、5分3分1分0分事实上,没有必要精确确定内聚的级别。重要的是设计设计时高内聚时高内聚,并且能够辨认出低内聚的模块,有能力通过修改有能力通过修改设计提高模块的内聚程度并且降低模块间的耦合程度设计提高模块的内聚程度并且降低模块间的耦合程度,从而获得较高的模块独立性。第5章总体设计5.2.5 模块独立64主要内容主要内容 5.1 5.1 设计过程设计过程 5.2 5.2 设计原理设计原理 5.3 5.3 启发规则启发规则 5.4 5.4 描绘软件结构的图形工具描绘软件结构的图形工具 5.5 5.5 面向数据流的设计方法面向数据流的设计方法 5.3 启发规则第5章总体设计655.35.3 启发规则启发
33、规则1.改进软件结构提高模块改进软件结构提高模块独立性独立性设计出软件的初步结构以后,应该审查分析这个结构,通过模块分解或合并,力求降降低耦合提高内聚低耦合提高内聚。5.3 启发规则第5章总体设计665.35.3 启发规则启发规则2. 模块规模应该模块规模应该适中适中一个模块的规模不应过大,最好能写在一页纸内(通常不超过60行语句)5.3 启发规则第5章总体设计675.35.3 启发规则启发规则3.深度、宽度、扇出和扇入都应深度、宽度、扇出和扇入都应适当适当深度深度:软件结构中控制的层数宽度宽度:软件结构内同一个层次上的模块总数的最大值扇出扇出:一个模块直接控制(调用)的模块数目扇入扇入:一个
34、模块被多少个上级模块直接调用的数目5.3 启发规则第5章总体设计68 有关程序结构的术语有关程序结构的术语 有关程序结构的术语有关程序结构的术语Mabcdemfgihopqrntjks扇出扇出扇入扇入宽度宽度深度深度69 优秀的软件结构通常顶层扇出比较高,中层扇出较少,底层扇入到公共的实用模块中去。705.35.3 启发规则启发规则4.模块的作用域应该在控制域模块的作用域应该在控制域之内之内作用域作用域:受该模块内一个判定影响的所有模块的集合。控制域控制域:模块本身以及所有直接或间接从属于它的模块的集合。在图中模块A的控制域是A、B、C、D、E、F等模块的集合。5.3 启发规则第5章总体设计7
35、15.35.3 启发规则启发规则在一个设计得很好的系统中,所有受判定影响的模块应所有受判定影响的模块应该都从属于做出判定的那个模块,最好局限于做出判定的那该都从属于做出判定的那个模块,最好局限于做出判定的那个模块及它的直属下级个模块及它的直属下级模块。模块。5.3 启发规则第5章总体设计在图中模块A的控制域是A、B、C、D、E、F等模块的集合。在图中模块A的作用域域是A、B、C、D、E、F等模块的集合的子集。725.35.3 启发规则启发规则怎样修改软件结构才能使作用域是控制域的子集呢?方法1:是把做判定的点往上移方法2:是把那些在作用域内但不在控制域内的模块移到控制域内5.3 启发规则第5章
36、总体设计模块A的控制域: A、B、C、D、E、F等模块的集合。作用域是A、B、C、D、E、F、G。73 上移A模块至M中,使得控制域进入作用域74 下移G模块,使得控制域进入作用域755.35.3 启发规则启发规则5.力争降低模块接口的复杂力争降低模块接口的复杂程度程度模块接口复杂是软件发生错误的一个主要原因。应该仔细设计模块接口,使得信息传递简单并且和模块的功能一致。求一元二次方程的根。1)QUAD_ROOT(TBL,X)用数组TBL传送方程的系数,用数组X回送求得的根。2)QUAD_ROOT(A,B,C,ROOT1,ROOT2)A、B、C是方程的系数,ROOT1和ROOT2是算出的两个根。
37、5.3 启发规则第5章总体设计765.35.3 启发规则启发规则6.设计单入口单出口的设计单入口单出口的模块模块这条启发式规则警告软件工程师不要使模块间出现内容耦合。当从顶部进入模块并且从底部退出来时,软件是比较容易理解的,因此也是比较容易维护的。多入口的模块:内容耦合,高耦合5.3 启发规则第5章总体设计775.35.3 启发规则启发规则7.模块功能应该可以预测模块功能应该可以预测1)模块的功能应该能够预测相同的输入 相同的输出2)防止模块功能过分局限模块仅完成一个功能 高内聚。但是可能会引起功能过分局限、使用范围狭窄。5.3 启发规则第5章总体设计787条启发规则1.改进软件结构提高模块独
38、立性改进软件结构提高模块独立性2.模块模块规模应该适中规模应该适中3.深度、宽度、扇出和扇入都应适当深度、宽度、扇出和扇入都应适当4.模块的作用域应该在控制域之内模块的作用域应该在控制域之内5.力争降低模块接口的复杂程度力争降低模块接口的复杂程度6.设计单入口单出口的模块设计单入口单出口的模块7.模块功能应该可以预测模块功能应该可以预测79主要内容主要内容 5.1 5.1 设计过程设计过程 5.2 5.2 设计原理设计原理 5.3 5.3 启发规则启发规则 5.4 5.4 描绘软件结构的图形工具描绘软件结构的图形工具 5.5 5.5 面向数据流的设计方法面向数据流的设计方法 5.4 描绘软件结
39、构的图形工具第5章总体设计805.45.4 描绘软件结构的图形工具描绘软件结构的图形工具层次图用来描绘软件的层次结构。数据结构的层次方框图相同,但是表现的内容却完全不同。层次图很适于在自顶向下设计软件的过程中使用。5.4.15.4.1 层次层次图和图和HIPO图图5.4.1 层次图和HIPO图第5章总体设计81实例 机票预定系统的层次图825.45.4 描绘软件结构的图形工具描绘软件结构的图形工具HIPO图是美国IBM公司发明的“层次层次图图+ +输入输入/ /处理处理/ /输输出图出图”的英文缩写。为了能使HIPO图具有可追踪性,在H图(层次图)里除了最顶层的方框之外,每个方框都加了编号。5
40、.4.1 层次图和HIPO图第5章总体设计83IPO图 例子:H图中的3.5模块的IPO图845.45.4 描绘软件结构的图形工具描绘软件结构的图形工具模块,框内注明模块的名字或功能箭头箭头( (或直线或直线) )表示模块的调用关系表示模块的调用关系。空心空心圆表示传递的是圆表示传递的是数据数据实心实心圆表示传递的是控制信息。圆表示传递的是控制信息。5.4.25.4.2 结构图结构图5.4.2 结构图第5章总体设计855.45.4 描绘软件结构的图形工具描绘软件结构的图形工具一些附加的符号,可以表示模块的选择调用或循环调用。左图表示当模块M中某个判定为真时调用模块A,为假时调用模块B。右图表示
41、模块M循环调用模块A、B和C。 条件调用 循环调用5.4.2 结构图第5章总体设计86 层次图和结构图并不严格表示模块的调用次序,也不指明什么时候调用下层模块。 通常用层次图作为描述软件结构的文档;结构图信息太多因而不够清晰。 利用IPO图或数据字典中的信息得到模块调用时传递的信息,从而由层次图导出结构图,可用于模块独立性的评价。87主要内容主要内容 5.1 5.1 设计过程设计过程 5.2 5.2 设计原理设计原理 5.3 5.3 启发规则启发规则 5.4 5.4 描绘软件结构的图形工具描绘软件结构的图形工具 5.5 5.5 面向数据流的设计方法面向数据流的设计方法 5.5 面向数据流的设计
42、方法程第5章总体设计885.55.5 面向面向数据流的设计方法数据流的设计方法面向数据流的设计方法把信息流映射成软件结构把信息流映射成软件结构,信息流的类型决定了映射的方法。信息流有下述两种类型。 1)变换流)变换流 2)事务流)事务流5.5.15.5.1 概念概念5.5.1 概念第5章总体设计895.55.5 面向面向数据流的设计方法数据流的设计方法1)变换流)变换流信息沿输入通路进入系统,由外部形式变换成内部形式,进入系统的信息通过变换中心,经加工处理以后再沿输出通路变换成外部形式离开软件系统。 当数据流图具有这些特征时,这种信息流就叫作变换流。5.5.15.5.1 概念概念5.5.1 概
43、念第5章总体设计905.55.5 面向面向数据流的设计方法数据流的设计方法2)事务流)事务流数据沿输入通路到达一个处理T,这个处理根据输入数据的类型在若干个动作序列中选出一个来执行。这类数据流应该划为一类特殊的数据流,称为事务流。图中的处理T称为事务中心,它完成下述任务。(1)接收输入数据(输入数据又称为事务)。(2) 分析每个事务以确定它的类型。(3) 根据事务类型选取一条活动通路。5.5.1 概念第5章总体设计915.55.5 面向面向数据流的设计方法数据流的设计方法3)设计过程)设计过程5.5.1 概念第5章总体设计92面向数据流的设计方法 两种分析与过渡方法变换分析与事务分析,能方便地
44、把DFD(数据流)图转换为初始SC(结构)图。上一页 下一页返回93面向数据流的设计方法 1.变换分析 变换分析是一系列设计步骤的总称,经过这些步骤把具有变换流特点的数据流图按预先确定的模式映射成软件结构。 1)对DFD 图的分析和划分 首先区分传入、传出和变换中心区分传入、传出和变换中心 3 个部分,在DFD 图上标明它们的分界线。上一页 下一页返回94面向数据流的设计方法 变换中心的任务是通过计算或者处理把系统的逻辑输入变换(或加工)为系统的逻辑输出。 逻辑输入是指离物理输入端(输入始端)最远,但仍可以被看作系统输入的那些数据流。而逻辑输出则是指离物理输出端(输出末端)最远,但仍可以被系统
45、输出的那些数据流。上一页 下一页返回95面向数据流的设计方法 以下列出几种可能遇到的情况及其处理方法: (1)有些系统没有中心加工没有中心加工,系统的逻辑输入和逻辑输出是完全相同的数据流。此时应如实地把DFD 图划分为传划分为传入和传出两个部分入和传出两个部分,不要强求一律硬分成3 个部分。 (2)除传入部分外,在变换中心甚至传出部分也可能从系统外接受某些输入数据流,称为二次输入数据二次输入数据。分析时,应按照实情把二次输入数据看成变换中心或输出部分的一把二次输入数据看成变换中心或输出部分的一个成分个成分,不应当作输入的一部分。 (3)有些DFD 图可能失之太粗,缺少应有的细节。遇到这种情况,
46、设计人员可对自己用作分析的DFD 图进行补充,必要时甚至重画。过多的细节对于划分DFD 图也许作用不大,但对以后的设计却常常是有益的。上一页 下一页返回96面向数据流的设计方法 2)完成第一级分解 画出它最上面的两层模块顶层和第一层。 任何系统的顶层都只有一个用于控制的主模块。它的下一层(第一层)包括输入、输入、输出和中心变换输出和中心变换3 3 个个模块模块,分别代表系统的3 个相应分支。上一页 下一页返回97面向数据流的设计方法 另一种画法:按照实际情况确定模块的数量。上一页 下一页返回98面向数据流的设计方法 3)完成第二级分解 对上步的结果继续进行自顶向下的分解,直至画出每个分支所需要
47、的全部模块,称为第二级分解。这一步得到的结果便是系统的初始结构图。 同第一级分解一样,这一步的分解实质上仍然是映射映射,即把把 DFD DFD 图中的加工按照一定的规则转换为结构图中的模图中的加工按照一定的规则转换为结构图中的模块块。这就使整个工作变得有章可循,这也是SD 方法的一大优点。 数据流在输入的过程中,也可能经历数据的变换。上一页 下一页返回99a)输入通道:逆着逆着输入通道外移,把遇到的模块直接或间接映射成低层模块100b)输出通道:沿着输出通道外移,把遇到的模块直接或间接映射成低层模块101修改:每个模块都调用2个模块即输入和变换模块102c)将变换中心的每个模块映射成MT的每个
48、模块103初始的系统结构图返回104面向数据流的设计方法 4变换分析的步骤 变换分析的主要步骤如下: (1)复查基本系统模型复查基本系统模型。在软件需求分析阶段应该对上述每条要求以及系统的其他特点进行全面的分析评价,建立起必要的文档资料,特别是数据流图。 (2)复查并精化数据流图复查并精化数据流图。复查的目的是确保系统的输入数据和输出数据符合实际。应该对需求分析阶段得出的数据流图认真复查,并且在必要时进行精化。不仅要确保数据流图给出目标系统的正确逻辑模型,而且应该使数据流图中每个处理都代表一个规模适中、相对独立的子功能。上一页 下一页返回105面向数据流的设计方法 (3)确定数据流图具有变换特
49、性和事务特性确定数据流图具有变换特性和事务特性。在这一步,设计人员应该根据数据流图中占优势的属性,确定数据流的全局特性。此外,还应该把具有和全局特性不同的特点的局部区域孤立出来,以后可以按照这些子数据流的特点精化,根据全局特性得出软件结构。 (4)划分划分DFD DFD 图的边界图的边界。确定输入流和输出流的边界,从而孤立出变换中心。输入流和输出流的边界和对它们的解释有关,也就是说,不同设计人员可能会在流内选取稍微不同的点作为边界的位置。当然在确定边界时应该仔细认真,但是把边界沿着数据流通路移动一个处理框的距离,通常对最后的软件结构只有很小的影响。上一页 下一页返回106面向数据流的设计方法
50、(5)建立初始建立初始SC SC 图的框架并分解图的框架并分解SC SC 图的各个分支图的各个分支。 完成第一级分解完成第一级分解。软件结构代表对控制的自顶向下的分配,分解就是分配控制的过程。对于变换流的情况,数据流图被映射成一个特殊的软件结构,这个结构控制输入、输入、变换和输出变换和输出等信息处理过程。 完成第二级分解完成第二级分解。第二级分解就是把数据流图中的每把数据流图中的每个处理映射成软件结构中一个适当的模块个处理映射成软件结构中一个适当的模块。完成第二级分解的方法是,从变换中心的边界开始沿着输入通路向外移动,把输入通路中每个处理映射成软件结构中的低层模块。上一页 下一页返回107面向