代码怎么用 代码怎么用手机打开( 二 )


还可以更进一步,不用int数组表示单元格,而是另写一个类 。该类包括一个名副其实的函数(称为isFlagged) , 从而掩盖住那个魔术数[1] 。于是得到函数的新版本:
public List<Cell> getFlaggedCells(){List<Cell> flaggedCells = new ArrayList<Cell>();for (Cell cell : gameBoard)if (cell.isFlagged())flaggedCells.add(cell);return flaggedCells;}
只要简单改一下名称,就能轻易知道发生了什么 。这就是选用好名称的力量 。
— 02 —
避免误导
程序员必须避免留下掩藏代码本意的错误线索 。应当避免使用与本意相悖的词,例如,hp、aix和sco都不该用作变量名 , 因为它们都是Unix平台或类Unix平台的专有名称 。即便你是在编写三角计算程序,hp看起来是一个不错的缩写[2],但那也可能会提供错误信息 。
别用accountList来指称一组账号,除非它真的是List类型 。List一词对程序员有特殊意义 。如果包纳账号的容器并非真是一个List , 就会引起错误的判断 。
所以,用accountGroup或bunchOfAccounts,甚至直接用accounts都会好一些 。
提防使用外形相似度较高的名称 。例如,想区分模块中某处的XYZControllerFor-EfficientHandlingOfStrings和另一处的XYZControllerForEfficientStorage-OfStrings , 会花多长时间呢?这两个词的外形实在太相似了 。
以同样的方式拼写出同样的概念才是信息 。拼写前后不一致就是误导 。我们很享受现代Java编程环境的自动代码完成特性 。键入某个名称的前几个字母,按一下某个热键组合(如果有的话),就能得到一列该名称的可能形式 。
假如相似的名称依字母顺序放在一起,且差异很明显,那就会相当有助益 , 因为程序员多半会压根不看你的详细注释 , 甚至不看该类的方法列表就直接看名字挑一个对象 。
误导性名称真正可怕的例子,是用小写字母l和大写字母O作为变量名,尤其是在组合使用的时候 。当然,问题在于它们看起来完全像是常量“壹”和“零” 。
int a = l;if (O == l)a = O1;elsel = 01;
读者可能会认为这纯属虚构,但我们确曾见过充斥这类名称的代码 。有一次,代码作者建议用不同字体写变量名,好显得更清楚些,但前提是这种方案得要通过口头和书面传递给未来所有的开发者才行 。后来 , 只是做了简单的重命名操作,就解决了问题 , 而且也没引起别的问题 。
— 03 —
做有意义的区分
如果程序员只是为满足编译器或解释器的需要而写代码,就会制造麻烦 。例如,因为同一作用范围内两样不同的东西不能重名 , 你可能会随手改掉其中一个的名称 , 有时干脆以错误的拼写充数,结果就会出现在更正拼写错误后导致编译器出错的情况 。

光是添加数字系列或是废话远远不够,即便这足以让编译器满意 。如果名称必须相异,那么其意思也应该不同才对 。
以数字系列命名(a1、a2…aN)是依义命名的对立面 。这样的名称纯属误导——完全没有提供正确信息,没有提供导向作者意图的线索 。试看:
public static void copyChars(char a1[], char a2[]) {for (int i = 0; i < a1.length; i++) {a2[i] = a1[i];}}
如果参数名改为source和destination,这个函数就会像样许多 。
废话是另一种没意义的区分 。假设你有一个Product类,如果还有一个名为ProductInfo或ProductData的类,那它们的名称虽然不同,意思却无区别 。Info和Data就像a、an和the一样,是意义含混的废话 。
注意,只要体现出有意义的区分,使用a和the这样的前缀就没错 。例如,你可能把a用在域内变量 , 而把the用于函数参数[5] 。但如果你已经有一个名为zork的变量,又想调用一个名为theZork的变量,麻烦就来了 。

推荐阅读