McCabe推荐的代码走查方法

来源:互联网 发布:椰族部落永久域名新址 编辑:程序博客网 时间:2024/04/30 11:32
“为什么你能看到邻居眼中的斑点,但是注意不到你自己眼中的东西”
以上这个谚语形成了代码走查的原则。本文将会介绍做代码走查的好处,但更为重要的是要懂得其中的基本概念
   以上简单论述了一群人走查代码可以找到82%的错误,另外,终生费用的80%都用在了软件维护上,更为艰难的是软件维护通常要写代码的人来做。
代码走查的挑战
打算做代码走查有许多不同方面的挑战,尤其是有效率、客观、以及接近程度。
效率
代码走查通常被看作是效率低下,但是它已经被很多研究所证明,有个人(Boehm, Kaplan, Gilb)也有组织(IBM),在编码阶段去除错误的成本是在软件发布阶段去除错误成本的1/92
   代码走查的另一个问题是全部的代码都需要走查,在理想世界,所有的代码都要被走查(按照CMM3级的要求),然而在实践中,通常是不可行的,测试者必须找到那些必须要走查的代码,例如,由于在将来的版本中引入缺陷的风险,由于维护阶段的费用很高,将会留下一些代码或者随机检查,或者按照优先权次序。
客观
这可能是代码走查过程中的最大的问题,劝说开发者遵循一定的标准,开发着个人对于代码走查可能会有两个基本问题:
 别人写的代码为什么要他们批评写代码的方式。
 他们写代码别人怎么批评他们的手艺,编码是一门艺术,不是科学。
这里的挑战在于要采用一个公认的标准以便所有人都能够同意接受它的要求,尤其是接受一些代码标准和复杂度门限值,所有这些都要小心选择并能够全面反映团队的工作环境。
逼近
一个代码走查者所执行的过程很大程度上决定了开发团队内的对于这个概念的接受程度,这方面的很多文章推荐一个团队有四个人作为代码走查者,每个人执行不同的任务,目的就是为了发现程序中的缺陷,并不企图修正它们。
 走查者用7个字左右来描述每个缺陷
 走查者不决定怎么修改这些缺陷,这是写代码者的责任。
 是否存在缺陷没有讨论的余地,一旦被记录,就是一个缺陷
 开发者不允许被解释,或定义他们的工作,除非有一个直接的问题
 走查者必须经过专门的训练
使用McCabe IQ来做代码走查
McCabe IQ工具提供了105种不同的代码复杂度,因此可以很好的解决对代码复杂度敏感的代码走查体制。
McCabe IQ可以识别出代码的超过所选择的复杂度门限值运行范围的方法、函数、控制等。这就使得代码走查团队集中他们的注意力在更深的检查上,也使得开发者从新查看代码作为他们开发活动的一部分,以确保代码在被审查之前满足团队的需求。
McCabe IQ做代码走查包含三个相互关联的因素:
 复杂度的选择
 门限值的选择
 超标值的识别-超过那些规定门限值的代码
复杂度选择
一个团队选择一个最小被QA人员以及开发者承认的复杂度集合是非常重要的,一旦这些过程被接受施行,更多的复杂度可以被添加。
 最初选择的复杂度应该包括:
 Cyclomatic Complexity         (McCabe) 
 Essential Complexity     (McCabe) 
 Integration Complexity        (McCabe) 
 Comment Density      (General) 
 LOC             (McCabe & Halstead) 
 一些附加的复杂度可以在以后添加:
  Program Volume      (Halstead) 
  Nesting Depth, including Switch Depth & Loop Depth  (General) 
  Maximum Number of Predicates in a single statement  (General) 
 Number of Unique calls excluding Library routines  (McCabe) 
 Logic Density           (McCabe) 
 Fan-in and Fan-out ratios        (McCabe) 
另外,McCabe IQ可以计算取得复杂度,基于产品中应用复杂度的组合。为了简化代码走查流程,McCabe 提供了四种取得复杂度
 大小
 可读性
 非结构化
 模块大小
