// Good int elapsedTimeInDays; int daysSinceCreation; int daysSinceModification; int fileAgeInDays;
使用可读的变量名
1 2 3 4 5 6 7 8 9 10 11
// Bad class prsRecr { private Date genymdhms; private Date modymdhms; }
// Good class PersonRecord { private Date generationTimestamp; private Date modificationTimestamp; }
使用可搜索的变量名
1 2 3 4 5 6 7 8 9 10 11 12 13
// Bad int s = 0; for (int j = 0; j < 10; j++) { s += l[j]; } return s;
// Good int sum = 0; for (int j = 0; j < NUMBER_OF_ADDITIONS; j++) { sum += results[j]; } return sum;
不要使用匈牙利表示法
在匈牙利表示法中,变量名以一个或多个小写字母开始,代表变量的类型,如下面的例子所示:
1 2 3 4 5
lAccountNum - variable is long szName - zero terminated String mFriend - private Friend sFriend - package Friend m_friend - member variable
类名和方法名
类名
名词或者名词短语
不使用抽象的词汇
1 2 3 4 5 6 7 8 9 10
// Good Customer Account Address AddressPrinter
// Bad AccountHandler Data DataManager
方法名
动词或者动词短语
1 2 3 4 5 6 7 8
// Good postPayment savePage setName
// Bad get readResolve
使用静态工厂方法代替重载构造函数
这条原则在《Effective Java》中也有提到,具体有如下几个优点:
静态工厂方法有名字,构造器名字固定,不易于表达方法签名的意义
不必在每次调用它们的时候都创建一个新对象
它们可以返回原返回类型的任何子类型的对象
类似如下的例子中,多个构造函数的重载形式,可读性较差
1 2 3 4 5 6
Date date0 = new Date(); Date date1 = new Date(0L); Date date2 = new Date("0"); Date date3 = new Date(1,2,1); Date date4 = new Date(1,2,1,1,1); Date date5 = new Date(1,2,1,1,1,1);
如下的例子中,可以返回不同的子类,
1 2 3 4 5 6 7 8 9 10
Class Person { public static Person getInstance(){ return new Person(); // 这里可以改为 return new Player() / Cooker() } } Class Player extends Person{ } Class Cooker extends Person{ }
// Bad function emailClients(clients) { clients.forEach(client => { let clientRecord = database.lookup(client); if (clientRecord.isActive()) { email(client); } }); }
// Good function emailClients(clients) { clients.forEach(client => { emailClientIfNeeded(client); }); }
function emailClientIfNeeded(client) { if (isClientActive(client)) { email(client); } }
function isClientActive(client) { let clientRecord = database.lookup(client); return clientRecord.isActive(); }
代码块和缩进风格一致
尽量控制参数在3个及以内
单个参数
判断语句
1
boolean fileExists("myFile");
对变量进行操作,转换并返回
1
InputStream openFile("myFile");
事件响应
1
void passwordAttemptFailedNtimes(int attempts);
参数类
如果一个函数需要多于2-3的变量,可以考虑将他们放在一个类中。
1 2
Circle makeCircle(double x, double y, double radius); Circle makeCircle(Point center, double radius);