代码整洁之道--阅读笔记

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


你可能感兴趣的:(代码整洁之道--阅读笔记)