1、第5章 总体设计 设计举例,结构化设计方法,结构化设计方法 无论是何种类型的设计,都要从需求分析获得的分析模型导出软件的设计模型。,结构化设计(SD)的基本概念 SD的概念 SD源于1970年代 SD认为程序或系统是由一组功能操作构成的,需要实现的系统是逻辑功能(模块)的抽象集合, 强调分析模块之间关系,忽视模块内部的情况,重视“模块度” 。 软件应该设计为结构简单,功能单一、相互独立的模块组织。,图形工具 结构图(SC)结构图是描绘系统结构的图形工具,描述系统由哪些模块组成、程序中模块之间的调用关系、每个模块“做什么”以及每个模块输入和输出。 结构图是结构化设计中的重要的结果。 结构图的基本
2、成分有方框、箭头或直线以及带注释的箭头。,结构图的基本成分,已定义模块 例如程序库中的函数,模块A调用模块B,模块间的调用关系和接口表示, 结构图的辅助符号,报表加工程序结构图,结构图揭示了模块结构的偶合和内聚关系,这种关系是系统的一种静态结构,表明模块间是否有关系,是否相互发生影响,但没有说明如何发生影响。 结构图的主要质量指标是模块内聚度和偶合度。 获取结构图 根据需求规格说明书建立初始结构图;按高内聚、低藕合的标准修改初始结构图;反复修改调整直至获得满意的最终结构图。,层次图(H图) 层次图中一个矩形框代表一个模块,框间的连线表示调用关系,位于上方的矩形框所代表的模块调用位于下方的矩形框
3、所代表的模块,HIPO图H图里除了顶层的方框之外,每个方框都加编号,H图中的每个方框配置一张IPO图,该IPO图描述对应方框代表的模块的处理过程,每张IPO图内都标有它所描绘的模块在H图中的编号。,加编号的H图,面向数据流的设计方法 基本概念和设计过程 SD根据DFD的特性定义变换映射与事务映射。,变换流 如果数据流图中输入信息流沿传入路径进入系统,同时由外部形式变换为内部形式,经过系统变换中心加工或处理后,再沿输出通道变换成外部形式离开系统,则称数据流图所描述的信息流是变换流。 变换流型数据流图有明显的输入、加工/变换、输出三部分。,变换流型数据流图,事务流 信息沿传入或输入路径进入系统,由
4、外部形式变换为内部形式后到达一个事务中心,事务中心根据输入信息的类型,在若干个动作路径或活动流中选择一个来执行,这种信息流称为事务流。,动 作 路 径,事务中心,接受路径,事务型结构的基本模型,。,结构化设计方法的设计过程,变换分析 变换分析是一系列设计步骤的总称,它是指经过这一系列设计步骤把具有变换流特性的数据流图按预先确定的模式映射成软件结构。 变换结构由传入、传出和变换中心三个部分组成。 变换中心(中心加工)的任务是把系统的逻辑输入加工为系统的逻辑输出。,从数据流图导出程序结构图的方法 分析数据流图 在数据流图上找出传入、传出和变换中心,并划分出它们的分界线。,f7,f6,f8,f3,变
5、换中心,逻辑输入,逻辑输出,P,R,A,f2,f1,C,B,W,U,V,f10,f9,f5,f4,Q,D,E,输入流,物理输入,物理输出,输出流,传入,传出,变换型数据流图,进行一级分解主要任务是画出初始结构图的最上面的两层模块,系统的顶层和第一层。顶层只有一个用于控制的模块,其功能是完成整个系统要做的事情。第一层(顶层的下一层)一般包括输入、输出和变换中心三个模块,它们分别代表系统的三个相应分支。具体做法是先把DFD的变换中心对准结构图的顶层模块,然后画出结构图的顶层模块。然后逐步自顶向下建立或设计结构图的其他下属模块和成分。,顶层,f7,f6,f8,f3,变换中心,逻辑输入,逻辑输出,P,
6、R,A,f2,f1,C,B,W,U,V,f10,f9,f5,f4,Q,D,E,输入流,物理输入,物理输出,输出流,传入,传出,MC/主模块,一级分解,f8, f9,f3 ,f5,f8, f9,f3 ,f5,MA,ME,MT,MC,顶层,第一层, DFD经第一级分解后导出的结构图,调用线注明了模块间输送的数据流名称。 此种画法强调第一层每一分支只画一个模块。 可能出现只有输入和输出两个模块的情形。,进行二级分解 对一级分解的结果继续自顶向下的分解,这一步分解的方法与第一级分解一样,实质上仍然是映射。 把数据流图中的加工按照一定的规则转换为结构图中的模块,直至画出每个分支所需要的全部模块,获得系统
7、的初始结构图。,P,第二级分解,C,W,E,A,Q,U,V,B,R,D,f3,f2,f1,f4,f5,f5,f6,f3f6,f7 f7,f8,f9,f8,f10,f9,二级分解的第一种画法,二级分解的第二种画法,U to V,取得C,输出W,取得E,Bto C,读入A,Q,得出U,输出V,取得B,Ato B,R,Dto E,读入D,P,f3,f2,f1,f1,f2,f2,f3, f4,f4,f5,f5,f5,f6,f3f6,f7 f7,f8,f9,f8,f9,f10,f10,f9,变换型DFD导出的初始结构图,变换分析的步骤 复查基本系统模型(确认系统的输入数据和输出数据符合实际);复查并精化
8、数据流图;确定数据流图具有变换特性还是事务特性;确定输入流和输出流的边界,从而分离出变换中心;完成“第一级分解”;完成“第二级分解”;采用启发规则对得到的程序结构的初始结果进一步精化。,事务分析 当数据流具有明显的事务特性时,则应该采用事务分析法处理问题。事务分析是从事务流型的数据流图导出程序结构,它的步骤与变换分析基本类似,主要差别是从数据流图到程序结构的映射,相关规则及处理参见教材。,确定事务中心及由事务中心发出的每一动作路径的数据流特性图A给出了事务型DFD的一般特性,数条动作路径的公共起点(源头)就是事务中心T,这些动作路径上的数据流从T点成辐射状流出。每条动作路径上的信息流可以是变换
9、流也可以是事务流。事务中心一经确定,就可以划定接受路径与所有动作路径的边界。,把事务型的数据流图映射为高层程序结构图B给出了一个事务型数据流图的高层程序结构,顶层模块的功能就是整个系统的功能。接受模块对应于输入流,用来接受输入数据。发送模块是一个调度模块,它控制下层的所有活动流模块,每个活动流模块对应于一条动作路径。,设计优化 不能工作的最佳设计是值得怀疑的。 早期精化 少而简 对时间有特殊要求的应用 对时间有特殊要求的优化对策,模块设计原则(启发式规则) 提高模块独立性 模块规模应该适中 设计单入口单出口的模块 模块功能应该可以预测 尽可能降低模块接口的复杂程度 模块的作用域应该在控制域之内
10、 深度、宽度、扇出和扇入都应适当,结构优化,教材购销系统的结构设计示例 采用结构化设计方法导出教材购销系统的总体结构图,包括初始SC图,最终SC图(按改进规则修改调整)。 精化数据流图销售子系统:SRS中的数据流图共有6个,加工1.4包含登记售书和打印领书单两项功 能。为了提高模块独立性,将其分解为两个 加工,让原来的加工1.4专门处理登记售书, 新添一个加工1.7专管打印领书单。,细化修改SRS中的DFD采购子系统:来自书库报管员的“进书通知”,不仅本子系统要用其修改教材库存F1和待购教材数量F5,还要传递信息给销售子系统,通知学生补售教材。“登记进书”和“补售教材”属于两个不同子系统,补售
11、只能在登记之后进行。,精化数据流图为了避免补售时在键盘上重复录入“进书通知”的内容,在系统中增加一个“进书登记表”文件F7,文件F7的组成可以是进书登记表=书号+书名+数量+登记标志+补售标志 其中两个标志的初值均为“假/0”,执行“登记”和“补售”功能后即改“假”为“真/1”。, 修改后销售子系统的DFD(数据流未标名),1.1,学 生,学 生,1.2,1.3,1.5,1.6,1.7,1.4,修改后采购子系统的DFD(数据流未标名),销售,书库保管员,2.3,2.1,2.2,文件名称,确定数据流图的类型修改后销售子系统的DFD中,加工1.1与1.6可视为传入部分,加工1.7与1.3可视为传出
12、部分,加工1.2,1.4,1.5属变换部分。加工1.4和1.5均不产生输出数据,不应列入传出部分。经分析,图上的两条虚线划分出的边界应该相对合理,于是传入部分就包含两个加工:加工1.1与加工1.6。 加工1.1用于初次出售,产生传入数据流“有效购书单”。加工1.6用于补售,产生传入数据流“补售书单”。,确定数据流图的类型一次售书活动,只能执行一种功能:要么初售,要么补售,即在任何一次售书操作中,二者必居其一。加工1.2左方两种传入流不会同时出现,通 常在加工1.2左方添加符号表示这类现象。修改后销售子系统的DFD包括两个动作分 支:初售与补售,可视为一个事务型结构。 这两个分支只有第一个加工不
13、同,其余的加 工都是共用的。,确定数据流图的类型数据流图整体上属于事务型结构,但其两 个动作分支又都具有变换型结构。修改后采购子系统的DFD也是具有两个动作分支的事务型结构。第一个动作分支是“统计缺书”,包含加工2.1和2.2;第二个动作分支是“登记进书”,包含加工2.3。统计缺书分支具有变换型结构的特征,加工2.1是它的传入部分,加工2.2是它的传出部分,没有变换中心,待购教材表F5就是这个分支的传入数据,也是它的传出数据。,画出SC图框架,教材购销系统上层框图,分解动作分支,补充动作与细节考虑销售子系统的初始SC图:初售与补售的大部分操作是相同的,因此,在动作层与细节层有很多共享模块。登记
14、缺书模块仅在有教材售缺时才被调用,其调用线的始端应加菱形选择符。为保画面清晰,图中调用线两侧暂未表明输入输出数据,待最终SC图出来后再补。,销售子系统的初始SC图,改进SC图,导出最终SC图考虑改进系统上层框架:本例共有四种可选功能,即初售、补售、统计缺书和登记进书。为了减少调用层次,两个事务层可以合并为一层。,最终SC图的上层框架,改进SC图,导出最终SC图改进“获得购/售书单”分支:初售时,对购书单要进行两种有效性检查,即学生是否用这些书;以前有没有购买过这些书。据此, “获得有效购书单”分支的改进结果。,改进SC图,导出最终SC图“获得补售书单”分支的改进结构如上图。读“进书登记表”文件时,对每一书号,首先检查它的两个标志:登记标志和补售标志,仅当该书号已经登记但尚未补售时,才生成补售书单。为了便于在计算机上实现,做出两处调整:把“登记售书”模块从由“开发票”模块调用调整为由“开领书单”模块调用;把“打印发票”模块从由“初售”模块直接调用调整为“开发票:模块的下级模块。,改进后初售动作分支的最终SC图,