静态分析的概念已经提出多年,而在过去的几年里利用该工具评估和诊断代码的技术已日趋成熟。几乎每种语言都存在相应的软件审查工具。这些审查可以在多个领域,如数组,循环,编码风格,设计,复制代码,命名风格,性能等领域中隔离出不良代码。而在每一个层级中又存在另一套完整的审查可供程序员使用。
这里要提醒大家,程序员可能会因审查报告过多漏洞而感到厌烦。笔者曾经看到过一个有20万行的应用程序,用现在的标准来衡量,这当然不算多,此外还运行了200+审查。该报告列出了35万个需要修复的违规之处,这样以来的确是有些麻烦。
要想成功使用审查,关键是要限定审查套组的量。这个量视情况而定,程序员应该把握好这个量,才能事半功倍。
我们通常会推荐程序员和其团队从小的有限审查开始,先修复各种常见问题。
审查最令人激动的一点是它可以为我们提供代码信息以及代码的构成。仅因为报告指出某一行出现异常,这并不意味着它就是真正的问题所在。一个好的工具应该能够将所报告的问题做上已验证的标记;可以在注释中标明,这样审查工具就明白该区域已经被查看过了。
那么什么时候可以使用审查呢?建议每晚或进行整合构建的时候都可以运行审查以便保证程序的运行,尤其是当代码的编写不够严格或刚刚编写完不久的情况下。运行已有代码中的Software Archeology时至少应该运行一次代码,而重构进程的时候则要一直运行审查。
本文介绍的五个审查工具分别是Numerical Literal in Code,String Literal,God Method,Shotgun Surgery和Duplicate Code。
Numerical Literal in Code
这是最简单的重构方法之一。我们已经写出这样的代码:
double salaryCalc(double salary){
return salary*1.34564333721
}
C++
两个月后,我们要更新salaryCalc方法,而客户查看代码的时候则遇到了困难。很可能他们不记得方法最开始的写法了,所以不明白1.34564333721代表着什么。最好是用字符常量来代替数字。这样就赋予了数字有意义的名称,如下所示:
double salaryCalc(double salary){
Return salary* BONUS
}
Static final double BONUS = 1.34564333721
C++
当程序员查看现在这个代码时,他们至少明白1.34564333721代表的是什么。如果你要重构,单元测试不应该发生改变,而重构完成后结果应该还一样。
String Literal
我们都知道,时间紧迫的时候,我们可能要改变代码,并使其能尽快投入运营。String Literal就派上用场了。该审查特别适用于要将软件国际化的任务。需要经常运行该审查。单元测试不应发生改变,结果也要保持一致。
这个不正确:
public const helloWorldMessage: String = ‘Hello World!’;
Delphi
这个才正确:
Public const helloWorld Message: String =
resourceManager.GetString(‘msg.helloworld’);
Delphi
这个方法将会对应用程序外能够被改变的资源包中的helloWorldMessage字符串进行检索,并在不重新编译的情况下进行更正。
God Method
God ‘X’审查,‘X’相当于Method,Class。该审查不仅仅是查看代码,然后指出不足。
对这一类审查的概括可总结为god Method;简而言之,我们拥有一个类,这个类包含了50个方法,但是只有一个方法恰好能完成所有工作。那么这个方法就要被标记为god Method。