变量名的力量(二)

变量名的力量(二)

11.4 非正式命名规则


与语言无关的命名规则的指导原则
    区分变量名和子程序名字 通常,变量名以小写字母开头而子程序名以大写字母开头。
    区分类和对象 类名字与对象名字——或者类型与该类型的变量——之间的关系会比较棘手。有很多标准的方案可用,如下例所示:
    方案一:通过大写字母开头区分类型和变量
Widget widget;
LongerWidget longerWidget;
    方案二:通过全部大写区分类型和变量
WIDGET widget;
LONGERWIDGET longerWidget;
    方案三:通过给类型加“t_”前缀区分类型和变量
t_idget widget;
t_longerWidget longerWidget;
    方案四:通过给变量加“a”前缀区分类型和变量
Widget aWidget;
LongerWidget aLongerWidget;
    方案五:通过对变量采用更明确的名字区分类型和变量
Widget employeeWidget;
LongerWidget fullEmployeeWidget;
    每一种方案都有其优点和不足。第一种方案是在大小写敏感语言如C++和Java里常用的规则,但是有些程序员对仅依靠大写区分名字感到不舒服。的确,创建两个只用第一个字母大小写不同的名字所能提供的“心理距离”太短了,二者之间的视觉差异也太小。
    再多语言混合编程的环境中,如果任一种语言是大小写不敏感的,则将无法一直使用第一种命名方案。例如,VB就会将widget和Widgei当作同一个标志符看待。
    第二种方案适用类型和变量名之间的差异更加明显。然而,由于历史原因,在C++和Java里面全部字母大写只用于表示常量,同时这种方案也会与第一种方案面临混合语言环境的问题。
    第三种方案可用于所有语言,但是很多程序员从审美的角度出发并不喜欢增加前缀。
    第四种方案有时会用作第三种方案的备选项,但是它存在的问题是需要改变每个实例的名字,而不是仅仅修改类名。
    第五种方案要求基于每个变量的实际情况做出更多的考虑。在大多数情况下要求程序员为每个变量想出一个特别的名字会有助于提高代码的可读性。但是有时候,一个widget确实就是一个普通的widget,在这种情况下你会发现自己会想出一些并不鲜明的名字,如genericWidget,他的可读性比较差。
    简而言之,每一种可选方案都不是十全十美的。
    标识全局变量 有一种编程问题很常见,那就是滥用全局变量。假如你在所有的全局变量名之前加上g_前缀,那么程序员在读到变量g_RunningTotal之后就会明白这是个全局变量,并且予以相应的对待。
    标识成员变量 要根据名字识别出变量是类的数据成员。即明确表示该变量既不是局部变量,也不是全局变量。比如说,你可以用m_kjfdsjlk前缀来标识类的成员变量,以表明它是成员数据。
    标识类型声明 为类型建立命名法规则有两个好处。首先它能够明确表明一个名字是类型名,其次能够避免类型名与变量名冲突。为了满足这些要求,增加前缀或者后缀是不错的方法。
    标识具名常量 你需要对具名常量加以标识,以便明确在为一个变量赋值时你用的是另一个变量的值,还是一个具名常量。
    给常量命名的方法之一是给常量名增加c_前缀。这会让你写出类似c_RecesMax这样的名字来.C++和Java里的规则是全部用大写,以及如果有可能,用下划线来分隔单词,例如RECSMAX或者RECS_MAX.
    枚举类型的元素.与具名常量相同,枚举类型的元素也许要加以标识--一边表明该名字表示的是枚举类型,而不是一个变量、具名常量或者函数。标准方法如下:全部用大写,或者为类型名增加e_或者E_前缀。同时为该类型的成员名增加基于特定类型的前缀,如Color_或者Planet_。
    再不能保证输入参数制度的语言里标识只读参数。有时输入参数会被意外修改。在C++和Visual Basic这样的语言里,你必须明确表明是否希望把一个修改后的值返回给调用方子程序。在C++里分别用×、&和const指明,在VB里分别用ByRef和ByVal指明。
    在其他语言里,如果你修改了输入变量的取值,那么无论你是否愿意,它的新值都会被返回。特别是当你传递对象的时候。举例来说,在Java里所有对象都是“按值”传递的,因此当你把一个对象传递给一个子程序的时候,该对象的内容就可以被调用子程序修改。
    在这些语言里,你如果指定了为输入参数增加一个const前缀的命名规则,那么当你看到const前缀出现在赋值符号左边的时候,就会知道出现了错误。如果看到constMax。SetNewMax(...),就会知道这里有大漏洞,因为const前缀表明了该变量是不应该被修改的。
    格式化命名以提高可读性。有两种常用方法可以用来提高可读性,那就是用大小写和分隔符来分隔单词。
    尽量不要胡用上述方法,那样会使代码难以阅读。如果你老老实实地坚持使用其中任一种提高可读性的方法,你的代码质量一定会有所改善。人们曾经就诸如变量名的第一个字母是不是应该大写的做法的价值展开了非常激烈的讨论,但是只要你和你的团队正在使用上保持一致,那么大写小写就没有太大区别。不过,通常来说,我是比较喜欢用小写字母作为变量的开头。
    应该遵循你所用语言的命名规则。对于大多数语言,你都可以找到描述其风格原则的参考书。下面给出C、C++、Java指导原则。

