14.5 一种不同的意见:Go风格指南

不是每个人都赞同我对命名的看法。一些Go语言的开发者认为,名称应当非常简短,通常只有一个字符。在关于Go语言名称选择的演讲中,Andrew Gerrand指出,“长的名称会掩盖代码的作用”(见注解)。 他介绍了这个代码示例,其中使用了单字母变量名:

func RuneCount(b []byte) int { 
    i, n := 0, 0
    for i < len(b) {
        if b[i] < RuneSelf { 
            i++ 
        } else {
            _, size := DecodeRune(b[i:])    
            i += size 
        } 
        n++
    } 
    return n
}

并认为它比下面这个使用较长名称的版本更具可读性:

func RuneCount(buffer []byte) int {
    index, count := 0, 0 
    for index < len(buffer) { 
        if buffer[index] < RuneSelf { 
            index++ 
        } else { 
            _, size := DecodeRune(buffer[index:]) 
            index += size 
        } 
        count++
    } 
    return count
}

就个人而言,我不觉得第二个版本比第一个版本更难读。如果要说些什么的话,count这个名字对变量的行为提供了比n更好的线索。在第一个版本中,我为了弄清楚n的含义,最终通读了代码,而在第二个版本中,我不觉得需要这么做。但是,如果n在整个系统中被一致地用来指代计数(而不是其他),那么这个简短的名字对其他开发者来说可能会很清楚。

Go的文化鼓励用同一个短名称来表示多种不同的东西:ch表示字符或通道,d表示数据、差异或距离,等等。对我来说,像这样模棱两可的名字很可能会导致混乱和错误,就像在block的例子中一样。

总的来说,我认为可读性必须由读者来决定,而不是由编写者决定。如果你用简短的变量名编写代码,而阅读的人觉得很容易理解,那就很好。如果你开始收到抱怨说你的代码很晦涩难懂,那么你应该考虑使用更长的名字(在网上搜索“go language short names”就会发现一些这样的抱怨)。同样地,如果我开始收到抱怨说长的变量名使我的代码更难读,那么我会考虑使用更短的。

Gerrand提出了一个我同意的意见。“一个名称的声明和它的使用之间的距离越大,这个名字就应该越长”。先前关于使用名为ij的循环变量的讨论就是这个规则的一个例子。

Last updated