# 第二章 把信息装到名字里

# 选择专业的词

  • 避免使用过于通用的动词如"do"、"run"、"make"
  • 根据上下文选择更精确的词汇:
    • 获取数据:fetch/retrieve > get
    • 解析数据:parse > read
    • 查找元素:find/search > look

# 避免泛泛的名字

  • 避免使用tmp、data、info等无意义名称
  • 示例改进:
    • tempFile → uploadTempFile
    • data → userInputData
    • retval → parsedJsonResult

# 用具体的名字代替抽象的名字

  • 将抽象概念转化为具体实现:
    • ServerCanStart() → CanListenOnPort(8080)
    • DiskSpace() → FreeDiskSpaceInMB()
    • ProcessData() → DecryptAndValidateJson()

# 使用前缀或者后缀来给名字附带更多信息

  • 添加单位信息:
    • timeout → timeout_ms
    • size → size_kb
  • 添加类型信息:
    • name → name_str
    • count → count_int

# 决定名字的长度

  • 作用域规则:
    • 小作用域(1-5行):短名称(i, j)
    • 中等作用域:描述性名称(userIndex)
    • 大作用域:完整描述(currentActiveUserIndex)

# 利用名字的格式来表达含义

  • 常量:ALL_CAPS_WITH_UNDERSCORES
  • 类名:PascalCase
  • 函数名:camelCase
  • 私有变量:_leadingUnderscore

# 总结

本章唯一的主题是:把信息塞入名字中。这句话的含义是,读者仅通过读到名字就可以获得大量信息。

下面是讨论过的几个小提示:

  • 使用专业的的单词——例如,不用 Get ,而用 Fetch 或者 Download 可能会更好,这由上下文决定。
  • 避免空泛的名字,像 tmp 和 retval ,除非使用它们有特殊的理由。
  • 使用具体的名字来更细致地描述事物——ServerCanStart() 这个名字就比 CanListenOnPort() 更不清楚。
  • 给变量名带上重要的细节——例如,在值为毫秒的变量后加上 _ms。
  • 为作用域大的名字采用更长那个的名字——不要用让人费解的一个或两个字母的名字来命名。
  • 有目的的使用大小写、下划线