C的命名规则
    · c和ch是字符变量。
    · i和j是整数下标。
    · n表示某物的数量。
    · p是指针。
    · s是字符串。
    · 预处理红全部大写。这通常也包括typedef。
    · 变量名和子程序名全部小写。
    · 下划线(_)用作分隔符。

    这些都是属于一般性的、UNIX风格和Linux风格的C变成那个规则,C变成规则在不同的环境下也会有所差别。开发Microsoft Windows应用的C程序员倾向于采用匈牙利命名法,并在变量名中混合使用大小写。在Macintosh平台下,C程序员会倾向于在子程序的名字中混合使用大小写,这是因为Macintosh工具箱和操作系统子程序最初是为支持Pascal接口而设计的。

C++的命名规则
    · i和j是整数下标。
    · p是指针。
    · 常量、typedef和预处理宏全部大写。
    · 类和其他类型的名字混合大小写。
    · 变量名和函数名中的第一个单词小写(我是变量首字母大写,函数首字母大写),后续每个单词的首字母大写。
    · 不要把下划线用作名字中的分隔符,除非用于全部大写的名字以及特定的前缀中。

    与C变成那个相比,上述规则还远没有形成标准,并且不同的环境也会形成不同的具体规则。

Java的规则
    与C和C++不同,Java语言的风格约定从一开始就创建好了。
    · i和j是整数下标。
    · 常量全部大写并用下划线分隔。
    · 类名和接口名中每一个单词的首字母均大写,包括第一个单词。
    · 变量名和方法命中第一个单词首字母小写,后学单词的首字母大写。
    · 除用于全部大写的名字之外不使用下划线作为名字中的分隔符。
    · 访问器子程序使用get和set前缀。


混合语言编程那个的注意事项

    在混合语言环境中编程时,可以对命名规则做出优化以提高整体的一致性和可读性——即使这意味着优化的规则会于其中某种语言所用的规则相冲突。

11.5 标准前缀
    对具有通用含义的前缀标准化,为数据命名提供了一种间接、一致并且可读性好的方法。有关标准前缀最广为人知的方案是匈牙利命名法,该方案由一组用于指导变量和子程序命名的详细原则组成,并且曾经一度被广泛用于Microsoft Windows编程。尽管目前匈牙利命名法已经不再得到广泛使用,但是使用简洁准确的缩写词的基本命名标准理念确认具有价值。
    标准化的前缀由两部分组成:用户自定义类型(UDT)的缩写和语义前缀。


用户自定义类型缩写
    UDT缩写可以标识被命名对象或变量的数据类型。UDT缩写可以被用于表示像窗体、屏幕区域以及字体一类的实体。UDT缩写通常不会表示任何由编程语言所提供的预置数据类型。
    UDT用很短的编码描述,这些编码是为特定的程序创建的,并经过标准化以在该程序内使用。这些编码有助于用户理解其所代表的实体,如用wn代表窗体scr代表屏幕区域。
--------------------------------------------------------------------------------------------------------------
UDT缩写 含义
--------------------------------------------------------------------------------------------------------------

ch 字符(Character,这里的字符不是指C++中的字符,

而是指文字处理程序可能用于表示一份文档中的字符的数据类型)

--------------------------------------------------------------------------------------------------------------
doc 文档(Document)
--------------------------------------------------------------------------------------------------------------
pa 段落(Paragraph)
--------------------------------------------------------------------------------------------------------------
scr 屏幕区域(Screen region)
--------------------------------------------------------------------------------------------------------------
sel 选中范围(Selection)
--------------------------------------------------------------------------------------------------------------
wn 窗体(Window)
--------------------------------------------------------------------------------------------------------------
    当你使用UDT的时候,你还要按与UDT同样的缩写去定义编程语言的数据类型。

语义前缀(Semantic Prefixes)
    语义前缀比UDT更进一步,它描述了变量或者对象是如何使用的。语义前缀与UDT不同,后者会根据项目的不同而不同,而前者在某种程度上对于不同的项目均是标准的。下面类除了一组标准的语义前缀。
--------------------------------------------------------------------------------------------------------------
语义前缀 含义
--------------------------------------------------------------------------------------------------------------
c 数量(count,如记录、字符或者其他东西的个数)
--------------------------------------------------------------------------------------------------------------

first 数组中需要处理的第一个元素。fisrt与min类似,但它是相对于当

前操作而不是数组本身的。

