1、名副其实 见名知意
我们应该选择指明了计量对象和计量单位的名称;
int elapsedTimeInDays;
int daysSinceCreation;
选择体现本意的名称能让人容易理解和修改代码。下面的代码目的何在?
public List<int[]> getThem()
{ List<int[]> list1 = new ArrayList<int[]>();
for (int[] x : theList)
if (x[0] == 4)
list1.add(x);
return list1;
}
(1)theList中是什么类型的东西?
(2)theList零下标条目的意义是什么?
(3)值4的意义是什么?
(4)我怎么使用返回的列表?
问题的答案没体现在代码段中,可那就是它们该在的地方。比方说,我们在开发一种扫雷游戏,我们发现,盘面是名为theList的单元格列表,那就将其名称改为gameBoard。 盘面上每个单元格都用一个简单数组表示。我们还发现,零下标条目是一种状态值,而该种状态值为4表示“已标记”。只要改为有意义的名称,代码就会得到相当程度的改进:
public List<int[]> getFlaggedCells()
{ List<int[]> flaggedCells = new ArrayList<int[]>();
for (int[] cell : gameBoard)
if (cell[STATUS_VALUE] == FLAGGED)
flag gedCells.add(cell);
return flaggedCells;
}
注意,代码的简洁性并未被触及。运算符和常量的数量全然保持不变,嵌套数量也全然保持不变。但代码变得明确多了。 还可以更进一步,不用int数组表示单元格,而是另写一个类。该类包括一个名副其实的函数(称为isFlagged),从而掩盖住那个魔术数[9]。于是得到函数的新版本:
public List<Cell> getFlaggedCells() {
List<Cell> flaggedCells = new ArrayList<Cell>();
for (Cell cell : gameBoard)
if (cell.isFlagged())
flaggedCells.add(cell);
return flaggedCells;
}
2、函数
只做一件事(具体如何判断看事件是否在一个抽象级别)
要短小,最好不过20行。
自顶向下读代码:向下规则---每个函数后面都跟着位于下一个抽象级别的函数
switch语句
使用描述性名称 ,函数名字不要怕长,尽其意
函数参数 最多保持3个
标识参数丑陋不堪。向函数传入布尔值简直就是骇人听闻的做法。这样做,方法签名立刻变得复杂起来,大声宣布本函数不止做一件事。如果标识为true将会这样做,标识为 false则会那样做!
参数对象 如果函数看来需要两个、三个或三个以上参数,就说明其中一些参数应该封装为类了。
分割另指令与询问。函数要么做什么事,要么回答什么事,但二者不可得兼。public boolean set(String attribute, String value);
抽离Try/Catch代码块。Try/catch代码块丑陋不堪。它们搞乱了代码结构,把错误处理与正常流程混为一谈。最好把try和catch代码块的主体部分抽离出来,另外形成函数。P53