1第五章软件设计概述§5.1软件设计的目标和任务§5.2软件设计基本概念§5.3模块化设计2§5.1软件设计的任务软件需求:解决“做什么”软件设计:解决“怎么做”3软件设计的任务问题结构(软件需求)软件结构;从软件需求规格说明书出发,形成软件的具体设计方案。映射41.软件的总体结构主要回答的问题软件的组成部分软件的层次关系模块的内部处理逻辑模块之间的界面52.软件设计方法结构化设计方法(SD)面向数据结构的设计方法(JSD方法)面向对象的设计方法(OOD)63.软件设计分为两个阶段:(1)概要设计(总体设计)确定软件的结构以及各组成成分(子系统或模块)之间的相互关系。(2)详细设计确定模块内部的算法和数据结构,产生描述各模块程序过程的详细文档。7§5.2软件设计的基本概念1.模块化2.抽象与细化3.信息隐蔽4.软件复用81.模块化模块化:把程序划分成若干个模块,每个模块完成一个子功能,把这些模块集总起来组成一个整体,可以完成指定的功能,满足问题的功能。模块:一个拥有明确定义的输入、输出和特性的程序实体。9模块模块是具有一定功能的可以用名词调用的程序语句集合,如:独立的汇编程序Pascal过程10概要设计的基本概念将系统划分成模块决定每个模块的功能决定模块的调用关系决定模块的界面,即模块间传递的数据112.抽象(Abstraction)与细化抽象:解决问题时只考虑与问题有关的方面,不考虑与问题无关的方面。即抽出事物的本质特性而不考虑细节。12抽象(Abstraction)抽象原则应用举例WindowsNT一体化的I/O系统设计文件管理网络管理设备管理高速缓冲存储器OS对虚拟文件的字节流,虚拟文件可为任何设备和实体抽象13细化:即分解。在逐步细化中,特别强调这种分解的“逐步”性质,即每一部分仅较其前一部增加“少量”的细节。这样,在相邻两部之间就只有微小的变化,不难验证它们的内容是否等效。143.信息隐蔽(InformationHiding)信息隐蔽的含义:有效的模块化可以通过定义一组独立模块来实现,这些模块相互之间只交流软件功能必需的信息。换句话说:模块所包含的信息,不允许其它不需要这些信息的模块访问,独立的模块间仅仅交换为完成系统功能而必须交换的信息。信息隐蔽:对模块内部信息访问的约束信息隐蔽的基本原则:功能独立,高内聚且低耦合15§5.3模块化设计1.分解2.模块独立性内聚耦合自顶向下与自底向上设计16模块化(Modularity)模块化是好的软件设计的一个基本准则从整体上把握问题,隐蔽细节复杂问题较小问题分解可减小解题所需的总的工作分解17C(p1)C(p2)则E(p1)E(p2)其中:p1和p2是两个问题C(x)是由x问题决定的复杂性E(x)是解决x问题所需要的工作量C(p1+p2)C(p1)+C(p2)E(p1+p2)E(p1)+E(p2)试验发现模块划分得越小成本越低,但是集成成本却随着模块划分得越小成本越高。如何确定模块化分的最小成本区,并保证模块的最佳性能,是设计活动中的主要任务之一。1.分解"各个击破"理论18模块数与开发工作量的关系成本或工作量模块数量软件总成本集成成本成本/模块M最小成本区域192.模块的独立性①模块独立性的概念模块完成独立的功能符合信息隐蔽和信息局部化原则模块间关连和依赖程度尽量小20②模块独立性的度量模块独立性取决于模块的内部和外部特征。SD方法提出的定性的度量标准:模块自身的内聚性模块之间的耦合性212.模块独立性的度量之一:内聚性一个模块内部各成分之间相互关联的强度设计目标:高内聚(一模块的所有成分都直接参与并且对于完成同一功能来说都是最基本的)22模块的内聚性类型:低巧合内聚内逻辑内聚聚时间内聚性过程内聚通信内聚信息内聚高功能内聚模块独立性弱(功能分散)强(功能单一)23(1)巧合内聚(偶然内聚)模块内各部分间无联系ABCMMOVEOTORREADFILEFMOVESTOT模块M中的三个语句没有任何联系缺点:可理解性差,可修改性差。例:24(2)逻辑内聚把几种相关功能(逻辑上相似的功能)组合在一模块内,每次调用由传给模块的参数确定执行哪种功能。25逻辑内聚模块ABCEFGABCEFGA1B1C1EFG模块内部逻辑E、F、G逻辑功能相似,组成新模块EFG公用代码段公用代码段缺点:增强了耦合程度(控制耦合)不易修改,效率低。26(3)时间内聚模块完成的功能必须在同一时间内执行,这些功能只因时间因素关联在一起。例如:初始化系统模块、系统结束模块、紧急故障处理模块等。27(4)过程内聚模块内各处理成分相关,且必须以特定次序执行。28过程内聚模块读入成绩单读入并审查成绩单审查成绩单统计成绩打印成绩统计并打印成绩29(5)通信内聚模块内各部分使用相同的输入数据,或产生相同的输出结果。30通信内聚模块例产生工资报表计算平均工资职工工资记录职工工资报表平均工资产生职工工资报表并计算平均工资模块31(6)信息内聚信息内聚指模块完成多个功能,各个功能都在同一数据结构上操作,每个功能有唯一入口。如对同一个数据库的“查找—添加—删除—修改”模块。32(7)功能内聚模块仅包括为完成某个功能所必须的所有成分。(模块所有成分共同完成一个功能,缺一不可)内聚性最强33功能内聚模块建立方程组系数矩阵高斯消去法回代高斯消去法解题流程34模块独立性的度量之二:耦合性是模块间相互依赖程度的度量,耦合的强弱取决于模块间接口的复杂程度,进入或访问一个模块的点,以及通过接口的数据。耦合性越高,模块独立性越弱35耦合强度依赖的因素:一模块对另一模块的引用一模块向另一模块传递的数据量一模块施加到另一模块的控制的数量模块间接口的复杂程度36模块间耦合的类型:低非直接耦合耦数据耦合合标志耦合性控制耦合外部耦合公共耦合高内容耦合模块独立性弱(低耦合)强(中耦合)(较强耦合)(强耦合)37(1)非直接耦合两个模块没有直接关系(模快1和模快2),模块独立性最强。模块1模块2模块3模块438(2)数据耦合一模块调用另一模块时,被调用模块的输入、输出都是简单的数据,属松散耦合。39数据耦合举例开发票计算水费单价数量金额40数据耦合举例计算水电费计算水费计算电费用水量用电量水费电费41(3)标记耦合(特征耦合)如两个模块通过传递数据结构(不是简单数据,而是记录、数组等)加以联系,或都与一个数据结构有关系,则称这两个模块间存在标记偶合。42标记耦合举例计算水电费计算水费计算电费住户情况水费电费住户情况“住户情况”是一个数据结构,图中模块都与此数据结构有关。“计算水费”和“计算电费”本无关,由于引用了此数据结构产生依赖关系,它们之间也是标记偶合。43将标记耦合修改为数据耦合举例计算水电费计算水费计算电费本月用水量本月用电量水费电费44(4)控制耦合一模块通过开关量、标志、名字等控制信息,明显地控制另一模块的功能。45控制耦合举例A计算平均分或最高分B平均/最高成绩46控制耦合举例读入分数输出结果计算平均分计算最高分平均/最高?调用逻辑性模块B时,须先传递控制信号(平均分/最高分),以选择所需的操作。控制模块必须知道被控模块的内部逻辑,增强了相互依赖。B47控制耦合增加了理解和编程的复杂性,调用模块必须知道被调模块的内部逻辑,增加了相互依赖。去除模块间控制耦合的方法:(1)将被调用模块内的判定上移到调用模块中进行;(2)被调用模块分解成若干单一功能模块。48改控制耦合为数据耦合举例A计算平均分B1平均成绩最高成绩计算最高分B249(5)外部耦合一组模块均与同一外部环境关联(例如,I/O模块与特定的设备、格式和通信协议相关联),它们之间便存在外部耦合。外部偶合必不可少,但这种模块数目应尽量少。50(6)公共耦合(公共数据区耦合)一组模块引用同一个公用数据区(也称全局数据区、公共数据环境)。公共数据区指:全局数据结构共享通讯区内存公共覆盖区等51公共耦合举例Acommon公共数据区松散的公共耦合BAcommon公共数据区紧密的公共耦合B52公共耦合举例A公共数据区CB模块A、B、C间存在错综复杂的联系53公共耦合举例所有的公共耦合关系AEBCD6个模块共享一个公共数据区F54(1)软件可理解性降低(模块间存在错综复杂的连系)(2)软件可维护性差(修改变量名或属性困难)(3)软件可靠性差(公共数据区及全程变量无保护措施)慎用公共数据区和全程变量!!!公共耦合存在的问题:55(7)内容耦合一模块直接访问另一模块的内部信息(程序代码或数据)。最不好内容耦合形式!!!56发生内容耦合的情形:(1)一模块直接访问另一模块的内部数据(2)一模块不通过正常入口转到另一模块内(3)两模块有一部分代码重叠(4)一模块有多个入口57模块化设计的原则和目标耦合是影响软件复杂程度和设计质量的重要因素目标:建立模块间耦合度尽可能松散的系统。58如何降低模块间耦合度?(1)如模块必须存在耦合,选择适当的耦合类型原则:尽量使用数据耦合少用控制耦合限制公共耦合的范围坚决避免使用内容耦合(2)降低模块间接口的复杂性59接口复杂性与耦合类型的关系:接口复杂性接口方式接口数据的复杂性无接口关系直接引用过程调用语句数据项作参数数据结构,变量名作参数内容耦合其它耦合开关量,起控制变量作用公用数据区数据耦合标记耦合控制耦合外部耦合公共耦合非直接耦合60内聚与耦合密切相关,同其它模块强耦合的模块意味着弱内聚,强内聚模块意味着与其它模块间松散耦合。设计目标:力争强内聚、弱耦合。