--------------------------------------------------------------------------------------------------------------
g 全局变量(global variable
--------------------------------------------------------------------------------------------------------------
i 数组的下标(index into an array

--------------------------------------------------------------------------------------------------------------

last 数组中需要处理的最后一个元素,last与first相对应

--------------------------------------------------------------------------------------------------------------

lim 数组中需要处理的元素的上限。lim不是一个合法的下标。它与

last都是first相对应的概念。不同之处是lim表示的是一个数组中

并不存在的上界;而last标识的则是最终的、合法的元素。通常,

lim等于last+1

--------------------------------------------------------------------------------------------------------------
m 类一级的变量
--------------------------------------------------------------------------------------------------------------

max 数组或者其他种类的列表中绝对的最后一个元素。max反映的是

数组本身,而不是针对数组的操作

--------------------------------------------------------------------------------------------------------------
min 数组或者其他种类的列表中绝对的第一个元素
--------------------------------------------------------------------------------------------------------------
p 指针(pointer)
--------------------------------------------------------------------------------------------------------------
    语义前缀可以泉涌谢谢,也可以混合使用大小写,还可以根据需要与UDT和其他的语义前缀结合使用。例如,文档中的第一段应该命名为pa,以表明它是个段落,还要加上first以强调它是第一段落:即firstPa。一组段落的下标可以命名为iPa;cPa是相应的计数值,段落的总数量:firstPaActiveDocument和LastPaActibeDocument表示当前活动文档中的第一个和最后一个段落。

标准前缀的优点
    除了具备命名规则所能提供的一般意义上的优点外,标准前缀还为你带来了另一些好处。由于很多名字都已经标准化了,因此你在一个程序或者类内需要记忆的名字更少了。
    标准前缀能够更为精确地描述一些含义比较模糊的名字。min、first、last和max之间的严格却别就显得格外有用。
    标准化的前缀是名字变得更加紧凑。例如,你可以用cpa而不是totalParagraphs表示段落总数。你可以用ipa表示一个段落数组的下标,而不是用indexParagraphs或者paragraphsIndex。
    最后,你在用的编译器不能检查你所用的抽象数据类型的时候,标准前缀能帮助你准确地对类型做出判断:paReformat = docTeformat很可能不对,因为pa和doc是不同的UDT。
    标准前缀的主要缺陷是程序员在使用前缀的同时忽略给变量起有意义的名字。如果ipa已经能非常明确地表示一个段落数组的下标,啊么程序员就不会主动地去想类似于ipaActiveDocument这样有意义的名字。味蕾高可读性,应该停下来为数组下标起一个具有描述性的名字。


11.6 创建具备可读性的短名字
    从某种程度上说,要求使用短变量名是早期计算的遗留物。早期语言,如汇编、一般的Basic和Fortran都把变量名的长度限制在2到8个字符,并要求程序员创建简短的名字。早期的计算科学更多的同数学联系在一起,并大量使用求和及其他等式总的i、j和k等符号。而在现代语言如C++、Java和VB里面,实际上你可以创建任何长度的名字:几乎没有任何理由去缩短具有丰富含义的名字。
    如果环境真的要求你创建简短的名字,请注意有些缩短名字的方法要好于其他的方法。你可以通过消除冗余的单词、使用简短的同义词以及使用诸多缩写策略中的任意中来创建更好的段变量名。熟悉多种缩写技巧会很有用,因为没有哪种方法能够适用于所有的情况。
 
缩写的一般指导原则
    下面是机箱用于创建缩写的指导原则。其中的一些原则彼此冲突,所以不要试图同时应用所有的原则。
     · 使用标准的缩写(列在字典中的哪些常见缩写)。
    · 丢掉所有非前置元音。(computer变成cmptr,screen变成scrn,apple变成appl,integer变成intgr。)
    · 去掉虚词and,or,the等。
    · 使用每个单词的第一个或前几个字母。
    · 统一地在每个单词的第一、第二、或者第三个(选择最合适的一个)字母后截断。
    · 保留每个单词的第一个和最后一个。
    · 使用名字中的每一个重要单词,最多不超过三个。
    · 去除无用的后缀——ing,ed等。
    · 保留每个音节中最引人注意的发音。
    · 确保不要改变变量的含义。
    · 反复使用上述技术,知道你把每个变量名的长度所见到了8到20个字符,或者达到你所用的编程语言对变量名的限制字符数。

语音缩写

    有些人倡导基于单词的发音而不是拼写来创建缩写。于是skating就变成了sk8ing,highlight变成了hilite,before变成那个了b4,execute变成了xqt,诸如此类。这样做很象是要去猜出个性化汽车牌照的意思。这很不好。

有关缩写的评论
    在创建缩写的时候,会有很多的陷阱在等着你。下面是一些能够用来避免犯错的规则。
不要用从每个单词中删除一个字符的方式来缩写。
缩写要一致。
创建你能读出来的名字。
避免使用容易看错或者读错的字符组合
使用辞典来接名命名冲突。
在代码利用缩写对照表解释极短的名字的含义。
在一份项目级的“标准缩写”文档中说明所有的缩写。
名字对于代码读者的意义要比对作者更重要。


11.7 应该避免的名字

避免使用令人误解的名字或缩写
避免使用具有相似含义的名字
避免使用具有不同含义但却有相似名字的变量。
避免使用发音相近的名字,如wrap和rap。
避免在名字中使用数字。
避免在名字中拼错单词。
避免使用英语中常常拼错的单词。
不要仅靠大小写来区分变量名。
避免使用多种自然语言。
避免使用标准类型、变量和子程序的名字。
不要使用与变量含义完全无关的名字。
避免在名字中包含易混淆的字符。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值