资源描述
Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,*,*,Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,*,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,软件工程导论第五第五章,第5章:总体设计,5.1 设计过程,1,.,设想供选择的方案,2,.,选择合理的方案,对每个合理的方案要提供:,A,系统流程图,B,组成系统的物理元素清单,C,成本/效益分析,D,实现这个系统的进度计划,3,.,推荐最佳方案,4,.,功能分解,5,.,设计软件结构,6,.,数据库设计,A,模式设计,B,子模式设计,C,完整性和安全性设计,D,优化,7,.,制定测试计划,8,.,书写文档,A,系统说明,B,用户手册,C,测试计划,D,详细的实现计划,E,数据库设计结果,9,.,审查和复审,5.2 设计原理,如果一个大型程序仅由一个模块组成,很难被人理解。,设函数,C(x),定义问题,x,的复杂程度,函数,E(x),定义解决问题,x,需要的工作量(时间)。对于两个问题,P1,和,P2,,如果:,C(P1)C(P2),那么,E(P1)E(P2),根据解决问题的经验,有一个规律是:,C(P1+P2)C(P1)+C(P2),于是有,E(P1+P2)E(P1)+E(P2),模块数目,接口成本,成本/模块,软件总成本,M,最小成本区,成本,图5.1 模块化与软件成本,抽象,模块的独立性很重要,因为:,1)有效的模块化的软件比较容易开发出来;,2)独立的模块比较容易测试和维护。,5.2.,5,模块独立,一、耦合,耦合,:指软件结构内不同模块彼此之间相互依赖(连接)的紧密程度。,模块独立程度可以由两个定性标准度量:耦合与内聚。,模块的偶合分四类:,1)数据耦合,两个模块之间只是通过参数交换信息,而且交换的信息仅仅是数据。,数据耦合是最低程度的耦合。,A,B,数据,(1)数据耦合,2)控制耦合,两个模块之间所交换的信息包含控制信息。,控制耦合是中等程度的耦合。,图中模块,A,的内部处理程序判断是执行,C,还是执行,D,,要取决于模块,B,传来的信息状态(,Status)。,B,A,C,D,(2)控制耦合,a,status,3,)公用耦合,两个或多个模块通过一个公共区相互作用时的耦合。,公共区可以是:全程数据区、共享通信区、内存公共覆盖区、任何介质上的文件、物理设备等。,软件结构中存在大量的公用耦合时会给诊断错误带来困难。,图中存在公用耦合,假设模块,A,、,C,、,E,都存取全程数据区(如公用一个磁盘文件)中的一个数据项。,如果,A,模块读取该项数据,然后调用,C,模块对该项重新计算,并进行数据更新。,A,B,C,D,E,全程数据区,(3)公用耦合,如果此时,C,模块错误地更新了该项数据,在往下的处理中模块,E,读该数据项时出现错误。,表面上看,问题由模块,E,产生,实际上由模块,C,引起。,A,B,C,D,E,全程数据区,(3)公用耦合,两个模块之间所交换的信息包含控制信息。,如果A模块读取该项数据,然后调用C模块对该项重新计算,并进行数据更新。,作用域:受该模块内一个判定影响的所有模块的集合。,宽度:软件结构内同一个层次上的模块总数的最大值;,如果一个模块包含的任务必须在同一段时间内执行,称为时间内聚。,5)基于数据流图逐步分解,设计下层模块;,2)分别设计输入类型分析模块和调度模块的下层模块结构。,6)运用模块设计和优化准则优化软件结构;,1)分解第一层模块结构,B子模式设计,1)复审并精化数据流图;,因此建议:尽量使用数据耦合,少用控制耦合,限制公用耦合,完全不用内容偶合。,就是把整个变换分解成输入控制模块Ci、输出控制模块Co和变换中心控制模块Ct,由主控模块控制。,C完整性和安全性设计,扇入:一个模块被其它模块调用的数目。,4,)内容耦合,一个模块与另一个模块的内容直接发生联系。,内容耦合对维护会带来严重的困难。,模块,A,LAB:MOVE 1,模块,B,GOTO LAB,内容耦合,(4)内容耦合,程序中如果一个模块直接把程序转移到另一个模块中,或一个模块使用另一个模块内部的数据,都会产生内容耦合。内容耦合是最高程度的耦合,应该避免采用。,软件设计应追求尽可能松散耦合,避免强耦合,这样模块间的联系就越小,模块的独立性就越强,对模块的测试、维护就越容易。,因此建议:尽量使用数据耦合,少用控制耦合,限制公用耦合,完全不用内容偶合。,二、内聚,内聚:一个模块内部各个元素彼此结合的紧密程度。,它是衡量一个模块内部组成部分间整体统一性的度量。,常见的内聚有七类。,1,)功能内聚(,Functional Cohesion,),如果一个模块内所有处理元素完成一个,而且仅完成一个功能,则称为功能内聚。,功能内聚是最高程度的内聚。但在软件结构中,并不是每个模块都能设计成一个功能内聚模块。,2)顺序内聚(,Sequential Cohesion),如果一个模块内处理元素和同一个功能密切相关,而且这些处理元素必须顺序执行,则称为顺序内聚。,如图,一个求一元二次方程根的模块由三个处理元素组成,该模块中存在顺序内聚。,通常,顺序内聚中一个处理元素的输出是另一个处理元素的输入。,求一元二次方程根模块,1输入方程系数,2求解,3打印方程的解,顺序内聚示例,3)通信内聚(,Communicational Cohesion),如果一个模块中所有处理元素都使用同一个输入数据和(或)产生同一个输出数据,称为通信内聚。,如图,模块,A,的处理单元将根据同一个数据文件,FILE,的数据产生不同的表格,因此它存在通信内聚。,通信内聚有时也称为数据内聚。,A,从文件,FILE,中读出数据,1.由数据产生报表,A,2.由数据产生报表,B,通信内聚示例,4)过程内聚(,Procedural Cohesion),如果一个模块内的处理元素是相关的,而且必须以特定的次序执行,称为过程内聚。,过程内聚与顺序内聚的区别是:,顺序内聚中是数据流从一个处理单元流到另一个处理单元,而过程内聚是控制流从一个动作流向另一个动作。,5)时间内聚(,Temporal Cohesion),如果一个模块包含的任务必须在同一段时间内执行,称为时间内聚。也称为瞬时内聚。,例如,完成各种初始化工作的模块,或者处理故障的模块都存在时间内聚。,如图,在,“,紧急故障处理模块,”,中,,“,关闭文件,”,、,“,报警,”,、,“,保留现场,”,等任务都必须无中断地同时处理。,紧急故障处理模块,1关闭文件,2报警,3保留现场,时间内聚示例,6)逻辑内聚(,Logical Cohesion),如果模块完成的任务在逻辑上属于相同或相似的一类,称为逻辑内聚。,如图,,A、B、C,模块合并成,ABC,模块之后,,ABC,模块就是逻辑内聚模块。,X,Y,Z,A,B,C,X,Y,Z,ABC,合并,逻辑内聚示例,对逻辑内聚模块的调用,常常需要有一个功能开关,由上层调用模块向它发出一个控制信号,在多个关联性功能中选择执行某一个功能。,这种内聚较差,增加了模块之间的联系,不易修改。,7)偶然内聚(,Coincidental Cohesion),如果一个模块由完成若干毫无关系的功能处理元素偶然组合在一起的,就叫偶然内聚。,偶然内聚是最差的一种内聚。,常犯这种错误的一种情况是:有时在写完程序后,发现一组语句在多处出现,于是为了节省空间而将这些语句作为一个模块设计,就出现偶然内聚。,如图,模块,A、B、C,出现公共代码段,W,,于是将,W,独立成一个模块,而,W,中这些语句并没有任何联系。,如果在测试中发现模块,A,不需要做“,X=Y+Z”,,而应该做“,X=Y*Z”,,此时对,W,的维护就很困难了。,A,B,C,W,模块,X=Y+Z,GET CARD,IF I=5 THEN E=0,偶然内聚示例,软件设计中应该:力求做到高内聚,尽量少用中内聚,不用低内聚。,5.3 启发式规则,1,.,改进软件结构提高模块独立性,2,.,模块规模应该适中,3,.,深度、宽度、扇出和扇入都应适当,深度:软件结构中控制的层数;,宽度:软件结构内同一个层次上的模块总数的最大值;,扇出:一个模块直接控制(调用)其它模块的数目;,扇入:一个模块被其它模块调用的数目。,正文加工系统,输入,输出,编辑,加标题,存储,检索,编目录,格式化,添加,删除,插入,修改,合并,列表,对扇出、扇入过大的改进:,(,a),对扇入过大的改进,(,b),对扇出过大的改进,4,.,模块的作用域应该在控制域之内,M,A,G,B,C,E,D,F,图5.2 模块的作用域和控制域,作用域:受该模块内一个判定影响的所有模块的集合。,控制域:模块本身以及所有从属于它的模块的集合。,如:,QUAD-ROOT(TBL,X),求一元二次方程的根的模块,其中,TBL,X,都为数组,分别代表方程的系数和方程的根。,应该使接口更简单,如:,QUAD-ROOT(A,B,C,ROOT1,ROOT2),A、B、C,是方程的系数,,ROOT1,ROOT2,是方程的根。,5,.,力争降低模块接口的复杂度,6,.,设计单入口、单出口的模块,7,.,模块功能应该可以预测,5.4 图形工具,层次图和,HIPO,图,正文加工系统,输入,输出,编辑,加标题,存储,检索,编目录,格式化,添加,删除,插入,修改,合并,列表,图5.3 正文加工系统的层次图,正文加工系统,输入,1.0,输出,2.0,编辑,3.0,加标题,4.0,存储,5.0,检索,6.0,编目录,7.0,格式化,8.0,添加,3.1,删除,3.2,插入,3.3,修改,3.4,合并,3.5,列表,3.6,图5.4 带编号的层次图(,H,图),HIPO,图是:“层次图输入,/,处理,/,输出图”,产生最佳解,得到好输入,计算最佳解,输出结果,读输入,编辑输入,结果格式化,显示结果,图4.5 结构图的例子产生最佳解的一般结构,M,A,B,图5.6 判定为真时调用,A,,为假时调用,B,M,A,B,C,图5.7 模块,M,循环调用模块,A、B、C,5)基于数据流图逐步分解,设计下层模块;,B子模式设计,(b)对扇出过大的改进,两个或多个模块通过一个公共区相互作用时的耦合。,于是有 E(P1+P2)E(P1)+E(P2),模块的独立性很重要,因为:,C完整性和安全性设计,常犯这种错误的一种情况是:有时在写完程序后,发现一组语句在多处出现,于是为了节省空间而将这些语句作为一个模块设计,就出现偶然内聚。,C完整性和安全性设计,如图,一个求一元二次方程根的模块由三个处理元素组成,该模块中存在顺序内聚。,图中存在公用耦合,假设模块A、C、E都存取全程数据区(如公用一个磁盘文件)中的一个数据项。,2)分别设计输入、输出和处理的下层模块结构,模块的独立性很重要,因为:,如图,一个求一元二次方程根的模块由三个处理元素组成,该模块中存在顺序内聚。,内容耦合是最高程度的耦合,应该避免采用。,5.5 面向数据流的设计方法,面向数据流设计(,Data Flow-Oriented Design,,,DFOD,),是与数据流分析(,DFA,),对应的结构化软件设计技术。,面向数据流的设计将得到以数据流图为基础的软件模块结构图。,数据流可以分为两种类型:,1,)变换型数据流,2,)事务型数据流,一、变换流,具有较明确的输入、变换(或称主加工)和输出界面的数据流图称为变换型数据流图。,如图所示,该变换中心可以理解为数据的加工和处理程序。,读入原始数据,校验原始数据,计算最优结果,编辑打印最优结果,输入,变换中心,输出,事务型数据流图中存在一个事务中心(也就是数据处理、加工中心),它将输入分离成若干个发散的数据流,形成许多活动路径,并根据输入值选择其中一条路径。,要求类别处理,分房处理,调房处理,退房处理,住房要求,事务中心,活动路径,二、事务流,通常,一个实际系统的数据流图是变换型和事务型两种类型的混合体。,如图所示,中间的子块属事务型数据流,如果把中间子块视为一个处理整体的话,整个程序属变换型程序。,A,(事务型,,A,为事务中心),变换中心,输入,输出,混合型数据流图,面向数据流设计软件结构的基本步骤有七步:,1)复审并精化数据流图;,2)确定数据处理流图的类型;,3)确定变换中心或事务中心;,4)将数据流图映射成软件模块结构图,设计出该数据流图对应的第一层模块结构;,5)基于数据流图逐步分解,设计下层模块;,6)运用模块设计和优化准则优化软件结构;,7,)描述模块的接口。,复查、精化数据流图,类型,找出事务中心,找出变换中心,映射成事务结构,映射成变换结构,优化软件模块结构,导出模块结构,复查,不满意,变换,事务,变换设计,事务设计,面向数据流的设计步骤,6 判定为真时调用A,为假时调用B,C完整性和安全性设计,如图所示,该变换中心可以理解为数据的加工和处理程序。,通常,一个实际系统的数据流图是变换型和事务型两种类型的混合体。,5)时间内聚(Temporal Cohesion),(事务型,A为事务中心),如果在测试中发现模块A不需要做“X=Y+Z”,而应该做“X=Y*Z”,此时对W的维护就很困难了。,面向数据流设计(Data Flow-Oriented Design,DFOD)是与数据流分析(DFA)对应的结构化软件设计技术。,于是有 E(P1+P2)E(P1)+E(P2),1)功能内聚(Functional Cohesion),如图,一个求一元二次方程根的模块由三个处理元素组成,该模块中存在顺序内聚。,模块的独立性很重要,因为:,内容耦合对维护会带来严重的困难。,如图,模块A的处理单元将根据同一个数据文件FILE的数据产生不同的表格,因此它存在通信内聚。,过程内聚与顺序内聚的区别是:,变换设计就是从变换型数据流图映射出软件模块结构的过程,也称以变换为中心的设计。,变换设计的基本方法有两步:,1)分解第一层模块结构,就是把整个变换分解成输入控制模块,Ci、,输出控制模块,Co,和变换中心控制模块,Ct,,由主控模块控制。,主控模块,输出控制模块,Co,变换中心控制模块,Ct,输入控制模块,Ci,2)分别设计输入、输出和处理的下层模块结构,方法是:,从变换中心边界向两侧移动,分别把输入通路和输出通路的每个处理映射成输入控制模块,Ci,和输出控制模块,Co,的下属模块。,变换中心的下层模块,是把每个处理映射成变换中心控制模块,Ct,的一个直接下属模块。,A,B,C,D,F,E,G,H,I,J,K,变换中心,输入,输出,主控模块,输出控制模块,Co,变换中心控制模块,Ct,输入控制模块,Ci,D,C,B,A,E,F,G,I,H,J,K,事务设计就是从事务型数据流图映射出软件模块结构的过程,也称为以事务为中心的设计。,事务设计的基本方法有两步:,1,)建立主控模块、接收输入类型分析模块和事务调度模块;,主模块,调度,输入类型分析,2,)分别设计输入类型分析模块和调度模块的下层模块结构。,方法是:将输出的每条通路作为调度模块的一个判断分支,而输入类型分析模块的下层模块与变换设计类似。,
展开阅读全文