Code Review最佳实践

原文链接 : Code Review Best Practices

在Wiredrive上,我们做了很多的Code Review。在此之前我从来没有做过,这对于我来说是一个全新的体验,下面来总结一下在Code Review中做的事情以及说说谈论Code Review的最好方式。

简单的说,Code Review是开发者之间讨论修改代码来解决问题的过程。很多文章谈论了Code Review的诸多好处,包括知识共享,代码的质量,开发者的成长,却很少讨论审查什么、如何审查。

审查的内容

体系结构和代码设计

  • 单一职责原则:一个类有且只能一个职责。我通常使用这个原则去衡量,如果我们必须使用“和”来描述一个方法做的事情,这可能在抽象层上出了问题。

  • 开闭原则如果是面向对象的语言,对象对可扩展开放、对修改关闭。如果我们需要添加另外的内容会怎样?

  • 代码复用:根据"三振法",如果代码被复制一次,虽然如喜欢这种方式,但通常没什么问题。但如果再一次被复制,就应该通过提取公共的部分来重构它。

  • 换位考虑,如果换位考虑,这行代码是否有问题?用这种模式是否可以发现代码中的问题。

  • 用更好的代码: 如果在一块混乱的代码做修改,添加几行代码也许更容易,但我建议更进一步,用比原来更好的代码。

  • 潜在的bugs:是否会引起的其他错误?循环是否以我们期望的方式终止?

  • 错误处理:错误确定被优雅的修改?会导致其他错误?如果这样,修改是否有用?

  • 效率: 如果代码中包含算法,这种算法是否是高效? 例如,在字典中使用迭代,遍历一个期望的值,这是一种低效的方式。

代码风格

  • 方法名: 在计算机科学中,命名是一个难题。一个函数被命名为==get_message_queue_name==,但做的却是完全不同的事情,比如从输入内容中清除html,那么这是一个不准确的命名,并且可能会误导。

  • 值名:对于数据结构,==foo== or ==bar== 可能是无用的名字。相比==exception==, ==e==同样是无用的。如果需要(根据语言)尽可能详细,在重新查看代码时,那些见名知意的命名是更容易理解的。

  • 函数长度: 对于一个函数的长度,我的经验值是小于20行,如果一个函数在50行以上,最好把它分成更小的函数块。

  • 类的长度:我认为类的长度应该小于300行,最好在100内。把较长的类分离成独立的类,这样更容易理解类的功能。

  • 文件的长度: 对于Python,一个文件最多1000行代码。任何高于此的文件应该把它分离成更小更内聚,看一下是否违背的“单一职责” 原则。

  • 文档:对于复杂的函数来说,参数个数可能较多,在文档中需要指出每个参数的用处,除了那些显而易见的。

  • 注释代码: 移除任何注释代码行。

  • 函数参数个数:不要太多, 一般不要超过3个。。

  • 可读性: 代码是否容易理解?在查看代码时要不断的停下来分析它?

测试

  • 测试的范围:我喜欢测试新功能。测试是否全面?是否涵盖了故障的情况【比如:网络,信号等,译者注】?是否容易使用?是否稳定?大多的测试?性能的快慢?
  • 合乎规范的测试:当复查测试时,确保我们用适当的方式。换句话说,当我们在一个较低水平测试却要求期望的功能?Gary Bernhardt建议95%的单元测试,5%的集成测试。特别是在Django项目中,在较高的测试水平上,很容易发现意外bug,创建一个详细的测试用例,认真仔细也是很重要的。

审查代码

在提交代码之前,我经常用git添加改变的文件/文件夹,然后通过git diff 来查看做了哪些修改。通常,我会关注如下几点:

  • 是否有注释?
  • 变量名是否见名知意?
  • ...等上面提到的

和著名的橡皮鸭调试法(Rubber Duck Debugging)一样,每次提交前整体把自己的代码过一遍非常有帮助,尤其是看看有没有犯低级错误。

如何进行Code Review

当Code Review时,会遇到不少问题,我也学会了如何处理,下面是一些方法:

  • 提问: 这个函数是如何生效的?如果需求变更,应该做什么改变?怎么更容易维护?
  • 表扬/奖励良好的做法:Code Review重要的一点是奖励开发者的成长和努力。得到别人的肯定是一件很不错的事情,我尽可能多的给人积极的评论。
  • 当面讨论代替评论。 大部分情况下小组内的同事是坐在一起的,当面的 code review是非常有效的。
  • 说明理由 :是否还有跟好的方式,证明为什么这样做是好的。

心态上

  • 作为一个Developer , 不仅要Deliver working code, 还要Deliver maintable code.
  • 必要时进行重构,随着项目的迭代,在计划新增功能的同时,开发要主动计划重构的工作项。
  • 开放的心态,虚心接受大家的Review Comments。

参考

一些关于clean code的书籍,如下:

译者注

一. 参考了 http://jimhuang.cn/?p=59
二. 国内阿里的陈皓写的关于codereview的文章,也很有见底,推荐大家看看
1.Code Review中的几个提示
  • 先Review设计实现思路,然后Review设计模式,接着Review成形的骨干代码,最后Review完成的代码,如果程序复杂的话,需要拆成几个单元或模块分别Review
  • Code Review不要太正式,而且要短
  • 学会享受Code Reivew
2.从Code Review 谈如何做技术
三. Code Review 工具

Review Board

四.

在Code Review时,要在 意识 方法 心态 习惯 这几个方面上下功夫,坚持code review,相信我们会在各方面有很大的提升。

Android安全概述

