软件中随处可见命名,我们给变量,函数,参数,类和封包命名,我们给源代码及源代码所在目录命名,我们给jar文件,war文件和ear文件名命名,我们命名,命名,不断命名,既然有这么多命名要做,不妨做好他,下文列出了好名字的几条简单规则
名副其实
名副其实说起来简单,我们想要强调,这事很严肃,选个好名字要花时间,但省下来的时间比花掉的多,注意命名,而且一旦发现更好的名称,就替换掉旧的,这么做,读你代码的人(包括你自己)都会更开心.
变量,函数或类的名称应该已经答复了所有的大问题,他该告诉你,他为什么会存在,他做什么事,应该怎么用,如果名称需要注释来补充,那就不算是名副其实
int d; //消逝的时间,以日计
名称d什么也没说明,他没有引起对时间消逝的感觉,更别说以日计了,我们应该选择指明了计量水箱的计量单位的名称:
int elapsedTimeInDays; int daysSinceCreation; int daysSinceModification; int fileAgeInDays;
选择体现本意的名称能让人更容易理解和修改代码,下列代码的目的何在?
public List<int[]> getThem() { List<int[]> list1 = new ArrayList<int[]>(); for(int[] x : theList) if(x[0]==4) list1.add(x); return list1; }
为什么难以说明上列代码要做什么事?里面并没有复杂的表达式,空格和缩进中规中矩,只用到三个变量和两个常量,甚至没有涉及任何其他类或多态方法,只是(或者看起来)一个数组的列表而已
问题不在于代码的简洁度,而是在于代码的模糊度:即上下文在代码中未被明确体现的程度.上列代码要求我们了解类似以下问题的答案:
(1)theList中是什么类型的东西?
(2)theList零下标条目的意义是什么?
(3)值4的意义是什么?
(4)我怎么使用返回的列表?
问题的答案没体现在代码段中,可那就是他们该在的地方,比方说,我们在开发一种扫雷游戏,我们发现,盘面是名为theList的单元格列表,那就将其名称改为gameBoard
盘面上每个单元格都用一个简单数组表示,我们还发现,零下标条目是一种状态值,而该种状态值为4表示”已标记”,只要改为有意义的名称,代码就会得到相当程度的改进:
public List<int[]> getFlaggedCells() { List<int[]> flaggedCells = new ArrayList<int[]>(); for(int[] cell : gameBorad) if(cell[STATUS_VALUE]==FLAGGED) flaggedCells.add(x); return flaggedCells; }
注意,代码的简洁性并未被触及,运算符和常量的数量全然保持不变,嵌套数量也全然保持不变,但代码变得明确多了
还可以更近一步,不用int数组表示单元格,而是另写一个类,该类包括一个名副其实的函数(称为isFlagged),从而掩盖住那个魔术数,于是得到函数的新版本:
public List<Cell> getFlaggedCells() { List<Cell> flaggedCells = new ArrayList<Cell>(); for(Cell cell : gameBorad) if(cell.isFlagged()) flaggedCells.add(Cell); return flaggedCells; }
只要简单改一下名称,就能轻易知道发生了什么,这就是选用好名称的力量