跳转到内容

C++ 编程

来自维基教科书,为开放世界提供开放书籍

命名标识符

[编辑 | 编辑源代码]

C++ 关于标识符关键字 的命名限制已经在 代码部分 中介绍过。这些限制给命名留下了很多自由度,可以使用特定的前缀或后缀,名称以大写或小写字母开头,将所有字母保持在单一大小写,或者对于复合词,使用像 "_" 这样的词分隔符或翻转每个组件词的首字母的大小写。

注意
还需要注意避免与操作系统 API (取决于可移植性要求) 或其他标准发生冲突。例如,POSIX 的关键字以 "_t" 结尾。

匈牙利命名法
[编辑 | 编辑源代码]

匈牙利命名法,现在也称为 Apps 匈牙利命名法,是由查尔斯·西蒙尼 (Charles Simonyi) 发明的 (一位在 1972-1981 年间在 Xerox PARC 工作的程序员,后来成为微软首席架构师);并且直到最近,它一直是大多数微软代码中使用的首要命名约定。它使用前缀 (比如 "m_" 表示成员变量,"p" 表示指针),而标识符的其余部分通常使用某种混合大小写的方式写出来。我们提到这个约定,是因为你很可能会发现它正在使用中,如果你在 Windows 中进行任何编程,这更可能发生,如果你有兴趣了解更多,可以查看 维基百科关于这种命名的条目

这种命名法被认为已经过时,因为它很容易出错,并且需要一些努力才能在没有实际好处的情况下维护,而且在当今的 IDE 中也是如此。如今,重构是一项日常任务,IDE 已经发展到可以提供标识符弹出窗口和颜色方案使用的帮助。所有这些信息辅助减少了对这种命名的需求。

前导下划线
[编辑 | 编辑源代码]

在大多数情况下,最好避免使用前导下划线。它们是为编译器或库的内部变量保留的,并且会使你的代码难以移植和维护。这些变量也可以从库中剥离 (即变量不再可访问,它对外部世界隐藏),因此除非你想要覆盖库的内部变量,否则不要这样做。

重用现有名称
[编辑 | 编辑源代码]

不要使用标准库函数和对象的名称作为你的标识符,因为这些名称被认为是保留词,程序在意外使用时可能会变得难以理解。

有意义的名称
[编辑 | 编辑源代码]

始终使用良好、未缩写、拼写正确、有意义的名称。

优先使用英语 (因为 C++ 和大多数库已经使用英语),并避免使用简短的隐晦名称。这将使代码更容易阅读和输入名称,而无需查找。

注意
对于循环变量和在小范围内 (~20 行) 使用的变量,可以忽略此规则,如果该变量的目的足够明显,可以为它们赋予短名称以节省空间。历史上,在这种情况下最常用的变量名称是 "i"。

"i" 可能来自 "increment" 或 "index" 的单词。在 for 循环中,"i" 非常常见,它完全符合使用这种变量名称的规范。

在早期的 Fortran 编译器 (直到 F77) 中,以字母 i 到 n 开头的变量隐含地表示整数 - 按照惯例,前几个 (i、j、k) 通常用作循环计数器。

名称表明目的
[编辑 | 编辑源代码]

标识符应该表明它所代表的变量/函数/等的函数,例如,foobar 可能不是存储人的年龄的变量的良好名称。

标识符名称也应该是描述性的。n 可能不是表示员工数量的全局变量的良好名称。但是,必须找到长名称和大量键入之间的良好折衷方案。因此,对于在 小范围或上下文中使用 的变量,可以放宽此规则。许多程序员更喜欢使用短变量 (如 i) 作为循环迭代器。

大小写
[编辑 | 编辑源代码]

按照惯例,变量名称以小写字母开头。在包含多个自然语言词的标识符中,使用下划线或大小写来分隔这些词,例如 num_chars (K&R 风格) 或 numChars (Java 风格)。建议你选择一种符号并不要在一个项目中混合使用。

在命名 #defines、常量变量、enum 常量和宏时,使用全大写并用 "_" 分隔符;这使得很清楚地表明该值不可更改,并且在宏的情况下,明确地表明你正在使用需要小心处理的构造。

注意
有一种广泛的观点认为 LIKE_THIS 这样的名称 应该用于宏,这样宏使用的名称空间 (不遵守 C++ 范围) 不会与用于其他标识符的名称空间重叠。正如 C++ 命名约定中通常的那样,没有一个普遍认可的标准。最重要的是通常保持一致。

函数和成员函数
[编辑 | 编辑源代码]

赋予函数和成员函数的名称应该具有描述性,并清楚地表明它所执行的操作。由于函数和成员函数通常执行操作,因此最佳名称选择通常包含动词和名词的组合,例如 CheckForErrors() 而不是 ErrorCheck(),以及 dump_data_to_file() 而不是 data_file()。函数和成员函数的清晰、描述性的名称有时可以使正确猜测函数和成员函数的功能变得更容易,从而有助于使代码更加自记录。通过遵循此命名约定和其他命名约定,程序可以更自然地阅读。

人们在使用包含缩写词的名称时,似乎有不同的直觉。最好确定一种策略,以便名称是完全可预测的。以 NetworkABCKey 为例。注意 ABC 中的 C 和 key 中的 K 是如何混淆的。有些人并不介意,而另一些人则非常讨厌,因此你会在不同的代码中发现不同的策略,所以你永远不知道如何命名某个东西。

前缀和后缀有时很有用

  • Min - 表示某事物可以拥有的最小值。
  • Max - 表示某事物可以拥有的最大值。
  • Cnt - 某事物的当前计数。
  • Count - 某事物的当前计数。
  • Num - 某事物的当前数量。
  • Key - 键值。
  • Hash - 哈希值。
  • Size - 某事物的当前大小。
  • Len - 某事物的当前长度。
  • Pos - 某事物的当前位置。
  • Limit - 某事物的当前限制。
  • Is - 查询某事物是否为真。
  • Not - 查询某事物是否不为真。
  • Has - 查询某事物是否具有特定的值、属性或特性。
  • Can - 用于询问某件事是否可以做到。
  • Get - 获取一个值。
  • Set - 设置一个值。

在大多数情况下,最好避免在标识符开头使用下划线。例如,以下标识符是有效的

  • i 循环变量
  • numberOfCharacters 字符数量
  • number_of_chars 字符数量
  • num_chars 字符数量
  • get_number_of_characters() 获取字符数量
  • get_number_of_chars() 获取字符数量
  • is_character_limit() 是否达到字符限制?
  • is_char_limit() 是否达到字符限制?
  • character_max() 字符最大数量
  • charMax() 字符最大数量
  • CharMin() 字符最小数量

以下也是有效的标识符,但你能说出它们的含义吗?

  • num1
  • do_this()
  • g()
  • hxq

以下标识符虽然有效,但最好避免使用

  • _num 因为它们可能被编译器/系统头文件使用
  • num__chars 因为它们可能被编译器/系统头文件使用
  • main 因为可能会引起混淆
  • cout 因为可能会引起混淆

以下不是有效的标识符

  • if 因为它是关键字
  • 4nums 因为以数字开头
  • number of characters 因为标识符中不允许空格

华夏公益教科书