代码审查拯救世界?

代码审查是指阅读代码来检查源代码与编码标准的符合性以及代码质量的活动。现在,越来越多的团队倡导要进行代码审查活动,而本文作者通过一幅漫画,来诠释其对代码审查的理解,观点可能不符合大家的常规心理。以下为译文:

一天早晨,本文作者在Twitter上面看到这样一条推文:

Why code reviews are important? pic.twitter.com/8KyMo7Syis — Arun Gupta (@arungupta) August 28, 2016

该条推文下面放了Oppressive Silence网站上的一组漫画:

通过代码审查解决?

我想问的主要问题:

代码审查期间真的会发现问题或bug吗?

我的回答可能不会惊艳到你,下面我从四个方面来回答这个问题,至少这样的问题不应该发生在我(或者任何其它有经验的程序员)身上。

➤静态变量/全局状态(Static variables/global state)

第一个非常明显的错误是把变量isCrazyMurderingRobot设置成static并且是可变的。程序员在下面就很难推论和跟踪这个变量,任何程序员都可以给它赋值,这是完全不可接受的,没有任何理由把该变量设置成可变的静态类型。

重要提示:如果你要设置变量,特别是可变变量,那么,你应该把它的作用域范围最小化。

➤Final方法参数

如果你把全局状态的问题解决了,那么代码很有可能是这样的(转换成Java代码):

 private void interact_with_humans(boolean isCrazyMurderingRobot) {
    if(isCrazyMurderingRobot = true) {
        kill(humans);
    } else {
        be_nice_to(humans);
    }
}

任何时候,只要把一个参数传递到一个方法中,都应该把该参数设置成final。方法里的参数应该是不可变的。这可能意味着,方法应该拥有属于自己的(作用域)可变变量。

下面的代码变化:

private void interact_with_humans(final boolean isCrazyMurderingRobot) {
    if(isCrazyMurderingRobot = true) {
    // Compilation error: 'Cannot assign a value to final variable 'isCrazyMurderingRobot'

在告诉我错误之前,这段代码根本不会编译,好了,世界得救了!

➤静态代码分析

这样的bug在我的代码中根本不会发生,因为我们在整个项目中都启用了静态代码分析。例如FindBugs这款软件,它会立即揪出这种bug。

看一下FindBugs里的特定检查:

QBA: Method assigns boolean literal in boolean expression (QBA_QUESTIONABLE_BOOLEAN_ASSIGNMENT)


This method assigns a literal boolean value (true or false) to a boolean variable inside an if or while expression. Most probably this was supposed to be a boolean comparison using ==, not an assignment using =.

在现代编程中,静态代码分析工具是必不可少的。

➤Yoda conditions

另外一个好习惯使我的代码中永远都不会发生这样的bug,采用Yoda模式来编写If语句。原因是它会在cartoon里完全阻止这个bug。

在cartoon中,这个if语句会由“疯狂谋杀机器是真的吗?”转变为:“真的要疯狂谋杀机器人吗?”

如果这样做,代码应该是:

private void interact_with_humans(boolean isCrazyMurderingRobot) {
    if(true = isCrazyMurderingRobot) {
    // Compilation error: 'Variable expected'

结论/拯救世界

所以,你认为Arun的观点是正确的吗?代码审查会发现这个bug吗?对还是不对呢?

人类擅长推理、思考、富有创造性、并且发现错误,但语法编译对人类来说是一件可怕的事情。在代码审查期间,你可能仅仅发现一些拼写或基础错误(typo)但并未真正发现bug。难道第二双眼睛就可以发现了吗?

原文发布于微信公众号 - CSDN技术头条(CSDN_Tech)

原文发表时间:2016-08-31

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏养码场

限时领取| 6GJavaScript高级视频,高级前端工程师必备武器!

之前场主分享了13G的JavaScript基础视频,共140集实战教学。没想到领取人数竟超过了5000+,着实让场主感受到了JavaScript教程的需求,及还...

772
来自专栏玄魂工作室

Python黑帽编程 2.0 第二章概述

于 20世纪80年代末,Guido van Rossum发明了Python,初衷据说是为了打发圣诞节的无趣,1991年首次发布,是ABC语言的继承,同时也是一...

3637
来自专栏斑斓

面向流的设计思想

作者 | 张逸 特别说明:本文包含大量代码片段,若要获得更好阅读观感,请点击文末“阅读原文”或访问我的博客。 响应式编程(Reactive Programmin...

3543
来自专栏平凡文摘

十年之后再看“面向对象”

1143
来自专栏landv

C#本质论第四版-1,抄书才能看下去,不然两三眼就看完了,一摞书都成了摆设。抄下了记忆更深刻

4203
来自专栏牛客网

美团点评2019届机器学习/数据挖掘算法实习生一面

3.14网申的(北京,基础研究部门),3.20笔试。二十多天没消息,然后今天(4.12)下午接到美团面试电话,当然是前两天约好的,面试官大概迟到了十多分钟。 Q...

4206
来自专栏韩伟的专栏

字节的奥秘

在数码产品中,最常见的名词就是“字节”了。不管是U盘容量、手机存储空间,还是网络带宽,下载速度,都会涉及所谓“字节”这个单位。但到底“字节”是一个什么东西呢?本...

3584
来自专栏程序人生

代码命名:僧敲月下门

忽一日於驴上吟得:‘鸟宿池中树,僧敲月下门。’初欲著‘推’字,或欲著‘敲’字,炼之未定,遂于驴上作‘推’字手势,又作‘敲’字手势。 - 《鉴戒录·贾忤旨》 两句...

2917
来自专栏企鹅号快讯

C语言的前世今生,及其特点、利弊和入门须知三把斧

C语言的开展前史: ? 20世纪70年代初,贝尔实验室的Dennis Richie 等人在B语言基础上开发C语言,最初是作为UNIX的开发语言; 20世纪70年...

2136
来自专栏TensorFlow从0到N

讨厌算法的程序员 4 - 时间复杂度

增长量级 ? 函数的增长量级 上一篇算法分析基础中,我们分析了插入排序,知道了其最好情况下的运行时间为T(n) = an + b,最差情况下的运行时间为T(n...

2993

扫码关注云+社区