程序员需知的五种静态代码审查

静态分析的概念已经提出多年,而在过去的几年里利用该工具评估和诊断代码的技术已日趋成熟。几乎每种语言都存在相应的软件审查工具。这些审查可以在多个领域,如数组,循环,编码风格,设计,复制代码,命名风格,性能等领域中隔离出不良代码。而在每一个层级中又存在另一套完整的审查可供程序员使用。

这里要提醒大家,程序员可能会因审查报告过多漏洞而感到厌烦。笔者曾经看到过一个有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。

时间: 2024-12-24 20:29:04

程序员需知的五种静态代码审查的相关文章

SQL Server 利用锁提示优化Row_number()-程序员需知

原文:SQL Server 利用锁提示优化Row_number()-程序员需知 网站中一些老页面仍采用Row_number类似的开窗函数进行分页处理,此时如果遭遇挖坟帖的情形可能就需要漫长的等待且消耗巨大.这里给大家介绍根据Row_number()特性采用特定锁Hint提升查询速度.   直接上菜   脚本环境可在SQL Server优化技巧之SQL Server中的"MapReduce"找到   如下查询在分页中比较常见 set statistics time on select *

SQL Server 隐式转换引发的躺枪死锁-程序员需知

原文:SQL Server 隐式转换引发的躺枪死锁-程序员需知 在SQL Server的应用开发过程(尤其是二次开发)中可能由于开发人员对表的结构不够了解,造成开发过程中使用了不合理的方式造成数据库引擎未按预定执行,以致影响业务.这是非常值得注意的.这次为大家介绍由于隐式数据类型转换而造成的死锁及相应解决方案. 现实中有些程序员/数据库开发者会根据数据库的处理机制实现一些应用,如抢座应用,可能会对事务中的查询加一些列的Hint以细化粒度,实现应用的同时使得影响最低,但也有可能因为一些小细节的欠缺

Java程序员需要了解的五种开源协议

五种开源协议的比较(BSD,Apache,GPL,LGPL,MIT). 当Adobe.Microsoft.Sun等一系列巨头开始表现出对"开源"的青睐时,"开源"的时代即将到来! 现今存在的开源协议很多,而经过Open Source Initiative组织通过批准的开源协议目前有58种(http://www.opensource.org/licenses/alphabetical).我们在常见的开源协议如BSD, GPL, LGPL,MIT等都是OSI批准的协议.

Python 程序员必知必会的开发者工具

Python已经演化出了一个广泛的生态系统,该生态系统能够让Python程序员的生活变得更加简单,减少他们重复造轮的工作.同样的理念也适用于工具开发者的工作,即便他们开发出的工具并没有出现在最终的程序中.本文将介绍Python程序员必知必会的开发者工具. 对于开发者来说,最实用的帮助莫过于帮助他们编写代码文档了.pydoc模块可以根据源代码中的docstrings为任何可导入模块生成格式良好的文档.Python包含了两个测试框架来自动测试代码以及验证代码的正确性:1)doctest模块,该模块可

UNIX/Linux C 程序员需要掌握的七种武器

我是一名普通的软件工程师,不是什么技术大牛.这篇文章所提到的"七种武器"只是我这些年工作经验的一点体会和感悟,如果有错误的地方,还请大家指正. (一)C语言 作为一名C程序员,熟练掌握C语言是最基本的一项技能.关于如何学好C语言,以及C语言话题的讨论,网上有很多经典的文章,我就不一一列举了.在这里,我只想谈一点我个人的体会:刚毕业时,我来到一家比较大的软件公司工作,而公司的工作模式是每个人只负责一个小模块.这样工作两年后,我自认为我的C语言水平已经很高了.后来,我来到现在这家公司.由于

php程序员应具备的7种能力

 php程序员应具备的7种能力:        一个优秀php程序员应具备什么样的能力,才能更好的完成工作,才会有更好的发展方向呢?下面7种能力希望对您有所帮助.        一,php能力        1,了解阶段,您能写一些代码,因为那是在手册和google的帮助下,您才完成的.变量乱定义,N多函数不知道,做起事来很慢,想到什么写什么,代码写的比较乱,后期维护很麻烦.        2,熟悉阶段,经常查函数,手册估计也看过一,二遍了,常用的函数基本上您都了解了.后期维护给您带来了不少痛苦

程序员必知的LinuxShell命令

程序员必知的LinuxShell命令 grep (Globle Regular Expression Print全局正则表达式) 命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来 -c:只输出匹配行的计数. -I:不区分大 小写(只适用于单字符). -h:查询多文件时不显示文件名. -l:查询多文件时只输出包含匹配字符的文件名. -n:显示匹配行及 行号. -s:不显示不存在或无匹配文本的错误信息. -v:显示不包含匹配文本的所有行. pattern正则表达式主要

程序员必知35个jQuery 代码片段_jquery

jQuery如今已经成为Web开发中最流行的JavaScript库,通过jQuery和大量的插件,你可以轻松实现各种绚丽的效果.本文将为你介绍一些jquery实用的技巧,希望可以帮助你更加高效地使用jQuery. 收集的35个 jQuery 小技巧/代码片段,可以帮你快速开发. 1. 禁止右键点击 $(document).ready(function(){ $(document).bind("contextmenu",function(e){ return false; }); });

做一个优秀程序员应该知道的15件事_其它综合

1. 懂得分享.尽可能使用开源,并且当你有能力的时候,要对其有所贡献.聚全社会之智慧,胜过某些"大"公司之短视. 2. 公平竞争.尝试其他技术.框架.方法和观点.不要总以为只有你的选择才是可行的.别的选择也有可能比你的要强得多.要以开放的心态,来检验其他人的选择. 3. 不要攻击他人.像第2条所说的,不要仅仅因为别人恰巧使用.Net.Java或PHP就去攻击他们(我在这方面有一次教训).有时,它们或许要比你所认为的更有效.只要别人不是一无是处,你就可以从他们那里学到很多东西. 4. 自