一、名副其实
int d; //消逝的时间,以日计
上面的变量名d仿佛什么也没说,佳实践应该类似下面这样的变量名表示消逝的时间:
int elapsedTimeInDays;
int daysSinceCreation;
//等其他有意义的变量名
再举个例子:
public List<int[]> getThem(){
List<int[]> list1=new ArrayList<int[]>();
for(int[] x:theList){
if(x[0]==4) {
list1.add(x);
}
}
return lits1;
}
上面的代码是错误的实践,代码具有很高的模糊度。比如:
① theList是什么类型的东西?
② theList零下标条目的意义是什么?
③ 值4的意义是什么?
④ 我怎么使用返回的列表?
改进,以扫雷游戏为例,下面是良好的实践:
public List<Cell> getFlaggedCells(){
List<Cell> flaggedCells=new ArrayList<Cell>();
for(Cell cell:gameBoard){
if(cell.isFalgged()){
flaggedCells.add(cell);
}
}
return flaggedCells;
}
这样我们从方法名,到for each语句里的变量,到方法返回list都能看到变量名就猜出大概是做什么事的了。
二、避免误导
必须避免留下掩藏代码本意的错误线索。避免使用与本意相悖的词。
例如:hp、aix、sco都不该用作变量名,因为他们都是UNIX平台或者类UNIX平台的专有名称。
再比如,不要用accuntList来指称一组账号,除非它真的是List类型。List一词对程序员有特殊的意义。如果存储账号的容器并非真是List,就会引起错误的判断。
还有一条,提防使用不同之处较小的名称。
例如:
想要区分XYZControllerForEfficientHandlingOfStrings和另一处的
XYZControllerForEfficientStorageOfStrings,需要花费一些时间,因为它俩太像了,应尽量避免这样。
三、做有意义的区分
首先,以数字序列命名不是良好的实践,例如:a1、a2、a3,这样的命名就完全没有办法知道代码作者的意图。
其实废话是没意义的区分:如果你的项目有以下这三个类:比如Product类,ProductInfo类和ProductData类。虽然它们的名字不同,但是意义却没区别,是意义含糊的废话。
废话都是冗余的,就好比Varaiable这个单词永远不应该出现在变量命中,Table这个单词永远不应该出现在表明中。因为这是废话,难道NameString比Name好么?Name会是浮点数不成?
四、使用读得出来的名称
编程是一种社会活动!不要自己造单词,要使用恰当的英语词!
五、使用可搜索的名称
单字母名称和数字常量有个问题,很难在代码中全局搜索出来。
找MAX_CLASS_PER_STUDENT很容易,但是找数字7就比较
六、避免使用编码
比如可以不用添加m_前缀表示这是一个成员变量。
不用IShapeFactory中的I前缀表示接口等
七、避免思维映射
不应该让读者在脑中把你的名称翻译成他们熟知的名称。这种问题经常出现在选择是使用问题领域术语还是解决方案领域术语时。
八、类名
类名和对象名应该是名词或者名词短语。比如:Customer、Account。
避免使用动词作为类名
九、方法名
方法名应该是动词或者动词短语。比如:sendMessage、deletePage等。
十、别扮可爱
也就是别在代码中抖机灵,用非正式词汇做名称。
比如你好骚啊,抖机灵翻译成“keen how sour”
十一、每个概念对应一词
例如使用fetch、retrieve、get来给在多个类中的同种方法命名。
十二、别用双关语
顾名思义,不要用含义模棱两可的变量名
十三、使用解决方案领域名称
只有程序员才会读你的代码,因此尽管用计算机科学术语、算法名、模式名、数学术语吧。
哪个程序员会不知道JobQueue的意思呢?
十四、使用源自所涉问题领域的名称
如果不能使用程序员熟悉的专业术语给手头的工作命名,那就采用从所涉问题领域而来的名称吧。
十五、添加合适的语境
很少有名称是能够自我说明的—多数不能。因此,需要用良好命名的类、函数或名称空间来放置名称,给读者提供语境。
假如有名为firstName、lastName、street、houseNumber、city变量,这的确很明确看出是地址。可是只若看到state呢?此时添加前缀addrFirstName、addrLastName、addrState等,一次提供语境。
参考
《代码整洁之道》