1.有意义的命名
1.1 名副其实
变量选择要体现本意的名称,能让人更容易理解和修改代码。
例如:
int d ; //消逝的时间,以日计
int elapsedTimeInDays;
int daysSinceCreation;
int fileAgeInDays;
好的命名习惯可以让代码块变得易读,无关于简洁度,而是可以减少代码的模糊度。
比如下面这段代码。
public List<int []> getThem(){
List<int []> list1 = new ArrayList<>();
for(int[] x : theList){
if (x[0] == 4){
list1.add(x);
}
}
return list1 ;
}
在看这段代码时有很多问题不理解,如theList是什么类型的东西,theList下标0条目的意义是什么?值4的意义是什么?我怎么使用返回列表?
假设这是一款扫雷游戏,盘面是theList的单元格列表,那就将其名称改为gameBoard。盘面上每个单元格都用一个简单数组表示,0下标条目是状态栏,而状态值4代表为“已标记”。现在我们可以把代码改为有意义的名称。
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封装为一个类,在判断FLAGGED时,调用判断方法来掩盖这个数字。
1.2 避免误导
我们必须避免留下掩盖代码本意的错误线索,避免使用与本意相悖的词。比如accountList来指称一组账号,除非它真的是List类型。如果说他包含的一组账号并不是List类型,就会引起错误的判断。所以,用accountGroup或bunchOfAccounts,甚至直接用accounts都会好一些。
另外需要提防使用不同之处较小的名称,如XYZControllerForEfficientHandlingOfStrings
和另一处的XYZControllerForEfficientStorageOfStrings
,辨别需要花费多少时间呢?
1.3 做有意义的区分
对于一些变量,只是在其后面添加数字用以区分并不规范,只是滥竽充数,这只能让编译器满意,以数字系列命名(a1,a2,a3,a4...)是依义命名的对立面,完全没有提供正确的信息:没有提供导向作者意图的线索。
public static void copyChars(char a1[],char a2[]){
for(int i=0; i<a1.length; i++){
a2[i] = a1[i] ;
}
}
如果参数名改为source和destination,这个函数就会像样很多。