有意义的命名
我们给变量,函数,参数,类和封包命名,我们给源代码及源代码所在目录命名,既然有这么多命名要做,不妨做好它。下面列出了取个好名字的几条简单规则。
名副其实
变量含糊或者类的名称应该告诉别人:它为什么存在,做什么事,该这么用。如果名称需要注释来补充,那就不是名副其实,下面有几个例子:
int d;//消逝的时间以日来计算。
名称d什么也没有说明,它没有说明对时间消逝的感觉,更别说以日计算了,我们应该使用更加清晰明确的名称:
int elapsedTimeInDay;
再来看看下面的代码:
public List<int []> getThem(){
List<int []> list1 = new ArrayList<int []> ();
for(int[] x: theLIst)
{
if(x[0] == 4)
list1.add(x);
}
return list1;
}
上面的代码没有复杂的表达式,空格和缩进也是按照格式,用到的变量也很少,没有涉及多态或者继承等复杂情况,但是依然难以了解代码要做什么。
问题不在于代码的简洁度,而在于代码过于模糊,即上下文在代码中未被明确体现。
假如上面的代码实际是:我们在开发一种扫雷游戏,我们发现,盘面是名为theList的矩阵,那就可以改名为gameBoard,矩阵的数字代表着一种状态,状态值为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;
}
代码依然很简洁,而且变得明确了很多。只是简单改一下名称就能轻易的知道发生了什么,这就是命名的作用。
避免误导
程序员必须避免留下掩盖代码本意的错误线索。应当避免使用与本意相悖的词。例如:hp,aix,sco都不应该用作变量名,因为它们都是unix或者类unix平台的专有名词。
别用accountList来指一组账号,除非它真的是List类型。List一词对程序员来说有特殊的意义。如果存放账号的容器并非真实个List,就会引起错的判断。所以用accountGroup或者accounts都可以。
提防使用不同之处较小的名称。比如XYZControllerForEfficientHandlingOfStrings和XYZControllerForEffcientStorageOfStrings,区别这两个词都会花费大量精力。。
以同样的方式拼写出同样的概念才是信息。拼写前后不一致就是误导。我们很享受现代编程环境的代码自动补全。假如相似的名称依字母顺序放在一起,且差异明显,那就会相当有益。
误导性名称真正可怕的例子,使用小写字母I和小写字母O作为变量名,尤其是组合使用的时候。当然,问题在于它们看起来完全很像“0”和“1”。
做有意义的区分
如果程序员只是为了满足编译器或者解释器的需要而写代码,就会产生麻烦。例如,因为同一作用范围内两样不同的东西不能重名,你可能随手改掉一个名称。有时干脆以错误的拼写充数,结果就是出现在更正拼写错误后导致编译器出错。
以数字系列命名(a1,a2,...)是依义命名的对立面,这样的名称纯属误导,完全没有提供正确的信息,没有提供作者意图的线索。
废话是另一种无意义的区分。假如你有一个ProductData类还有一个ProductInfo类,它们名称虽然不同但是意思却无区别。注意,只要体现出有意义的区分,例如a前缀用在域内变量,而把the用于函数参数,是可以接受的。废话都是冗余。比如NameString,Name已经是一个string型没有必要再加说明。
要区分名称,就要以读者能鉴别不同之处的方式来区分。
使用读得出来的名称
有时你会把某个很长的名称用首字母或者你习惯的缩写来简写,这样的名称最好是能够容易发音的。(英语好的注意。。)
使用可搜索的名称
单个字母名称和数字常量有个问题,就是很难再一大篇文字中找出来。
单字母名称最好只用于短方法中的本地变量。名称长短应该与作用域大小相对应。若常量或者变量可能在代码中多出使用,则应赋予便于搜索的名称
网友评论