有意义的命名
有意义命名的几个简单规则:
1.名副其实。
变量,函数或者类的名称可以答复所有的大问题,而不需要注解来补充命名名称。
int d; //消逝的时间,以天计算。
上面这句代码名称没有什么实际含义,无法表达时间消逝和按照天来计算。
int elapsedTimeInDay;
int daysSinceCreation;
int daysSinceModification;
以上的这段代码不需要注释却也可以让人很清楚明白的理解其含义。
通过了一个简单的例子解释了名副其实这句话想要表达什么,除了命名之外还需要有代码的简洁性等。
下面的例子我们就可以通过对代码就行修改,使得代码的简洁性有所提高,让代码变得更加明确。
public List<int[]> getFlaggedCells(){
List<int[]> flaggedCells = new ArrayList<int[]>();
for(int [] cell : gameBoard){
if(cell[STATUS_VALUE] == FLAGGED){
flaggedCells.add(cell);
}
return flaggedCells;
}
}
改进后:
使用Cell类代替int数组,该类还包括一个名副其实的函数isFlagged(),从而将FLAFFED这个数据封装起来。
public List<int[]> getFlaggedCells(){
List<Cell> flaggedCells = new ArrayList<Cell>();
for(Cell cell : gameBoard){
if(cell.isFlagged()){
flaggedCells.add(cell);
}
return flaggedCells;
}
}
只需要将名称简单的修改,就可以很清楚的知道程序的含义,同时避免了大量的注释。
2.避免误导
程序员必须避免留下掩藏代码本意的错误线索,应当避免使用与本意相悖的词。例如一些操作系统或者编程语言的专有名词。
误导性最可怕的例子莫过于使用小写的“l”和大写的字母"O作为变量名,尤其是在组合使用的时候,因为他们看起来实在是太像常量“1”和“0”了。
3.做有意义的区分
比如用数字系列命名a1,a2,a3,…aN这样的命名纯属误导。完全没有办法提供正确的信息,没有提供导向作者意图的线索。
还有一种就是意义混淆的废话,为什么这么说,比如你有一个Product类,还有一个ProductInfo类或者是ProductData类,他们的名称虽然不同,但是意思却没有区别,程序员在选择程序调用的时候,根本不知道调用哪个函数。
4.使用读的出来的名称
不要使用一堆名称的缩写,在读的时候也没法读,而且也没有办法理解其含义。
5.使用可搜索的名称
单字母命名和数字常量在大段的代码中很难搜索,应该尽可能的使用便于搜索的变量名。
名称的长短应与其作用域大小相对应。
6.避免使用编码
1.避免使用匈牙利语标记法,所谓匈牙利语标记法就是取单词首字母作为变量名,这种编码增加了修改变量,函数或者类名称或者类型的难度,同时也增加了代码阅读的难度。
2.避免使用成员前缀,显得多余。
3.接口和实现,不需要使用XXXImpl等这种标识,就直接使用XXX来命名。
7.避免思维映射
应该尽量使用明确的命名,而不是使用习惯上的i,j,k作为变量名来使用。要清楚明确才是王道。
8.类名
类名和对象名应该是名词或者各词短语。类名不应当是动词。
9.方法名
方法名应当是动词或动词短语。属性访问器,修改器和断言器应该根据其值命名。并依据Javabean标准加上get,set和is前缀。
还包括使用解决方案领域的名称,使用源自所涉及问题领域的名称,添加有意义的语境等。