版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Code Review 简介1 Code Review 的目的凡事知其然还要知其所以然,我们首先需要知道什么是Code Review和我们使用它的目的是什么。Code Review是一种用来确认方案设计和代码实现的质量保证 机制,通过这个机制我们可以对代码,测试过程和注释进行检查。Code Review主要用来在软件工程过程中改进代码质量,通过Code Review可以达到如下目的:在项目早期就能够发现代码中的 BUG帮助初级开发人员学习高级开发人员的经验,达到知识共享避免开发人员犯一些很常见,很普通的错误保证项目组人员的良好沟通项目或产品的代码更容易维护2 Code Review 的前提知道
2、了 Code Review的目的,我们就可以看看如何做 Code Review了,但在做 Code Review前我们还有事要做,所谓预则立,不预则废,就是说如果在进入CodeReview之前我们不做些准备工作,Code Review很容易就变得没有意义或是流于 形式,这在我们周围是有很多例子的啊。进入Code Review需要检查的条件如下:a) Code Review人员是否理解了 Code Review的概念和 Code Review将做 什么如果做Code Review的人员不能理解 Code Review对项目成败和代码质 量的重要程度,他们的做法可能就会是应付了事。b)代码是否已经
3、正确的build , build的目的使得代码已经不存在基本语法 错误我们总不希望高级开发人员或是主管将时间浪费在检查连编译都通不过 的代码上吧。c)代码执行时功能是否正确Code Review人员也不负责检查代码的功能是否正确,也就是说,需要 复查的代码必须由开发人员或质量人员负责该代码的功能的正确性。d) Review人员是否理解了代码做复查的人员需要对该代码有一个基本的了解,其功能是什么,是拿 一方面的代码,涉及到数据库或是通讯,这样才能采取针对性的检查 e)开发人员是否对代码做了单元测试这一点也是为了保证Code Review前一些语法和功能问题已经得到解决, Code Review人
4、员可以将精力集中在代码的质量上。3 Code Review 需要做什么好了,进入条件准备好了,有人在这些条件中看到Code Review这也不负责,那也不检查,不禁会问,Code Review到底做什么?其实 Code Review主要检查代 码中是否存在以下方面问题:代码的一致性、编码风格、代码的安全问题、代码冗 余、是否正确设计以满足需求(性能、功能等等),下边我们一一道来。以下内容 参考了 « Software Quality Assurance: Documentation and Reviews 文中的代码检 查部分。3. 1 完整性检查(Completeness)代码是否
5、完全实现了设计文档中提出的功能需求代码是否已按照设计文档进行了集成和Debug代码是否已创建了需要的数据库,包括正确的初始化数据代码中是否存在任何没有定义或没有引用到的变量、常数或数据类型4. 2一致性检查(Consistency )代码的逻辑是否符合设计文档代码中使用的格式、符号、结构等风格是否保持一致5. 3正确性检查(Correctness )代码是否符合制定的标准所有的变量都被正确定义和使用所有的注释都是准确的所有的程序调用都使用了正确的参数个数3. 4可修改性检查(Modifiability )代码涉及到的常量是否易于修改(如使用配置、定义为类常量、使用专门的 常量类等)代码中是否包
6、含了交叉说明或数据字典,以描述程序是如何对变量和常量进 行访问的代码是否只有一个出口和一个入口(严重的异常处理除外)4. 5可预测性检查(Predictability )代码所用的开发语言是否具有定义良好的语法和语义是否代码避免了依赖于开发语言缺省提供的功能代码是否无意中陷入了死循环代码是否是否避免了无穷递归5. 6健壮性检查(Robustness)代码是否采取措施避免运行时错误(如数组边界溢出、被零除、值越界、堆 栈溢出等)6. 7结构性检查(Structuredness )程序的每个功能是否都作为一个可辩识的代码块存在循环是否只有一个入口3. 8可追溯性检查(Traceability )代
7、码是否对每个程序进行了唯一标识是否有一个交叉引用的框架可以用来在代码和开发文档之间相互对应 代码是否包括一个修订历史记录,记录中对代码的修改和原因都有记录 是否所有的安全功能都有标识3. 9可理解性检查(Understandability )注释是否足够清晰的描述每个子程序是否使用到不明确或不必要的复杂代码,它们是否被清楚的注释使用一些统一的格式化技巧(如缩进、空白等)用来增强代码的清晰度是否在定义命名规则时采用了便于记忆,反映类型等方法每个变量都定义了合法的取值范围代码中的算法是否符合开发文档中描述的数学模型3. 10可验证性检查(Verifiability)代码中的实现技术是否便于测试二、
8、Code Review经验检查项以下是在实践中建立的检查列表(checklist),通过分类和有针对性的检 查项,保证了 Code Review可以有的放矢。1 JAVA编码规范方面检查项检查项参照JAVA编码规范执行,见JAVA编码规范(Java Code Convention s)»2面向对象设计方面检查项这几点的范围都很大,不可能在本文展开讨论,有专门的书籍介绍这方面问题,当然在Code Review中主要靠经验来判断。A)类设计和抽象是否合适B)是否符合面向接口编程的思想C)是否采用合适的设计范式3性能方面检查项性能检查在大多数代码中都是需要严重关注的方面,也是最容易出现问题
9、的方 面,常常有程序员写出了功能和语法没有丝毫问题的代码后,正式运行时却在性能 上表现不佳,从而不得不做大量的返工,甚至是推倒重来。A)在海量数据出现时,队列,表,文件,在传输,upload等方面是否会出现问题,有 无控制,如分配的内存块大小,队列长度等控制参数B)对hashtable,vector等集合类数据结构的选择和设置是否合适,如正确设置capacity,load factor等参数,数据结构的是否是同步的C)有无滥用String对象的现象D)是否采用通用的线程池、对象池模块等cache技术以提高性能E)类的接口是否定义良好,如参数类型等,避免内部转换F)是否采用内存或硬盘缓冲机制以提
10、高效率G)并发访问时的应对策略H) I/O方面是否使用了合适的类或采用良好的方法以提高性能(如减少序列化, 使用buffer类封装流等)I) 同步方法的使用是否得当,是否过度使用J)递归方法中的叠代次数是否合适,应该保证在合理的栈空间范围内K)如果调用了阻塞方法,是否考虑了保证性能的措施L)避免过度优化,对性能要求高的代码是否使用profile 工具,如Jprobe等4资源泄漏处理方面检查项对于JAVA来说由于存在垃圾收集机制,所以内存泄漏不是太明显,但使用不当,仍然存在内存泄漏的问题。而对于其它的语言,如C+等在这方面就要严重关注了。当然数据库连接资源不释放的问题也是广大程序员最常见的,相信
11、有很多 的PM被这个问题折磨的死去活来。A)分配的内存是否释放,尤其在错误处理路径上(对非 JAVA类)B)错误发生时是否所有的对象被释放,如数据库连接、Socket、文件等C)是否同一个对象被释放多次(对非 JAVA类)D)代码是否保存准确的对象reference计数(对非JAVA类)5线程安全方面检查项线程安全问题实际涉及两个方面,一个是性能,另一个是资源的一致性,我们 需要在这两方面做个权衡,现在就是到了权衡利弊的时候了。A)代码中所有的全局变量是否是线程安全的B)需要被多个线程访问的对象是否线程安全,检查有无通过同步方法保护C)同步对象上的锁是否按相同的顺序获得和释放以避免死锁,注意错
12、误处理代码D)是否存在可能的死锁或是竞争,当用到多个锁时,避免出现类似情况:线程A获得锁1,然后锁2,线程B获得锁2,然后锁1E)在保证线程安全的同时,要注意避免过度使用同步,导致性能降低6程序流程方面检查项A)循环结束条件是否准确B)是否避免了死循环的产生C)对循环的处理是否合适,如循环变量,局部对象,循环次数等能够考虑到性 能方面的影响7数据库处理方面很多Code Review人员在面对代码中涉及到的数据库可移植性和提高数据库性 能方面的冲突时表现的无所适从,凡事很难两全其美的啊。A)数据库设计或SQM句是否便于移植(注意和性能方面会存在冲突)B)数据库资源是否正常关闭和释放C)数据库访问
13、模块是否正确封装,便于管理和提高性能D)是否采用合适的事务隔离级别E)是否采用存储过程以提高性能F) 是否采用PreparedStatement以提高性能8通讯方面检查项A) socket通讯是否存在长期阻塞问题B)发送接收的数据流是否采用缓冲机制C) socket超时处理,异常处理D)数据传输的流量控制问题9 JAVA对象处理方面检查项这个检查项的基础是对JAVA对象有较深的理解,但现实是很多看过Thinki ng in Java的程序员,仍然在程序中无法区分传值和传引用,以及对象和 referenc e的区别。这或许就是理论和实践难以结合的问题啊。正所谓知而不行,非真知 也。A)对象生命周
14、期的处理,是否对象的reference已经失效,能够设置为null,并被 回收B)在对象的传值和传参方面有无问题,对象的clone方法使用是否过度C)是否大量经常的创建临时对象D)是否尽量使用局部对象(堆栈对象)E)在只需要对象reference的地方是否创建了新的对象实例10异常处理方面检查项JAVA中提供了方便的异常处理机制,但普遍存在的是异常被捕获,但并没有得到处理。我们可以打开一段代码,最常见的现象是进入某个方法后,一个大的try/catch将所有代码行括住,然后在catch中将异常打印到控制台,而且该异常是 E xception 对象。A)每次当方法返回时是否正确处理了异常,如最简单
15、的处理,记录日志到日志 文件中B)是否对数据的值和范围是否合法进行校验,包括采用断言(assertion)C)在出错路径上是否所有的资源和内存都已经释放D)所有抛出的异常都得到正确的处理,特别是对子方法抛出的异常,在整个调 用栈中必须能够被捕捉并处理E)当调用导致错误发生时,方法的调用者应该得到一个通知F)不要忘了对错误处理部分的代码进行测试,很多代码在正常情况下执行良 好,而一旦出错,整个系统就崩溃了11方法(函数)方面检查项A)方法的参数是否都做了校验B)数组类结构是否做了边界校验C)变量在使用前是否做了初始化D) 返回堆又t象的reference,不要返回栈对象的referenceE)方法API是否被良好定义,即是否尽量面向接口编程,便于维护和重构12安全方面检查项A)对命令行执行的代码,需要详细检查命令
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年土地使用权交易代理合同6篇
- 2024年度体育用品设计与开发合同3篇
- 2024版虚拟现实游戏ODM合作开发合同3篇
- 2024年企业综合信息化管理系统定制合同
- 2024年度版权买卖合同:青苔有声书著作权交易3篇
- 2024大连市夫妻协商一致离婚协议范例
- 2024年度风力发电项目合作协议
- 2024年上海房产交易正式协议文件版A版
- 2024年并购交易中介服务协议样式
- 2024年供应链管理与优化协议5篇
- 精神科保护性约束问题课件
- 原发性肺癌临床路径
- 2024-2025华为ICT大赛(云赛道)高频备考试题库500题(含详解)
- (中级)数据安全管理员(四级)职业技能鉴定考试题库-上(单选题)
- 2024年度特别版磷矿石购销合同(修订版)
- 空调设计答辩
- 2023年吕梁市公安机关辅警招聘笔试真题
- 加油站应急救援处置卡(全)
- 骨科骨折课件教学课件
- 2024年四川省公务员考试《行测》真题及答案解析
- 2024-2030年中国电动工具配件行业市场发展趋势与前景展望战略分析报告
评论
0/150
提交评论