讨论如何为变量取好的名字与讨论如何高效编程同样重要,好的变量名是提高程序可读性的一项关键因素。

1、选择好变量名的注意事项

  • 最重要的命名注意事项

    为变量命名时最重要的考虑事项是,改名字要完全、准确地描述出该变量所代表的事物。获得好名字的一种技巧是用文字表达变量所代表的是什么,对变量的描述就是最佳变量名。

  • 以问题为导向

    一个好记的名字反映的通常是问题而不是解决方案。一个好名字通常表达的是“什么”(what),而不是“如何”(how)。避免使用反映计算机某些方面的而不是反映问题本身的名字。

  • 最适当的名字长度

    确保变量名字的含义足够清晰,太短的名字无法传达足够的信息,在不印象变量含义的情况下,比较合理的长度是10到16个字符。

  • 变量名对作用域的影响

    较短的变量名适用于局部变量或者循环变量。如i,j,k,tmp

    对位于全局命名空间中的名字加以限定词,不支持命名空间的语言,可以给变量加上前缀,避免出现命名冲突。

  • 变量名中的计算值限定词

    对于total、sum、average、max、min、record、string、pointer这样的限定词,最好加在名字的最后。

  • 变量名中的常用对仗词、

    对仗词的使用要准确,使用容易理解和记忆的对仗词组,避免产生歧义。

    常用对仗词:

      begin/end
      first/last
      locked/unlocked
      min/max
      next/previous
      old/new
      opened/closed
      visible/invisible
      source/target
      source/destination
      up/down
    

2、为特定类型的数据命名

  • 为循环下标命名

    循环是一种极为常见的计算机编程特征,i、j、k等是约定俗成的变量名。

    如果一个变量要在循环之外使用,那么就应该在循环前定义一个名字更有意义的变量,循环里面操作该变量,循环结束之后再使用这个变量。

    如果循环里代码行数较多,最好给循环下标换一个更有意义的名字,以免在修改代码或者循环嵌套时误用变量,避免下标串话。

  • 为状态变量命名

    最好把标记看做状态变量,标记的名字中不应该含有flag,因为看不出该标记是做什么的。

  • 为临时变量命名

    临时变量用于存储计算的中间结果,常被赋予temp、x等模糊的名字,应该尽量使用有意义的名字代替含义模糊的临时变量名字,因为程序中大多数的变量都可以称临时变量。

  • 为布尔变量命名

    有用的布尔变量命名

    • 用done表示某件事情已经完成
    • 用error表示有错误发生
    • 用found表明某个值已经找到
    • 用success或ok来表明一项操作是成功的

    给布尔变量赋予隐含“真/假”含义的名字,其状态要么是true,要么是false。可以考虑在名字前加上is,来避免那些模糊不清的布尔变量名。如变量名isStatus是无意义的。

    使用肯定的布尔变量名,这样的程序更易阅读,也不会出现双重否定的运算符(!notFound)了。

  • 为枚举类型命名

    在使用枚举类型的时候,可以通过使用组前缀(如Color_、Plant_)来明确表示该类型的成员都属于一个组。

  • 为常量命名

    应该根据具名常量所表示的含义而不是该常量具有的数值来命名。

3、命名规则的力量

  • 为什么要有规则

    • 要求你更多的按规矩行事
    • 有助于在项目之间传递知识
    • 有助于在新项目中更快速的学习代码
    • 有助于减少名字增生
    • 弥补编程语言的不足之处
    • 强调相关变量之间的关系

    命名规则的存在为你的代码增加了结构,减少了需要考虑的事情。

  • 何时采用命名规则

    下面的情况下,命名规则是很有价值的:

    • 当多个程序员合作开发一个项目时
    • 当你计划把一个程序转交给另一位程序员来修改和维护的时候
    • 当你所在的组织中的其他程序员评估你写的程序的时候
    • 当你写的程序规模太大,以至于你无法再脑海里同时了解事情的全貌,而必须分而治之的时候
    • 当你写的程序生命期足够长,长到你可能在搁置几个星期或者几个月之后又重新启动有关该程序的工作时
    • 当你在一个项目中存在一个写不常见的术语,并希望在编写代码阶段使用标准的术语或者缩写的时候。
  • 正式程度

    不同规则所要求的正式程度也有所不同,这取决于为同一程序而工作的人员数量、程序的规模以及程序预期的生命期。

