540 likes | 658 Views
软件设计任务. 从工程管理的角度来看,软件设计分两步完成。 概要设计 ,将软件需求转化为数据结构和软件的系统结构。 详细设计 ,即过程设计。通过对结构表示进行细化,得到软件详细的数据结构和算法。. 软 件 工 程. --- 第 6 章 详细设计. §1. 详细设计的任务. 引言: 详细设计的任务. (Program Design Coding) 为 SC 图的每一个模块确定使用的算法和数据结构 ⑴ 确定模块内算法,用 某种工具 来表达 ⑵ 确定模块内的数据结构 ⑶ 确定模块间的接口细节 ⑷ 为每个模块设计测试. §6. 详细设计的任务.
E N D
软件设计任务 • 从工程管理的角度来看,软件设计分两步完成。 • 概要设计,将软件需求转化为数据结构和软件的系统结构。 • 详细设计,即过程设计。通过对结构表示进行细化,得到软件详细的数据结构和算法。
软 件 工 程 ---第6章 详细设计
§1. 详细设计的任务 引言: 详细设计的任务 (Program Design Coding) 为SC图的每一个模块确定使用的算法和数据结构 ⑴ 确定模块内算法,用某种工具来表达 ⑵ 确定模块内的数据结构 ⑶ 确定模块间的接口细节 ⑷ 为每个模块设计测试
§6. 详细设计的任务 引言:详细设计的任务 进行详细设计的原则 ⑴ 在保证正确可靠的前提下,尽量提高算法的可读性 ⑵ 结构化设计方法 ① 自顶向下逐步求精; ② 具有单入、单出的控制结构(取消GOTO语句) ⑶ 用工具来描述模块算法
引言:详细设计(过程设计、模块设计) 主要任务:编写详细设计说明书 为此,设计人员应: (1)确定每个模块的算法,用工具 表达算法的过程,写出模块的 详细过程性描述。 (2)确定每一模块的数据结构。 (3)确定模块接口细节。 详细设计是编码的先导。
6.1结构化程序设计(SP)方法 传统的设计技术和旧观念: • 强调设计的随意性,具有浓厚的个人色彩. • 追求程序效率和个人设计技巧 新的设计思想和风格: • 清晰第一 • 使用标准的、规范的控制结构 • 逐步细化
结构程序设计原则 • 程序的读者有二个:计算机和人,人们测试、维护、诊断和修改程序都必须读懂程序 • 衡量程序质量不仅要看逻辑是否正确,性能是否良好,还要看它是否容易阅读和理解 • 程序的质量与GOTO语句数量成反比 • 只用3种或几种基本结构来构造程序 • 每个程序应是单入口和单出口 • 结构程序设计是一种使程序容易阅读、理解的编程方法,自顶向下,逐步求精,用3种基本结构构造程序
§2. 设计工具 §2. 设计工具 • 在详细设计阶段,要决定各个模块的实现算法,并精确地表达这些算法。表达过程规格说明的工具叫做详细设计工具,它可以分为以下三类: • 图形工具 • 表格工具 • 语言工具
§2. 设计工具 1、程序流程图(Program Flow Chart) • 程序流程图也称为程序框图,程序流程图使用五种基本控制结构是:
示例 §2. 设计工具
§2. 设计工具 程序流程图的标准符号
§2. 设计工具 循环的标准符号 注解的使用
§2. 设计工具 多出口判断
§2. 设计工具 任何复杂的程序流程图都应由以上五种基本结构组合而成。 优点:容易掌握,且历史“悠久”,使用广泛。 缺点:本质上不具备逐步求精的特点,对于提高 大型系统的可理解性作用甚微; 不易表示数据结构; 转移控制太方便。 趋势:仃止使用
§2. 设计工具 2、N-S图 • N-S图也叫做盒图(Box Diagram)。五种基本控制结构由五种图形构件表示。
§2. 设计工具 示例
§2. 设计工具 N-S图的嵌套定义形式
§2. 设计工具 特点: ① 没有箭头,不允许随意转移控制; ② 每个矩形框(Case中条件取值例外)都是一个功能域(即一个特定结构的作用域),结构表示明确; ③ 局部及全程数据的作用域易见; ④ 易表现嵌套关系(embedded structure)以及模块的层次结构。
A ELSE THEN A While P Until P S S P B B Selective Sequential Loops A1 def 1 A2 2 Statement Index Definition P = … n Case An §2. 设计工具 3、PAD图(Problem Analysis Diagram):日立公司,1973
k : x2 a b 1 2 3 x1 d e T F Do-While x3 f c x4 T F k i g h Do-Until x5 Do-Until x6 j §2. 设计工具 例:N-S图与PAD的转换
开始 f a x1 Untilx5 i k b x4 Untilx6 结束 def g j Whilex3 c h 1 x2 d k 2 3 e §2. 设计工具
§2. 设计工具 特点: ① 结构清晰,层次分明,易读; ② 支持逐步求精的设计思想; ③ 容易将PAD自动转换为高级语言源程序。
4 判定表 当算法中包含多重嵌套的条件选择时,用程序流程图、 N-S图或PAD都不易清楚地描述。这时可以用判定表或判定树来描述这些复杂的条件。判定表与判定树除了在详细 设计阶段使用外,在需求分析阶段也经常使用。 判定表一般由4部分组成:左上半部分列出所有条件、左下半部分列出所有动作、右上半部分列出各种条件组合,右下半部分列出和每组条件取值组合对应的动作。其结构下图所示:
判定表的优点是能够简洁,无二义性的描述所有的处理规则。缺点是它所表示的是静态逻辑,是在某种条件组合情况下可能的结果,它不能表达加工的顺序,也不能表达循环结构。因此,判定表不能成为一种通用的设计工具,判定表的优点是能够简洁,无二义性的描述所有的处理规则。缺点是它所表示的是静态逻辑,是在某种条件组合情况下可能的结果,它不能表达加工的顺序,也不能表达循环结构。因此,判定表不能成为一种通用的设计工具, 一般作为辅助工具配合其他工具一起使用。 图3.33 判定表结构示意图
例 某“订货单处理程序”的处理逻辑描述如下:例 某“订货单处理程序”的处理逻辑描述如下: “如果订货金额不足500元且未过期,则向客户发出批准单和提货单,已过期的,什么也不发;如果订货金额超过500元但不足1000元,则发出批准单和提货单,对已过期的,还要发过期通知单;如果订货金额超过1000元,不论是否过期,都要发出批准单和提货单。” 试用判定表表示出该逻辑。 判定表如表3.2所示:
1 2 3 4 条 件 过期 F T T 金额<500 T T 500<金额<1000 T 金额>1000 T 动 作 发过期通知单 √ 发批准单 √ √ √ 发提货单 √ √ √ 表3.2 判定表实例
5.判定树(Decision Tree) 判定树实质上是判定表的一种变形,本质上是一样的。 判定树的优点是形式简单、比较直观、易于掌握和使用。 缺点是不如判定表简洁。对于例3.3的描述可用判定树表示成如图3.34所示的形式: 图3.34 判定树实例
Internal statements PROCEDURE spell_check IS BEGIN Split document into single words Look up words in dictionary Display words which are not in dictionary Create a new dictionary END spell_check External statements §2. 设计工具 6、PDL语言(Program Design Language):又称 Pseudocode. 例:
§2. 设计工具 应具备以下特点: ① 有固定的外语法(keyword); ② 内语法用自然语言描述; ③ 有数据说明,例如: TYPE number IS STRING LENGTH (12) TYPEtable ISINSTANCE OFsymbol_table 抽象类型 ④有子程序定义与调用机制,例如: PROCEDURE <子程序名> <属性:内部\外部,编程语言等等> INTERFACE <参数表:I\O等等> pseudocode lines END 调用时可用:PERFORM <子程序名> USING<参数表>
§2. 设计工具 优点:易于实现由PDL到源代码的自动转换。 缺点:不够直观。
A A A S I Bo Co B* B C A = A = B A = S B B C C §3. 面向数据结构的设计方法Jackson System Development(JSD) 与SD的由DFD导出结构设计不同,JSD是以数据结构(data structure)为基础设计每个模块的处理过程。 注意: H中的方框表示模块,而JD中的方框代表几个语句构成的简单操作; H表现调用关系,而JD表现组成关系。 1、Jackson Diagram:
2、Jackson方法: 例:(P.91)一个正文文件由若干个记录组成,每个记录是一个字符串。要求统计每个记录中空格字符的个数,以及文件中空格字符的总个数。要求的输出数据格式是:每复制一行输入字符串之后,另起一行印出这个字符串中的空格数,最后印出文件中空格的总个数。
输出 输入 输出表格 正文文件 I 字符串* 表格体 空格总数 I I 字符* 串信息* S 空格O 非空格O 字符串 空格数 第1步:用Jackson图描述 I\O 的数据结构 第2步:在两个图中指出有直接因果关系(causality)、可以同时处理的单元(重复的次序,次数均相同)
输出 输入 输出表格 正文文件 I 字符串* 表格体 空格总数 I I 字符* 串信息* ? S 空格O 非空格O 字符串 空格数 ? 经过程序处理由正文文件得到输出表格。 每处理输入中一个字符串后就得到输出中一个串信息,二者重复次序和次数均相同。 字符不与多字符组成的字符串对应。 单个空格不能决定空格数。
输出 输入 输出表格 正文文件 程序体 印总数 I I 字符串* 表格体 空格总数 处理字符串* I I 字符* 串信息* 分析字符串 印字符串 印空格数 S I 空格O 非空格O 字符串 空格数 分析字符* S 处理空格o 处理非空格o 第3步:Data structureProgram structure 把有对应关系的单元合为一个处理框,画在相应的层次中(不同层以低层为准) 统计空格 分析字符* 注:顺序执行的处理中不允许混有重复执行或选择执行的处理。
统计空格 4 1 5 2 3 程序体 印总数 I(1) 处理字符串* 分析字符串 印字符串 印空格数 I 分析字符* S 处理空格o 处理非空格o 第4步:列出所有操作条件,并分配到上幅程序结构图中 例:(部分列举,详见P.93-93) ⑴打开文件 ⑵读入字符串 ⑶空格总数totalsum=0 ⑷关闭文件 ⑸仃止 I ⑴文件结束 第5步:用Pseudocode 表示程序。(详见P.94 -95)
§4. Warnier方法 活动号 顾 客 号 顾客姓名 旧余额 代码 (存/取) 数量 Warnier方法又称LCP法(Logically Constructing Program) 例:(P.96)假设要设计一个系统用来定期产生有关顾客帐目的报表,输入文件中每个顾客有一个头记录,后接若干个事务记录。
顾客姓名 顾客号 活动号 支出数 存入数 新余额 旧余额 存入总数 支出总数 输出报表如下:
第1步:用Warnier Diagram描述I\O的数据结构 见P.97图5.16 第2步:Data Structure Program Structure。见P.97 图5.17 第3步:将上图对应转换为程序流程图,并将每个处理框编号。见P.98图 5.18 第4步:Pseudocode分类。
例:(部分列举,详见P.98 - 99) 输 入 类 010 — 读 040 — 读 100 — 读 分支准备类:040 — 顾客号送到访问顾客号 分支指令类:010 — 若EOF 030 040 — 若读出的顾客号 =访问的顾客号 060 100 — 若读出的顾客号 =访问的顾客号 070 ………… 计 算 类:040 — 旧余额送到工作区 ………… 输 出 类:040 — 旧余额送到参考区 040 — 编辑顾客标题 040 — 输出并复原打印区 …………
第5步:将前一步分类结果标号排序 Pseudocode. 见 P.99 — 100 辅助技术:当I\O 数据有多个时,借 助判定表 见P.100 — 104
6.5 程序复杂程度的定量度量 详细设计阶段设计出的模块质量如何呢?第5章中曾经讲述了软件设计的基本原理和概念,经过详细设计之后每个模块的内容都非常具体了,因此可以使用这些原理进一步仔细衡量它们的质量。 由于软件工程还是一门很年轻的学科,目前许多定量度量方法还处在研究过程中,本节将要介绍的程序复杂程度定量度量方法是其中比较成熟的一种。
定量度量程序复杂程度的方法很有价值:把程序的复杂程度乘以适当常数即可估算出软件中错误的数量以及软件开发需要用的工作量,定量度量的结果可以用来比较两个不同的设计或两个不同算法的优劣;程序的定量的复杂程度可以作为模块规模的精确限度。定量度量程序复杂程度的方法很有价值:把程序的复杂程度乘以适当常数即可估算出软件中错误的数量以及软件开发需要用的工作量,定量度量的结果可以用来比较两个不同的设计或两个不同算法的优劣;程序的定量的复杂程度可以作为模块规模的精确限度。 下面着重介绍使用得比较广泛的McCabe方法和Halstead方法。
6.5.1 McCabe方法 1. 流图 McCabe方法根据程序控制流的复杂程度定量度量程序的复杂程度,这样度量出的结果称为程序的环形复杂度。 为了突出表示程序的控制流,人们通常使用流图(也称为程序图)。所谓流图实质上是“退化了的”程序流程图,它仅仅描绘程序的控制流程,完全不表现对数据的具体操作以及分支或循环的具体条件。
在流图中用圆表示结点,一个圆代表一条或多条语句。程序流程图中的一个顺序的处理框序列和一个菱形判定框,可以映射成流图中的一个结点。流图中的箭头线称为边,它和程序流程图中的箭头线类似,代表控制流。在流图中一条边必须终止于一个结点,即使这个结点并不代表任何语句(实际上相当于一个空语句)。由边和结点围成的面积称为区域,当计算区域数时应该包括图外部未被围起来的那个区域。在流图中用圆表示结点,一个圆代表一条或多条语句。程序流程图中的一个顺序的处理框序列和一个菱形判定框,可以映射成流图中的一个结点。流图中的箭头线称为边,它和程序流程图中的箭头线类似,代表控制流。在流图中一条边必须终止于一个结点,即使这个结点并不代表任何语句(实际上相当于一个空语句)。由边和结点围成的面积称为区域,当计算区域数时应该包括图外部未被围起来的那个区域。 图6.15(见书128页)举例说明把程序流程图映射成流图的方法。
用任何方法表示的过程设计结果,都可以翻译成流图。图6.16是用PDL表示的处理过程及与之对应的流图。用任何方法表示的过程设计结果,都可以翻译成流图。图6.16是用PDL表示的处理过程及与之对应的流图。 当过程设计中包含复合条件时,生成流图的方法稍微复杂一些。所谓复合条件,就是在条件中包含了一个或多个布尔运算符(逻辑OR,AND,NAND,NOR)。在这种情况下,应该把复合条件分解为若干个简单条件,每个简单条件对应流图中一个结点。包含条件的结点称为判定节点,从每个判定结点引出两条或多条边。图6.17是由包含复合条件的PDL片断翻译成的流图。
2. 计算环形复杂度的方法 环形复杂度定量度量程序的逻辑复杂度。有了描绘程序控制流的流图之后,可以用下述3种方法中的任何一种来计算环形复杂度。 (1) 流图中的区域数等于环形复杂度。 (2) 流图G的环形复杂度V(G)=E-N+2,其中,E是流图中边的条数,N是结点数。 (3) 流图G的环形复杂度V(G)=P+1,其中,P是流图中判定结点的数目。