软件中随处可见命名。我们给变量、函数、参数、类和封装包命名。我们给源代码及源代码所在目录命名。我们给jar、war、ear文件命名。我们命名,命名,不断命名,有的时候我们脑袋词穷,想不到适合的名字,不愿意花精力去查名字对应的英文单词,图方便,怕麻烦,就草草命个名,在旁边加上相应注释就OK了,含沾沾自喜代码注释挺详细的。可是这样就真的无后患之忧了,且不说注释会被后来的人误删,或者开发工具由于编码格式不对出现乱码。或者看代码的人不习惯看注释等等,这些问题我们都不能忽视。既然命名工作如此之多,如此重要,不放我们就做好它。以下列出取个好名字的几条简单的规则。

(1)名副其实  

选个好名字要花时间,但省下来的时间比花掉的多。这么做,读你代码的人,包括你自己都会开心。名副其实就是要让变量、函数或类的名称应该表达所有意图,用名字来表达它为什么会在这儿,它在这做什么?谁在调用它?他该怎么被调用,如果名称需要用注释来补充,那就不算名副其实。 错误范例: int d;//消逝的时间,以日计。 正确范例:int elapsedTimeInDays; 错误范例中名称d,什么也没说明,虽然加了注释,可是我们对他它不感冒。规范的命名应该如后者,通过名称我们就指明了计量对象与单位,无需加注释。而且选择体现本意的名称能让人更容易理解和修改代码。  

错误范例:public List<int []> getThem( ) {

List<int[]> list = new ArrayList<int[]>(); 

for(int[] x : thlist){

if( x[0] == 4){

list.add( x );  

}

return list;

}

重构之后:  

public List<Cell> getFlaggedCells( ) {

List<Cell> flaggedCellls = new ArrayList<Cell>(); 

for(Cell cell : gameBoard){ 

if( cell.isFlageed() ){ 

flaggedCells.add( cell); 

} 

return flaggedCells; 

}  

我们可以看到错误范例中代码一下子让人摸不着头绪,太过于模糊,看到这段代码我们还得花精力去了解theList是什么?中定义的类型是什么?theList零下标代表什么意义?值4的意义是什么?该方法在做什么?返回的列表怎么用? 假设我们现在在开发一个扫雷的游戏,盘面是名为theList的单元格列表,那就将它改为gameBoard.盘面上每个单元格都用一个简单的数组表示,零下标是一种状态值,该状态值为4表示“已标记”。

于是我们就将int数组改为表示单元格的一个类Cell,该类中的函数(isFlagged())掩盖那个魔术数(已标记的为4)。只是简单的改了一下名称,就轻易的知道发生了什么。所以取一个好名字百利而无一害。

(2)避免误导

在命名的时候应该尽量避免使用让人产生误导的词,例如:hp, mac,aix,sco等等。别用accountList来指称一组账号,除非他真的是List类型。List一词对程序员有特殊的意义,如果包纳的账号的容器并非真是一个List,就会引起错误的判断,所以用accountGroup或者bunchOfAccounts,甚至直接用accounts都是好的。 此外还要提防使用不用之处较小的名称,想要区分模块中某处的XYZContrallerForEfficientHandlingOfStrings和另一处XYZContrallorForEfficientStorageOfStrings,会花很多时间,因为他们太相似了。还有一个误导性名称真正可怕的例子,用小写字母l和o做变量名,他们看起来太像“一”和“零”了。

(3)做有意义的区份 

假设你有一个Product类,还有一个ProductInfo类,他们名称虽然不同但是意思却无差别。info和Data就像a,an,the一样,是意义含糊的废话 ,Variable永远不要出现在变量中。Table一词永远不要出想在表名当中,NameString会比Name好吗?Customer与CustomerObject类后和区别,如果缺少明确规定,变量moneyAmount就与money没有区别,theMessage与Message也没有区别,要区分名称,就要以读者能鉴别不同之处的方式来区分

 

(4)使用读得出来的名称 

尽量少略写,或简写名称。因为阅读代码,或讨论的时候,简写的名称很让人冒火。比如, Date genymdhms;改成generationTimeStamps(生成时间戳),你在跟人讨论的时候,说:“那个,generationTimestamps这个变量要获得他的整型值.......”.怎么样,比你读genymdhms要舒坦得多吧。

(5)类名 

类名与对象名应该是名词或名词短语,如Customer,WikiPage、Account和AddressParser,避免用Manager,Processor,DAta或Info这样的类名。

(6)方法名  

方法名应该是动词或动词短语,如postPayment,deletePage,saveInstance.属性访问器,修改器,断言应该根据其值命名,并以JavaBean标准加上get,set,is前缀。 

最后想要说的话,就是取一个好的名字是一个技术问题,需要良好的描述技巧与共有的教育文化背景。不要害怕重命名,而且我相信现在的很多开发工具多有重命名的快捷键,不会出现什么大的乱子。在命名的时候不妨试试上面的一些规则,看看你的代码可读性是否有所提高。

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