C++学习笔记----2、使用C++进行优雅编程(五)----命名

C++编译器对于命名有如下规则:

  • 命名中可以有大小写字母、数字、下划线。
  • 字母不限于英文字符,可以是任意国家语言的字母,例如日文,阿拉伯文等。
  • 不能以数字开头,例如9to5。
  • 包含双下划线的被标准库保留不可使用,如my__name。
  • 以下划线开头,后线大写字母的被标准库保留不可使用,如_Name。
  • 全局命名空间中以下划线开头的为系统保留不可使用,如_name。

        除了这些规则之外,既有的名字只是为了帮助你和程序员好好地写出程序需要的各个要素,基于这个目的,程序员去使用非特定的或者不合适的名字就经常令人吃惊了。

1、选一个好名字

        对于变量、成员函数、函数、参数、类、命名空间等等的最好的名字就是准确地表明了这些元素的目的。名字也包含了额外的信息,如类型与特定用法。当然了,实践是检验真理的唯一标准,真正的考验是其他程序员是否理解的你的名字想要表达的意思。

        对于命名没有放之四海而皆准的规则,也不见得有适合你公司的命名方法。我们不知道什么是最合适的,但我们知道什么是不合适的,下面列出了一些好的命名与不好的命名的一些例子:

命名举例
好的命名不好的命名

sourceName, destinationName

区分出来两个对象

thing1, thing2

太通用了

m_nameCounter

表达了数据成员的状态

m_NC

太抽象,太短

calculateMarigoldOffset()

简单、准确

doAction()

太通用,不明确

m_typeString

一眼就能看明白

typeSTR256

恐怕只有计算机才认得

g_settings

表达了全局的状态

m_IHateLarry

不可接受的知情人才听得懂的笑话

errorMessage

描述性的名字

string

非描述性的名字,系统保留字

sourceFile, destinationFile

没有简写

srcFile, dstFile

简写

2、命名规范

        选择一个名字并不总是需要考虑半天或者需要什么创造性。很多情况下,你可能想用一些命名技巧。以下是一些数据类型可以使用的标准名字。

2.1计数器

        在编程的早期阶段,大家基本都在用 i 做计数器的变量名字,约定俗成地 i 与 j 就成为了外部计数器与内部计数器。当然了,在使用时,不要将两者弄混了。在二维矩阵中,用 row 与 column当作索引要比 i 与 j 要易于使用。有些程序员使用outerLoopIndex与innerLoopIndex做计数器,甚至有些程序员一看到 i 和 j 做循环计数器就皱眉头,不过,这只是仁者见仁,智者见智的观点,都可以,至少可以获得业界的认可。

2.2前缀

        许多程序员习惯于将变量以字符开头,该字符提供了一些关于变量类型与用途的信息。另一方面,更多的程序员不认可这种前缀,因为这可能会使代码在将来不好维护。举个例子,如果一个成员变量从static变成了non-static,你就不得不对这个变量进行重命名,否则的话,变量表面上要表达的意思与实际的意思就不一致了,尤其是这种相反的变量与实际含义的可读性极差,根本无法维护。甚至比没有含义带来的恶果还要糟糕。

        但是,我们别无选择,应该遵从公司的命名指导或者说编码规范的命名规范,下表就是可能的一些前缀:

前缀
前缀举例文本前缀意思用法

m

m_

mData

m_data

"member"类中的数据成员

s

ms

ms_

sLookupTable

msLookupTable

ms_lookupTable

"static"静态变量或数据变量
kkMaximumLength"konstant"(常量的德语)常量。有些程序员省略前缀表达常量

b

is

bCompleted

isCompleted

"Boolean"表明一个布尔值

2.3匈牙利命名法

        匈牙利命名法就是一个亦是与数据成员的命名规范,对于Windows程序员来讲,使用比较普遍。基本意思就是不用单个字母如m做前缀,用更长的前缀表达更多的信息。举例如下:

char* pszName; // psz means "pointer to string, zero-terminated"

        匈牙利命名法兴起于它的发明者Charles Simonyi是匈牙利人的事实。有些人说实际上是反映了使用匈牙利命名法的程序看起来像是用外文写的事实。基于后一种原因,有些程序员不喜欢匈牙利命名法。我们还是会用前缀,但不使用匈牙利命名法。除了前缀,要准确地命名变量并不需要额外的附加上下文信息。例如,一个数据变量使用m_name就足够了。好的名字是要达到传达信息的目的,且不能使代码不可读。

2.4 get与set

        在大部分类中都会包含数据成员,例如m_status,通常情况下,对这类成员的操作都是通过getStatus()和setStatus()来实现的。而对于布尔型的成员变量的操作就不是使用get而是使用前缀,例如isRunning()。C++语言本身没有对这些函数预先的名字,但是你所在的公司可能想这样或者使用类似的命名格式。

2.5 首字母大写

        在代码中有许多不同的方式将名字中的首字母大写。对于大部分元素的编码风格,使用一种标准的方法是很重要的,统一即可,不要在代码中使用不同风格的命名方式。将命名中的所有字母都用小写可能使代码看起来杂乱。可以比较一下如下的命名方式:

priority_queue

PriorityQueue

priorityQueue

        这三种方式其实都可以,只是统一就可以了。

2.6 命名空间常量

        想像一下,在图形界面下写程序,主菜单中有File,Edit,Help。Help菜单的ID你可能会用Help,在主菜单下的加一个Help的按钮,你还需要一个Help的ID,这时候发现Help已经被使用了。

        怎么解决这个问题,这就需要使用namespace命名空间了,Menu::Help与Button::Help就可以完美解决了。当然,你也可以使用前缀的方式,这里就不赘述了。

  • 22
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王俊山IT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值