命名
1.命名要体现意思
例如:集合名称、有意义的形参、下标的意义、整数的意义,不要用魔术数,用命名代称。
2.避免误导
不要轻易用容器后缀作为命名,除非真的是该类型。accounts
也可以;
不要取特别长由难区分的命名,耽误时间,容易弄错。
不要乱用大小写字母,例如,小写字母l和大写字母O。
3.有意义的区分
不要轻易以数字系列命名,例如:a1[]
、a2[]
不要用没区别的意思命名,例如:ProductInfo
、ProductData
不要用废话,例如:Variable在变量名中、Table在表名中、用Name而不用NameString,
如果缺少约定,变量moneyAmount与money没区别,xxInfo和xx没区别。
要区分名称,要以读者能鉴别的不同之处来区分。
不要如下:getActiveAccount()
、getActiveAccounts()
、getActiveAccountInfo()
4.使用读得出来的、可搜索的名称
不要用自造词
不要轻易用单个字母e或数字7等命名,不好搜索。
单字母名称仅用于短方法中的本地变量,名称长短应与作用域相对应。
若变量或常量可能在代码中多处使用,应采用方便搜索的名称。
5.避免使用无意义的前缀
6.接口和实现类要有区分
7.单字母命名时变量名取大多数人习惯的,比如i、j、k
8.类名、对象名应该是名词或名词短语,不应该是动词。
避免使用 Manager
、Processor
、 Data
或 Info
等类名。
9.方法名应当是动词或动词短语
如 postPayment
、 deletePage
、 save
,属性访问器、修改器和断言应当根据其值命名,并添加get、set和is前缀。
10.取名要规范,不要内涵别的意思
11.每个概念对应一个词
不要 fetch
、 retrieve
、 get
在多个类中的同种方法命名,不要混用 controller
、manager
、 Driver
等
12.避免同一单词多个意思的理解
比如,多个类中的add在参数列表和返回值在语义上等价,但是不能为了add而强行使用。比如 可能 insert
或 append
更精确。
13.使用常用的术语、算法名、模式名、数学术语等,
例如 VISITOR模式的 AccountVisitor
、Queue的 JobQueue
。
14.名称来源于要解决的问题域,有应用场景。
15.添加有意义的语境。
可以用良好命名的类、函数或名称空间来放置名称,从而提供语境,或者添加合适的前缀。比如单个的 state
,转化为 addrState
。
16.不要添加没用的语境。
在Address类中,类属性不用什么都加上addr,同样也注意类名是否会多义。
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", verb, number, candidate, pluralModifier);
System.out.println(guessMessage);
}
函数过长,变量的使用贯穿始终。分解这个函数,可以创建一个类,把三个变量做成该类的成员字段,这样在定义上成为类的一部分。
主函数呈现整体逻辑。
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", 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 = "l";
verb = "s";
pluralModifier = "";
}
private void thereAreNoLetters() {
number = "no";
verb = "are";
pluralModifier = "s";
}
}