5.4.2 命名约定
选择一个名称通常不需要太多的思考以及创造力。在许多情况下,您可以使用标准的命名技术。下面给出的类型可以使用标准名称。
1. 计数器
在您编程(www.cppentry.com)生涯的早期,您可能已经看到过变量"i"用作计数器。使用i以及j分别用作计数器以及内部循环计数器已经成为惯例。然而要小心嵌套循环。当您想要表示"第j个"元素时,经常会错误地用到"第i个"元素。有些程序员更喜欢使用诸如outerLoopIndex和innerLoopIndex的计数器。
2. 前缀
许多程序员在变量名称开头用一个字符提供与变量的类型或者用法有关的信息。然而,许多程序员并不赞成使用前缀,因为这会使得相关代码在将来变得难以维护。例如,如果某个成员变量从静态变为非静态,这意味着所有用到这个名称的地方都要修改。这通常情况下非常耗时,因此大多数程序员不会去重新命名这个变量。随着项目的进行,变量的声明变了,但是名称没有变。结果是名称给出了虚假的语义,实际上这个语义是错误的。
当然,通常您别无选择,只能遵循公司的指导方针。表5-2显示了一些可能会用到的前缀。
表 5-2
|
前 缀< xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> |
示 例 名 称 |
前缀的字面意思 |
用 法 |
|
m
m_
_ |
mData
m_data
_data |
“成员” |
类的数据成员 |
|
s
ms
ms_
|
sLookupTable
msLookupTable
ms_lookupTable
|
“静态” |
静态变量或者数据成员 |
|
k
|
kMaximumLength
|
“konstant”,
德语表示的常量 |
常量值。有些程序员全部
用大写字母表示常量 |
|
b |
bCompleted
|
“布尔值” |
表示布尔值 |
|
n
mNum |
nLines
mNumLines |
“数字” |
数据成员同时也是计数器。
由于n看上去像m,许多程
序员用mNum替换n做前缀,
例如mNumLines |
3. getter以及setter
如果类包含了数据成员,例如mStatus,习惯上会提供一个名为getStatus()的getter以及一个名为setStatus()的setter访问这个成员。C++(www.cppentry.com)语言并未指定如何命名这些方法,但是您所在的组织可能会采用这种命名形式或类似的形式。
4. 大写
在代码中大写名称有多种不同的方法。与大多数编码风格元素类似,最重要的是您所在的组织将某个方法正式化,并且让所有的员工都采用这种方法。如果某些程序员全部用小写字母命名类,并用下划线分隔(priority_queue),而另外一些程序员将每个单词的首字母大写(PriorityQueue),代码将乱成一团。变量以及数据成员几乎总是以小写字母开头,并用下划线(my_queue)或者大写字母(myQueue)分隔单词。在C++(www.cppentry.com)中,函数以及方法通常将首字母大写,但是正如您看到的那样,本书我们采用了小写风格的函数以及方法,从而把它们与类名称区分开来。采用大写字母为类以及数据成员名指明单词的边界。
5. 把常量放到名称空间
假定您正在编写一个使用图形用户界面的程序。这个程序具有几个菜单,包括File、Edit以及Help。您决定用常量代表每个菜单的ID。kHelp是代表Help菜单ID的一个好名字。
名称kHelp一直运行良好,直到有一天您在主窗口上添加了一个Help按钮。您需要一个常量代表按钮的ID,但是kHelp已经被使用了。
在此情况下,建议将常量放到不同的名称空间,名称空间在第1章已经讲过。您可以创建两个名称空间:Menu以及Button。每个名称空间中都有一个kHelp常量,其用法为Menu::kHelp以及Button::kHelp。
6. 匈牙利表示法
匈牙利表示法是关于变量以及数据成员的命名约定,Microsoft Windows程序员经常使用这一方法。基本思想是使用更详细的前缀而不是一个字母(例如m)表示附加的信息。下面这行代码显示了匈牙利表示法的用法:
- char* pszName; // psz means "pointer to a null-terminated string"
之所以称其为匈牙利表示法,是因为其发明者Charles Simonyi是一个匈牙利人。也有人认为这准确地反映了一个事实,使用匈牙利表示法的程序员好像是在用外语编程(www.cppentry.com)一样。为此,一些程序员不喜欢匈牙利表示法。在本书中我们使用前缀,但不使用匈牙利表示法。我们觉得合理命名的变量不需要前缀以外的附加上下文信息,我们认为用mName命名数据成员就足够了。
好的名称会传递与用途有关的信息,而不会使得代码难以阅读。