命名
命名应该表明意图
- 它为什么存在、它做了什么,它怎么使用。
- 如果命名需要注释,那它没有表明它的意图。
坏的例子:
int d; // elapsed time in days
好的例子:
int elapsedTimeInDays;
int daysSinceCreation;
int daysSinceModification;
int fileAgeInDays;
避免虚假信息
程序员应该避免为代码留下错误的线索。
比如变量名为accountList,但是类型却不是List。使用accounts更好。
相似的概念使用相似的命名。避免不一致的命名。
有意义的区分
不同的用途,避免相似的命名。
坏的例子:
public static void copyChars(char a1[], char a2[]) {
for (int i = 0; i < a1.length; i++) {
a2[i] = a1[i];
}
}
ProductInfo和ProductData
getActiveAccount();
getActiveAccounts();
getActiveAccountInfo();
好的例子:
public static void copyChars(char source[], char destination[]) {
for (int i = 0; i < source.length; i++) {
destination[i] = source[i];
}
}
customer和customerInfo
accountData和account
使用可发音的命名
class DtaRcrd102 {
private Date genymdhms;
private Date modymdhms;
private final String pszqint = "102";
/* ... */
};
重构为
class Customer {
private Date generationTimestamp;
private Date modificationTimestamp;;
private final String recordId = "102";
/* ... */
};
使用可搜索的命名
单个字母变量名和数字常量不容易搜索。
for (int j=0; j<34; j++) {
s += (t[j]*4)/5;
}
重构为
int realDaysPerIdealDay = 4;
const 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;
}
避免编码
命名不应该包含类型信息。
坏的例子:
PhoneNumber phoneString;
// name not changed when type changed!
成员前缀
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;
}
}
接口与实现
坏的例子:
IShapeFactory
好的例子:
ShapeFactory 和 ShapeFactoryImp
避免思维映射
名称应该望文生义。
类名
类名应该使用名词或者名词短句。不应该是动词。
Customer, WikiPage, Account, 和 AddressParser.
避免使用Manager, Processor, Data, 或者 Info。
方法名
方法名应该使用动词或者动词短句。
比如postPayment, deletePage, save。
使用get、set、is前缀。
当重写构造器时,使用静态工厂方法,通过名称描述参数。
Complex fulcrumPoint = Complex.FromRealNumber(23.0);
优于
Complex fulcrumPoint = new Complex(23.0);
每个概念选择一个单词
fetch、retrieve、get同时使用会产生混乱。
使用解决方案领域名称
使用计算机术语、算法术语、模式术语、数学术语。
比如AccountVisitor、SocketAdaptor、JobQueue。
使用问题领域名称
使用业务领域名词。
添加有意义的上下文
firstName、lastName、state
添加前缀表示其是地址第一部分:
addrFirstName, addrLastName, addrState
更好的解决方案是创建一个新类Address来保存这些信息。
不要添加无理由的上下文
比如所有类名前缀为GSD。
短的名称比长的名称好。
accountAddress 和 customerAddress 是一个好的实例名,但不是一个好的类名。Address是一个好的类名。