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