这些中的每一个都可以从以前定义的复杂度中计算得到,每个都是一个修改因素,他们的应用必须小心校准以便这些修改因素可以真实地反映代码地特征。
选择每个复杂度可以接受的门限值
在代码走查的过程中门限值的选择是关键,尤其是对付遗留代码的时候,门限值允许代码走查者识别出哪里的代码质量下降到了不可接受的水平,以下表格详细列出了工业标准门限值
复杂度                    低门限                    高门限
圈复杂度                   10                        15
基本复杂度                  4                         8
集成复杂度                  4                         8
注释密度                    <20%                     <15%
逻辑密度                    .14                       .42
扇入扇出比                  
LOC                         20                       50
程序规模                     
嵌套深度(包括分支循环深度) 4                         6
一条语句中断言的最大数量     4                         6
识别出那些超过最低或最高门限值的代码
识别出超过门限值的代码是通过McCabe IQ一个报告来列出方法、程序、控制或超过的边界值
定制的报告可以采取多种形式,从简单的列表到多种复杂度,到星状图、KV图等。
开发者可以使用定制报告来监控他们自己的程序以便来确保他们的代码满足团队的质量标准。QA团队/代码走查者可以使用定制报告来确保他们的注意力集中在问题代码上。
走查过程
报告
McCabe IQ被用来创建代码的特定时刻的快照的报告。一个典型的代码走查的报告应该包含:
 复杂度的星状图vs.结构分布
 复杂度的形状图vs.注释密度
 EQ质量报告
以上报告方便地回答了关于大小,可理解性,结构化,和模块化的几个关键问题。
一旦报告已经产生,走查团队可以检查他们以便识别出那些需要手工检查的代码,走查团队可以人工检查那些“问题”代码。给出缺陷的列表,并且产生纠正这些缺陷的计划。
可视化
McCabe IQ通过它的可视化功能,可以提供给走查团队一个详细的任何部件的可视化图,McCabe IQ显示出每个模块的代码,不仅仅是它的原始的编码语言格式,而且是更重要的是有代码的逻辑结构图。
详细的走查可以按照以下三种格式中的一种:
 使用IQ产生报告和上下文敏感的模块名字
 使用打印报告和查找功能
 使用Graph/ASL工具来遍历各种部件只在那些部件逻辑比较复杂的地方停止。
最后一种技术最适合被开发者或监控者执行。
代码走查的McCabe功能
McCabe复杂度
和这篇文章开始的时候所说,McCabe IQ具有记录直到105个复杂度信息的能力,复杂度在 模块级、程序机或系统机被收集。除了这些,还有OO复杂度等
McCabe报告
McCabe IQ 工具从三个不同方面的报告能力
 由工具提供的标准报告,包含35种报告,包括图形和文本的
 定制那些可以从标准报告种产生的产生报告,产生文本的图形的,以及文件的报告。
 McCabe EQ使用一个嵌入式的RDBMS来创建和管理一个复杂度的数据库,通过提供一系列标准的报告和报告生成器。
  McCabe可视化
McCabe IQ提供了在所有层次上可视化的分析能力,基本的McCabe IQ可视化工具是:
 Battlemap-一个高级的显示各个模块的调用关系的分析图
 Graph/ASL列表-一个较底层的单个模块或部件视图,最原始的编码语言的格式,以及相关的逻辑图
 星状图-有两个复杂度勾画出的图表,当在工具中使用的时候是上下文敏感的,可以被使用在第一个阶段
 KV图-有5个复杂度勾画出的图表
McCabe自动化
代码走查的大部分方面可以使用McCabe IQ的命令行来实现自动化
McCabe IQ命令行命令是“CLI METRICS”,可以从命令行执行并且使用以下参数“
-pcf   McCabe PCF名字
-output   输出到结果文件
-report   将被运行的定制报告的名字
例如,以下命令运行一个叫“qualiy_level“代码分析在c:/CV6/mcChess.pcf,结果报告放在c:/listings/qual_rep1.txt,命令行指令为:CLI METRICS –pcf c:/CV6/mcChess.pcf –output c:/listings/qual_rep1.txt –report quality_level1