1.名副其实
☛要点
如果名称需要注释来补充,那就不算是名副其实
☹糟糕代码
public List<int[]> getThem (){
List<int[]> listl = new ArrayList<int[]> ();
for (int[] x : theList)
if (x[0] == 4){
listl.add(x[0]);}
return listl;
}
theList 中是什么类型的东西?
theList 0下标的意义是什么?
值4的含义是什么?
我们怎么使用返回的列表?
☺改进代码
假设这是一段扫雷游戏代码。
盘面就是theList的单元格列表,将其命名为gameBord
0下标是一种状态值
状态值‘4’表示已标记
private List<int[]> gameBord;
private int STATUS_VALUE = 0;
private int FLAGED = 4;
public List<int[]> getFlagedCells() {
List<int[]> flagedCells = new ArrayList<int[]>();
for (int[] cell : gameBord)
if (cell[STATUS_VALUE] == FLAGED) {
flagedCells.add(cell);
}
return flagedCells;
}
☺更进一步
不用int[]表示单元格,而是用一个单独的类,该类包括一个名副其实的函数(isFlagged)
public List<Cell> getFlagedCells() {
List<Cell> flagedCells = new ArrayList<Cell>();
for (Cell cell : gameBord)
if (Cell.isFlagged()) {
flagedCells.add(cell);
}
return flagedCells;
}
2.避免误导
3.做有意义的区分
☛要点
以数字系列命名(a1,a2…)是依义命名的对立面。这样的名称纯属误导——完全没有提供正确信息
如果有一个Product类,还有一个ProductInfo或者ProductData,他们虽然名称不同,毫无任何区别
variable(可变的)一词永远不应出现在变量名中
Table一词永远不应出现在表名中
nameString会比name好吗?难道name会是一个浮点数?
☹糟糕代码
public static void copyChars(char[]a1,char[]a2) {
for (int i = 0; i < a1.length; i++) {
a2[i] = a1[i];
}
}
如果参数名为source和destination(目的地,目标,终点)这个函数就会像样许多
getActiveAccount();
getActiveAccounts();
getActiveAccountInfo();
以上区分毫无意义
4.使用能读出来的名称
☛要点
人类进化到大脑中专门有一部分来处理语言,若不善加利用,实在是种耻辱
☹糟糕代码
private Date genymdhms;//生成日期,年,月,日,时,分,秒
☺改进代码
private Date generationTimeStamp;//生成时间戳
5.使用可搜索名称
☛要点
单字母名称和数字常量很难在一大篇文字中找出来
若变量或常量可能在代码中多次使用,应赋其便于搜索的名称
☹糟糕代码
for (int i = 0; i < 34; i++) {
s+=(t[i]*4)/5;
}
☺改进代码
int realDaysPerIdealDay = 4;
final int WORK_DAYS_PER_WEEK = 5;
final int NUMBER_OF_TASKS = 34;
int sum = 0;
for (int i = 0; i < NUMBER_OF_TASKS; i++) {
int realTaskDays = TaskEstimate[j] * realDaysPerIdealDay;
int realTaksWeeks = realTaskDays/WORK_DAYS_PER_WEEK;
sum += realTaksWeeks;
}
6.避免使用编码
☛要点
不必用m_前缀来标注成员变量。应把类和函数做的足够小,消除成员前缀的需要
这段看的有点懵逼。。。
☹糟糕代码
private String m_des;// The textual description
☺改进代码
private String description;
7.避免思维映射
☛要点
仅仅是因为有了a和b,就要取名为c,实在非像样的理由。
专业程序员了解,明确是王道
8.类名
☛要点
类和对象应该是名称或名词短语,如Customer,Account,避免使用Manager,Processor,data或Info这样的类名。
类名不应当是动词。
9.方法名
☛要点
方法名应当是动词或动词短语,如PostPayMent,deletePage或save。
重载构造器时,使用描述了参数的静态工厂方法名。例如
Complex fulcrumPoint = Complex.FromRealNumber(23.0);
同常好于
Complex fulcrumPoint = new Complex(23.0);
可以考虑将对应的构造器设置为private,强制使用这种命名手段。
10.别扮可爱
☛要点
谁会知道HolyHandGrenade(圣手手雷)这个函数是用来做什么的呢?DelteItems或许是更好的名称
言到意到,意到言到。
11.每个概念对应一个词
☛要点
给抽象概念对应一个词,并且一以贯之。
在同一堆代码中。有manager又有controller,driver,就会令人困惑。
总之,不要用多个词表示一个意思!
12.别用双关语
☛要点
避免用同一单词表示不同目的。
比如在多个类中都有add方法,该方法通过增加或链接两个现有值来获得新值。假设新类中有个方法,把单个变量放在集合中,这个方法如果再叫add,就是双关了,应该用insert或append好一些。
总之,不要用一个词表示多个意思!
13.使用解决方案领域的名称
☛要点
只有程序员会读你的代码,尽管使用程序员看得懂的名称。使用问题所涉领域来命名,可不算是聪明的做法。
14.使用源自所涉问题领域的问题
☛要点
如果不能使用程序员熟悉的术语来命名,使用问题所涉领域来命名。
我觉的以上两点写的有些矛盾。。
15.添加有意义的语境
☹糟糕代码
public 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 = "s";
}
else {
number = Integer.toString(count);
verb = "are";
pluralModifier = "s";
}
String guessMessage = String.format("There %s %s %s$s",verb,number,candidate,pluralModifier);
System.out.println(guessMessage);
}
☺改进代码
上列函数有点过长,要分解这个函数,需要创建一个GuessStatisticsMessage的类,把三个变量作为该类的成员字段。
class GuessStatisticsMessage
{
String number;
String verb;
String pluralModifier;
public String make(char candidate,int count) {
CreatePluraDependentMessageParts(count);
return String.format("There %s %s %s$s",verb,number,candidate,pluralModifier);
}
private void CreatePluraDependentMessageParts(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 = "s";
}
private void thereAreNoLetters() {
number = "no";
verb = "are";
pluralModifier = "s";
}
}
16.不要添加没用的语境
☛要点
假设有一个“加油站豪华版”(Gas Station Deluxe)的应用,在其中给每个类添加GSD前缀就不是什么好点子了。
17.最后的话
不妨试试上面这些规则,看你的代码可读性是否有所提升。如果你是在维护别人写的代码,使用重构工具来解决问题。效果立竿见影,而且会持续下去。