4、非正式命名规则

  • 与语言无关的命名规则的指导原则

    • 区分变量名和子程序名字
    • 区分类和对象
    • 标识全局变量
    • 标识成员变量
    • 标识类型声明
    • 标识具名常量
    • 标识枚举类型的元素
    • 再不能保证输入参数只读的于艳丽标识只读参数
    • 格式化命名以提高可读性
  • 与语言相关的命名规则的指导原则

    • c的命名规则

      • c和ch是字符变量
      • i和j是整数下标
      • n标识某物的数量
      • p是指针
      • s是字符串
      • 预处理宏和typedef全部大写
      • 变量名和子程序名全部小写
      • 下划线做分隔符
    • c++的命名规则

      • i和j是整数下标
      • p是指针
      • 常量、预处理宏和typedef全部大写
      • 类和其他类型的名字混合大小写
      • 变量名和函数名第一个单词小写,后续每个单词的首字母大写
      • 不把下划线用作名字的分隔符
    • java的命名规则

      • i和j是整数下标
      • 常量全部大写并用下划线分隔
      • 类名和接口名中每一个单词的首字母均大写,包括第一个单词
      • 变量名和方法名中第一个单词的首字母小写,后续单词的首字母大写
      • 除用于全部大写的名字之外,不使用下划线作为名字中的分隔符
      • 访问器子程序使用get和set前缀
  • 混合语言编程的注意事项

    在混合语言环境中编程时,可以对命名规则(格式规则、文档规则)做出优化以提高整体的一致性和可读性。

  • 命名规则示例

    简单来说,变量名应包含了以下三类信息:

    • 变量的内容(它代表什么)
    • 数据的种类(具名常量、简单变量、用户自定义类型或者类)
    • 变量的作用域(私用的、类的、包的或者全局作用域)

5、标准前缀

标准化的前缀有两部分组成:

  • 用户自定义类型(UDT)的缩写

    UDT缩写可以标识被命名对象或变量的数据类型。在某种程度上,对于不同的项目均是标准的。

  • 语义前缀

    语义前缀比UDT更进一步,它描述了变量或者对象是如何使用的,根据项目的不同而不同。

标准前缀具备命名规则所能提供的一半意义上的优点,还有更多好处:

  • 能够更为精确的描述一些含义比较模糊的名字
  • 标准化的前缀使名字变得更加紧凑
  • 编译器不能检查你所用的抽象数据类型的时候,标准前缀能帮助你准确的对类型做出判断

6、创建具备可读性的短名字

除非环境(如编程语言)真的要求你创建简单的名字,几乎没有任何理由去缩短具有丰富含义的名字。

缩写的一般指导原则:

  • 使用标准的缩写(列在字典的常用缩写)
  • 去掉所有的非前置元音(computer->cmptr,screen->scrn,apple->appl,integer->intgr)
  • 去掉虚词and,or,the
  • 使用每个单词的第一个或前几个字母
  • 统一地在每个单词的第一、第二或者第三个(选择最合适的一个)字母后截断
  • 保留每个单词的第一个和最后一个字母
  • 使用名字中的每一个重要单词,最多不超过三个
  • 去除无用的后缀:ing ed 等
  • 保留每个音节中最引人注意的发音
  • 确保不要改变变量的含义

不建议使用语音缩写

避免缩写犯错的规则:

  • 不要用从每个单词中删除一个字符的方式来缩写
  • 缩写要一致
  • 创建你能读出来的名字
  • 避免使用容易看错或者读错的字符组合
  • 使用词典来解决命名冲突
  • 在代码中用索尔写对照表揭示极短的名字的含义
  • 在一份项目级的标准缩写文档中说明所有的缩写
  • 记住,名字对于代码读者的意义比对作者重要

7、应该避免的名字

  • 避免使用令人误解的名字或缩写
  • 避免使用具有相似含义的名字
  • 避免使用具有不同含义但却有相似名字的变量
  • 避免使用发音相似的名字
  • 避免在名字中使用数字
  • 避免在名字中拼错单词
  • 避免使用英语中常常拼错的单词
  • 不要仅靠大小写来区分变量名
  • 避免使用多种自然语言
  • 避免使用标准类型、变量和子程序的名字
  • 不要使用与变量含义完全无关的名字
  • 避免在名字中包含易混淆的字符

更多有关《代码大全 2》的读书笔记,请关注 :
http://tabalt.net/blog/code-complete-2-reading-notes/

本文链接:http://tabalt.net/blog/cc2-the-power-of-variable-names/,转载请注明。