Skip to content
Go back

代码Review最佳实践

在实际工作中,经常会遇到项目交接或者二次开发的情况,在这个过程中,我们经常会听到“这是什么垃圾代码啊”。有时候我们翻看自己几年前写的代码,也会忍不住鄙视自己。

在软件开发过程中,代码Review是一个可以提高代码质量,统一代码规范,分享技术知识,从而形成增长团队的有效手段。

在代码Review过程中,存在两个角色:

在本文中,主要涉及了以下内容:

动机

通过代码Review可以提供代码质量,并且我们还可以通过代码Review来提高自我的能力。
比如:

Review什么

对于代码Review什么内容,可以有很多的方面,如:变量命名、代码结构、算法、架构、安全等等。具体内容没有一个统一的标准,但是在一个团队中,是需要形成一个统一的标准的,这样更有益于团队的可持续发展。

什么时候Review

代码需要在测试、CI之后,在合并上线分支之前。测试、CI等确保了逻辑是正确的。因为需要保证线上的代码是最优的,所以Review需要在合并分支之前。

准备Review

提交者需要提交一个便于Review的代码,避免浪费审查者的精力和时间:

进行Review

代码Review一定要及时,不能因为卡在没有进行Review而影响项目进度。如果审查者时间不允许,应立即告知提交者,让他找其他人对代码进行Review。

作为审查者,有责任执行编码标准并保持质量水准。 审查代码更多是一门艺术,而不是一门科学。 学习它的唯一方法就是去做。 有经验的审查者需要考虑让经验不足的审查者先Review,以此来提高他们的Review经验。

假设提交者遵循上面的指南(尤其是关于自我检查并确保代码可以运行的准则),审查者在代码Review过程中应注意的事项应注意一下事项:

示例

在以下示例中,建议的评论注释在代码块中由 // R:... 注释标识。

命名不一致

class MyClass {
  private int countTotalPageVisits;  //R: 变量命名不一致
  private int uniqueUsersCount;
}

方法签名不一致

interface MyInterface {
  /** Returns {@link Optional#empty} if s cannot be extracted. */
  public Optional<String> extractString(String s);

  /** Returns null if {@code s} cannot be rewritten. */
  //R: 应该协调返回值:在这里也使用Optional <>
  public String rewriteString(String s);
}

类库使用

//R: 使用Guava's MapJoiner替换以下方法
String joinAndConcatenate(Map<String, String> map, String keyValueSeparator, String keySeparator);

个人倾向

//R: nit: I usually prefer numFoo over fooCount; up to you,
//  but we should keep it consistent in this project
int dayCount;

Bugs

//R: 代码处理numIterations+1的情况,如果是故意这样处理,是否考虑变更numIterations值
for (int i = 0; i <= numIterations; ++i) {
  ...
}

架构疑虑

//R: I think we should avoid the dependency on OtherService.
// Can we discuss this in person?
otherService.call();

总结

通过有效的代码Review,可以提高项目代码质量,使团队开发人员形成统一风格,并同步项目细节。同时还可以提高团队人员的知识,提升自我。


Share this post on:

Previous Post
Angular之自定义组件添加默认样式
Next Post
Angular核心技术之组件