代码审查

代码审查清单

常规项

  • 代码能够工作么?它有没有实现预期的功能,逻辑是否正确等

  • 所有的代码是否简单易懂?

  • 代码符合你所遵循的编程规范么?这通常包括大括号的位置,变量名和函数名,行的长度,缩进,格式和注释。

  • 是否存在多余的或是重复的代码?

  • 代码是否尽可能的模块化了?

  • 是否有可以被替换的全局变量?

  • 是否有被注释掉的代码?

  • 循环是否设置了长度和正确的终止条件?

  • 是否有可以被库函数替代的代码?

  • 是否有可以删除的日志或调试代码?

安全

  • 所有的数据输入是否都进行了检查(检测正确的类型,长度,格式和范围)并且进行了编码?

  • 在哪里使用了第三方工具,返回的错误是否被捕获?

  • 输出的值是否进行了检查并且编码?

  • 无效的参数值是否能够处理?

文档

  • 是否有注释,并且描述了代码的意图?

  • 所有的函数都有注释吗?

  • 对非常规行为和边界情况处理是否有描述?

  • 第三方库的使用和函数是否有文档?

  • 数据结构和计量单位是否进行了解释?

  • 是否有未完成的代码?如果是的话,是不是应该移除,或者用合适的标记进行标记比如‘TODO’?

测试

  • 代码是否可以测试?比如,不要添加太多的或是隐藏的依赖关系,不能够初始化对象,测试框架可以使用方法等。

  • 是否存在测试,它们是否可以被理解?比如,至少达到你满意的代码覆盖(code coverage)。

  • 单元测试是否真正的测试了代码是否可以完成预期的功能?

  • 是否检查了数组的“越界“错误?

  • 是否有可以被已经存在的API所替代的测试代码?

代码审查列表

结构

1   代码是否正确完整的实现了设计? 
2   代码是否符合相关的编码标准?  
3   代码结构是否适当,风格和格式是否保持一致?   
4   代码中是否有没有被调用的或无用的程序,或没有被执行的代码?   
5   代码中是否还有多余的桩程序或测试代码? 
6   是否存在能被调用外部复用组件或库函数替代的代码?    
7   有没有能被压缩成简单程序的程序块或重复的代码? 
8   存储空间是否被有效利用?    
9   数字和字符串常量是否用符号代替?    
10  是否有过于复杂的模块需要重新构造或拆分成多个程序?   

文档

1   代码是否已被用易于维护的注释方式清晰充分的文档化?   
2   注释是否与代码协调一致?    

变量

1   所有变量的命名是否清晰,一致并且有意义?    
2   所有被赋值的变量赋值类型是否一致或有类型转换? 
3   是否有冗余或无用的变量?    

算法操作

1   代码是否避免了对浮点型数值的相等比较操作?   
2   被除数是否做了零值测试和噪音测试?   

循环和分支

1   所有的循环,分支和逻辑构造是否完整,正确并且欠套适当? 
2IF-ELSEIF链中,最一般的状况是否最先被考虑到?    
3   所有可能的状况,包含ELSE语句或DEFAULT语句是否都被覆盖到IF--ELSEIFCASE块中? 
4   每种状况是否都有缺省值?    
5   循环结束的条件是否明显并且总是可以达到?    
6   索引或下标在循环开始前被正确初始化?  
7   在循环中的声明是否能放到循环之外?   
8   代码中的循环是否避免了对索引变量进行操作或依靠索引变量来退出循环?   

防御性编程

1   索引,指针和下标是否经过了数组,记录或文件的边界测试  
2   是否验证了导入的数据或输入的参数的正确性和完整性?   
3   所有的输出变量是否都被赋值?  
4   在每个声明中数据是否被正确操作?    
5   分配的内存空间是否都被释放?  
6   对于外部设备接入是否有超时设计或错误陷阱?   
7   在操作文件时是否判断了文件存在与否?  
8   在程序结束的时候所有的文件和设备是否都保持了正确的状态?    

java版
变量,Auribute,和常量声明缺陷(VC)

变量和常量的命名是否与约定保持一致?  
是否存在容易混淆的相似的变量和属性名? 
变量和属性是否书写正确?    
变量和属性是否被正确的初始化? 
非局部变量是否能用局部变量替换?    
所有的for循环的控制变量是否都在循环顶部被声明?   
是否有应该命名为常量的文字常量?    
变量和属性是否可以用常量替换? 
属性是否可以用本地变量?    
所有的属性是否都有正确的访问限制符(private,protected,public)?    
是否有静态属性应该是非静态或vice-versa?   

