1、2018/10/25,1,第15讲 模块设计,2018/10/25,2,复习系统分析内容,系统分析的结果:,把数据在组织(或原系统)内部的流动情 况抽象地独立出来,用数据流程图的形式 描述出系统的功能、输入、输出和存储的,“逻辑模型 ”,2018/10/25,3,库房管理系统总体逻辑模型,F1,正常入库,生产部,物资 采购员,车间,主管领导,F4,F3,F5,1.1,限额管理,2,接收限额领料单,3.1,统计,4,接收退料单,1.2,接收物资领料单,3.3,D5 物资领料单,出库处理,3.4,限额核对,3.2,退料处理,1.3,D4 限额领料单,D2 限额配套卡,F2.1 限额领料单,F2.2
2、 物资领料单,2018/10/25,4,问题? 系统分析的结果提供了数据库模型和逻辑功能结构,解决了“系统应该做什么?”的问题。,但是系统的各项功能在信息系统中是靠计算机中的 应用程序模块来实现的,这些功能应该由哪些程序模,块来实现的问题并没有在系统分析阶段中给出答案 这正是信息系统设计所要解决的问题,2018/10/25,5,如何考虑?,为实现某一个系统/子系统,应该设计几个功能模块?这些模块由哪些程序组成?它们之间又存在什么关系?为了提高运行效率在数据库的组织方面又应该采取什么措施?程序模块应该采用什么处理方式?,2018/10/25,6,系统设计的主要内容,抽象的问答,根据系统分析阶段所
3、确定的新系统的逻辑模型(“做什么”),综合考虑各种约束,利用一切可用的技术手段和方法,进行物理设计,提出一个能在计算机上实现的新系统的,实施方案,解决“系统怎样做”的问题。,2018/10/25,7,字典,流程 数据 描 流图 述,数E-R图数据,据,描述,对象,模块结构设计,过程设计接口设计,从分析模型,系统设计模型,加工小说明处理描述分析模型,平 台 设 计数 据 设 计设计模型,2018/10/25,8,系统设计的主要内容,具体的问答, 数据设计:将分析时创建的数据模型变换成实现系统所需,的数据结构。, 接口设计:描述了系统内部、系统和协作系统之间的以及,系统同人之间如何通信。, 模块结
4、构设计:定义系统模块元素之间的关系。, 过程设计:将加工说明变换为对系统模块内部算法的具体,描述。, 平台设计:将性能需求变换成对系统软硬件环境的配置,2018/10/25,9, 系统总体设计, ,将系统合理的划分成子系统 把子系统划分成若干模块 决定每个模块的功能, 决定模块间数据、调用关系 确定模块间界面 系统详细设计 系统平台设计 代码设计 输入输出设计 接口设计 数据库或数据文件设计 模块内部的算法设计 写出系统设计报告,结构化程序设计方法,2018/10/25,10,第15讲 模块设计设计,第一PPT模板网 ,(结构化)系统总体设计概述,6.1,面向数据流的总体设计方法,6.2,模块
5、设计优化,6.3,2018/10/25,11,本讲内容,15.1 (结构化)系统总体设计概述一、总体设计的任务二、结构化系统设计,返回,2018/10/25,6.1 系统总体设计概述,12,一、总体设计的任务,总体设计是根据系统的总体目标和功能将整个 系统合理划分成若干个功能模块,正确地处理模 块间的调用关系和数据联系即模块之间的接口, 定义各模块的内部结构等。,将系统合理的划分成子系统 把子系统划分成若干模块 决定每个模块的功能 决定模块间数据、调用关系 确定模块间界面,2018/10/25,6.1 系统总体设计概述,13,二、结构化系统设计,结构化系统设计是“用一组标准的准则和工具帮 助系
6、统设计人员确定应该由哪些模块,用什么方 式联结在一起,才能构成一个最好的系统结构”。即,结构化设计方法(SD)是以数据流图为基础 的,采用 模块化、自顶向下逐步求精 的基本思 想,以 数据流图为基础 构造出模块结构图。,2018/10/25,6.1 系统总体设计概述,14,1、结构化系统设计的基本工具,在系统设计阶段,我们采用模块结构图来表达目 标系统的物理模型,描述系统的结构。系统结构是软件模块之间关系的表示,它决定了 整个系统的结构,也确定了系统的质量。模块之间 的关系可有多种,但都可以归结为一种层次关系。模块结构图是总体设计阶段的主要描述工具,它 描述了构成系统的基本元素 模块及模块之间
7、的 调用关系,模块之间的数据传递关系。,2018/10/25,6.1 系统总体设计概述,15,2、系统模块化A,B,C,D,H,EJ,FK,GL,IM,模块化就是将系统划分为若干个模块,每个模块完成一个子功能。模块化的目的是将系统“分而治之”,模块化能够降低问题的复杂性,使软件构清晰,易阅读、易理解,易于测试和调试,因而也有助于提高软件的可靠性。,2018/10/25,6.1 系统总体设计概述,16,(1)模块, 模块的定义:,模块是可以组成、分解、更换的系统,是易于处 理的基本单位,是具有四种属性的一组程序语句称 为一个模块.,这四种属性分别是,输入输出、逻辑功能(外部特性)内部数据、程序代
8、码(内部特性),2018/10/25,6.1 系统总体设计概述,17,z=xy? x: y;return(z);,模块的例子 :模块名,数,据,int max( int x, int y) 内部 数据 int z;,内部 语句,2018/10/25,6.1 系统总体设计概述,18,(2)模块化思想:, 模块化是好的系统设计的一个基本准则:,高层模块,从整体上把握, 复杂问题,较小问题,分解可减小解题所需的总的工作,问题,暂不考虑细节 分解,2018/10/25,6.1 系统总体设计概述,19,3、模块结构图SC(Structure Chart),模块用方框表示,方框中写上模块 名字,反映了这个
9、模块的功能,调用从调用模块指向被调用模块的 箭头,数据调用箭头旁的小箭头,表示从 一个模块向另一个模块传送的数据,也 指出了传送的方向,(1)结构图基本符号及表示方法,2018/10/25,6.1 系统总体设计概述,20,读学生记录,编辑学生记录学生数据,无此学生,不加区分的数据,数据信息,学号,控制信息,2018/10/25,6.1 系统总体设计概述,21, 模块调用的例子 :int max( int x, int y), int z;z=xy? x: y;,return(z);Main( ):,max( 3, 4):,Main(),求最大值,Z,xy,2018/10/25,6.1 系统总体
10、设计概述,22,(2)SC中的四种模块,传入模块,传出模块,B,B,变换模块,A,A,C,D,协调模块,E E,F,F,(d),(a),(b),(c),2018/10/25,6.1 系统总体设计概述,23,A,1B,2C,x,yB,SC中的简单调用AzzC,1 2,A调用B和C(a)表示法一,z(b)表示法二,(3)SC调用方式,2018/10/25,6.1 系统总体设计概述,24,SC中的选择调用,A,C,B,D,A根据内,部判断决 定是否调,用B,A按另一判,定结果选择 调用C或D,2018/10/25,6.1 系统总体设计概述,25,SC中的循环调用A,B,C,A根据循环条件重复调 用B
11、、C等模块,2018/10/25,6.1 系统总体设计概述,26, 选择调用的例子 :A( ),:if (条件 )B( )else,C( ):,A,B,C,2018/10/25,6.1 系统总体设计概述,27, 循环调用的例子 :,A( ):while (条件)B( );,: ;,:,A,B,2018/10/25,6.1 系统总体设计概述,28,(4)模块结构类型内导结构:是结构图中数据以最低层模块输入,并逐级向高层传递,高一层模块接收低一层模块的输入。主模块,A1,A4,A3,A2,2018/10/25,6.1 系统总体设计概述,29,w子模块1,外导结构:结构图中低一层模块接收上一层 模块
12、的数据信息,并把它们转换给下一级模 块,直到输出给使用者。主模块,u子模块2v子模块2.1,2018/10/25,6.1 系统总体设计概述,30,w,u,子模块1,转换结构:数据要在模块内经过一定的处理, 下层模块从相应的上层模块接收数据,经转换 后返回同一上层模块中去。主模块,子模块2v子模块2.1,X M,Y,2018/10/25,6.1 系统总体设计概述,31,打印报表功能的模块结构图,2018/10/25,32,本讲内容,15.2 面向数据流的总体设计方法一、 变换分析二、 事务分析三、 混合结构分析,返回,2018/10/25,6.2 面向数据流的总体设计方法,33,6.2 面向数据
13、流的总体设计方法数据流程图DFD的结构类型,1. 变换型 DFD,变换型数据流程图可以明显地分成输入、处理,和输出三部分。,2事务型 DFD,数据沿输入通道到达一个转换,该转换根据输入流类型和特征在若干动作序列中选择一条来执行。,2018/10/25,6.2 面向数据流的总体设计方法,34,一、变换分析1、变换型结构由输入、变换中心(或称主加工)和输出三部分组成。基本模型:,变换 中心,输出 路径,输入 路径,2018/10/25,6.2 面向数据流的总体设计方法,35,2、变换型数据流图,输入 信息,物理,输入,格式 检查,处理,显示,正确 信息,结果,物理,输出,数据,变换中心,输出,逻辑
14、,输入,逻辑,输出,输入,2018/10/25,6.2 面向数据流的总体设计方法,36,变换型结构的数据流图,2018/10/25,6.2 面向数据流的总体设计方法,37,3、变换型DFD导出初始SC的过程,)在DFD上区分输入、主加工、输出部分,并标注2 ) 先设计模块结构顶端的主模块3 )然后“由顶向下逐步细化”,4 )最后得到一个与数据流图相对应的程序结构,2018/10/25,6.2 面向数据流的总体设计方法,38,5,6,4,b3,2e,w7,变换中心crpu,a1输入 部分d,输出 部分v,输入 输出 加工,顶层1,顶层2,输入分解,输出分解,变换,2018/10/25,6.2 面
15、向数据流的总体设计方法,39,1)区分输入、主加工、输出部分,,在DFD上标明分界线,(2)确定逻辑输入在数据流图中标出输入数据 的最后点,即系统主加工的输入数据流。,返回,(1)确定主加工通常,几股数据流的汇合处或是 一个数据流的分流处可以定义为系统的主加工,即系 统的变换中心。,(3)确定逻辑输出找出输出数据的第一点即系 统主加工的输出数据流,2018/10/25,6.2 面向数据流的总体设计方法,40,2) 设计SC的顶层和第一层模块,(1) 设计一个顶层模块(主模块),它的功能是完成整个,程序要做的工作。,(2) 设计结构的第一层:, 为逻辑输入设计一个输入模块,它的功能是向主模块,提
16、供数据, 为逻辑输出设计一个输出模块,它的功能是输出主模,块提供的数据, 为主加工设计一个变换模块,它的功能是将逻辑输入,变换成逻辑输出,2018/10/25,6.2 面向数据流的总体设计方法,41,MC,MT,MA,ME,总控模块,2018/10/25,42,传送信息,第一级分解后的SC,MC,MT,MA,ME,c,e c,e u,w,u,w,顶层,第一层,DFD图,2018/10/25,43,r,第一级分解后的SC(另一种画法),c,e,U,W,MA1 MA2,4,5,6,ME1 ME2,e,pc,p r,w,u,w,DFD图,MC,2018/10/25,6.2 面向数据流的总体设计方法,
17、44,3)第二级分解自顶向下分解,设计出每个分支 (输入、加工、输出)的中、下层模块,(1)为每一个输入模块设计两个下层模块,一个是输入模,块,接受数据来源;另一个是变换模块,模块调用时传 送的参数应同数据流图相对应,(2)输出模块也有两部分组成,一部分是变换模块,将数,据变换成输出的形式;另一部分是输出模块上述设计过程由顶向下递归进行,直至达到系统的输 入端或输出端,(3) 变换模块的下层模块,根据数据流图中相应“加工”的,组成情况而定。,2018/10/25,6.2 面向数据流的总体设计方法,45,传入分支的分解,c,(1),Get C,c,Get E,e,MA,c,e,B to C,b,
18、c,D to E,d,e,A to B,a,b,(2),DFD图,2018/10/25,6.2 面向数据流的总体设计方法,46,传出分支的分解,Put U,Write V,u,u,U to V,v,v,w,(1),(2),DFD图,2018/10/25,6.2 面向数据流的总体设计方法,47,加工分支的分解MT,5,4,6,e,c,p,r,u,w,p,r,DFD图,2018/10/25,6.2 面向数据流的总体设计方法,48,随堂练习一:将DFD用变换分析导出初始SC,一个汇款处理业务流程:,客户填写汇款单并提交给业务人员,业务员检查汇款单是 否填写规范,然后计算汇款费用,并把发生的汇款和费用
19、数,据记帐存留,同时开收据给汇款人,2018/10/25,6.2 面向数据流的总体设计方法,49,数据流程图,汇款单,合格的 汇款单,处理后的 汇款单,收据,明细账,业务,数据,格式检查,计算汇费,产生数据,记帐,2018/10/25,6.2 面向数据流的总体设计方法,50,汇款单,合格的 汇款单,处理后的 汇款单,收据,明细账,业务,数据,格式检查,计算汇费,产生收据,记帐,变换中心,逻辑输入,逻辑输出,2018/10/25,6.2 面向数据流的总体设计方法,51,取得合格 汇款单,计算汇费,记账,输出处理后 的汇款单,第一级分解汇款处理系统合格的,汇款单,处理后的 汇款单,业务数据,合格的
20、 处理后的 汇款单 汇款单业务数据,2018/10/25,6.2 面向数据流的总体设计方法,52,取得合格 汇款单,计算汇费,记账,输出处理后 的汇款单,输入,汇款单,格式检查,产生收据,打印收据,第二级分解汇款处理系统合格的,汇款单,处理后的 汇款单,业务数据,汇款单,合格的 汇款单,汇款单,处理后的,汇款单,收据,收据,合格的 处理后的 汇款单 汇款单业务数据,2018/10/25,6.2 面向数据流的总体设计方法,53,二、事务分析 1、事务型结构特征:具有在多种事物中选择执行某类事物的能 力。基本模型:,动作 路径,事务,中心,接受路径(事务),2018/10/25,6.2 面向数据流
21、的总体设计方法,54,事务型DFD:,T事务中心,传入,变换,传出,2018/10/25,6.2 面向数据流的总体设计方法,55,2、事务分析设计方法,任何情况下都可使用变换分析方法设计软件结 构,但如数据流具有明显的事务特点时(有一个明 显的事务中心),以采用事务分析方法为宜。,2018/10/25,6.2 面向数据流的总体设计方法,56,3、事务分析设计方法步骤:,(1)在DFD上标注出三部分(接收部分、事务中心、动作),(2)把数据流图上的三部分分别映射为事务控制模块、 接收模块和动作发送模块,并逐步细化。,2018/10/25,6.2 面向数据流的总体设计方法,57,输入,- 事务型
22、数据流图,1,A,B,C,3,D,E,F,G,H,2,4,5,6,7,事务中心,输出,逻辑 输入,物理 输入,逻辑 输出,物理 输出,(1)在事务型DFD上划分出事务中心,I,2018/10/25,6.2 面向数据流的总体设计方法,58,事务型 数据流图,映射,(2)把数据流图上的三部分分别映射为事务控制模块、接收模块和动作发送模块,并逐步细化。,2018/10/25,6.2 面向数据流的总体设计方法,59,总控,逻辑输入,调度控制,C,4,5,6,C,I,F,D,E,H,G,输出,G H I,G H I,2018/10/25,6.2 面向数据流的总体设计方法,60,事务型分析实例,C某校欲设
23、计“收费查询”系统,该程序可以为学生和管理人员服务,由录入员和管理员输入查询请求,即可查出学生的缴费情况,要求做到: 按学号查询 按姓名查询 按专业查询 按班级查询,2018/10/25,6.2 面向数据流的总体设计方法,61,数据流图,录入员,接受 查询,分析 查询,按学号 查询,按姓名 查询,按专业 查询,按班级 查询,查询 信息,查询 信息,学号,姓名,专业,班级,学生,管理员,缴费清单,缴费清单,缴费清单,缴费清单,2018/10/25,6.2 面向数据流的总体设计方法,62,得出程序结构,首先应设计出事务中心模块,对整个事务进行控制。从数据流图可看出,“分析查询”处理是事务调度中心,
24、可以设计为事务调度模块。由四个事务处理,分别为其设计事务处理模块。输入模块为“接受查询”。,事务中心,接受查询,调度,输出查询结果,按学号查询,按姓名查询,按专业查询,按班级查询,2018/10/25,6.2 面向数据流的总体设计方法,63,图书管理 要求,1.1 要求类 型处理无效输入,1.2 新书入库,入库单,罚款单,还书,注销单借书单还书单,1.5 注销图书1.3借书1.4,目录文件罚款单借书文件,事务分析举例-DFD,事务 中心,2018/10/25,6.2 面向数据流的总体设计方法,64,取得图书 处理要求,修改目 录文件,操作层,细节层,注销图书,新书入库 借书,还书,打印 罚款单
25、,修改借 书文件,事务分析举例-转换后的SC图书处理系统图书管,理要求,入库单,借书单,还书单,注销单,2018/10/25,6.2 面向数据流的总体设计方法,65,T,事务中心,传入,变换,传出,接收部分,发送 部 分,三、混合分析-大型系统DFD中,变换型和事务型共存,2018/10/25,6.2 面向数据流的总体设计方法,66,首先应设计出事务中心模块,对整个事务进行控制。从数据流图可看出,“T”处理是事务调度中心,可以设计为事务调度模块。每个事务处理,分别为其设计事务处理模块。,事务中心,接受 模块,调度,输出模块,事务1,事务2,事务3,传入,变换,传出,2018/10/25,6.2
26、 面向数据流的总体设计方法,67,混合型DFD转换为SC示例:,2018/10/25,6.2 面向数据流的总体设计方法,68,变换分析与事务分析的混合使用,2018/10/25,6.2 面向数据流的总体设计方法,69,D,G,c2,e,C1,d,f,F,b3,随堂练习二:将DFD用变换分析和事务型,K,k,lLm,分析导出初始SCc1hb1 b2C2 c3 E g J*B * C3 jbA,2018/10/25,6.2 面向数据流的总体设计方法,70,c1 b2 c2,初始SC,主加工,Put k,Get d,K,J,A,Read a,C1,C3,C2,Ac 1 Ac 2,Dt 1,Dt 3,
27、Dt 2,Ac N,操作层,细节层,d,k,k,系统d,m mWrite m,lL,l,lPut l,k,dD,c,cGet c,b,c,a,Get ba,bb,B to cb1,c3b3,e,fE,d,g,jF,e,gf,hG,h,j,k,2018/10/25,71,本讲内容,6.3 模块优化设计一、模块的耦合度与聚合度二、系统设计优化原则实例银行贷款文件管理,返回,2018/10/25,6.3 模块设计优化,72,15.3,模块设计优化,直接从 DFD转换过来的 SC并不是最好的,往往要优化处理将初始SC根据模块独立性原则进行精化,对 模块进行合并、分解修改、调整,得到“高内 聚、低耦合模
28、块”,得到易于实现、易于测试 和易于维护的软件结构,产生设计文档的最终 SC,这是设计优化工作。,2018/10/25,6.3 模块设计优化,73,一、模块的耦合度与聚合度,系统的可维护性是系统评价的一个重要因素,可维护性,局部修改,这是 设计原则:尽量保持模块的独立性!,2018/10/25,6.3 模块设计优化,74,模块独立性取决于模块的内部和外部特性,SD方法提出的定性度量标准:, 模块之间的耦合性(块间联系)尽可能少 模块自身的聚合性(块内联系)尽可能多,2018/10/25,6.3 模块设计优化,75,1、模块独立性的度量之一:耦合度,耦合度:是模块间的联结关系,衡量不同模块间 的
29、相互依赖的紧密程度.,耦合度越高,模块独立性越弱,2018/10/25,6.3 模块设计优化,76,无耦合没有依赖关系,紧密耦合有很多依赖关系松散耦合有 少量依赖关系,模块耦合度(续),2018/10/25,6.3 模块设计优化,77,模块间耦合的类型:,低,非直接耦合,耦,数据耦合,合,标记耦合,性,高,内容耦合,模,块,独,立 性,弱,(低耦合),强,(中耦合),(较强耦合),(强耦合),公共耦合,控制耦合,2018/10/25,6.3 模块设计优化,78,(1)非直接耦合,两个模块没直接关系(模块1和模块2),模块独立性最强。,模块2,模块1模块3,模块4,2018/10/25,6.3
30、模块设计优化,79,(2)数据耦合,一模块调用另一模块时,被调用模块的输入、输出都是,简单的数据。属松散耦合。,2018/10/25,6.3 模块设计优化,80,数据耦合举例,一模块调用另一模块时,被调用模块的输入、输出都是简,属松散耦合开发票单价,数量,金额计算水费,单的数据。,2018/10/25,6.3 模块设计优化,81,数据耦合举例计算水电费,计算水费,计算电费,用水量,用电量,水费,电费,2018/10/25,6.3 模块设计优化,82,(3)标记耦合(特征耦合),如两个模块通过传递数据结构(不是简单数 据,而是记录、数组等)加以联系,或都与一 个数据结构有关系, 则称这两个模块间
31、存在标 记耦合。,2018/10/25,6.3 模块设计优化,83,标记耦合举例计算水电费,计算水费,计算电费,住户情况,水费,电费,住户情况,“住户情况”是一个数据结构,图中模块都与此数据结,构有关.,“计算水费”和“计算电费”本无关,由于引用了此数,据结构产生依赖关系,它们之间也是标记偶合.,2018/10/25,6.3 模块设计优化,84,将标记耦合修改为数据耦合举例计算水电费,计算水费,计算电费,本月,用水量,本月,用电量,水费,电费,2018/10/25,6.3 模块设计优化,85,(4)控制耦合一模块通过开关量、标志、 名字等控制信息,明显地 控制另一模块的功能。,B计算平均分或最
32、高分,平均/最高,成绩,A,2018/10/25,6.3 模块设计优化,86,控制耦合举例,输出结果,计算平均分 计算最高分,读入分数平均/最高?,调用逻辑性模块B时, 须先传递控制信号(平 均分/最高分),以选 择所需的操作。控制 模块必须知道被控模 块的内部逻辑,增强,了相互依赖.,B,2018/10/25,6.3 模块设计优化,87,去除模块间控制耦合的方法:,(1)被调用模块分解成若干单一功能模块,(2)将被调用模块内的判定上移到调用模块中,2018/10/25,6.3 模块设计优化,88,改控制耦合为数据耦合举例A,平均成绩B1计算平均分,最高成绩B2计算最高分,2018/10/25
33、,6.3 模块设计优化,89,功能A,功能B,判别,控制耦合举例A,名次 (开关量),奖牌,被调用模块内 处理逻辑模式,发奖牌控制耦合,2018/10/25,6.3 模块设计优化,90,改控制耦合为数据耦合举例A,发金牌,发银牌,发铜牌,金牌,银牌,铜牌,2018/10/25,6.3 模块设计优化,91,控制耦合举例A,取口令并核对,B,用户名、 口令,对/不对,2018/10/25,6.3 模块设计优化,92,将B中核对口令功能划分到 AA,取口令,B,用户名,口令,2018/10/25,6.3 模块设计优化,93,(5)公共耦合,一组模块引用同一个公用数据区,(也称全局数据区、公共数据环境
34、)。公共数据区指: 全局数据结构 共享通讯区, 内存公共覆盖区等,2018/10/25,6.3 模块设计优化,94,公共耦合举例,公共数据区,公共数据区,松散的公共耦合,紧密的公共耦合,2018/10/25,6.3 模块设计优化,95,公共耦合举例,C,B公共数据区,模块A、B、C间存在错综复杂的联系,2018/10/25,6.3 模块设计优化,96,所有的公共耦合关系,A,公共耦合举例BC,D,6个模块共享一 个公共数据区EF,2018/10/25,6.3 模块设计优化,97,(6)内容耦合,一模块直接访问另一模块的内部信息(程序,代码或数据)最好不采用内容耦合形式 !,A,B,模块A TR
35、C: 模块B GOTO TRC,2018/10/25,6.3 模块设计优化,98,2、如何降低模块间耦合度:,如模块必须存在耦合,选择适当的耦合类型,原则:尽量使用数据耦合少用控制耦合限制公共耦合的范围坚决避免使用内容耦合,2018/10/25,6.3 模块设计优化,99,3、模块独立性的度量之二:聚合度,衡量一个模块内部各成分之间彼此结合的紧密程度,设计目标:高聚合(一模块的所有成分都直接参与完成,同一功能),2018/10/25,6.3 模块设计优化,100,模块的聚合性类型:,低高,偶然聚合逻辑聚合时间聚合过程聚合通信聚合信息聚合功能聚合,弱(功能分散)模块独立性强(功能单一),内 聚
36、性,(1) 偶然内聚(巧合内聚),模块内各部分间无联系,A,B,C,M,MOVE O TO R READ FILE F MOVE S TO T,模块M中的三个语句没有任何联系 缺点:可理解性差, 可修改性差。,例:,(2) 逻辑内聚,把几种相关功能(逻辑上相似的功能)组合在一 模块内,每次调用由传给模块的参数确定执行 哪种功能。,逻辑内聚模块,A,B,C,E,F,G,A,B,C,EFG,A1,B1,C1,EFG模块内部逻辑,E、F、G逻辑 功能相似,组 成新模块EFG,公用代码段,公用代码段,缺点:增强了耦合程度(控制耦合)不易修改,效率低。,(3) 时间内聚,模块完成的功能必须在同一时间内执
37、行,这些功能只 因时间因素关联在一起。 例如:初始化系统模块、系统结束模块、紧急故障处理模块等。,2018/10/25,105,(4) 过程内聚,模块内各处理成分相关,且必须以特定次序执行。,2018/10/25,106,过程内聚模块,建立方程组系数矩阵,全部任务纳入一个 模块,得到一过程 性模块,高斯消去法,回 代,高斯消去法解题流程,过程内聚模块举例,读入 成绩单,读入并审查 成绩单,审查 成绩单,统计 成绩,打印 成绩,统计并打印 成绩,2018/10/25,108,(5) 通信内聚,模块内各部分使用相同的输入数据,或产生 相同的输出结果。,通信内聚模块例,产生工资报表,计算平均工资,职
38、工工资记录,职工工资报表,平均工资,产生职工工资报表并计算平均工资模块,2018/10/25,110,通信内聚模块例,开领 书单,登记 售书,发票,领书单,售 书 登记表,文件,删除,修改,2018/10/25,111,(6)信息内聚,这种模块完成多个功能,各个功能相互独立但都在同一数据结构上操作,每一项功能有一个唯一的入口点。这个模块将根据不同的要求,确定该执行哪一个功能。,2018/10/25,6.3 模块设计优化,112,(7) 功能聚合,一个模块内的所有成分的处理动作全部为完成某个功能,且只执行一个功能,缺一不可, 称为功能聚合。,聚合性最强,如:计算实发工资,打印发票等,2018/1
39、0/25,113,功能内聚模块,建立方程组系数矩阵,高斯消去法,回 代,高斯消去法解题流程,2018/10/25,6.3 模块设计优化,114,4、耦合、聚合与模块独立性关系,耦合与聚合都是模块独立性的定性标准,都反,映模块独立性的良好程度。,但耦合是直接的主导因素,聚合则辅助耦合共,同对模块独立性进行衡量。,2018/10/25,115,控制耦合举例,A,计算平均分 或最高分,B,平均/最高,成绩,逻辑聚合,2018/10/25,116,改控制耦合为数据耦合举例,A,计算平均分,B1,平均成绩,最高成绩,计算最高分,B2,功能聚合,2018/10/25,117,A,取口令并核对,B,用户名、
40、 口令,对/不对,控制耦合举例,顺序聚合,2018/10/25,118,A,取口令,B,用户名,口令,将B中核对口令功能划分到 A,功能聚合,2018/10/25,119,聚合与耦合密切相关,同其它模块强耦合的模块意味着弱聚合,强聚合模块意味着与其它模块间松散耦合.设计目标:力争强聚合、弱耦合,4. 耦合、聚合与模块独立性关系(续),2018/10/25,120,二、系统设计优化原则,(1)程序结构尽可能与问题结构相对应 (2)模块功能要完整 (3)消除重复功能,(4)作用范围应在控制范围内 (5)减少高扇出争取高扇入 (6)模块大小适中,2018/10/25,121,(1)优化系统结构两种典
41、型的程序结构:,变换型程序事务型程序两种程序结构的共同特征:上层模块只负责控制、协调下层模块完成具体的操作,2018/10/25,122,变换型程序,变换型(即输入、加工、输出型,或称IPO型)的功 能是从某输入设备(如键盘)获得数据,再对这些 数据作处理,然后将结果送出(如屏幕显示)。,这类程序的标准SC图形如下图所示:,2018/10/25,123,变,换,型 程 序 结 构,b,a,d,cGet cb,e,a,b,dPUT de,Get b b to c,d to e Write e,Read a a to b,MAIN c dc to dc,2018/10/25,124,(2)模块功能
42、的完整,完整的模块应包括三部分: 执行规定功能部分 出错处理部分, 需返回一系列数据时,应返回是否正确结束(即“文件完/EOF”)标志。,2018/10/25,125,(3)消除重复功能,几个模块中含有重复的部分,应设法消去。因为同一 功能重复多处,不仅浪费编程、测试时间,还会给修改带 来麻烦。,但消除重复功能并不是简单的合并,正确的方法是:先 分析几个模块中相同功能的部分;然后把这个功能分离出 来,构成它们的一个公共的下层模块。,2018/10/25,126,例子:消除重复功能,A,B,A,B,C,C改进前,C改进后,2018/10/25,127,(4) 作用范围应在控制范围内(作用域应在控
43、制域内), 模块的控制范围(控制域) :,包括模块本身和其下属模块的集合。, 模块的作用范围(作用域):,指受该模块内一个判定条件影响的所有模块的集合。 只要模块中含有一些依赖于这个判定的语句,那么就称 该模块在这个判定的作用范围内。, 控制域是从结构方面考虑的;作用域是从功能方面考虑,的,2018/10/25,128,模块的控制范围和作用范围(例),A,F,B,E,M,D,GC,模块A的控制范围:,A、B、C、D、E、F A的作用范围:A、C、F:条件判定,:受判定影响的模 块,2018/10/25,129,作用范围/控制范围原则:,把一个条件判定的作用范围限制在判定所在模块 的控制范围之内
44、,且判定所在位置不能太高。(作用域是控制域的子集),2018/10/25,130,图A:判定位置违反作用范围/控制范围原则,TOP,A,B,C,D,G,E,判定的作用范围 有一部分,(模块C),越出了判定所在 模块G的控制范,围,G D,B C,条件 判定,2018/10/25,131,图B:符合作用范围/控制范围原则,但判定位置,太高,TOPA,B,C,D,G,E,条件 判定,TOP,B,D,G,TOP,B,C,2018/10/25,132,图C:符合作用范围/控制范围原则,判定位置适,中,TOP,A,G,C,B,E,条件判定D,BB,CD,G,2018/10/25,133,图D:符合作用范
45、围/控制范围的理想判 定位置TOP,A,E,B,D,C,条件判定G,DD,EG,2018/10/25,134,思考,发现作用域不在控制域范围内时,该如何进行改进呢?,1、将判定位置上移。2、将超出作用域的模块下移,2018/10/25,135,(5)减少高扇出,争取高扇入, 模块调用的直接下层模块的个数,称为扇出,(Fan out), 模块被其他各模块调用的个数,称为扇入(Fan,in), 原则:扇出不宜过大,=7;扇入尽可能大些。,(3,1),(5,1),(0,2),(4,0)符号:,(扇出,扇入),2018/10/25,136,(5)减少高扇出,争取高扇入(续),清真寺型,金字塔型不够好,底层模块复用度低,2018/10/25,137,(6) 模块大小适中, 模块过大:可理解程度下降,考虑对该模块分解, 模块过小:开销大于有效操作,系统接口复杂,考虑是否同它的调用模块合并,