时隔我做程序员两年了,现在才意识到为文件,为变量,为函数起个好名字的重要,我倍感惭愧,但又为现在意识到这点感到幸运。
1.没意义的名字
例子:
int a = 1; int b = 2; int c = a + b; System.out.println("c="+c);
这段代码很简单,输出两个数的和,但有个问题,你能看到c就知道是两数和吗?如果我们的代码足够多,当每次看到a,b,c的时候,我们都要尝试用逻辑去解析这段代码,这造成时间的大量浪费,因为这个名字除了区别不同变量外,没有带给我们任何有用的消息。
2.让人误解的名字
int apple = 1; int banana = 2; int orange = apple + banana; System.out.println("orange ="+orange);
这段代码包含着逻辑炸弹,因为名称存在意义,我们往往会在意名称的含义。第一眼看到以为是要输出橘子的有关系,但发现竟然不是,然后又要从头看起。apple是啥?banana是啥?他们两个相加有什么意义?如果这样的代码足够多,我保证一定比a,b,c更让人抓狂。
让人误解的名字往往让人先想含义,发现不正确又要从头看起。
3.数字命名
int a1 = 1; int a2 = 2; int a3 = 3; int a4 = a1 + a2 ; System.out.println("a4 ="+a4 );
数字命名导致我不得不去查看与之相关的名字。既然都以a开头,又用编号区分,我打赌他们之间一定存在某些关系。不行,一定不能写错,我要看看它的几个兄弟是什么意思。。。每次看到这种代码的时候我难免这样想,不得不去看看它的“兄弟”是干嘛的,甚至有的时候会应为粗心,而写错。比如上面的a4 = a1+a2;
我写成a1+a3,这真的很难一眼看出来。
数字命名导致阅读者要查看兄弟名称,容易书写错误且不容易检查。
4.大家来找茬
int naturalFirstNum = 1; int naturalSecondNum = 2; int naturalSumNum = naturalFirstNum + naturalSecondNum; System.out.println("naturalSumNum ="+naturalSumNum );
如果有相似的名字,请把它们不同的部分写在开头,其次是结尾,不要把这部分放在中间,这会增大错误率,容易书写错误且不容易检查。
看到上面三个数的不同之处了吗?它们开头结尾都相同,但是中间不同,这样真的很容易弄错,如果你不得不这样写,请将naturalFirstNum 改为firstNaturalNum,naturalSecondNum改为secondNaturalNum 同理修改naturalSumNum;如果命名规则要求固定开头(类似btnServiceCommit,前面几个字母表示控件),那就让它们的结尾不同naturalNumFirst.
5.不要加和类型相同的名字,这会给你的查找替换工作加大难度
List<Integer> list = new ArrayList<>();
这个名字有两个槽点:1.你搜索list的时候会把List也搜索出来,如果我全局替换名称,会造成大面积的错误,因为我把List也替换了。2.没意义,因为一旦我赋值错误了,强类型语言IDE会提醒,看到这个名字我也不知道它的作用是什么。
这种情况通常发生在自定义的类,比如:
Apple apple = new Apple();
聪明的程序员往往会这样写:
Apple mApple = new Apple();
mApple比apple这个名字好,因为它让IDE的查找替换工作更加容易
好的名字
int firstNum = 1; int secondNum = 2; int sumNum = firstNum + secondNum; System.out.println("sumNum ="+sumNum );
注意到了吗?我用firstNum来代替num1,这样识别度会增强,firstNum和secondNum不像num1和num2这样容易弄错。因为是变量名所以采用名词,不要写成动词firstAdd,这容易让人眩晕,1+?这是什么?用动词不能完整的表达变量名的意思。
同样的,函数名(方法名)要使用动词+名词。
public static void main(String []args){ int firstNum = 1; int secondNum = 2; System.out.println("sumNum ="+addTwoNums(firstNum,secondNum )); } public static int addTwoNums(int firstNum,int secondNum){ return firstNum + secondNum; }
上面的名称:addTwoNums就是动词+名词格式,不用看代码单独看名字,就知道这个函数(方法)是求两数和的,这就是这种命名方式的好处。单用动词add,绝对不会马上知道这个具体的工作。是添加到数据库?添加到列表?还是求和?要有个识别的过程,这个过程,我称之为浪费时间的过程。
特殊:按钮或超链接类控件命名
虽然也算变量名,通常表示一个动作,如:
提交数据,比如修改手机号,比如登录
所以使用动词或动名词形式:
btnCommit,btnModifyPhoneNumber