【经验表明,一个设计得好的典型系统的平均扇出通常是3或4(扇出的上限通常是5~9)。】 ? 扇入表明有多少个上级模块直接调用它
【扇入越大则共享该模块的上级模块数目越多,这是有好处的。但是,不能违背模块独立原理单纯追求高扇入。】
【设计的好的软件结构通常顶层扇出比较高,中层扇出较少,底层模块有高扇入】
18)面向数据流的设计方法:把信息流映射成软件结构,信息流的类型决定了映射的方法 19)信息流的类型:变换流和事物流
20)变换分析的定义:是一系列设计步骤的总称,经过这些步骤把具有变换流特点的数据流图按预先确定的模式映射成软件结构
第六章 详细设计
1)过程设计的工具:
? 图形工具:如程序流程图、盒图(N-S图)和PAD图 ? 表格工具:如判定表
? 过程设计语言:是一种用于描述模块算法设计和处理细节的语言工具
2)程序流程图的主要缺点:(1) 程序流程图本质上不是逐步求精的好工具,它诱使程序员过早地考虑程序的控制流程,而不去考虑程序的全局结构。(2) 程序流程图中用箭头代表控制流,因此程序员不受任何约束,可以完全不顾结构程序设计的精神,随意转移控制。(3) 程序流程图不易表示数据结构
3)盒图(N-S图)特点:(1) 功能域(即,一个特定控制结构的作用域)明确,可以从盒图上一眼就看出来。(2) 没有箭头,不可能任意转移控制。(3) 很容易确定局部和全程数据的作用域。(4) 很容易表现嵌套关系,也可以表示模块的层次结构 4)PAD图(问题分析图)的结构:
? 图中最左边的竖线是程序的主线,即第一层结构
? 随着程序层次的增加,PAD图逐渐向右延伸,每增加一个层次,图形向右扩展一条竖
线
? PAD图中竖线的总条数就是程序的层次数 5)PAD图的主要优点:
? 使用PAD符号设计出来的程序必然是结构化程序。
? PAD图所描绘的程序结构十分清晰。
? 用PAD图表现程序逻辑,易读、易懂、易记。
程序从图中最左边竖线上端的结点开始执行,自上而下,从左向右顺序执行,遍历所有结点
? PAD图易于向高级语言转换。
? PAD图的符号支持自顶向下、逐步求精方法的使用。
开始设计者可以定义一个抽象的程序,随着设计工作的深入而使用def符号逐步增加细节,直至完成详细设计。 6)判定表的组成:
? 左上部列出所有条件
? 左下部是所有可能做的动作
? 右上部是表示各种条件组合的一个矩阵 ? 右下部是和每种条件组合相对应的动作 7)判定表的优缺点:
? 优点:判定表能够简洁而又无歧义地描述处理规则。
? 缺点:判定表并不适于作为一种通用的设计工具,没有一种简单的方法使它能同时清
晰地表示顺序和重复等处理特性
8)判定树的优点:它的形式简单到不需任何说明,一眼就可以看出其含义,因此易于掌握和使用【判定树是判定表的变种,它能清晰地表示复杂的条件组合与应做的动作之间的对应关系】
9)过程设计语言(伪码PDL)的定义:用正文形式表示数据和处理过程的设计工具【PDL具有严格的关键字外部语法,用于定义控制结构和数据结构】 10)PDL的优缺点:
优点:(1) 可以作为注释直接插在源程序中间。这样做能促使维护人员在修改程序代码的同时也相应地修改PDL注释,因此有助于保持文档和程序的一致性,提高了文档的质量。(2) 可以使用普通的正文编辑程序或文字处理系统,很方便地完成PDL的书写和编辑工作。(3) 已经有自动处理程序存在,而且可以自动由PDL生成程序代码。
缺点:不如图形工具形象直观,描述复杂的条件组合与动作间的对应关系时,不如判定表清晰简单
11)Jackson图的结构(面向数据结构的设计方法):1.顺序结构;2.选择结构;3.重复结构 12)Jackson图的优缺点:
优点:便于表示层次结构,而且是对结构进行自顶向下分解的有力工具;形象直观可读性好;既能表示数据结构也能表示程序结构(因为结构程序设计也只使用上述3种基本控制结构)
缺点:选择/循环条件不能直接在图上表示出来,影响图的表达能力;不易直接把图翻译成程序;不易在打印机上输出
13)Jackson图和描绘软件结构的层次图对比:形式相当类似,但是含义却很不相同 ? 层次图中一个方框代表一个模块;而Jackson图中一个方框只代表几个语句; ? 层次图表现的是调用关系;而Jackson图表现的是组成关系。 14)Jackson结构程序设计方法步骤:
? 第一步 分析并确定输入数据和输出数据的逻辑结构,并用Jackson图描绘这两组数据
结构。
? 第二步 找出输入数据结构和输出数据结构中有对应关系的数据单元。
? 第三步 用下述3条规则从描绘数据结构的Jackson图导出描绘程序结构的Jackson图:
第一,为每对有对应关系的数据单元,按照它们在数据结构图中的层次在程序结构图的相应层次画一个处理框(注意,如果这对数据单元在输入数据结构和输出数据结构中所处的层次不同,则和它们对应的处理框在程序结构图中所处的层次与它们之中在数据结构图中层次低的那个对应);
第二,根据输入数据结构中剩余的每个数据单元所处的层次,在程序结构图的相应层次分别为它们画上对应的处理框;
第三,根据输出数据结构中剩余的每个数据单元所处的层次,在程序结构图的相应层次分别为它们画上对应的处理框。
在导出程序结构图的过程中,由于改进的Jackson图规定在构成顺序结构的元素中不能有重复出现或选择出现的元素,因此可能需要增加中间层次的处理框。
? 第四步 列出所有操作和条件(包括分支条件和循环结束条件),并且把它们分配到程序
结构图的适当位置。
? 第五步 用伪码表示程序。
15)McCabe方法的定义:根据程序控制流的复杂程度定量度量程序的复杂程度,这样度量出的结果称为程序的环形复杂度 16)流图
? 流图中用圆表示结点,一个圆代表一条或多条语句。程序流程图中的一个顺序的处理
框序列和一个菱形判定框,可以映射成流图中的一个结点。 ? 流图中的箭头线称为边,代表控制流
? 流图中的边必须终止于一个结点,即使这个结点并不代表任何语句(实际上相当于一个
空语句)
? 由边和结点围成的面积称为区域,当计算区域数时应该包括图外部未被围起来的那个
区域。
17)计算环形复杂度的方法:(1) 流图中的区域数等于环形复杂度。(2) 流图G的环形复杂度V(G)=E-N+2,其中,E是流图中边的条数,N是结点数。(3) 流图G的环形复杂度V(G)=P+1,其中,P是流图中判定结点的数目。 18)环形复杂度的用途:
? 程序的环形复杂度取决于程序控制流的复杂程度,也即是取决于程序结构的复杂程度 ? McCabe研究大量程序后发现,环形复杂度高的程序往往是最困难、最容易出问题的程
序
? 模块规模以V(G)≤10为宜,也就是说,V(G)=10是模块规模的一个更科学更精确的上
限
19)Halstead方法:
? 令N1为程序中运算符出现的总次数,N2为操作数出现的总次数,程序长度N定义为:
N=N1+N2
? 详细设计完成后,可以知道程序中不同运算符(包括关键字)的个数n1,不同操作数(变
量和常数)的个数n2。Halstead给出预测程序长度的公式为:H=n1log2n1+n2log2n2 ? 预测程序中包含错误的个数的公式如下:E=Nlog2(n1+n2)/3000
第七章 实现
1)程序内部文档组成:恰当的标识符、适当的注解和程序的视觉组织 2)效率的定义与原则:指处理机时间和存储器容量两个方面。 首先,效率是性能要求
其次,效率是靠好设计来提高的
第三,程序的效率和程序的简单程度是一致的,不要牺牲程序的清晰性和可读性来不必要地提高效率
3)软件测试步骤:1. 模块测试;2. 子系统测试;3. 系统测试;4. 验收测试;5. 平行运行 4)测试重点:1. 模块接口【参数的数目、次序、属性等】;2. 局部数据结构;3. 重要的执行通路;4. 出错处理通路;5. 边界条件【使用刚好小于、刚好等于和刚好大于边界值的测试方案,可能发现软件中的错误】;
5)测试正文编辑模块用的存根程序、测试正文编辑模块用的驱动程序: Ⅰ. TEST STUB(*测试正文编辑模块用的存根程序*) 初始化; 输出信息“进入了正文编辑程序”; 输出“输入的控制信息是”CFUNCT; 输出缓冲区中的字符串; IF CFUNCT=CHANGE THEN 把缓冲区中第二个字改为*** ELSE
在缓冲区的尾部加??? END IF; 输出缓冲区中的新字符串; END TEST STUB
Ⅱ. TEST DRIVER(*测试正文编辑模块用的驱动程序*) 说明长度为2500个字符的一个缓冲区; 把CFUNCT置为希望测试的状态; 输入字符串; 调用正文编辑模块; 停止或再次初启; END TEST DRIVER 6)自顶向下集成步骤:
第一步,对主控制模块进行测试,测试时用存根程序代替所有直接附属于主控制模块的模块;
第二步,根据选定的结合策略(深度优先或宽度优先),每次用一个实际模块代换一个存根程序(新结合进来的模块往往又需要新的存根程序); 第三步,在结合进一个模块的同时进行测试;
第四步,为了保证加入模块没有引进新的错误,可能需要进行回归测试。 7)自底向上集成步骤:
第一步,把低层模块组合成实现某个特定的软件子功能的族;
第二步,写一个驱动程序(用于测试的控制程序),协调测试数据的输入和输出; 第三步,对由模块组成的子功能族进行测试;
第四步,去掉驱动程序,沿软件结构自下向上移动,把子功能族组合起来形成更大的子功能族。
8)不同集成测试策略的比较(自顶向下与自底向上): 自顶向下
优点:不需要测试驱动程序,能够在测试阶段的早期实现并验证系统的主要功能。
缺点:需要存根程序,低层关键模块中的错误发现较晚。 而自底向上与之相反。
9)白盒测试技术定义:也叫玻璃盒测试(Glass Box Testing)。它允许测试人员利用程序内部的逻辑结构及有关信息,来设计或选择测试用例,对程序所有逻辑路径进行测试 10)逻辑覆盖测试的5种标准: 发现错误的能力 1(弱) 2 3 4 5 (强) 标准 语句覆盖 判定覆盖 条件覆盖 判定/条件覆盖 条件组合覆盖 含义 每条语句至少执行一次 每一判定的每个分支至少执行一次 每一判定中的每个条件,分别按“真”、“假”至少各执行一次 同时满足判定覆盖和条件覆盖的要求 求出判定中所有条件的各种可能组合值,每一可能的条件组合至少执行一次 测试用例应满足的条件 11)逻辑覆盖举例: 覆盖标准 语句覆盖 程序结构举例 A^B=.T. 判定覆盖 A^B=.T. A^B=.F. 条件覆盖 A=.T. A=.F. B=.T. B=.F. 判定/条件覆盖 A^B=.T. , A^B=.F. A=.T. A=.F. B=.T. B=.F.