Android 安全架构的理解不仅帮助我了解 Android 的工作原理,而且为我开启了如何构建移动操作系统和 Linux 的眼界。 本章从安全角度讲解 Android 架构的基础知识。 在第 1....

发布于:1年以前  |  1727次阅读  |  详细内容 »

Android Linux 内核层安全

作为最广为人知的开源项目之一,Linux 已经被证明是一个安全,可信和稳定的软件,全世界数千人对它进行研究,攻击和打补丁。 不出所料,Linux 内核是 Android 操作系统的基...

发布于:1年以前  |  1515次阅读  |  详细内容 »

Android 本地用户空间层安全

本地用户空间层在 Android 操作系统的安全配置中起到重要作用。 不理解在该层上发生了什么,就不可能理解在系统中如何实施安全架构决策。 在本章中,我们的主题是 Android ...

发布于:1年以前  |  1203次阅读  |  详细内容 »

Android 框架层安全

如我们在第1.2节中所描述的那样,应用程序框架级别上的安全性由 IPC 引用监视器实现。 在 4.1 节中,我们以 Android 中使用的进程间通信系统的描述开始,讲解这个级别上的...

发布于:1年以前  |  1435次阅读  |  详细内容 »

Android 应用层安全

虽然在这一节中我们描述了应用层的安全性,但是实际的安全实施通常出现在到目前为止描述的底层。 但是,在介绍应用层之后,我们更容易解释 Android 的一些安全功能。 5.1 ...

发布于:1年以前  |  2051次阅读  |  详细内容 »

Android 安全的其它话题

在本章中,我们会涉及到与 Android 安全相关的其他主题,这些主题不直接属于已经涉及的任何主题。 6.1 Android 签名过程 Android 应用程序以 Android 应用包文件(.apk文件...

发布于:1年以前  |  1605次阅读  |  详细内容 »

数据绑定(Data Binding)-Part5

原文链接 : Data Binding - Part 5 直到现在,我们已经见识到Data Binding的很多功能了。但是还有一个很强大的特点没有介绍,那就是观察者模式的应用。 观察者模式在数据会...

发布于:1年以前  |  1075次阅读  |  详细内容 »

在Android 5.0中使用JobScheduler

原文链接 : using-the-jobscheduler-api-on-android-lollipop 在这篇文章中,你会学习到在Android 5.0中如何使用JobScheduler API。JobScheduler API允许开发者在符合某些...

发布于:1年以前  |  976次阅读  |  详细内容 »

Code Review最佳实践

原文链接 : Code Review Best Practices 在Wiredrive上,我们做了很多的Code Review。在此之前我从来没有做过,这对于我来说是一个全新的体验,下面来总结一下在Code Revie...

发布于:1年以前  |  1196次阅读  |  详细内容 »

从Dex到源代码(伪代码)

这个系列的头两篇文章中,我写了两篇关于APK format和aapt tool的文章. 在这篇文章中我将重点讲述dex2jar,它是一个作用于Android .dex文件和Java .class文件的工具。已经...

发布于:1年以前  |  1397次阅读  |  详细内容 »

第五章 基于空间的架构

第五章 基于空间的架构 大多数基于网站的商务应用都遵循相同的请求流程:一个请求从浏览器发到web服务器,然后到应用服务器,然后到数据库服务器。虽然这个模式在用户数不...

发布于:1年以前  |  1174次阅读  |  详细内容 »

Retrofit指南

这是一篇关于如何使用Retrofit写一个Android的REST客户端的小教程。 我为什么选择Retrofit? 在使用square的Retrofit之前,我尝试过Volley和AsyncTask。但在使用过Retrofi...

发布于:1年以前  |  1374次阅读  |  详细内容 »

使用Mockito对异步方法进行单元测试

原文链接 : Unit testing asynchronous methods with Mockito 之前我拍着胸脯承诺要维护的我博客,因此才有了这篇文章。但是请忘记我的那些承诺,我今天要写的是关于Mockit...

发布于:1年以前  |  1161次阅读  |  详细内容 »

Android中调试RxJava

原文链接 : Debugging RxJava on Android 调试是查找和分析bug的过程或者预防软件的正确操作出现问题Wikipedia。 当前调试不是一件容易的事情,我们在处理Android的异步操...

发布于:1年以前  |  814次阅读  |  详细内容 »

国内优秀Android学习资源

技术博客 应用开发 博主 博客 备注 任玉刚 CSDN博客 深入Android应用开发,深度与广度兼顾 郭霖 CSDN博客 内容实用,行文流畅,高人气博主 夏安明 CSDN博客 ...

发布于:1年以前  |  1205次阅读  |  详细内容 »

最多阅读

简化Android的UI开发 8月以前  |  198842次阅读
Android设计与开发工作流 7月以前  |  2335次阅读
Google Enjarify:可代替dex2jar的dex反编译 1年以前  |  2330次阅读
Android多渠道打包工具:apptools 1年以前  |  1953次阅读
Android权限 - 第一篇 1年以前  |  1913次阅读
Google Java编程风格规范(中文版) 1年以前  |  1899次阅读
Stetho 1年以前  |  1832次阅读
Android UI基本技术点 1年以前  |  1827次阅读
30分钟搭建一个android的私有Maven仓库 1年以前  |  1806次阅读
2015 Google IO带来的新 Android 开发工具 1年以前  |  1722次阅读
你应该知道的布局和属性 1年以前  |  1676次阅读
听FackBook工程师讲*Custom ViewGroups* 1年以前  |  1669次阅读
Gradle小知识#3:任务的顺序 1年以前  |  1647次阅读
MVP在Android平台上的应用 1年以前  |  1647次阅读