一、名副其实的命名(如果名称需要注释来补充,那就不是名副其实的命名)
例:
int d;// 消逝的时间,以日计
参考:
int elapsedTimeInDays;
二、简洁明了的方法
例:
public List<int[]> getThem() {
List<int[]> list1 = new ArrayList<int[]>();
for (int[] x : theList)
if (x[0] == 4)
list1.add(x);
return list1;
}
参考:
public List<Cell> getFlaggedCells(){
List<Cell> flaggedCells = new ArrayList<Cell>();
for (Cell cell : gameBoard)
if (cell.isFlagged())
flaggedCells.add(cell);
return flaggedCells;
}
三、命名避免误导
如:hp、aix、sco都不该用来做变量名,因为它们都是UNIX或类似平台的专有名称。
别用xxList来命名一堆数据除非真的是List类型 可以考虑xxGroup或者xxs
别用容易引起误导的字母 如字母O、I 和数字0、1
四、使用可搜索的名称
MAX_CLASSES_PER_STUDENT很容易搜索 但是常量就很难搜索的到 字母e也很难搜索到
五、扔掉前缀吧 这些是旧时代的产物
例:
public class Part {
private String m_dsc; // The textual description
void setName(String name) {m_dsc = name;}
}
参考:
public class Part {
String description;
void setDescription(String description) {
this.description = description;
}
}
六、别扮可爱
如果名称太耍宝,那就只有同作者一般有幽默感的人才能记得住,int Ծ‸Ծ = 0?
宁可明确,毋为好玩。
七、每个概念对应一个词
在同一堆代码中有controller,又有manager,还有driver,就会令人困惑。为什么不全用controllers或managers?
八、别用双关方法
如一个add方法 通过增加或者连接获取新值,现在一个新类一个方法是讲参数放在容器里,也取名add方法,看似和其他 add方法名字一致,但是语意并不相同,应该用insert或者append之类的命名。
九、添加有意义的语境
例:
private void printGuessStatistics(char candidate, int count) {
String number;
String verb;
String pluralModifier;
if (count == 0) {
number = "no";
verb ="are";
pluralModifier = "s";
}
else if (count == 1) {
number = "1";
verb = "is";
pluralModifier = "";
}
else {
number = Integer.toString(count);
verb = "are";
pluralModifier = "s";
}
String guessMessage = String.format("There %s %s %s%s", verb, number,candidate,pluralModifier);
print(guessMessage);
}
上列函数有点儿过长,变量的使用贯穿始终。要分解这个函数,需要创建一个名为GuessStatisticsMessage的类,把三个变量做 成该类的成员字段。这样它们就在定义上变作了GuessStatisticsMessage的一部分。语境的增强也让算法能够通过分解为更小的
函数而变得更为干净利落。
参考:
public class GuessStatisticsMessage {
private String number;
private String verb;
private String pluralModifier;
public String make(char candidate, int count) {
createPluralDependentMessageParts(count);
return String.format("There %s %s %s%s",verb, number, candidate, pluralModifier );
}
private void createPluralDependentMessageParts(int count) {
if (count == 0) {
thereAreNoLetters();
}
else if (count == 1) {
thereIsOneLetter();
}
else {
thereAreManyLetters(count);
}
}
private void thereAreManyLetters(int count) {
number = Integer.toString(count);
verb = "are";
pluralModifier = "s";
}
private void thereIsOneLetter() {
number = "1";
verb = "is";
pluralModifier = "";
}
private void thereAreNoLetters() {
number = "no";
verb = "are";
pluralModifier = "s";
}
}
十、函数要短小
函数的第一规则是要短小。第二条规则是还要更短小
十一、函数只做一件事
函数应该做一件事。做好这件事。只做这一件事。
十二、使用描述性的名称(不要害怕使用长名称)
别害怕长名称。长而具有描述性的名称,要比短而令人费解的名称好。
十三、函数参数
最理想的参数数量是零(零参数函数),其次是一(单参数函数),再次是二(双参数函数),应尽量避免三(三参数函数)。有 足够特殊的理由才能用三个以上参数(多参数函数)—所以无论如何也不要这么做。
十四、标识参数
方法调用render(true)对于可怜的读者来说仍然摸不着头脑。看到render(Boolean isSuite),稍许有点帮助,不过仍然不够。应 该把该函数一分为二:reanderForSuite()和renderForSingleTest()。
十五、参数对象
如果函数看来需要两个、三个或三个以上参数,就说明其中一些参数应该封装为类了。例如,下面两个声明的差别:
Circle makeCircle(double x, double y, double radius);
Circle makeCircle(Point center, double radius);
十六、动词与关键字
例:
write(name)
参考:
writeField(name) 它告诉我们,“name”是一个“field”。
十七、输出参数
例:
appendFooter(s); s是什么让人疑惑 s是输出还好是输入也让人费解 看看原函数
public void appendFooter(StringBuffer report) 被迫检查函数 会中断思路
参考:
report.appendFooter();
十八、注释一般都是修饰糟糕的代码 尽量可以不添加注释读懂代码
例:
//check args is eligible for full benefits
if((xx.flags&yy)&&(yy>65))
参考:
if(xx.isEligibleForFullBenefits)
十九、如果一定要添加注释 简洁明了 不要废话连篇
二十、不要滥用位置标记
比如//action// --------------------anything----------------------