方法定义缺陷(FD)

方法名的描述方法是否与命名约定一致?  
每个方法的参数值在使用之前是否都作了检查?   
对于每一个方法,它是否都返回了正确的值?    
每种方法是否都有正确的访问限制符(private, protected, public)?   
静态方法是否应该为非静态或vice-versa?    

类定义缺陷(CD)

每一个类是否都有正确的构造函数和析构函数?   
在子类中是否有应该放到父类中的通用成员?    
类的继承层次是否能被简化?   

数据引用缺陷(DR)

对于每一个数组引用,下标值是否在定义的范围内? 
对于对象和数组引用,是否组确定其值应为非空?  

计算/数值缺陷(CN)

是否存在不同类型数据之间的混合计算?  
在计算中是否存在上溢或下溢的可能?   
关于数值计算的顺序和优先级的假设是否正确?   
是否用了括号来避免模糊不清?  

比较/关系缺陷(CR)

对每一个布尔测试,正确条件是否被检查? 
比较操作符是否正确?  
布尔表达式是否通过内部否定操作进行了简化    
每个布尔表达式是否都正确?   
比较操作是否存在不引人注意的副作用?  
"&&"是否被不小心替换为''&"? ''||''是否被不小心替换为''|"? 

流程控制缺陷(CF)

对于每一个循环:是否选用了最佳的循环结构?   
所有的循环是否都能结束?    
如果一个循环有多个出口,是否每个出口都有必要并且得到正确处理? 
switch声明是否都有default条件?  
是否所有的case-switch-break对应关系都已更正并加上批注?    
是否named break叙述都跳到正确的地方?    
循环和分支的嵌套是否过深?是否正确?  
是否有if嵌套可以转换程switch嵌套?   
空控制叙述是否都正确,并加上括号及批注?    
所有的异常是否都得到了正确的处理    
每一个方法在是否都结束?    

输入输出缺陷(IO)

文件在被使用之前是否都被打开? 
输入对象的属性是否与使用的文件一致?  
文件在被使用之后是否都被关闭? 

计算/数值缺陷(CN)

文本中是否有拼写和语法上的错误?    
所有的I/O异常处理的是否合理?    

模块间接口缺陷

方法调用的参数的数量,顺序,类型和值是否与该方法声明一致?   
度量单位是否一致(如:公分 vs. 公尺)?  
如果对象或数组被传递,它们是否改变?是否被调用方法正确改变?  

注释缺陷(CM)

每一个方法,类和文件是否都有适当的头注释?   
每一个属性,变量和常量的声明是否都有注释?   
每个类和方法的潜在行为是否都有用简易的语言进行解释?  
方法和类的头注释是否和它们的功能保持一致?   
注释和代码是否保持一致?    
注释对于理解代码是否有帮助?  
代码中的注释是否充分? 
代码中的注释是否过多? 

布局和封包缺陷(LP)

代码布局格式和缩排标准是否前后一致?  
对于每一个方法,它的代码量是否都不超过60行? 
对于每一个编译模块,它的代码量是否都不超过600行?  

模块性缺陷 (MO)

模块(方法,类)之间是否具有低偶合性? 
每个模块(方法,类)自身是否具有高聚合性?   
是否存在重复的代码,它的功能可以通过调用其它方法实现? 
C#类库的使用是否适时适地?  

存储器使用缺陷(SU)

数组是否足够大?    
数组和对象不再使用之后,它们的引用是否被赋为空值?   

性能缺陷 (PE) [可选]

是否有更好的数据结构和算法可以采用?  
测试安排是否合理,使易于通过的且代价低廉的测试优先于代价较高且通过频率较低的测试?   
是否可以通过对数值进行一次计算并将结果保存来减少对它重新计算带来的消耗?    
每一个计算出并保存了的结果是否都被应用?    
计算是否能被移到循环之外?   
在循环内是否有不需要的测试?  
短循环是否可以取消?  
对同一个数据进行操作的两个循环是否可以合并成一个?   

代码审查_第1张图片

部分摘抄自伯乐在线
英文出处:Gareth Wilson

你可能感兴趣的:(代码审查)