1、第四章第四章 结构化设计结构化设计 对软件进行需求分析和建模后,便开始了软件设对软件进行需求分析和建模后,便开始了软件设计,需求规格说明是软件设计的重要输入,它为软件计,需求规格说明是软件设计的重要输入,它为软件设计提供了基础。设计提供了基础。 软件设计过程是将需求规格说明转化为软件实现软件设计过程是将需求规格说明转化为软件实现方案的过程方案的过程。软件设计包括。软件设计包括概要设计概要设计和和详细设计详细设计,本,本章则主要介绍软件概要设计和详细设计的过程。章则主要介绍软件概要设计和详细设计的过程。 结构化设计原理结构化设计原理 模块独立模块独立 启发规则启发规则 表示软件结构的图形工具表示
2、软件结构的图形工具 面向数据流的设计方法面向数据流的设计方法 人机界面设计人机界面设计 过程设计过程设计14.1 结构化设计概述结构化设计概述 任务任务:回答:回答How to do? 阶段划分阶段划分:概要设计、详细设计:概要设计、详细设计 主要内容主要内容: 体系结构设计体系结构设计 数据设计数据设计 接口设计接口设计 过程设计过程设计 结构化设计模型与结构化分析模型的结构化设计模型与结构化分析模型的关系关系: 软件设计必须依据对软件的需求分析来进行的,而软件设计必须依据对软件的需求分析来进行的,而结构化分析的结果为结构化设计提供了最基本的输结构化分析的结果为结构化设计提供了最基本的输入信
3、息。入信息。2软件开发阶段的信息流软件开发阶段的信息流编码编码测试测试设计设计信息描述信息描述功能描述功能描述行为描述行为描述其他需求其他需求总体结构设计总体结构设计数据设计数据设计过程设计过程设计 程序模块程序模块集成并确集成并确认的软件认的软件34.2 软件设计的概念和原理软件设计的概念和原理 模块化模块化 抽象抽象 逐步求精逐步求精 信息隐藏信息隐藏41. 模块化模块化 模块模块(Modular): 独立命名,可独立访问的具有一定功能的一段程序。独立命名,可独立访问的具有一定功能的一段程序。 模块化设计(模块化设计(Modular Design):): 按适当的原则把软件划分为一个个较小
4、的、相关而又按适当的原则把软件划分为一个个较小的、相关而又相对独立的模块。每个模块可独立开发、测试,最后相对独立的模块。每个模块可独立开发、测试,最后组装成完整的软件。组装成完整的软件。 在结构化方法中,过程、函数和子程序等都可作为模在结构化方法中,过程、函数和子程序等都可作为模块;在面向对象方法中,对象是模块,对象内的方法块;在面向对象方法中,对象是模块,对象内的方法也是模块。也是模块。 模块分解并不是越小越好。模块分解并不是越小越好。5理想模块理想模块 理想模块的特点:理想模块的特点: 只解决一个问题。只解决一个问题。 功能都应该明确,使人容易理解。功能都应该明确,使人容易理解。 理想模块
5、之间的连接关系简单,具有独立性。理想模块之间的连接关系简单,具有独立性。 由理想模块构成的系统,容易使人理解,易于编程,由理想模块构成的系统,容易使人理解,易于编程,易于测试,易于修改和维护。易于测试,易于修改和维护。 对用户来说,其感兴趣的是模块的功能,而不必对用户来说,其感兴趣的是模块的功能,而不必去理解模块内部的结构和原理。去理解模块内部的结构和原理。6模块分解(模块分解(Decomposition) E(P1+P2)E(P1)+E(P2)设:设: C(x) 为为复杂程度函数复杂程度函数 E(x) 为决定解决问题为决定解决问题x x所需的所需的工作量工作量( (时间时间) )函数函数 如
6、果:如果:C(P1)C(P2)则:则:E(P1)E(P2)C(P1+P2)C(P1)+C(P2) Magical Number Seven,Plus or Minus Two,Some Limits on Our Capacity for Processing Information The Psychological Review,1956 G.A. Miller奇妙的数字奇妙的数字 7+2,人类,人类信息处理能力的限度信息处理能力的限度7软件工程基本定理软件工程基本定理C(P1+P2)C(P1)+C(P2)E(P1+P2)E(P1)+E(P2)软件工程基本定理软件工程基本定理最小成本区最小
7、成本区M模块成本模块成本接口成本接口成本总成本总成本软软件件开开发发工工作作量量 模块数模块数 8有关模块化有关模块化 模块化考虑因素:模块化考虑因素: 模块数目模块数目 怎样定义一个给定大小的模块怎样定义一个给定大小的模块 评价模块系统设计方法的标准评价模块系统设计方法的标准: 可分解性、可组装性、可理解性、连续性、保护性可分解性、可组装性、可理解性、连续性、保护性 模块化的优点模块化的优点: 易阅读和理解,可靠性,可修改性易阅读和理解,可靠性,可修改性92. 抽象(抽象(Abstraction) 抽象抽象即提取出本质而暂不考虑细节。是认识复杂现象即提取出本质而暂不考虑细节。是认识复杂现象过
8、程中使用的思维工具。过程中使用的思维工具。 在进行软件设计时,抽象与逐步求精、模块化密切相关,在进行软件设计时,抽象与逐步求精、模块化密切相关,可提高软件的可理解性。可提高软件的可理解性。 高层次抽象高层次抽象 使用问题环境的语言,以概括的方式叙述问题的解使用问题环境的语言,以概括的方式叙述问题的解决。决。 较低层次抽象较低层次抽象 更过程化的方法更过程化的方法 面向问题面向问题+面向实现术语结合面向实现术语结合 最低层次抽象最低层次抽象 直接实现的方式叙述问题的解法。直接实现的方式叙述问题的解法。103. 逐步求精逐步求精 细化细化 为了集中精力解决主要问题而尽量推迟对问题细节的考为了集中精
9、力解决主要问题而尽量推迟对问题细节的考虑。虑。 软件工程过程的每一步都是对软件解法的抽象层次的一软件工程过程的每一步都是对软件解法的抽象层次的一次精化。次精化。 求精求精是是帮助设计者在设计过程中提示出低层细节。帮助设计者在设计过程中提示出低层细节。114. 信息隐藏(信息隐藏(Information Hiding) 又称又称数据封装数据封装(Data Encapculation) 指在设计和确定模块时,使得一个模块内包含的信指在设计和确定模块时,使得一个模块内包含的信息(过程和数据),对于不需要这些信息的其他模息(过程和数据),对于不需要这些信息的其他模块来说,是不可访问的。块来说,是不可访
10、问的。 为软件系统的修改、测试及以后的维护都带来好处为软件系统的修改、测试及以后的维护都带来好处 目的目的 为了提高模块的独立性。为了提高模块的独立性。栈栈stack置空栈置空栈 makenull进栈进栈 push退栈退栈 pop124.3 模块独立性(模块独立性(Module Independence) 模块独立性模块独立性: 是指软件系统中每个模块只涉及软件要求的具体的是指软件系统中每个模块只涉及软件要求的具体的子功能,而和软件系统中其他模块接口是简单的。子功能,而和软件系统中其他模块接口是简单的。 模块完成独立的功能模块完成独立的功能 符合信息隐蔽和信息局部化原理符合信息隐蔽和信息局部化
11、原理 模块间关连和依赖程度尽量小模块间关连和依赖程度尽量小 两个定性的度量标准两个定性的度量标准: 耦合性:模块之间的依赖程度。取决于接口的复杂耦合性:模块之间的依赖程度。取决于接口的复杂性、调用的方式及传递的信息。性、调用的方式及传递的信息。 内聚性:模块内部各成分之间的关联程度。内聚性:模块内部各成分之间的关联程度。131. 耦合(耦合(Coupling) 耦合性耦合性: 是程序结构中各个模块之间相互关联的度量。是程序结构中各个模块之间相互关联的度量。 取决于各个模块之间接口的复杂程序、调用模块的取决于各个模块之间接口的复杂程序、调用模块的方式以及哪些信息通过接口。方式以及哪些信息通过接口
12、。 耦合性越高,模块独立性越弱。耦合性越高,模块独立性越弱。低低非直接非直接耦合耦合数据数据耦合耦合标记标记耦合耦合控制控制耦合耦合外部外部耦合耦合公共公共耦合耦合内容内容耦合耦合 高高弱弱 强强耦合性耦合性模块独立性模块独立性14非直接耦合非直接耦合(Nondirect Coupling) 非直接耦合非直接耦合: 模块之间没有直接关系,它们之间的联系完全是通模块之间没有直接关系,它们之间的联系完全是通过主模块的控制和调用来实现的。过主模块的控制和调用来实现的。 这种耦合的这种耦合的模块独立性最强模块独立性最强。 例如下图中,模块例如下图中,模块1和和2是非直接耦合是非直接耦合3412015数
13、据耦合(数据耦合(Data Coupling) 数据耦合数据耦合: 在两个模块间往返在两个模块间往返传递的只有数据传递的只有数据(或变量或记录(或变量或记录或文件),这种耦合称数据耦合。或文件),这种耦合称数据耦合。 在模块间只有数据传输,模块接口简单。在模块间只有数据传输,模块接口简单。 在不可避免的耦合中是耦合力最低的,也是在不可避免的耦合中是耦合力最低的,也是较理想较理想的耦合的耦合。 如:编程语言中的传值函数。如:编程语言中的传值函数。开发票开发票计算水费计算水费单价单价数量数量金额金额16标记耦合(标记耦合(Stamp Coupling) 标记耦合(又称特征耦合)标记耦合(又称特征耦
14、合): 指两个模块之间传递的是数据结构(如记录、数组指两个模块之间传递的是数据结构(如记录、数组等)。其实传递的是这个数据结构的地址。等)。其实传递的是这个数据结构的地址。 两个模块必须清楚这些数据结构,并按要求对其进两个模块必须清楚这些数据结构,并按要求对其进行操作,这样就降低了可理解性。行操作,这样就降低了可理解性。 如:如: 住户详情中包含了住户详情中包含了“本月用电量本月用电量”和和“本月用水量本月用水量”计算水电费计算水电费计算水费计算水费计算电费计算电费住户情况住户情况水费水费电费电费住户情况住户情况17将标记耦合改为数据耦合将标记耦合改为数据耦合计算水电费计算水电费计算水费计算水
15、费计算电费计算电费本月用水量本月用水量水费水费电费电费本水用电量本水用电量18控制耦合(控制耦合(Control Coupling) 控制耦合控制耦合: 如果一个模块通过传送控制信息(开发、标志、名如果一个模块通过传送控制信息(开发、标志、名字等),明显地控制选择另一模块的功能就是控制字等),明显地控制选择另一模块的功能就是控制耦合。耦合。 病态耦合病态耦合19B控制耦合举例控制耦合举例AB计算平均分计算平均分或最高分或最高分平均平均/最高最高成绩成绩读入分数读入分数平均平均/最高?最高?计算平均分计算平均分计算最高分计算最高分输出结果输出结果20去除模块间控制耦合的方法去除模块间控制耦合的方
16、法 去除模块间控制耦合的方法:去除模块间控制耦合的方法: 将被调用模块内的判定上移到调用模块中进行;将被调用模块内的判定上移到调用模块中进行; 被调用模块分解成若干单一功能模块。被调用模块分解成若干单一功能模块。AB1计算平均分计算平均分B2计算最高分计算最高分平均成绩平均成绩最高成绩最高成绩21将控制耦合改为数据耦合又例将控制耦合改为数据耦合又例22外部耦合外部耦合 外部耦合外部耦合: 当模块受外部环境的约束时就会发生外部耦合。当模块受外部环境的约束时就会发生外部耦合。 例如:例如:I/O模块与特定设备,格式与通信协议相关联。模块与特定设备,格式与通信协议相关联。 外部耦合必不可少,但这种模
17、块数目应尽量少。外部耦合必不可少,但这种模块数目应尽量少。23公共耦合(公共耦合(Common Coupling) 公共耦合公共耦合: 允许两个以上模块引用或访问同一个公用数据区允许两个以上模块引用或访问同一个公用数据区(也称全局数据区、公共数据环境)。(也称全局数据区、公共数据环境)。 公共数据区指:公共数据区指: 全局数据结构全局数据结构 共享通讯区共享通讯区 内存公共覆盖区等内存公共覆盖区等全局全局数据区数据区ABCDEFB、C、E 为公共耦合为公共耦合24公共耦合存在的问题公共耦合存在的问题 公共耦合存在的问题:公共耦合存在的问题: 软件可理解性降低(模块间存在错综复杂的联系)软件可理
18、解性降低(模块间存在错综复杂的联系) 软件可维护性差(修改变量名或属性困难)软件可维护性差(修改变量名或属性困难) 软件可靠性差(公共数据区及全程变量无保护措施)软件可靠性差(公共数据区及全程变量无保护措施) 慎用公共数据区和全程变量!慎用公共数据区和全程变量!25内容耦合(内容耦合(Content Coupling) 内容耦合内容耦合: 当一个模块使用另一个模块内部的数据或信息时,当一个模块使用另一个模块内部的数据或信息时,或者转移进入另一个模块中时,产生模块间内容耦或者转移进入另一个模块中时,产生模块间内容耦合。合。 最不好的耦合形式!最不好的耦合形式! 发生内容耦合的情形:发生内容耦合的
19、情形: 模块直接访问另一模块的内部数据模块直接访问另一模块的内部数据 模块不通过正常入口转到另一模块内模块不通过正常入口转到另一模块内 两模块有一部分代码重叠(只可能出现在汇编语言两模块有一部分代码重叠(只可能出现在汇编语言中)中) 一模块有多个入口一模块有多个入口26如何降低模块间耦合度如何降低模块间耦合度 如模块必须存在耦合,应采取下述设计原则:如模块必须存在耦合,应采取下述设计原则: 尽量使用数据耦合,尽量使用数据耦合, 少用控制耦合,少用控制耦合, 限制公共环境耦合的范围,限制公共环境耦合的范围, 坚决避免使用内容耦合。坚决避免使用内容耦合。 降低模块间接口的复杂性降低模块间接口的复杂
20、性 实际上,开始时两个模块之间的耦合不只是一实际上,开始时两个模块之间的耦合不只是一种类型,而是多种类型的混合。这就要求设计种类型,而是多种类型的混合。这就要求设计人员按照实际情况进行分析、比较和分析,逐人员按照实际情况进行分析、比较和分析,逐步加以改进,以提高模块的独立性。步加以改进,以提高模块的独立性。27接口复杂性与耦合类型的关系接口复杂性与耦合类型的关系28内聚(内聚(Cohesion) 内聚性内聚性: 衡量一个模块内各个元素彼此结合的紧密程度。衡量一个模块内各个元素彼此结合的紧密程度。 设计目标:高内聚(一个模块的所有成分都直接参设计目标:高内聚(一个模块的所有成分都直接参与并且对于
21、完成同一功能来说都是最基本的)与并且对于完成同一功能来说都是最基本的)低低功能功能内聚内聚顺序顺序内聚内聚通信通信内聚内聚过程过程内聚内聚时间时间内聚内聚逻辑逻辑内聚内聚偶然偶然内聚内聚 高高强强功能单一功能单一弱弱功能分散功能分散 内聚内聚性性模块独立性模块独立性29偶然内聚偶然内聚 偶然内聚偶然内聚: 一个模块完成一组任务,任务之间的关系很松散。一个模块完成一组任务,任务之间的关系很松散。 缺点:可理解性差,可修改性差。缺点:可理解性差,可修改性差。 例如下图中,例如下图中,M模块中的三个语句没有任何联系。模块中的三个语句没有任何联系。30逻辑内聚逻辑内聚 逻辑内聚逻辑内聚: 这种模块把几
22、种功能组合在一起,每次被调用时,这种模块把几种功能组合在一起,每次被调用时,则由传递给模块的判定参数来确定该模块应执行哪则由传递给模块的判定参数来确定该模块应执行哪一种功能。一种功能。调用模块调用模块判定判定读读一一个个记记录录写写一一个个记记录录被调用模块被调用模块31 缺点:缺点: 增强了耦合程度(控制耦合),不易修改,效率低。增强了耦合程度(控制耦合),不易修改,效率低。逻辑内聚逻辑内聚32时间内聚时间内聚 时间内聚时间内聚: 模块完成的功能必须在同一时间内执行,这些功能模块完成的功能必须在同一时间内执行,这些功能只因时间因素关联在一起。只因时间因素关联在一起。 如:初始化系统模块、系统
23、结束模块、紧急故障处如:初始化系统模块、系统结束模块、紧急故障处理模块等理模块等33过程内聚过程内聚 过程内聚过程内聚: 一个模块内各处理成分的动作各不相同,但它们都一个模块内各处理成分的动作各不相同,但它们都受一个控制流的支配,且决定了它们的执行次序。受一个控制流的支配,且决定了它们的执行次序。读入读入成绩单成绩单审查审查成绩单成绩单读入并审查读入并审查成绩单成绩单统计统计成绩成绩打印打印成绩成绩统计并打印统计并打印成绩单成绩单高斯消去法解题流程高斯消去法解题流程34通信内聚通信内聚 通信内聚通信内聚: 模块中的所有元素都使用相同输入数据,和模块中的所有元素都使用相同输入数据,和/或产生或产
24、生相同输出数据。相同输出数据。 通常,通信内聚模块是通过数据流图来定义的。通常,通信内聚模块是通过数据流图来定义的。 例如:例如:35通信内聚举例通信内聚举例职工工职工工资记录资记录产生工产生工资报表资报表计算平计算平均工资均工资职工工职工工资报表资报表平均工资平均工资产生职工工资报表并计算平均工资模块产生职工工资报表并计算平均工资模块36顺序内聚顺序内聚 顺序内聚顺序内聚: 一个模块能完成多个操作,前一个操作处理的输出一个模块能完成多个操作,前一个操作处理的输出数据是下一个操作处理的输入数据,模块中各成份数据是下一个操作处理的输入数据,模块中各成份的工作是有次序的,各成份的关系也较紧密,则称
25、的工作是有次序的,各成份的关系也较紧密,则称为顺序内聚。为顺序内聚。37功能内聚功能内聚 功能内聚功能内聚: 一个模块内的所有成分的处理动作全部为完成某个一个模块内的所有成分的处理动作全部为完成某个功能,且只执行一个功能,缺一不可,称为功能内功能,且只执行一个功能,缺一不可,称为功能内聚。聚。 如:计算实发工资,打印发票等如:计算实发工资,打印发票等 是最高程度的内聚。是最高程度的内聚。 有利于实现软件的重用,从而提高软件开发的效率。有利于实现软件的重用,从而提高软件开发的效率。38耦合、内聚与模块独立性关系耦合、内聚与模块独立性关系 内聚和耦合密切相关,同其它模块强耦合的模内聚和耦合密切相关
26、,同其它模块强耦合的模块意味着弱内聚,强内聚模块意味着与其它模块意味着弱内聚,强内聚模块意味着与其它模块间松散耦合。块间松散耦合。 设计目标:设计目标:力争力争强内聚、弱耦合强内聚、弱耦合。 二者都反映模块独立性的良好程度。耦合是直二者都反映模块独立性的良好程度。耦合是直接的主导因素,内聚则辅助耦合共同对模块独接的主导因素,内聚则辅助耦合共同对模块独立性进行衡量。立性进行衡量。394.5 表示软件结构的图形工具表示软件结构的图形工具 层次图层次图 HIPO图图 结构图结构图401. 层次图层次图 层次图(层次图(H图)图) 描绘软件的层次结构。描绘软件的层次结构。 用矩形框表示一个模块,连线表
27、示模块之间的调用用矩形框表示一个模块,连线表示模块之间的调用关系。关系。 适于在自顶向下设计软件的过程中使用。适于在自顶向下设计软件的过程中使用。412. HIPO图图 HIPO图图 Hierarchy Plus Input/Processing/Output 是一种描述系统结构和模块内部处理功能的工是一种描述系统结构和模块内部处理功能的工具(技术)。具(技术)。 由由H图和图和IPO图两部分构成。图两部分构成。H图描述了整个系统的图描述了整个系统的设计结构以及各类模块之间的关系,设计结构以及各类模块之间的关系,IPO图描述了某图描述了某个特定模块内部的处理过程和输入个特定模块内部的处理过程和
28、输入/输出关系。输出关系。 在在H图里除了最顶层的方框之外,每个方框都加了编图里除了最顶层的方框之外,每个方框都加了编号。号。 和和H图中每个方框相对应,应该有一张图中每个方框相对应,应该有一张IPO图描绘这图描绘这个方框代表的模块的处理过程。个方框代表的模块的处理过程。42IPO图示例图示例433. 结构图结构图 结构图(结构图(Structured Chart, SC) 是精确表达模块结构的图形表示工具。是精确表达模块结构的图形表示工具。 作为软件设计文档的一部分,清楚地反映出作为软件设计文档的一部分,清楚地反映出软件模软件模块间的层次调用关系块间的层次调用关系和和模块之间的联系模块之间的
29、联系。44结构图中的主要内容结构图中的主要内容 SC图中的主要内容:图中的主要内容: 模块模块 用矩形框表示,框内注明模块的名字或主要功能用矩形框表示,框内注明模块的名字或主要功能 模块的调用关系和接口模块的调用关系和接口 用箭头(或直线)表示用箭头(或直线)表示 调用次序为上层调用下层调用次序为上层调用下层 同层按照数据传递关系确定同层按照数据传递关系确定 模块间的信息传递模块间的信息传递 数据信息或控制信息数据信息或控制信息 尾端带有空心圆的短箭头表示数据信息尾端带有空心圆的短箭头表示数据信息 尾端还有实心圆的短箭头表示控制信息尾端还有实心圆的短箭头表示控制信息45结构图中的四种模块结构图
30、中的四种模块 在系统结构图中有在系统结构图中有四种类型的模块四种类型的模块: 传入模块传入模块 传出模块传出模块 变换模块,即加工模块变换模块,即加工模块 协调模块协调模块 在一个好的在一个好的SC图中,协调模块应在较高层出现。图中,协调模块应在较高层出现。逻辑输逻辑输入数据流入数据流逻辑输逻辑输出数据流出数据流传入模块传入模块AA传出模块传出模块DD变换变换数据流数据流变换模块变换模块BC协调模块协调模块YYXX46结构图中两个附加符号结构图中两个附加符号ABCX,YZZABCMBCA选择调用选择调用循环调用循环调用47结构图的形态特征结构图的形态特征 结构图的形态特征:结构图的形态特征:
31、深度、宽度、扇入、扇出深度、宽度、扇入、扇出48结构图举例结构图举例原子模块原子模块49结构化设计结构化设计 目的目的: 使程序的结构尽可能反映要解决的问题的结构。使程序的结构尽可能反映要解决的问题的结构。 任务任务: 完成目标系统的系统结构图。完成目标系统的系统结构图。 本质本质: 将需求分析阶段所产生的将需求分析阶段所产生的DFD转换成转换成SC图。图。504.6 面向数据流的设计方法面向数据流的设计方法 基于数据流的设计方法可以很方便地将数据流图中表示基于数据流的设计方法可以很方便地将数据流图中表示的数据流映射成软件结构。其的数据流映射成软件结构。其设计过程设计过程描述如下:描述如下:
32、复查并精化数据流图。复查并精化数据流图。 确定数据流图中数据流的类型。确定数据流图中数据流的类型。 导出初始的软件结构图。导出初始的软件结构图。 逐级分解。逐级分解。 精化软件结构。精化软件结构。 导出接口描述和全局数据结构。导出接口描述和全局数据结构。51从从DFD导出导出SC图的步骤图的步骤52DFD的两种类型的两种类型 信息流(信息流(DFD)的两种类型:)的两种类型: 变换型变换型DFD线型线型 事务型事务型DFD扇型扇型 有一个明显的有一个明显的事务中心事务中心,它接受一项事务,根据该事务的,它接受一项事务,根据该事务的特点和性质,选择分配一个适当的处理单元,然后输出结特点和性质,选
33、择分配一个适当的处理单元,然后输出结果。果。取得取得数据数据iaeo变换变换数据数据给出给出数据数据传入部分传入部分变换中心变换中心传出部分传出部分53事务型事务型DFD输入输入- 事务型事务型 数据流图数据流图ABCDEFGH中心变换中心变换输出输出逻辑逻辑输入输入物理物理输入输入逻辑逻辑输出输出物理物理输出输出541. 变换分析变换分析 Transform Analysis 是将具有变换型的是将具有变换型的DFD图导出图导出SC图。图。 基本步骤:基本步骤: 在数据流图上区分系统的逻辑输入、逻辑输出和变在数据流图上区分系统的逻辑输入、逻辑输出和变换中心部分,并标出它们的分界。换中心部分,并
34、标出它们的分界。 进行一级分解,设计系统模块结构的顶层和第一层。进行一级分解,设计系统模块结构的顶层和第一层。 进行二级分解,设计输入、输出和中心变换部分的进行二级分解,设计输入、输出和中心变换部分的中、下层模块。中、下层模块。55(1)在)在DFD上标出逻辑输入、逻辑输出和变换中心的分界上标出逻辑输入、逻辑输出和变换中心的分界abdvrp变换中心变换中心c,e 逻逻辑输入辑输入w,u 逻逻辑输出辑输出- 具有变换型具有变换型数据流图数据流图56(2)完成第一级分解)完成第一级分解McMAMTMEC,eC,eU,wU,w顶层顶层第一层第一层第一级分解后的结构图第一级分解后的结构图57(2)完成
35、第一级分解)完成第一级分解第一级分解后的结构图第一级分解后的结构图(另一种画法另一种画法)McMA1ME1C eU MA2QPRME2e c,p pr r w,uw58MAGet CGet EGet BRead ARead DabdecMAGet CGet EBtoCAtoBDtoEaecReadDGet BRead Ac,eabbbcde(3)完成第二级分解:自顶向下分解,设计出每个分支)完成第二级分解:自顶向下分解,设计出每个分支(输入、变换、输出)的中、下层模块(输入、变换、输出)的中、下层模块59(3)完成第二级分解(续)完成第二级分解(续)MA对逻辑输入的分解对逻辑输入的分解CEBA
36、DabdeccbaABCMAEDde 逻辑输入模块的逻辑输入模块的调用与执行过程调用与执行过程60(3)完成第二级分解(续)完成第二级分解(续)对输出的分解对输出的分解对变换中心加工的分解对变换中心加工的分解MTQPR eC,prU,w prMEWrite WPut UWrite VvuW w,uMEWrite WPut UWrite VvuW w,uU to Vuv61(4)获得完整的)获得完整的SC图图MACBAEDMTQPR从变换分析导出的初始从变换分析导出的初始 SC 图图MEWUVMCc, eW,uW,uC,e62运用变换分析方法建立系统的运用变换分析方法建立系统的SC图时需注意以下
37、几点:图时需注意以下几点: 模块设计的次序时,应遵循对一个模块的全部模块设计的次序时,应遵循对一个模块的全部直接下属模块都设计完成后,再转向另一个模直接下属模块都设计完成后,再转向另一个模块的下层模块的设计。块的下层模块的设计。 在设计下层模块时,应考虑模块的耦合和内聚在设计下层模块时,应考虑模块的耦合和内聚问题,以提高设计初始问题,以提高设计初始SC图的质量。图的质量。 注意注意“黑盒黑盒”技术的使用。技术的使用。 具有高内聚低耦合的模块才是模块独立性比较具有高内聚低耦合的模块才是模块独立性比较强的模块。强的模块。632. 事务分析事务分析 是将具有事务型的是将具有事务型的DFD导出结构图。
38、导出结构图。 基本步骤:基本步骤: 在在DFD上确定事务中心,接收部分和发送部分。上确定事务中心,接收部分和发送部分。 画出画出SC框架,把框架,把DFD上的三部分分别映射为事务控上的三部分分别映射为事务控制模块、接收模块和动作模块。制模块、接收模块和动作模块。 分解细化的接收分支和发送分支,完成初始分解细化的接收分支和发送分支,完成初始SC图。图。642. 事务分析事务分析 是将具有事务型的是将具有事务型的DFD导出结构图。导出结构图。 基本步骤:基本步骤: 在在DFD上确定事务中心,接收部分和发送部分。上确定事务中心,接收部分和发送部分。 画出画出SC框架,把框架,把DFD上的三部分分别映
39、射为事务控上的三部分分别映射为事务控制模块、接收模块和动作模块。制模块、接收模块和动作模块。 分解细化的接收分支和发送分支,完成初始分解细化的接收分支和发送分支,完成初始SC图。图。65事务分析映射方法事务分析映射方法 该数据流图是事务型。该数据流图是事务型。 识别事务中心和每一条操作路径上的流特征。识别事务中心和每一条操作路径上的流特征。 将将DFD映射为事务型映射为事务型SC图。图。 事务流应该映射到包含一个输入分支和一个分类事事务流应该映射到包含一个输入分支和一个分类事务处理分支的程序结构上。分类事务处理分支结构务处理分支的程序结构上。分类事务处理分支结构包含一个调度模块,它调度和控制下
40、属的操作模块。包含一个调度模块,它调度和控制下属的操作模块。 “因子化因子化”分解和细化该事务结构及每一条操作路径的分解和细化该事务结构及每一条操作路径的结构。结构。 每一条操作路径的每一条操作路径的DFD有它自己的信息流特征,可有它自己的信息流特征,可以是变换也可以是事务型。以是变换也可以是事务型。 优化得到的优化得到的SC图。图。66事务中心事务中心事务源事务源主模块主模块给出给出H取得取得ALMNA GHBECF D转换为结构图转换为结构图67事务分析映射方法事务分析映射方法 典型事务型典型事务型DFD也可使用变换分析来分解转换也可使用变换分析来分解转换变换控制变换控制主模块主模块输出输
41、出EFG输入输入ALMNA GE/F/GBECF DAE/F/GO输出输出HE/F/GHH68练习:请将下列给出的采购子系统练习:请将下列给出的采购子系统DFD图转换成图转换成SC图图书库书库保管员保管员F2F1F5F6F769采购子系统的采购子系统的SC图图70软件结构图注意事项软件结构图注意事项 同一名字的模块在结构图中仅能出现一次。同一名字的模块在结构图中仅能出现一次。 调用关系只能从上到下。调用关系只能从上到下。 不严格表示模块的调用次序,习惯上从左到右,不严格表示模块的调用次序,习惯上从左到右,有时为了减少连线的交叉,适当地调整同一层有时为了减少连线的交叉,适当地调整同一层模块的左右
42、位置,以保证结构图的清晰。模块的左右位置,以保证结构图的清晰。 结构图并不指明什么时候调用下层模块,只表结构图并不指明什么时候调用下层模块,只表明一个模块调用哪些模块,至于模块内还有没明一个模块调用哪些模块,至于模块内还有没有其他成分则完全没有表示。有其他成分则完全没有表示。71综合数据流图的映射综合数据流图的映射 确定确定DFD整体上的类型:除明显有事务类型的,整体上的类型:除明显有事务类型的,都可认为是变换型。事务型用于高层都可认为是变换型。事务型用于高层DFD变换变换有平行处理的优点。有平行处理的优点。 把与全局特性不同的局部区域孤立出来,确定把与全局特性不同的局部区域孤立出来,确定类型
43、。类型。 按整体与局部的按整体与局部的DFD特性,设计软件结构。特性,设计软件结构。72混合型的结构设计混合型的结构设计734. 设计优化设计优化 将初始将初始SC根据模块独立性原则进行精化,对模根据模块独立性原则进行精化,对模块进行合并、分解修改、调整,得到块进行合并、分解修改、调整,得到高内聚高内聚、低耦合低耦合模块,得到易于实现、易于测试和易于模块,得到易于实现、易于测试和易于维护的软件结构,产生设计文档的最终维护的软件结构,产生设计文档的最终SC。 改进软件结构设计的指导原则:改进软件结构设计的指导原则: 启发式规则启发式规则744.4 启发规则启发规则 几条常用的启发规则:几条常用的
44、启发规则: 程序结构尽可能与问题结构相对应程序结构尽可能与问题结构相对应 模块功能的完整模块功能的完整 消除重复功能,改进软件结构提高模块独立性消除重复功能,改进软件结构提高模块独立性 模块规模应该适中模块规模应该适中 深度、宽度、扇出和扇入都应适当深度、宽度、扇出和扇入都应适当 模块的作用域应该在控制域之内模块的作用域应该在控制域之内 力争降低模块接口的复杂程序力争降低模块接口的复杂程序 设计单入口单出口的模块设计单入口单出口的模块 模块功能应该可以预测模块功能应该可以预测751. 程序结构尽可能与问题结构相对应程序结构尽可能与问题结构相对应 两种典型的程序结构:两种典型的程序结构: 变换型
45、程序变换型程序 事务型程序事务型程序 两种程序结构的共同特征:两种程序结构的共同特征: 上层模块只负责控制、协调上层模块只负责控制、协调 下层模块完成具体的操作下层模块完成具体的操作762. 模块功能的完整模块功能的完整 完整的模块应包括三部分:完整的模块应包括三部分: 执行规定功能部分执行规定功能部分 出错处理部分出错处理部分 需返回一系列数据时,应返回是否正确结束(即需返回一系列数据时,应返回是否正确结束(即“文件完文件完/EOF”)标志。)标志。773. 消除重复功能消除重复功能 消除模块中重复部分消除模块中重复部分提高模块独立性。提高模块独立性。 因为同一功能重复多处,不仅浪费编程、测
46、试时间,还因为同一功能重复多处,不仅浪费编程、测试时间,还会给修改带来麻烦。但消除重复功能并非简单的合并。会给修改带来麻烦。但消除重复功能并非简单的合并。 正确的方法是正确的方法是: 先分析几个模块中相同功能的部分;先分析几个模块中相同功能的部分; 然后把这个功能分离出来,构成它们的一个公共的然后把这个功能分离出来,构成它们的一个公共的下层模块。下层模块。78消除重复功能消除重复功能 举例举例相似部分相似部分改进方案改进方案1改进方案改进方案2794. 模块规模应该适中模块规模应该适中 模块规模,模块规模,用模块中所包含语句的数量多少来衡量。用模块中所包含语句的数量多少来衡量。 模块过大模块过
47、大:可理解程度下降:可理解程度下降 考虑对该模块分解考虑对该模块分解 模块过小模块过小:开销大于有效操作,系统接口复杂:开销大于有效操作,系统接口复杂 考虑是否同它的调用模块合并考虑是否同它的调用模块合并 几种情况下的小模块不合并:几种情况下的小模块不合并: 模块具有独立的功能模块具有独立的功能 模块功能可能会发生变化模块功能可能会发生变化 模块的复用性好,或者其调用模块很复杂模块的复用性好,或者其调用模块很复杂805. 深度、宽度、扇入、扇出合理深度、宽度、扇入、扇出合理 深度深度表示软件结构中控制的层数。表示软件结构中控制的层数。 宽度宽度是软件结构内同一个层次上的模块总数的最是软件结构内
48、同一个层次上的模块总数的最大值。大值。 扇入扇入,表示一个模块有多少个上级模块直接调用,表示一个模块有多少个上级模块直接调用它。它。 扇出扇出,表示一个模块直接控制(调用)的模块数,表示一个模块直接控制(调用)的模块数目。目。 原则:避免高扇出(原则:避免高扇出(7,因为属自然分类情况,因为属自然分类情况,易理解。易理解。815. 深度、宽度、扇入、扇出合理(续)深度、宽度、扇入、扇出合理(续) 相关技巧:相关技巧: 良好的结构图往往呈良好的结构图往往呈“清真状清真状”,即,即“顶为尖顶为尖下下层逐渐加宽层逐渐加宽底层收窄底层收窄”。 结构图的形态应该均衡,即从顶到底层的路径长短不结构图的形态
49、应该均衡,即从顶到底层的路径长短不该过于悬殊。该过于悬殊。82举例:下列模块结构图是否合适举例:下列模块结构图是否合适836. 模块的作用域应在控制域之内模块的作用域应在控制域之内 定义:定义: 控制域控制域:从结构方面考虑的。是这个模块本身以及:从结构方面考虑的。是这个模块本身以及所有直接或间接从属于它的模块的集合。所有直接或间接从属于它的模块的集合。 作用域作用域:从功能方面考虑的。是受该模块内一个判:从功能方面考虑的。是受该模块内一个判定影响的所有模块的集合。定影响的所有模块的集合。 基本目标:基本目标: 当作用域为控制域的子集时当作用域为控制域的子集时,才能获得弱耦合;,才能获得弱耦合
50、; 判定模块和受其影响的模块应该尽量靠近判定模块和受其影响的模块应该尽量靠近。84练习:如何消除下列模块结构图中的不合理练习:如何消除下列模块结构图中的不合理857. 降低模块接口的复杂性降低模块接口的复杂性 接口传递信息应简单且和模块功能一致。接口传递信息应简单且和模块功能一致。86 8. 设计单入口、单出口模块设计单入口、单出口模块 防止模块间内容耦合的出现防止模块间内容耦合的出现 9. 模块功能应该可以预测模块功能应该可以预测 只要输入的数据相同就产生同样的输出,这个模块只要输入的数据相同就产生同样的输出,这个模块的功能就是可以预测的。的功能就是可以预测的。 模块带有内部状态其功能可能是