• 2.2. 标识符长度

    2.2. 标识符长度

    有时候人们批评 Go 语言推荐短变量名的风格。正如 Rob Pike 所说,“ Go 程序员想要正确的长度的标识符”。 [1]

    Andrew Gerrand 建议通过对某些事物使用更长的标识,向读者表明它们具有更高的重要性。

    The greater the distance between a name’s declaration and its uses, the longer the name should be. (名字的声明与其使用之间的距离越大,名字应该越长。) — Andrew Gerrand [2]

    由此我们可以得出一些指导方针:

    • 短变量名称在声明和上次使用之间的距离很短时效果很好。
    • 长变量名称需要证明自己的合理性; 名称越长,需要提供的价值越高。冗长的名称与页面上的重量相比,信号量较小。
    • 请勿在变量名称中包含类型名称。
    • 常量应该描述它们持有的值,而不是该如何使用。
    • 对于循环和分支使用单字母变量,参数和返回值使用单个字,函数和包级别声明使用多个单词
    • 方法、接口和包使用单个词。
    • 请记住,包的名称是调用者用来引用名称的一部分,因此要好好利用这一点。

    我们来举个栗子:

    1. type Person struct {
    2. Name string
    3. Age int
    4. }
    5. // AverageAge returns the average age of people.
    6. func AverageAge(people []Person) int {
    7. if len(people) == 0 {
    8. return 0
    9. }
    10. var count, sum int
    11. for _, p := range people {
    12. sum += p.Age
    13. count += 1
    14. }
    15. return sum / count
    16. }

    在此示例中,变量 p 的在第 10 行被声明并且也只在接下来的一行中被引用。 p 在执行函数期间存在时间很短。如果要了解 p 的作用只需阅读两行代码。

    相比之下,people 在函数第 7 行参数中被声明。sumcount 也是如此,他们用了更长的名字。读者必须查看更多的行数来定位它们,因此他们名字更为独特。

    我可以选择 s 替代 sum 以及 c(或可能是 n)替代 count,但是这样做会将程序中的所有变量份量降低到同样的级别。我可以选择 p 来代替 people,但是用什么来调用 for ... range 迭代变量。如果用 person 的话看起来很奇怪,因为循环迭代变量的生命时间很短,其名字的长度超出了它的值。

    贴士:与使用段落分解文档的方式一样用空行来分解函数。 在 AverageAge 中,按顺序共有三个操作。 第一个是前提条件,检查 people 是否为空,第二个是 sumcount 的累积,最后是平均值的计算。