质量评审培训课件

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

• 可利用基本结点度量消除这些局限性
圈复杂度
• 从有向图G,计算圈复杂度V(G):
V(G) = No. edges(边数) - No. nodes(节点数) + 2
• 这样也正确:
V(G) = No. predicates (判定节点数) + 1 • Case 结构(有N 种选择)是个例外,计算为 N – 1 V(G) = No. regions(区域数) • 假如G是个连接的平面图
圈复杂度
1
1 4
2
2
4
3 5 6
3
7 12
5
8 9
6
10
7
例子 12 条边 9 个节点 VG = 12 - 9 + 2 = 5
8
11
9
圈复杂度
1
3-1
例子 3 个判定结点计算为 4 case 计算为 2 VG = 4 + 1 = 5
1
圈复杂度
1
2 5
例子 5 个区域 VG = 5
4
3
结点和圈复杂度
• 通过追踪局部的控制流分支,任何不可达的代码都会在报 告中着重显示
LCSAJ(路径测试)流程图
质量评审报告
度量的解释
• 像大多数其他的物理度量一样,度量的大小并不能表明事 物的好或者坏 • 通常认为最好要保证函数符合这样的度量,这增加了程序 的可读性和可维护性
质量评审报告
• 显示复杂度度量和源代码 的信息 • 显示函数级别的复杂度度 量和整体源代码的复杂度 度量 • 许多结果也能够以图形化 的方式显示 • 可用的度量包括:
• 使用工业标准或自定义质量模型
– 提供边界检查 – 产生定量评估
• 将所有结果总结成顶层的度量指标
– 清晰性/测试性/维护性
• 提供直观的报告和代码可视化工具
复杂性
• 通常检查多余的复杂性是非常困难的 • 程序的复杂性并不可怕,但是多余的复杂性会引起软件出问题
度量元
• 度量元是软件度量的基础,就象“米”是对长度的度量 • 注意度量结果本身并不能直接就反应出质量好坏 • 在质量评审中使用度量源元时,相互的关联是最重要的
程序结构化确认
• 由于使用非正确的结构形式,C 语言非常容易产生错误:
– 需要 switch,case,default 和 break 语句的case语句 – if - then 语句也容易产生错误 – for 循环结构也容易产生错误
SPV建议
• 如果检测到非结构化的代码,这部分代码应该由程序员重 新编写,这不包括为了解决某些特殊问题而有意使用的非 结构化编程 • 除了允许以修改非结构化程序会带来不必要的复杂为理由 以外,建议管理者可以先怀疑任何非结构化编程的使用 • 流程图看起来很混乱,并不总是意味着代码是非结构化的。 绘制流程图的算法可能会误导程序是高度复杂的 • 通常程序的非结构化是由于代码内部错误引起的
– 1. – 2. – 3. 起始点 [一个线性代码序列] 结束点 目标点
LCSAJ起始点
• LCSAJs开始于:
– 程序的第一行可执行代码 – A的第一行可执行代码,A可以是:
• 功能 • 程序 • 方法…
– 任何控制流跳转的目标行:
• • • • • • 标号 else语句 endif语句 switch语句的子句 循环 函数调用的返回...
LCSAJs 线性代码序列及跳转
LCSAJs
• • • • • • 维护性度量指标 检测不可达代码 识别不可测试(或不合理)代码 强制用于欧洲安全苛刻性军用航空电子项目 路径测试的覆盖度量基础 最高级别的代码覆盖率度量
LCSAJ三要素
• 根据定义和LDRA的代码重格式化策略,LCSAJs能描述 成三要素的形式:
LCSAJ跨度
LCSAJ跨度是程序中的最小分割,任何LCSAJ的线型代码序列 都完全包含在LCSAJ的跨度中 LCSAJ跨度的第一行可以是程序的开始,或者是前面的LCSAJ 序列不能到达的那一行 LCSAJ跨度的终止行可以是程序的结束行,或者是控制流不能 经过其下一行的代码行
Span FINISH 82 else 1 -----------------------------------------------------------------------START 83 { 1 84 mess = "Hello There"; 1 85 } 1 START 86 } 2 START 87 } 3 START 88 printf ( "%d %d %d %20s\n", i, j, k, mess ); 4 FINISH 89 } 4 -----------------------------------------------------------------------START FINISH 90 } 1
程序结构化验证
程序结构化验证
• 通过匹配程序结构模版执行结构化验证,模版使用源代码 基本块的流程图表示 • 使用检查工具自动运行 • 检查下列结构:
if -then - endif if - then - else - endif do - while while for case
• 可配置成识别其他结构
– – – – – – 圈复杂度度量 源代码基本块 结点度量 函数的入口出口 循环数目和嵌套深度 程序结构化验证
质量评审报告
质量评审-质量模型
质量评审报告
Reformatted Code Information for File Total reformatted Lines, Total comments in ref. Code, Executable ref. Lines, Non-executable ref. Lines Number of Procedures, Total source Lines, Expansion Factor. Comments Associated with Procedures (% of total) Total Comments, Comments in Headers, Comments in Declarations, Comments in Executable Code Blank Lines. Ratio of Comments to Executable lines (%) Total Comments/Exe. Lines, Header Comments/Exe. Lines, Declaration Comments/Exe. Lines, Code Comments/Exe. Lines Halstead's Metrics Total Operators, Total Operands, Unique Operators, Unique Operands Vocabulary, Length, Volume. LCSAJ and Unreachability Total LCSAJs, Reachable LCSAJs, Unreachable LCSAJs, Maximum LCSAJ Density Unreachable Lines, Unreachable Branches. File Based C++ OO Metrics Total Structured Types Declared, Total Objects Created. Class Level C++ OO Metrics Objects Created, Number of Data Members, Number of Members, Number of Child Classes Class Level OO Metrics - with Base Classes Total Base Classes, Total Data Members, Total Members, Inheritance Depth Class Level OO Metrics - with Base Classes (2)
不可达的LCSAJs
• 如果从程序开始没有任何路径到达 指定的代码行,那么代码将被标为 不可达(或死代码) • 这种现象通常出现在紧跟着goto语 句的代码行中,典型例子如右面最 后一行代码 • 不可达的 LCSAJs标记显示在下面的 例子中
FINISH 235 goto l6 ; 2
if I=0 then go to label: end if;
SPV度量总结
• 如果一个模块通过SPV化简之后是结构化的,它有:
– 基本结点为0 – 基本圈复杂度为1
• 非结构化的程序含有很高的基本度量值 • 这两个度量是对代码中存在的结构缺陷的度量
复杂度分析标准
• 复杂度分析标准违反情况 • 位于代码评审报告中 • 用于强制源代码执行特定的质量特性
1 2 3 4 5 C C C C C Cyclomatic Complexity greater than *** Procedure is not reducible in terms of intervals Procedure contains essential knots Procedure is not structured Procedure contains infinite loop
代码评审
质量评审
单元测试
质量评审特点
复杂度分析 代码结构化化简
LCSAJs
代码评价度量
质量模型 优点
质量评审能力
• 检查多个代码复杂性度量元
– 圈复杂度 – 结点度量 – LCSAJ 控制流(测试路径)
• 识别死代码和不可测试代码
• 提供功能强大的结构化化简工具
– 结构化程序验证 – 将你的代码化简到基本复杂度
1 1 1
• 结点根据跳转类型可以 分为:
– 下-下结点 – 上-下结点 – 上-上结点
33344422
2
5
5
5
引起结点的C结构
• 下列编程结构会引起结点:
for while switch
• 可利用基本结点度量消除这些局限性
引起结点的Ada结构
• 下列编程结构会引起结点:
IF THEN ELSE CASE GOTO Exceptions
质量评审 – 代码评价度量
清晰性
系统的 可理解性 如何 可维护性
可测试性 对系统进行
软件的
可维护性 如何?
测试需要多少 工作?
复杂度度量
– – – – – – 控制流结点 圈复杂度 基本结点和基本圈复杂度 循环嵌套 函数扇入和扇出 不可达性
结点分类
• 跳转分为下列几类:
– 向上(向后)跳转 – 向下(向前)跳转
SPV流程图
• SPV流程图,图形化地显 示设计良好的程序结构中 节点的化简过程
代码评审流程图
基本结点度量
• 将所有的结构化的程序结构进行化简后,计算剩余的节点 数就得到基本结点度量 • 对于一个结构化的程序:
基本结点数 = 0
• 基本结点是非结构化程序引起的复杂性的度量
基本圈复杂度
• 某些结构化的编程结构会引起很高的圈复杂度 • 这个局限性可用基本度量克服 • 定义: EV(G) = V(G) - M 这里M 是有唯一入口和出口节点的子图G的数目 • 对于一个结构化的程序: EV(G) = 1
--------------------------------------------------------------------236 237 START 238 239 FINISH 240 } z = 5 ; z = 9 ; l6 : z = 10 ; 0 UNREACHABLE ***** 0 UNREACHABLE ***** 1 1 1
LCSAJ密度
• LCSAJ密度是维护性度量元 • 如果某一行代码作了修改,LCSAJ密度会告诉用户由于此代码修 改影响到多少条LCSAJ • 如果密度越高,那么就越会降低对于所有的LCSAJ此改变都是正 确的信心,因此必须增加需要的回归测试数目
Code a=b if (a==x) { b=y; } print (“ok”); “LCSAJ” Lines Density 2 2 2 1 1 1 2
不可测试的LCSAJs
• LCSAJ是一路径片段,通常在它的线性代码序列中包含许 多条件 • 如果LCSAJ的执行依赖于程序中的某些条件,而且永远不 会满足这些条件,那么LCSAJ可能是不可测试的(因此是 不可执行的)
LCSAJ报告
• 总结部分 • 详细的代码清单:
– – – – LCSAJs出现的地方 源代码内的位置 LCSAJ三要素列表 不可达的LCSAJs列表
– 圈复杂度用于表明程序复杂性 – 结点度量用于表明程序实施时附加的复杂性
循环的复杂性度量
• • • • • 由流程图研究源代码的循环结构 用于度量复杂性和代码优化 识别循环结构 不被源代码结构所影响 函数度量:
– 函数入口和出口(扇入扇出) – 循环总数 – 循环最大深度
C++ OO实现
• • • • • • • 类的数目 子类的数目 每个类的方法 继承深度 数据成员的数据 类外的函数调用 其他Chidamber和 Kemerer度量
1 1 2 2 4 3 3 5 4
此有向图可表示为右边两种程序结构 。
1
3
4
2
5
V(G) = 6 - 5 + 2 = 3 Knots = 4
5
V(G) = 6 - 5 + 2 = 3 Knots = 1
结点和圈复杂度
• 圈复杂度和结点度量是互补的两个指标 • 总之, 程序结构化度量量化了软件的属性
相关文档
最新文档