21变量名的力量_2
4. 非正式命名规则
4.1. 与语言无关的命名规则的指导原则
-
区分变量名和子程序名——例如 变量名为:variableName,子程序名为:getName()
-
区分类和对象
//方案1:通过大写字母开头区分类型和变量 Widget widget; LongerWidget longerWidget; //方案2:通过对变量采用更明确的名字区分类型和变量 Widget aWidget; LongerWidget fullEmployeeWidget;
-
标识全局变量——例如:g_runningTotal
-
标识成员变量——例如:m_isRunning
-
标识类型声明——可以为类型名增加前缀,例如: t_Color
-
标识具名常量——可以全部使用大写,如果有可能,用下划线来分割单词,例如:LINES_PER_PAGE_MAX
-
标识枚举类型的元素——可以全部用大写,或者为类型名增加 e_ 或则 E_ 前缀
-
在不能保证输入参数只读的语言里标识只读参数——可以为输入参数增加一个 const 前缀
-
格式化命名以提高可读性——用两种常用方法可以用来提高可读性,那就是用大小写和分割符来分割单词。例如 GYMNASTICSPOINTTOTAL 就比 GymnasticsPointTotal 或者 gymnastics_point_total 难读的多
4.2 与语言相关的命名规则的指导原则
(1)C 的命名规则
- c 和 ch 是字符变量
- i 和 j 是整数下标
- n 是某物的数量
- p 是指针
- s 是字符串
- 预处理宏全部大写(ALL_CAPS),这通常包括 typedef
- 变量名和子程序名全部小写 (all_lowercase)
- 下划线(_)用做分隔符: letters_in_lowercase 要比 lettersinlowercase 更具可读性
(2)C++ 的命名规格
-
i 和 j 是整数下标
-
p 是指针
-
常量、typedef 和预处理宏全部大写(ALL_CAPS)
-
类和其他类型的名字混合大小写(MixedUpperAndLowerCase)
-
变量名和函数名中的第一个单词小写,后续每个单词的首字母大写——例如:gymnasticsPointTotal
-
不把下划线用做名字中的分隔符,除非用于全部大写的名字以及特定的前缀中(例如标识全局变量的前缀)
与 C 编程相比,上述规则还远远没有形成标准,并且不同的环境也会形成不同的具体规则
(3)Java 的命名规则
与 C 和 C++ 不同,Java 语言的风格约定从一开始就创建好了。
- i 和 j 是整数下标
- 常量全部大写(ALL_CAPS)并用下划线分割
- 类名和接口名中每个单词的首字母均大写,包括第一个单次——例如, ClassOrInterfaceName
- 变量名和方法名中第一个单次的首字母小写,后续单次的首字母大写——例如, VariableOrRoutineName
- 除用于全部大写的字母之外,不使用下划线作为名字中的分隔符
- 访问器子程序使用 get 和 set 前缀
4.3 混合语言编程的注意事项
在混合语言环境中编程时,可以对命名规则(以及格式规则、文档规则等)做出优化以提高整体的一致性和可读性。
4.4 命名规则示例
变量名一般包含了以下三类信息:
-
变量的内容(它代表什么)
-
数据的种类(具名常量、简单变量、用户自定义类型或者类)
-
变量的作用域(私有的、类的、包的或者全局作用域)
(1)C++ 和 Java 的命名规则
ClassName 类名混合使用大小写,首字母大写
TypeName 类型定义,包括枚举类型和 typede,混合使用大小写,首字母大写
EnumeratedTypes 除遵循上述规则以外,枚举类型总以复数形式表示
localVariable 局部变量混合使用大小写,首字母小写。其名字应该与底层数据类型无 关,而且应该反映该变量所代表的事物
routineParameter 子程序参数的格式与局部变量相同
routineName() 子程序名混合使用大小写(建议首字母小写)
m_classVariable 对类的多个子程序可见(且只对该类可见)的成员变量用 m_ 前缀
g_globalVariable 全局变量名用 g_ 前缀
CONSTANT 具名常量全部大写
MACRO 宏全部大写
Base_EnumeratedType 枚举类型名用能够反映其基础类型的、单数形式的前缀——例 如,Color_Red, Color_Blue
(2)C 的命名规则
TypeName 类型名混合使用大小写,首字母大写
GlobalRoutineName() 公用子程序名混合使用大小写
f_FileRoutineName() 单一模块(文件)私用的子程序名用 f_ 前缀
Localvariable 局部变量混合使用大小写。其名字应该与底层数据类型无关,而且应
该变量所代表的事物
RoutineParameter 子程序参数的格式与局部变量相同
f_FileStaticVariable 模块(文件)变量名用 f_ 前缀
G_GLOBAL_GlobalVariable 全局变量名义 G_ 前缀和一个能反映定义该变量的模块(文件)的、全 部大写的名字的开始——例如, G_SCREEN_Dimensions
LOCAL_CONSTANT 单一子程序或者模块(文件)私用的具名常量全部大写,例如, POWS_MAX
G_GLOBALCONSTANT 全局具名常量全部大写,并且以 G_ 前缀和一个能反映定义该具名常量 的模块(文件)的、全部大写的名字开始, 如 G_SCREEN_ROWS_MAX
LOCALMACRO() 单一程序或者模块(文件)私用的宏定义全部用大写
G_GLOBAL_MACRO() 全局宏定义全部大写,并且以 G_ 前缀和一个能反映定义该宏的模块 (文件)的全部大写名字开始——例如, G_SCREEN_LOCATION()
5. 标准前缀
对具有通用含义的前缀标准化,为数据命名提供了一种简洁、一致并且可读性好的方法。
5.1 用户自定义类型缩写
用户自定义类型(UDT)缩写可以标识被命名对象或变量的数据类型。UDT 缩写可以被用于表示像窗体、屏幕区域以及字体一类的尸体。UDT 缩写通常不会表示任何由编程语言所提供的预置数据类型。
5.2 语义前缀
语义前缀比 UDT 更近一步,它描述了变量或者对象如何使用的。
5.3 标准前缀的优点
6. 创建具备可读性的短名字
6.1 缩写的一般指导原则
- 使用标准的缩写(列在字典中的那些常见缩写)
- 去掉所有非前置元音。(computer 变成 cmptr,screen 变成 scrn, apple 变成 appl, integer 变成 intgr)
- 去掉虚词 and、or、the 等
- 使用每个单词的第一个或前几个字母
- 统一地在每个单词的第一、第二或者第三(选择最合适的一个)字母后面截断
- 保留每个单词的第一个和最后一个字母
- 使用名字中的每一个重要单词,最多不超过三个
- 去除无用后缀——ing、ed 等
- 保留每个音节中最引人注意的发音
- 确保不要改变变量的含义
- 反复使用上述技术,直到你把每个变量名的长度缩减到了 8 到 20 个字符,或者达到你所用的编程语言对变量名的限制字符数。
6.2 语音缩写
有些人倡导基于单词发音而不是拼写来创建缩写、于是 skating 就变成了sk8ing, highlight 就变成了 hilite, before 变成了 b4, execute 变成了 xqt , to 变成了 2。
6.3 有关缩写的评论
在创建缩写时,需要避免以下陷阱。
- 不要用从每个单词中删除一个字符的方式来缩写
- 应该一直使用相同的缩写。例如,要么全用 Num, 要么全用 No, 不要两个都用
- 创建你能读出来的名字。 用 xPos 而不用 xPstn
- 避免使用容易看错或者读错的字符组合
- 使用辞典来解决命名冲突
- 在代码里使用缩写对照表解释极短的名字的含义
- 在一份项目级的“标准缩写”文档中说明所有的缩写
- 记着,名字对于代码读者的意义要比对作者更重要
7. 应该避免的名字
- 避免使用令人误解的名字或缩写
- 避免使用具有相似含义的名字
- 避免使用具有不同含义但却有相似名字的变量
- 避免在名字中使用数字
- 避免在名字中拼错单次
- 避免使用英语中常常拼错的单词
- 不要仅靠大小写来区分变量名
- 避免使用多种自然语言
- 避免使用标准类型、变量和子程序的名字
- 不要使用与变量名含义完全无关的名字
- 避免在名字中包含易混淆的字符