《软件工程结构化软件开发需求分析和概要设计课件》由会员分享,可在线阅读,更多相关《软件工程结构化软件开发需求分析和概要设计课件(74页珍藏版)》请在金锄头文库上搜索。
1、n6.2.1 需求分析需求分析n6.2.2 软件设计软件设计n6.2.3 软件编码软件编码n6.2.4 软件测试软件测试6.2 结构化软件开发方法结构化软件开发方法1)需求分析:弄清用户对软件系统的全部需求并用需求说)需求分析:弄清用户对软件系统的全部需求并用需求说明书的形式准确地表达出来。明书的形式准确地表达出来。需求说明通常由数据流图、数需求说明通常由数据流图、数据字典和加工说明等一整套文档组成据字典和加工说明等一整套文档组成。2)总体设计:主要任务是)总体设计:主要任务是建立软件的总体结构建立软件的总体结构,画出有模,画出有模块组成的软件块组成的软件结构图或层次图结构图或层次图。3)详细
2、设计:)详细设计:针对单个模块的设计针对单个模块的设计,目的是确定模块内部,目的是确定模块内部的过程结构。要求为每一个模块提供一个模块的过程结构。要求为每一个模块提供一个模块过程性描述过程性描述。详细说明实现该功能的算法和数据结构,又称算法设计。详细说明实现该功能的算法和数据结构,又称算法设计。4)编码:按照选定的高级语言,写出源程序。)编码:按照选定的高级语言,写出源程序。5)测试:是保证软件质量的重要手段。测试阶段的文档成)测试:是保证软件质量的重要手段。测试阶段的文档成为测试报告,包括测试计划、测试用例与测试结果等内容。为测试报告,包括测试计划、测试用例与测试结果等内容。6.2 结构化软
3、件开发方法结构化软件开发方法6.2.1 需求分析需求分析n任务:任务: -解决做什么的问题解决做什么的问题软件需求分析的目标软件需求分析的目标是深入描述软件的功能和性能,是深入描述软件的功能和性能,确定软件设计的约束和软件同其它系统元素的接口细确定软件设计的约束和软件同其它系统元素的接口细节,定义软件的其它有效性需求。节,定义软件的其它有效性需求。需求分析阶段研究的对象需求分析阶段研究的对象是软件项目的用户要求。一是软件项目的用户要求。一方面,必须全面理解用户的各项要求,但又不能全盘方面,必须全面理解用户的各项要求,但又不能全盘接受所有的要求,另一方面,要准确地表达被接受的接受所有的要求,另一
4、方面,要准确地表达被接受的用户要求。只有经过确切描述的软件需求才能成为软用户要求。只有经过确切描述的软件需求才能成为软件设计的基础。件设计的基础。n特点:特点:准确性和一致性准确性和一致性。是连接计划时期和开发时期的桥梁,。是连接计划时期和开发时期的桥梁,也是软件设计的依据。也是软件设计的依据。清晰性和没有二义性清晰性和没有二义性。直观、易读和易于修改直观、易读和易于修改。n 需求分析的过程需求分析的过程 1. 问题识别问题识别2. 问题分析和方案的综合问题分析和方案的综合3. 编制需求分析阶段的文档编制需求分析阶段的文档4. 需求分析评审需求分析评审1.问题的识别软件做什么和做到什么程度 功
5、能需求功能需求 (软件在职能上应做什么)(软件在职能上应做什么) 性能需求性能需求 (速度,容量等)(速度,容量等) 环境需求(硬件和软件支持要求和操作人员素质要求)环境需求(硬件和软件支持要求和操作人员素质要求) 可靠性需求可靠性需求 (不发生故障的概率)(不发生故障的概率) 安全保密的需求安全保密的需求 (拒绝非法使用等)(拒绝非法使用等) 用户界面的需求用户界面的需求 (不同级别用户使用软件的界面要求)(不同级别用户使用软件的界面要求) 资源使用需求资源使用需求 (运行时需要的计算机资源,开发过程中需要的人力(运行时需要的计算机资源,开发过程中需要的人力 资源和开发环境等软硬件支持)资源
6、和开发环境等软硬件支持) 软件成本与开发进度需求软件成本与开发进度需求 (费用,开发时间计划)(费用,开发时间计划) 预先估计未来可扩展需求预先估计未来可扩展需求 (升级修改)(升级修改)2. 分析和综合分析和综合 根据信息流和信息结构,逐步细化所有的软件功能,找出根据信息流和信息结构,逐步细化所有的软件功能,找出系统元素间的联系、接口特性和设计上的约束。系统元素间的联系、接口特性和设计上的约束。 对细化出的功能作出取舍,综合出系统解决方案,给出目对细化出的功能作出取舍,综合出系统解决方案,给出目标系统详细逻辑模型。标系统详细逻辑模型。3. 编制需求分析阶段的文档编制需求分析阶段的文档 把确定
7、下的需求清晰准确地描述,得到需求分析说明书。把确定下的需求清晰准确地描述,得到需求分析说明书。n 需求分析常用工具需求分析常用工具 数据流图(数据流图(DFD) 软件系统逻辑模型的一种图形表示,描述总体要求软件系统逻辑模型的一种图形表示,描述总体要求 数据词典数据词典 描述数据细节描述数据细节 加工说明加工说明 描述详细数据处理要求描述详细数据处理要求n为了表达数据处理过程的数为了表达数据处理过程的数据加工情况,用一个数据流据加工情况,用一个数据流图是不够的。图是不够的。n稍微复杂的实际问题,在数稍微复杂的实际问题,在数据流图上常常出现十几个甚据流图上常常出现十几个甚至几十个加工。这样的数据至
8、几十个加工。这样的数据流图看起来很不清楚。流图看起来很不清楚。n层次结构的数据流图能很好层次结构的数据流图能很好地解决这一问题。按照系统地解决这一问题。按照系统的层次结构进行逐步分解,的层次结构进行逐步分解,并以分层的数据流图反映这并以分层的数据流图反映这种结构关系,能清楚地表达种结构关系,能清楚地表达和容易理解整个系统。和容易理解整个系统。n 分层数据流图分层数据流图 领书单 进书通知 购书单 缺书单 学生 教材 购销 系统书 库保 管员领书单 进书通知 进书通知 购书单缺书单 1销售 2采购书库保管员学生F1教材存量表 F2缺书登记表 概括地说,就是自外向内,自顶向下,逐层细化,完概括地说
9、,就是自外向内,自顶向下,逐层细化,完善求精。检查和修改的原则为:善求精。检查和修改的原则为: 数据流图上所有数据流图上所有图形符号只限于前述四种基本图形元素图形符号只限于前述四种基本图形元素。 顶层数据流图必须包括前述四种基本元素,缺一不可。顶层数据流图必须包括前述四种基本元素,缺一不可。 顶层数据流图上的数据流必须封闭在外部实体之间。顶层数据流图上的数据流必须封闭在外部实体之间。 每个加工至少有一个输入数据流和一个输出数据流每个加工至少有一个输入数据流和一个输出数据流。 在数据流图中,需按层给加工框编号。编号表明该加工在数据流图中,需按层给加工框编号。编号表明该加工处在哪一层,以及上下层的
10、父图与子图的对应关系。处在哪一层,以及上下层的父图与子图的对应关系。 规定规定任何一个数据流子图必须与它上一层的一个加工对任何一个数据流子图必须与它上一层的一个加工对应,两者的输入数据流和输出数据流必须一致。此即父应,两者的输入数据流和输出数据流必须一致。此即父图与子图的平衡图与子图的平衡。 可以在数据流图中加入物质流,帮助用户理解数据流图可以在数据流图中加入物质流,帮助用户理解数据流图。 图上图上每个元素都必须有名字每个元素都必须有名字。数据流和数据文件的名字。数据流和数据文件的名字应当是应当是“名词名词”或或“名词性短语名词性短语”,表明流动的数据是,表明流动的数据是什么。加工的名字应当是
11、什么。加工的名字应当是“名词宾语名词宾语”,表明做什么,表明做什么事情。事情。 数据流图中不可夹带控制流数据流图中不可夹带控制流。 初画时可以忽略琐碎的细节,以集中精力于主要数据流。初画时可以忽略琐碎的细节,以集中精力于主要数据流。n 数据流图绘制原则数据流图绘制原则1 定义:定义:数据词典精确地、严格地定义了每一个与系统相关的数据词典精确地、严格地定义了每一个与系统相关的数据元素,并以字典式顺序将它们组织起来,使得用数据元素,并以字典式顺序将它们组织起来,使得用户和分析员对所有的输入、输出、存储成分和中间计户和分析员对所有的输入、输出、存储成分和中间计算有共同的理解。算有共同的理解。n 数据
12、词典数据词典2 词条描述词条描述在数据词典的每一个词条中应包含以下信息:在数据词典的每一个词条中应包含以下信息: 名称:数据对象或控制项、数据存储或外部实体的名名称:数据对象或控制项、数据存储或外部实体的名字。字。 别名或编号。别名或编号。 分类:数据对象?加工?数据流?数据文件?外部实分类:数据对象?加工?数据流?数据文件?外部实体?控制项(事件体?控制项(事件状态)?状态)? 描述:描述内容或数据结构等。描述:描述内容或数据结构等。 何处使用:使用该词条(数据或控制项)的加工。何处使用:使用该词条(数据或控制项)的加工。3 内容描述内容描述在数据词典的编制中,分析员最常用的描述内容或数据结
13、在数据词典的编制中,分析员最常用的描述内容或数据结构的符号如表所示。构的符号如表所示。 n 数据词典数据词典符号符号含含义解解释=被定被定义为+与与X=A,B , X由由A和和B组成成 , 或或X=A,B , X由由A或或B组成成 | X=A|B , X由由A或或B组成成重复重复X=A , X由由0或多个或多个A组成成mn重复重复()可可选X=(A ), A在在X可以出可以出现,也可以不出,也可以不出现“”基本数据元素基本数据元素X=“王三王三”.连接符接符X=1.9 X可取可取19之中的任意之中的任意值n 数据词典数据词典n存折户名所号帐号开户日性质(印密)存折户名所号帐号开户日性质(印密)
14、1存取行存取行50n户名户名2字母字母24n所号所号“001”.“999” 注:储蓄所编码,规定三位数字注:储蓄所编码,规定三位数字n帐号帐号“00000001”.“99999999” 注:帐号规定由八位数字组成注:帐号规定由八位数字组成n开户日年月日开户日年月日n性质性质“1”.“6” 注:注:“1”表示普通户,表示普通户,“5”表示工资户等表示工资户等n印密印密“0” 注:印密在存折上不显示注:印密在存折上不显示n存取行日期(摘要)支出存入余额操作复核存取行日期(摘要)支出存入余额操作复核n日期年月日日期年月日nn字母字母“a”.“z”|“A”.“Z”n 数据词典数据词典n4加工:加工:加
15、工规格说明用来说明加工规格说明用来说明DFD中的数据加工的加工细节。中的数据加工的加工细节。加工规格说明描述了数据加工的输入,实现加工的算加工规格说明描述了数据加工的输入,实现加工的算法以及产生的输出。法以及产生的输出。加工规格说明指明了加工(功能)的约束和限制,与加工规格说明指明了加工(功能)的约束和限制,与加工相关的性能要求,以及影响加工的实现方式的设加工相关的性能要求,以及影响加工的实现方式的设计约束。计约束。注意,写加工规格说明的主要目的是要表达注意,写加工规格说明的主要目的是要表达“做什么做什么”,而不是,而不是“怎样做怎样做”。应描述数据加工实现加工的策略而不是实现加工的细应描述数
16、据加工实现加工的策略而不是实现加工的细节。节。n目前用于写加工规格说明的工具有结构化语言、判定表和目前用于写加工规格说明的工具有结构化语言、判定表和判定树。判定树。n 数据词典数据词典a结构化语言:结构化语言:n自然语言加上结构化形式化的语言。是一种介于自然语言自然语言加上结构化形式化的语言。是一种介于自然语言和程序设计语言之间的语言。和程序设计语言之间的语言。b判定树判定树n是判定表的图形表示。是判定表的图形表示。c判定表判定表n采用表格化的形式,适于表达含有复杂判断的加工逻辑。采用表格化的形式,适于表达含有复杂判断的加工逻辑。d加工说明卡片加工说明卡片n加工说明可以像字典条目一样记载在卡片
17、上加工说明可以像字典条目一样记载在卡片上n 加工规格说明加工规格说明结构化英语结构化英语IF (条件语句集合) THEN 满足条件处理过程语句集合ELSE 不满足条件处理过程语句集合ENDIF WHILE (条件语句集合)DO 处理过程语句集合ENDDO REPEAT 处理过程语句集合UNTIL (条件语句集合)CASE - OF 加工逻辑说明加工逻辑说明IF 发货单金额超过500元 THEN IF 欠款超过60天 THEN 拒绝批准 ELSE 欠款未超期 发批准书及发货单 ENDIFELSE 发货单金额不超过500元 IF 欠款超过60天 THEN 发批准书、发货单及赊欠报告 ELSE 欠款
18、未超期 发批准书及发货单 ENDIFENDIF 判定树判定树1234条件条件发货单金金额500500=5006060=60操作操作不不发批准批准书Y发批准批准书YYY发出出发货单YYY发出出赊欠欠报告告Y判定表判定表需求分析阶段生成的文档需求分析阶段生成的文档 软件需求规格说明软件需求规格说明 软件简要使用说明书软件简要使用说明书附录:软件需求规格说明模板na. 引言 na.1目的 na.2 文档约定 na.3 预期的读者和阅读建议 na.4 产品的范围na.5 参考文献nb. 综合描述nb.1 产品的前景nb.2 产品的功能 nb.3 用户类和特征 nb.4 运行环境 nb.5 设计和实现上
19、的限制 nb.6 假设和依赖nc. 外部接口需求nc.1 用户界面 nc.2 硬件接口 nc.3 软件接口 nc.4 通信接口nd. 系统特性 nd.1 说明和优先级 nd.2 激励/响应序列 nd.3 功能需求ne. 其它非功能需求ne.1 性能需求ne.2 安全设施需求 ne.3 安全性需求 ne.4 软件质量属性 ne.5 业务规则 ne.6 用户文档nf. 其它需求ng. 进度要求 任何工程项目在施工之前,总要先完成设计。 设计是开发活动的第一步。 设计定义为: 应用各种技术和原理,对设备、过程或系统作出足够详细的定义,使之能够在物理上得以实现。 软件的设计与其它领域的工程设计一样,也
20、需要有好的方法、好的分析策赂。 软件设计不仅仅是程序设计或者编制程序。 程序设计只是软件设计的实现。 软件设计质量决定软件质量n 软件设计的目标和任务 软件需求确定之后,进入开发阶段。 开发阶段由三个互相关联的步骤组成: 设计 编码 测试 6.2.2 软件设计软件设计概述概述n 软件设计在开发阶段中的重要性 软件需求分析阶段已经完全弄清楚了软件的各种需求,解决了要让所开发的软件“做什么”的问题,并已在软件需求说明书详尽和充分地阐明了需求。 开发阶段要实现软件的需求,即要着手解决“怎么做”的问题。 在设计步骤中,根据软件的功能和性能需求采用某种设计方法进行 数据设计、系统结构设计和过程设计。数据
21、设计数据设计 侧重于数据结构的定义。系统结构设计系统结构设计 定义软件系统各主要成份之间的关系。过程设计过程设计 把结构成份转换成软件的过程性描述。在编码步骤中根据这种过程性描述变成源程序代码然后通过测试最终得到完整有效的软件。 n 软件设计任务 软件设计是一个把软件需求变换成软件表示的过程。 从工程管理的角度来看软件设计分两步完成。 概要设计:将软件需求转化为数据结构和软件的系统结构。 详细设计:通过对结构表示进行细化,得到软件的详细的数据结构和算法。 在概要设计过程中需要完成的工作: 1) 制定规范 在进入软件开发阶段之初,首先应为软件开发组制定在设计时应该共同遵守的标准,以便协调组内各成
22、员的工作。它包括: 阅读和理解软件需求说明书,在给定预算范围内和技术现状下确认用户要求能否实现。从而确定设计的目标,以及它们的优先顺序。 根据目标确定最合适的设计方法。 规定设计文档的编制标准,包括文档体系、用纸及样式、记述的详细程度、图形的画法等。 规定编码的信息形式(代码体系)、与硬件操作系统的接口规约、命名规则等。 2) 软件系统结构的总体设计 在需求分析阶段,已经从系统开发的角度出发,把系统按功能逐次分割成层次结构。 在设计阶段,基于这个功能的层次结构把各个部分组合起来成为系统。 包括:采用某种设计方法,将一个复杂的系统按功能划分成模块的层次结构。确定每个模块的功能,建立与已确定的软件
23、需求的对应关系。确定模块间的调用关系。确定模块间的接口,即模块间传递的信息。设计接口的信息结构。评估模块划分的质量及导出模块结构的规则。 3)处理方式设计处理方式设计确定为实现软件系统的功能需求所必需的算法评估算法的性能。确定为满足软件系统性能需求所必需的算法和模块间的控制方式(性能设计)。性能主要是指周转时间、响应时间、吞吐量、精度。确定外部信号的接收发送形式。 4 4)数据结构设计)数据结构设计 确定软件涉及的文件系统的结构以及数据库的模式、子模式,进行数据完整和安全性的设计。包括: 确定输入、输出文件的详细的数据结构。 结合算法设计,确定算法所必需的逻辑数据结构及其操作。 确定对逻辑数据
24、结构所必需的那些操作的程序模块(软件包)。限制和确定各个数据设计决策的影响范围。 若需要与操作系统或调度程序接口所必需的控制表等数据时,确定其详细的数据结构和使用规则。 数据的保护性设计 防卫性设计:在软件设计中插入自动检错、报错和纠错的功能。 致性设计:保证软件运行过程中使用的数据的类型和取值范围不变。 在并发处理过程中使用封锁和解除封锁机制保持数据不被破坏。 冗余性设计:针对同一问题,由两个开发者采用不同的程序设计风格、不同的算法设计软件,当两者运行结果之差不在允许范围内时,利用检错系统予以纠正,或使用表决技术决定一个正确的结果,以保证软件容错。5) 5) 可靠性设计可靠性设计 可靠性设计
25、也叫质量设计。在软件开发的一开始就要确定软件可靠性和其它质量指标,考虑相应措施,以使得软件易于修改和易于维护。6) 6) 编写概要设计阶段的文档编写概要设计阶段的文档 概要设计阶段完成时应编写以下文档: 概要设计说明书: 给出系统目标、总体设计、数据设计、处理方式设计、出错设计等。 数据库设计说明书: 给出所使用的数据库简介、数据模式设计、物理设计等。 用户手册: 对需求分析阶段编写的初步的用户手册进行审定。 初步的测试计划: 对测试的策略、方法和步骤提出明确的要求。7) 7) 概要设计评审概要设计评审在以上几项工作完成之后,应当组织对概要设计工作的评审。评审的内容包括: 可追溯性:即分析该软
26、件的系统结构、子系统结构,确认该软件设计是否覆盖了所有已确定的软件需求,软件每一成份是否可追溯到某一项需求。接口:分析软件各部分间的联系,确认软件的内部与外部接口是否已明确定义。模块是否满足高内聚和低耦合的要求。模块作用范围是否在其控制范围之内。风险:即确认该软件设计在现有技术条件下和预算范围内是否能按时实现。实用性:即确认该软件设计对于需求的解决方案是否实用。技术清晰度:即确认该软件设计是否以一种易于翻译成代码的形式表达。可维护性:从软件维护角度出发,确认该软件设计是否考虑了方便未来的维护。质量:即确认识软件设计是否表现出良好的质量特征。各种选择方案:看是否考虑过其它方案,比较各种选择方案的
27、标准是什么。限制:评估对该软件的限制是否现实,是否与需求一致。其它具体问题:对于文档、可测试性、设计过程等进行评估。软件系统外部特性:如软件的功能、一部分性能以及用户的使用特性等。 详细设计需要完成的工作详细设计需要完成的工作 确定软件各组成部分内的算法以及各部分的内部数据组织。 选定某种过程的表达形式来描述各种算法。 进行详细设计的评审。n 软件设计的最终目标是要取得最佳方案软件设计的最终目标是要取得最佳方案 “最佳”在所有候选方案中,根据节省开发费用、降低资源消耗、缩短开发时间的原则、选择能够赢得较高的生产效率、较高的可靠性和可维护性的方案。 在整个设计的过程中,各个时期的设计结果需要经过
28、一系列的设计质量的评审,以便及时发现和及时解决在软件设计中出现的问题,防止把问题遗留到开发的后期阶段,造成后患。 在评审以后,必须针对评审中发现的问题,对设计的结果进行必要的修改。为了评价设计质量的高低,必须有一个标准。 软件结构表明了软件各个部件(模块)的组织情况,它通常是树状结构或网状结构,并蕴含了在软件控制上的层次关系。 软件结构未表明软件的某些过程性特征。比如,软件的动态特性,在软件结构中就未明确体现。 软件的树状结构和网状结构 由模块连接而得到的软件结构最普通的形式就是树状结构和网状结构。在树状结构中,位于最上层的根部是顶层模块,它是程序的主模块。与其联系的有若干下属模块,各下层模块
29、还可以进一步引出更下一层的下属模块。6.2.2 软件设计软件设计软件结构软件结构n 用结构图来描述软件系统的体系结构n 描述一个软件系统由哪些模块组成,以及模块之间的调用关系n 结构图的基本成分有:模块、调用和数据OQNRUVaa,cbccd a,da,dMSffjPTSWghi6.2.2 软件设计软件设计结构图结构图n 模块(module)n模块是指具有一定功能的可以用模块名调用的一组程序语句,如函数、子程序等n它们是组成程序的基本单元n一个模块具有其外部特征和内部特征外部特征包括:模块的接口(模块名、输入/输出参数、返回值等)和模块的功能内部特征包括:模块的内部数据和完成其功能的程序代码
30、模块独立性模块独立性 所谓模块的独立性,是指软件系统中每个模块只涉及软件要求的具体的子功能,而和软件系统中其它的模块的接口是简单的,例如,若一个模块只具有单一的功能见与其它模块没有太多的联系,我们称此模块具有模块独立性。 一般采用两个准则度量模块独立性。 模块间的耦合性模块间的耦合性 模块的内聚性模块的内聚性。 耦合性是模块之间互相连接的紧密程度的度量。模块之间的连接越紧密,联系越多,耦合性就越高,而其模块独立性就越弱。 内聚性是一个模块内部各个元素彼此结合的紧密程度的度量。一个模块内部各个元素之间的联系越紧密,则它的内聚性就越高,相对地,它与其它模块之间的耦合性就会减低,模块独立性就越强。
31、独立性比较强的模块应是高内聚低耦合的模块。n 调用和数据n调用(call):用从一个模块指向另一个模块的箭头来表示,其含义是前者调用了后者为了方便,有时常用直线替代箭头,此时,表示位于上方的模块调用位于下方的模块n数据(data):模块调用时需传递的参数可通过在调用箭头旁附加一个小箭头和数据名来表示结构图中的辅助符号结构图中的辅助符号DBCA条件调用条件调用DBCA循环调用循环调用递归调用递归调用n 结构图的几个概念n深度:程序结构图中控制的层数,如图所示结构图的深度是5n宽度:程序结构图中同一层次上模块总数的最大值,例如图中所示的结构图的宽度为7n扇出:该模块直接调用的模块数目。n扇入:能直
32、接调用该模块的模块数目。WBKAEHJDGFILCMNOPQR深度宽度扇入扇出相关指标的含义n深度和宽度在一定程序上反映了程序的规模和复杂程度相对而言,如果程序结构图的深度和宽度较大,则说明程序的规模和复杂程度都较大。模块的扇入扇出会影响结构图的深度和宽度,例如减少模块的扇出,可能导致宽度变小而深度增加n一个模块的扇出过大通常意味着该模块比较复杂,然而扇出太少,可能导致深度的增加一般情况,一个模块的扇出以39为宜n一个模块的扇入表示有多少模块可直接调用它,它反映了该模块的复用程度,因此模块的扇入越大越好启发式设计策略-1按照模块化设计原则,相应的启发式设计策略如下:n改造程序结构图,降低耦合度
33、,提高内聚度n避免高扇出,并随着深度的增加,力求高扇入避免如图a那样的“平铺”形态,较好的结构图形态是如图b那样的“椭圆”型(a)平铺形态平铺形态(b)椭圆形态椭圆形态启发式设计策略-2n模块的影响范围应限制在该模块的控制范围内,例如下图中图图a中,模块中,模块B2的影响范围的影响范围(模块模块A)不在其控制范围不在其控制范围(模块模块B2)内内决策控制是在顶层模块,其影响范围决策控制是在顶层模块,其影响范围(A、B2)在控制范围在控制范围内,但从决策控制模块到被控模块之间相差多个层次内,但从决策控制模块到被控模块之间相差多个层次c和和d较合适,较合适,d为最好为最好(c)TopXBB1AYB
34、2TopXYABB2B1(d)XBB1YTopXBB1YAB2(a)(b)ATopB2启发式设计策略-3n降低模块接口的复杂程度和冗余程度,提高一致性模块接口上应尽可能传递简单数据,而且传递的数据应保持与模块的功能相一致,即不传递与模块功能无关的数据n模块的功能应是可预测的,避免对模块施加过多的限制模块功能可预测是指该模块对相同的输入能产生相同的输出限制一个模块只处理单一的功能,则这个模块体现出高内聚n尽可能设计单入口和单出口的模块单入口和单出口的模块能有效地避免内容耦合 n 结构化设计的步骤n建立初始结构图将整个软件看作一个大的功能模块,通过功能分解不断将其分解成若干个较小的功能模块,直至得
35、到一组不必再分解的模块(结构图中的底层模块)n对结构图进行改进可根据设计准则和启发式设计策略对初始结构图进行改进n书写设计文档书写设计规格说明,特别要为每个模块书写模块的功能、接口、约束和限制等n设计评审n 信息隐蔽 如何分解一个软件才能得到最佳的模块组合呢? 采用“信息隐蔽”方法。 信息隐蔽是指每个模块的实现细节对于其它模块来说是隐蔽的。也就是说,模块中所包含的信息(包括数据和过程)不允许其它不需要这些信息的模块使用。 通常有效的模块化可以通过定义一组相互独立的模块来实现,这些模块相互间的通信仅仅使用对于实现软件功能来说是必要的消息。通过抽象,帮助我们确定组成软件的过程(或信息)实体,而通过
36、信息隐蔽,则可定义和实施对模块的过程细节和局部数据结构的存取限制。 由于一个软件系统在整个软件生存期内要经过多次修改,所以在划分模块时要采取措施,使得大多数过程和数据对软件的其它部分是隐蔽的。这样,在将来修改软件时偶然引入错误所造成的影响就可以局限在一个或几个模块内部,不致波及到软件的其它部分。 根据系统的数据流进行设计,面向数据流的设计或者过程驱动的设计根据系统的数据结构进行设计,面向数据结构的设计面向对象的设计 结构化设计方法是基于模块化、自顶向下细化、结构化程序设计等程序设计技术基础发展起来的。该方法实施的要点是: a.首先研究、分析数据流图,从软件的需求规格说明中弄清数据流加工的过程。
37、b.然后根据数据流图决定问题的类型。数据处理问题中典型的类型有两种:变换型和事务型。针对两种不同的类型分别进行分析处理。c.由数据流图推导出系统的初始结构图。d.利用启发性原则来改进系统的初始结构图,直到得到符合要求的结构图为止。e.修改和补充数据词典。f.制定测试计划。 由于该方法的工作与软件需求分析阶段的结构化分析方法相衔接,所以该方法是面向数据流的设计方法。6.2.2 软件设计软件设计结构化设计结构化设计n 典型的系统结构形式典型的系统结构形式 结构化设计可以很方便地将用数据流图表示的信息转换成程序结构的设计描述。 典型的系统结构类型。 1) 在系统结构图中的模块在系统结构图中的模块 在
38、系统结构图中,称不能再分解的底层模块为原子模块。如果一个软件系统,它的全部实际加工(即数据计算或处理)都由底层的原子模块来完成,而其它所有非原子模块仅仅执行控制或协调功能,这样的系统就是完全因子分解的系统。如果系统结构图是完全因子分解的,就是最好的系统。但实际上,这只是我们力图达到的目标,大多数系统做不到完全因子分解。 一般地,在系统结构图中有4种类型的模块; (1) 传入模块从下属模块取得数据,经过某些处理,再将其结果传送给上级模块。它传送的数据流叫逻辑输入数据流。 (2) 传出模块从上级模块获得数据进行某些处理,再将其结果传送给下属模块。它传送的数据流叫作逻辑输出数据流。 (3) 变换模块
39、也叫加工模块。它从上级模块取得数据,进行特定的处理,转换成其它形式,再传送回上级模块。它加工的数据流叫作变换数据流。大多数计算模块(原子模块)属于这一类。 (4) 协调模块对所有下属模块进行协调和管理的模块。在系统的输入/输出部分或数据加工部分可以找到这样的模块。在一个好的系统结构图中,协调模块应在较高层出现。 在实际系统中有些模块属于上述某一类型,有些模块是上述各种类型的组合, 2) 变换型系统结构图 变换型数据处理问题的工作过程大致分为三步,即取得数据,变换数据和给出数据。这三步反映了变换型问题数据流图的基本思想,或者说是这类问题数据流图概括而抽象的模式。其中,变换数据是数据处理过程的核心
40、工作,而取得数据只不过是为它做准备,给出数据则是对变换后的数据进行后处理工作。 变换型系统结构图如图示,相应于取得数据、变换数据、输出数据,系统的结构图由输入、中心变换和输出三部分组成。 顶层模块(图中的)首先得到控制,沿着结构图的左支依次调用其下属模块,直至底层读人数据A。然后对A进行预加工(图中的),转换成B向上回送。再继续对B进行加工 (图中的),转换成逻辑输入C回送给主模块。主模块得到数据C之后,控制中心变换模块(图中的),将C加工成D。在调用传出模块输出D时,由传出模块调用后处理模块(图中的),将D加工成适于输出的形式E。最后输出结果E。 3) 事务型系统结构图 另一类典型的数据处理
41、问题是事务型的,通常它是接受一项事务,根据事务处理的特点和性质,选择分派个适当的处理单元然后给出结果。我们把完成选择分派任务的部分叫作事务处理中心,或分派部件。这种事务型数据处理问题的数据流图参看图。其中,输入数据流在事务中心处作出选择,通过调度激活某一种事务处理加工。 事务型数据流图所对应的系统结构图是事务型系统结构图。如图所示。在事务型系统结构图中,事务中心模块按所接受的事务的类型选择某一个事务处理模块执行。各个事务处理模块是并列的,依赖于定的选择条件,分别完成不同的事务处理工作。每个事务处理模块可能要调用若干个操作模块,而操作模块又可能调用若干个细节模块。由于不同的事务处理模块可能有共同
42、的操作,所以某些事务处理模块可能共享一些操作模块。同样不同的操作模块可以有相同的细节,所以某些操作模块又可以共享一些细节模块。事务型系统购结构图可以有多种不同的形式。例如,有多层操作层或没有操作层。简化形式是把分析作业和调度都归入事务中心模块。n 变换分析 变换分析是系统结构设计的一种策略。运用变换分析方法建立初始的变换型系统结构图,然后对它作进一步的改进,最后得到系统的最终结构图。 变换分析方法的步骤如下。 1) 重画数据流图重画数据流图 在需求分析阶段得到的数据流图侧重于描述系统如何加工数据:而重画数据流图的出发点是描述系统中的数据是如何流动。因此,重画数据流图应注意以下几点:以需求分析阶
43、段得到的数据流因为基础重画数据流固时,可以从物理输入到物理输出,或者相反。还可以从顶层加工框开始,逐层向下。在图上不要出现控制逻辑。用箭头表示的是数据流,而不是控制流。不要去管系统的开始和终止(假定系统在不停地运行)。省略每一个加工框的简单例外处理。当数据流进入和离开一个加工框时,要仔细地标记它们,不要重名。仔细检查每层数据流的正确性。 2) 在数据流图上区分系统的逻辑输入、逻辑输出和中心变换部分在数据流图上区分系统的逻辑输入、逻辑输出和中心变换部分 在这一步,可以暂时不考虑数据流图的一些支流,例如错误处理等等。 如果设计人员的经验比较丰富,对要设计系统的软件规格说明又很熟悉,那么决定哪些加工
44、框是系统的中心变换则是比较容易的。例如,几股数据流汇集的地方往往是系统的中心变换部分。3) 进行一级分解,设计系统模块结构的顶层和第一层进行一级分解,设计系统模块结构的顶层和第一层 自顶向下设计的关键是找出系统树形结构图的根或顶层模块。事实上,数据流图的中心变换部分应当与程序结构图的主要模块有着对应关系。我们首先设计一个主模块,并用程序的名字为它命名,然后将它画在与中心变换相对应的位置上。作为系统的顶层,它的功能是调用下一层模块,完成系统所要作的各项工作。 主模块设计好之后下面的程序结构可按输入、中心变换和输出等分支处理。程序结构的第一层可以这样设计:为每一个逻辑输入设计一个输入模块、它的功能
45、是为主模块提供数据;为每一个逻辑输出设计一个输出模块、它的功能是将主模块提供的数据输出;为中心变换设计一个变换模块、它的功能是将逻辑输入转换成逻辑输出。 第一层模块与主模块之间传送的数据应与数据流图相对应,图中主模块控制、协调第一层的输入模块、变换模块和输出模块的工作。 它要根据一些逻辑(条件或循环)来控制对这些模块的调用。 4) 进行二级分解,设计中、下层模块进行二级分解,设计中、下层模块 这一步工作是自顶向下,逐层细化,为每一个输入模块、输出模块、变换模块设计它们的从属模块。 设计下层模块的顺序是任意的。但一般是先设计输入模块的下层模块。 输入模块的功能是向调用它的上级模块提供数据,所以它
46、必须要有一个数据来源,因而它必须有两个下属模块:一个是接收数据;另一个是把这些数据变换成它的上一级模块所需的数据。但是,如果输入模块已经是原子模块,即物理输入端,则细化工作停止。同样,输出模块是从调用它的上级模块接收数据,用以输出,因而也应当有两个下层模块:一个是将上级模块提供的数据变换成输出的形式;另一个是将它们输出。设计中心变换模块的下层模块没有通用的方法,一般应参照数据流图的中心变换部分和功能分解的原则来考虑如何对中心变换模块进行分解。 图中的“计算”是系统的核心数据处理部分,即中心变换。中心变换左边的“编辑”和“检验”是为“计算”作准备的预变换。预变换以后,送入主模块的数据流是系统的逻
47、辑输入。中心变换送出的数据流是系统的逻辑输出。中心变换右边的“格式化I、和“格式化2”都是对计算值作格式化处理的后变换。运用变换分析方法建立系统的结构图时应当注意以下几点: 选择模块设计的次序时,不一定要沿一条分支路径向下,直到该分支的最底层模块设计完成后,才开始对另一条分支路径的下层模块进行设计。但是,必须对一个模块的全部直接下属模块都设计完成之后,才能转向另一个模块的下层模块的设计。如果我们已设计了主模块和第一层A,B,C模块,下一步要分解模块A。那么,应当先设计模块A的直接下属E,F,G模块,然后才可以去设计模块B和C的直接下属模块。 在设计下层模块时应考虑模块的耦合和内聚问题,以提高初
48、始结构图的质量。 注意“黑盒”技术的使用。在设计当前模块时,先把这个模块的所有下层模块定义成“黑盒”,并在系统设计中利用它们,暂不考虑它们的内部结构和实现方法。在这一步定义好的“黑盒“,由于已确定了它的功能和输入、输出,在下一步可以对它们进行设计和加工。这样、又会导致更多的“黑盒”。最后,全部“黑盒”的内容和结构被完全被确定。这就是我们所说的自顶向下、逐步求精的过程。使用黑盒技术的主要好处是使设计人员可以只关心当前的有关问题,暂时不必考虑进一步的琐碎的次要的细节,待进一步分解时再去关心它们的内部细节与结构。n 事务分析事务分析 在很多软件应用中,存在某种作业数据流,它可以引发一个或多个处理,这
49、些处理能够完成该作业要求的功能。这种数据流叫做事务。 如何从数据流图建立系统结构图。 与变换分析一样,事务分析也是从分析数据流图开始自项向下,逐步分解,建立系统到结构图。 1) 识别事务源利用数据流图和数据词典,从问题定义和需求分析的结果中,找出各种需要处理的事务。通常,事务来自物理输入装置。有时,设计人员还必须区别系统的购输入、中心加工和输出中产生的事务。在变换型系统的上层模块设计出来之后常常会遇到这种情形。 2) 规定适当的事务型结构在确定了该数据流图具有事务型特征之后根据模块划分理论、建立适当的事务型结构。 3) 识别各种事务和它们定义的操作对于系统内部产生的事务必须仔细地定义它们的操作
50、。 4) 注意利用公用模块在事务分析的过程中,如果不同事务的一些中间模块可由具有类似的语法和语义的若干个低层模块组成,则可以把这些低层模块构造成公用模块。 5)对每一事务或者联系密切的一组事务,建立一个事务处理模块如果发现在系统中有类似的事务,可以把它们组成一个事务处理模块。但如果组合后的模块是低聚的,则应该打散重新考虑。 6) 对事务处理模块规定它们全部的下层操作模块下层操作模块的分解方法类似于变换分析。但要注意,事务处理模块共享公用(操作)模块的情形相当常见。7) 对操作模块规定它们的全部细节模块对于大型系统的复杂事务处理,可能有若干层细节模块。另外,尽可能使类似的操作模块共享公用的细节模
51、块。 图示的数据流图中,首先确定了它是具有事务型特征的数据流图。也就是说,数据流A是一个带有“请求”性质的信息,即为事务源。而加工I具有“事务中心”的功能,它后继的3个加L,M,N是并列的,在加工A的选择控制下完成不同功能的处理。最后,经过加工O将某一加工处理的结果整理输出。为此,首先建立一个主模块用以代表整个加工,它位于P-层(即主层)。然后考虑被称为T-层(事务层)第一层模块。这时第一层模块只能是3类:取得事务、处理事务和给出结果。依据并列的3个加工,在主模块之下建立了3个事务模块,分别完成L、M和N的工作。并在主模块的下沿以菱形引出对这3个事务模块的选择,而在这些事务模块的左右两边则是对
52、应于加工I和O的“取得A”模块和“给出H“模块。 各个事务模块下层的操作模块,即A-层(活动层)和细节模块,即D-层(细节层),在图中未画出,可以继续分解扩展,直至完成整个结构图。 变换分析是软件系统结构设计的主要方法。因为大部分软件系统都可以应用变换分析进行设计。但是,在很多情况下,仅使用变换分析是不够的,还需要用其它方法作为补充。事务分析就是最重要的一种方法。虽然不能说全部数据处理系统都是事务型的,但是很多数据处理系统属于事务型系统。一个典型的商业数据处理系统的主要组成部分(包括输入和输出部分)也可以使用事务处理方法。所以事务分析方法很重要。 一个大型的软件系统是变换型结构和事务型结构的混
53、合结构。通常利用以变换分析为主,事务分析为辅的方式进行软件结构设计。在系统结构设计时,首先利用变换分析方法把软件系统分为输入、中心变换和输出3个部分,设计上层模块,即主模块和第一层模块。然后根据数据流图各部分的结构特点适当地利用变换分析或事务分析,可以得到初始系统结构图的某个方案。 图示的例子是一个典型的变换事务混合型问题的结构图。系统的输入、中心变换、输出3个部分是利用变换分析方法确定的,由此得到主模块“x x系统”及其下属的第一层模块“得到D”、“变换”和“给出K”。对图中的输入部分和变换部分又可以利用事务分析方法进行设计。例如,模块“调度BC”及其下属模块、模块“变换”及其下属模块部属于
54、事务型。n 软件模块结构的改进软件模块结构的改进 为了改进系统的初始模块结构图,人们经过长期软件开发的实践,得到了一些启发或规则,利用它们,可以帮助设计人员改进软件设计,提高设计的质量。 1) 模块功能的完善化模块功能的完善化 一个完整的功能模块,不仅能够完成指定的功能,而且还应当能够告诉使用者完成任务的状态,以及不能完成的原因。也就是说,一个完整的模块应当有: 执行规定的功能的部分; 出错处理的部分。当模块不能完成规定的功能时,必须回送出错标志,向它的调用者报告出现这种例外情况的原因。 所有上述部分,部应当看作是个模块的有机组成部分,不应分离到其它模块中去,否则将会增大模块间的耦合程度。 2
55、) 消除重复功能,改善软件结构消除重复功能,改善软件结构 在系统的初始结构图得出之后,应当审查分折这个结构图。如果发现几个模块的功能有相似之处,可以加以改进。 完全相似:在结构上完全相似,可能只是在数据类型上不一致。此时可以采取完全合并的方法,只需在数据类型的描述上和变量定义上加以改进就可以了。 局部相似:如图所示虚线框部分是相似的。此时,不可以把两者合并为一,因为这样在合并后的模块内部必须设置许多开关,势必把模块降低到逻辑内聚一级。一般处理办法是分析R1和R2 ,找出其相同部分,从R1和R2中分离出去,重新定义成一个独立的下一层模块。Rl和R2剩余的部分根据情况还可以与它的上级模块合并以减少
56、控制的传递、全局数据的引用和接口的复杂性。 3) 模块的作用范围应在控制范围之内模块的作用范围应在控制范围之内 模块的控制范围包括它本身及其所有的从属模块。如图,模块A的控制范围为模块A,BC,DE,F,G。模块C的控制范围为模块C,F,G。模块的作用范围是指模块内一个判定的作用范围,凡是受这个判定影响的所有模块都属于这个判定的作用范围,如果一个判定的作用范围包含在这个判定所在模块的控制范围之内,则这种结构是简单的,否则,它的结构是不简单的。 一个设汁得很好的系统模块结构图,所有受一个判定影响的模块应该都从属于该判定所在的模块,最好局限于作出判定的那个模块本身及它的直接下层模块。 4) 尽可能
57、减少高扇出结构,随着深度增大扇入数尽可能减少高扇出结构,随着深度增大扇入数 模块的扇出数,是指模块调用子模块的个数。如果一个模块的扇出数过大,就意味着该模块过分复杂,需要协调和控制过多的下属模块。 般说来,出现这种情况是由于缺乏中间层次,应当适当增加中间层次的控制模块。 模块的扇出数过小,例如总是1,也不好。这样将使得结构图的深度大大增加,不但增大了模块接口的复杂性,而且增加了调用和返回的时间开始,降低了工作效率。 一个模块的扇入数越大,则共享该模块的上级模块数目越多。但如果一个模块的扇入数太大,例如超过8,而它又不是公用模块,说明该模块可能具有多个功能。在这种情况下应当对它进一步分析并将其功
58、能分解。经验证明,一个设计得很好的软件模块结构,通常上层扇出比较高,中层扇出较少,底层扇入到有高扇入的公用模块中。 5)模块的大小要适中模块的大小要适中 模块的大小,可以用模块中所含语句的数量的多少来衡量。有人认为限制模块的大小也是减少复杂性的手段之一,因而要求把模块的大小限制在一定的范围之内。通常规定其语句行数在50100左右,保持在一页纸之内,最多不超过500行。这对于提高程序的可理解性是有好处的,但只能作一个参考数字。根本问题还是要保证模块的独立性。 6) 设计功能可预测的模块,但要避免过分受限制的模块设计功能可预测的模块,但要避免过分受限制的模块 一个功能可预测的模块可以被看成是一个“
59、黑盒”,不论内部处理细节如何,但对相同的输入数据,总能产生同样的结果。但是,如果模块内部蕴藏有一些特殊的鲜为人知的功能时,这个模块就可能是不可预测的。对于这种模块,如果调用者不小心使用,其结果将不可预测。图例是一个功能不可预测的例子。在模块内部保留了一个内部标记M,模块在运行过程中由这个内部标记确定作什么处理。由于这个内部标记对于调用者来说是隐藏起来的,因而调用者将无法控制这个模块的执行,或者不能预知将会引起什么后果,最终会造成混乱。 如果个模块的局部数据结构的大小、控制流的选择或者与外界(人、硬软件)的接口模式被限制死了,则很难适应用户新的要求或环境的变更给将来的软件维护造成了很大的困难,使得人们不得不花费更大的代价来消除这些限制。 为了能够适应将来的变更,软件模块中局部数据结构的大小应当是可控制的,调用者可以通过模块接口上的参数表或一些预定义外部参数来规定或改变局部数据结构的大小。另外,控制流的选择对于调用者来说,应当是可预测的。而与外界的接口应当是灵活的,也可以用改变某些参数的值来调整接口的信息,以适应未来的变更。