时时刻刻都在命名
软件中随处可见命名。我们给变量、函数、参数、类和封包命名。我们给源代码及源代码所在目录命名。我们给jar文件、war文件和ear文件命名。我们命名、命名,不断命名。既然有这么多命名要做,不妨做好它。下文列出了取个好名字的几条简单规则。
名副其实
变量、函数或类的名称应该已经答复了所有的大问题。它该告诉你,它为什么会存在,它做什么事,应该怎么用。如果名称需要注释来补充,那就不算是名副其实。
int d; // 创建以来天数
名称d 加了额外的注释,本身毫无意义。
int daysSinceCreation;
public List<int[]> getThem() {
List<int[]> list1 = new ArrayList<int[]>();
for (int[] x : theList)
if (x[0] == 4)
list1.add(x);
return list1;
}
(1)getThem 是什么?
(2)list1 目的意义是什么?
(3)值4的意义是什么?
(4)我怎么使用返回的列表?
问题的答案没体现在代码段中,可那就是它们该在的地方。比方说,我们在开发一种扫雷游戏,我们发现,盘面是名为theList的单元格列表,那就将其名称改为gameBoard。
public List<int[]> getFlaggedCells() {
// List<int[]> list1 = new ArrayList<int[]>();
List<int[]> flaggedCells = new ArrayList<int[]>();
//for (int[] x : theList)
for (int[] cell : gameBoard)
// if (x[0] == 4)
if (cell[STATUS_VALUE] == FLAGGED)
// list1.add(x);
flaggedCells.add(cell);
//return list1;
return flaggedCells;
}
进一步优化,隐藏魔术数字
public List<Cell> getFlaggedCells() {
List<Cell> flaggedCells = new ArrayList<Cell>();
for (Cell cell : gameBoard)
if (cell.isFlagged())
flaggedCells.add(cell);
return flaggedCells;
}
做有意义的区分
public static void copyChars(char a1[], char a2[]) {
for (int i = 0; i < a1.length; i++) {
a2[i] = a1[i];
}
}
以数字系列命名(a1、a2,……aN)是依义命名的对立面。这样的名称纯属误导——完全没有提供正确信息;没有提供导向作者意图的线索。
如果参数名改为source(源)和destination(目标),这个函数就会像样许多。
使用正确的英文
private Date genymdhms;//生成日期,年、月、日、时、分、秒
gen为generation缩写,ymdhms为格式符,如果不加那是注释毫无意义且令人费解的命名
private Date generationTimestamp;
注:Timestamp 时间戳
好的名称判断:可以读出来的名称
使用可搜索的名称
单字母名称和数字常量有个问题,就是很难在一大篇代码中找出来。
for (int j=0; j<34; j++) {
s += (t[j]*4)/5;
}
int realDaysPerIdealDay = 4;
final int WORK_DAYS_PER_WEEK = 5;
int sum = 0;
for(int j=0; j < NUMBER_OF_TASKS; j++) {
int realTaskDays = taskEstimate[j] * realDaysPerIdealDay;
int realTaskWeeks = (realdays / WORK_DAYS_PER_WEEK);
sum += realTaskWeeks;
}
消除对成员前缀
public class Part {
private String m_dsc; // The textual description
void setName(String name) {
m_dsc = name;
}
}
也不必用 m_前缀来标明成员变量。应当把类和函数做得足够小,消除对成员前缀的需要。你应当使用某种可以高亮或用颜色标出成员的编辑环境。
public class Part {
String description;
void setDescription(String description) {
this.description = description;
}
}
此外,人们会很快学会无视前缀(或后缀),只看到名称中有意义的部分。代码读得越多,眼中就越没有前缀。最终,前缀变作了不入法眼的废料,变作了旧代码的标志物。
类名不应当是动词
类名不应当是动词。
类名和对象名应该是名词或名词短语,如Customer、WikiPage、Account和AddressParser。避免使用Manager、Processor、Data或Info这样的类名,比如AccountManager 比 Manager 更具体。
方法名应当是动词或动词短语
方法名应当是动词或动词短语,如postPayment、deletePage或save。