根据实际情况,为了加快Code Review的效率,采用重DesignReview,轻CodeReview的方式。
目标和原则
- 提高代码质量,及早发现潜在缺陷,降低修改/弥补缺陷的成本
- 促进团队内部知识共享,提高团队整体水平
- 评审过程对于评审人员来说,也是一种思路重构的过程,帮助更多的人理解系统
- 是一个传递知识的手段,可以让其它并不熟悉代码的人知道作者的意图和想法,从而可以在以后轻松维护代码
- 可以被用来确认自己的设计和实现是一个清楚和简单的
- 鼓励相互学习对方的长处和优点
- 高效迅速完成Code Review
Design Review
DesignReview是必须做的
- 检查设计是否合理使用设计模式
- 设计的逻辑是否能实现功能
- 设计的逻辑是否对多种情况进行兼容
- 代码的分层是否更容易扩展,符合开闭原则
- 设计逻辑是否存在漏洞
Code Review Checklist
Code Review主要检查代码中是否存在以下方面问题:
代码的一致性、编码风格、代码的安全问题、代码冗余、是否正确设计以满足需求(功能、性能)等等
为了Code Review的效率,以下规则需要针对不同任务选择合适的Review List。
完整性检查
- 代码是否完全实现了设计文档中提出的功能需求
- 代码是否已按照设计文档进行了集成和Debug
- 代码是否已创建了需要的数据库,包括正确的初始化数据
- 代码中是否存在任何没有定义或没有引用到的变量、常数或数据类型
一致性检查
- 代码的逻辑是否符合设计文档
- 代码中使用的格式、符号、结构等风格是否保持一致
正确性检查
- 代码是否符合制定的标准
- 所有的变量都被正确定义和使用
- 所有的注释都是准确的
- 所有的程序调用都使用了正确的参数个数
可修改性检查
- 代码涉及到的常量是否易于修改(如使用配置、定义为类常量、使用专门的常量类等)
- 代码中是否包含了交叉说明或数据字典,以描述程序是如何对变量和常量进行访问的
- 代码是否只有一个出口和一个入口(严重的异常处理除外)
可预测性检查
- 代码所用的开发语言是否具有定义良好的语法和语义
- 是否代码避免了依赖于开发语言缺省提供的功能
- 代码是否无意中陷入了死循环
- 代码是否是否避免了无穷递归
健壮性检查
- 异常处理和清理(释放)资源
- 代码是否采取措施避免运行时错误(如数组边界溢出、被零除、值越界、堆栈溢出等)
结构性检查
- 程序的每个功能是否都作为一个可辩识的代码块存在
- 循环是否只有一个入口
- 可追溯性检查
- 代码是否对每个程序进行了唯一标识
- 是否有一个交叉引用的框架可以用来在代码和开发文档之间相互对应
- 代码是否包括一个修订历史记录,记录中对代码的修改和原因都有记录
- 是否所有的安全功能都有标识
可理解性检查
- 注释是否足够清晰的描述每个子程序
- 是否使用到不明确或不必要的复杂代码,它们是否被清楚的注释
- 使用一些统一的格式化技巧(如缩进、空白等)用来增强代码的清晰度
- 是否在定义命名规则时采用了便于记忆,反映类型等方法
- 每个变量都定义了合法的取值范围
- 代码中的算法是否符合开发文档中描述的数学模型
可验证性检查
- 代码中的实现技术是否便于测试
可重用性
- DRY(Do not Repeat Yourself)原则:同一代码不应该重复两次以上
- 考虑可重用的服务,功能和组件
- 考虑通用函数和类
可扩展性
- 轻松添加功能,对现有代码进行最小的更改。一个组件可以被更好的组件替换
安全性
- 进行身份验证,授权,输入数据验证,避免诸如SQL注入和跨站脚本(XSS)等安全威胁 ,加密敏感数据(密码,信用卡信息等)
性能
- 使用合适的数据类型
- 减少数据库操作
- 懒加载,异步和并行处理
- 缓存和会话/应用程序数据
- 代码检查包括不局限于上述清单,提交人应在本地自我完成代码格式、架构设计、面向对象分析与设计等检查。