如何给变量命名-彻底告别变量命名的苦恼

变量名的力量


看完代码大全第11章『变量名的力量』,我想根据我们目前
最容易遇到的以及对于我们目前最需要重视的方面,提炼出一些书中的精华。在这经典之上再进行浓缩一下。

解释一个概念:
你不能像给狗起名字那样给变量起名字。
因为:狗和狗的名字是不同的东西。而变量和变量名就本质而言却是同一事物。不夸张的说,变量的好坏取决于它的命名的好坏!

可以暂停想个30秒,你会感受到其中的趣味。

变量名字应该体现出什么价值?
要完全、准确的描述出该变量所代表的事物

对变量的描述就是最佳的变量名。

有了概念后直接步入正题。

  1. 尽可能的明确 temp,i,x,x1,和x2等相似的永远都是坏名字。Why?
    因为你的变量所代表的是一个未知量

  2. 类似 Total、 Sum、 Average、 Max、 Min、 Record、 String、 Pointer 这样的表示计算结果的词语修饰某个变量时,请记住放在最后面。

/**
* 这组变量具有非常优雅的对称性。
*一致性,对称性,可以极大的提高可读性,简化维护工作。
*/
revenueTotal    revenueAverage
expenseTotal    expenseAverage

/**
*这组变量与上组变量相比,其对称性和可读性就很差。
*/
totalRevenue    averageRevenue   
totalExpense    averageExpense

给特定类型的数据命名


  1. 为循环下标命名

    i, j, k只能适用在非常简单的循环里,最多只能有几行。而且只能在循环之内用。
    为了养成一个优秀的习惯。
    总结为一句话:
    尽可能的用比i, j, k更具体更形象的名字来命名。

  2. 为状态变量命名

    状态变量是用于描述你的程序的状态。绝大多数都是条件判断语句中的变量
    这里面最常用的反面栗子就是经常在后面加个flag后缀

/**
*命名模糊
*/
if(flag)...//这个flag表达的意识极其模糊
if(printFlag==10)...//同理,指代不清晰

/**
*命名清晰
*/
if(dataReady)...
if(printData==10)...

3.为临时变量命名

临时变量是用于存储计算的中间结果,作为临时占位符,以及存储内务管理值。
一句话:把一个变量命名为temp, x,等临时的名字时,表明你还没有弄清楚它们的实际用途,或者是你当时找不到合适的名字命名,这本身就是可以改善的,百度谷歌一下,不行翻翻辞典,总是可以解决的。

4.为布尔变量命名

谨记:
给布尔变量赋予隐含”真假”含义的名字;
经典命名:
done 在事情完成之前把done设为false,完成之后设为true
error 在错误发生之前把error设为false,在已经发生时设为true
found 在没有找到的时候把found设为false,一旦找到就设为true(在一个数组中查找某个值,在文件中搜寻某员工的ID等)
success或者ok 操作失败为false,操作成功时为true
反面栗子:
status 没有明确的true和false的含义,true代表什么?false代表什么?每件事都有状态,所以这个命名是非常差的。

//一些程序员喜欢在前面加上 is.下面将进行比较:
if(done)            if(isDone)
if(error)           if(isError)      
if(found)           if(isFound)
/*
*很明显左边的命名方式要好于右边,if(isFound)的可读性和整洁性都要差于 if(found)
**/

5.为枚举类型命名

使用组前缀,如Color_ , Planet_ , Month_ 就可以了。如Color_Red, Color_Blue都是表示同属于一个组。


几点心得


  1. 标识全局变量
    在你的全局变量名的前面加上 g_ 前缀『因为滥用全局变量的问题很常见』,在读到 g_RunningToatal 就会知道这个是全局变量。
  2. 标识成员变量
    通过命名来判断出它既不是局部变量,也不是全局变量,比如
    在成员变量名的前面加上 m_ 前缀来表示是类的成员变量,以表明它是成员数据。
  3. 标识类型声明
    给类型加前缀或者后缀,我一般加前缀,为标识类型名增加 t_ 前缀,如 t_Car 和 t_menu 。
  4. 标识具名常量
    给常量名增加 c_ 前缀。
  5. 标识枚举类型的元素
    为枚举类型名增加 e_ 或者 E_ 前缀。

说一下Java的一些规则

  1. ij 是整数下标
  2. 常量全部大写,并用下画线分隔单词(ALL_CARS)
  3. 类名和接口名中每一个单词的首字母要大写,包括第一个单词。
  4. 变量名和方法名中第一个单词的首字母小写,后面单词的首字母大写
  5. 除用于全部大写的名字外,不使用下画线作为名字中的分隔符。
  6. 访问器子程序使用 getset 前缀。

对如何加前缀的一些总结

语义前缀(Semantic Prefixes)

语义前缀含义
c数量
first数组中需要处理的第一个元素。针对当前操作而言的第一个元素
last数组中需要处理的最后一个元素,与 first 相对应
g全局变量
i数组的下标
limlim表示的是一个数组中并不存在的上界,lim 等于 last + 1
m类一级的变量
max数组或其他种类的列表中绝对的最后一个元素,反映的是数组本身
min数组或其他种类的列表中绝对的第一个元素,与max相对应
p指针

在给变量缩写时的一些原则(非常好的建议)

去掉所有非前置元音,什么意思?

就是把一个单词里的除了首字母以外的元音全部去掉,举个栗子:computer 变成 cmptr
screen 变成 scrn
apple 变成appl
integer 变成 intgr

  1. 去掉虚词and, or, the等。
  2. 保留每一个单词的第一个和最后一个字母。
  3. 去除无用的后缀—ing, end等
  4. 确保不要改变变量的含义。

命名时应该避免的陷阱:

避免在名字中使用数字。

避免使用具有相似含义的名字。

fileNumber 和 fileIndex 在语义上非常相似,如果把它们放在同一段代码里,就会很容易混淆它们。(有时候非常致命,找半天都发现不了错误)

避免在名字中包含易混淆的字符。

1(数字 1)和 l(小写字母L)
1和I(大写字母i)
.和,
0(零)和O(大写字母o)
2(数字2)和Z
;和:
S和5
G和6

以上就是我个人总结的,在给各种变量命名的过程中,最常见的问题。以及如何避免这些陷阱的经典指导。

2017年了,新的一年祝大家鸡年吉祥,万事顺利!

  • 54
    点赞
  • 116
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值