代码重构
---

> 重构，一言以蔽之，就是在不改变外部行为的前提下，有条不紊地改善代码。

代码重构（英语：Code refactoring）指对软件代码做任何更动以增加可读性或者简化结构而不影响输出结果。在经历了一年多的工作之后，我平时的主要工作就是修 Bug。刚开始的时候觉得无聊，后来才发现修 Bug 需要更好的技术。有时候你可能要面对着一坨一坨的代码，有时候你可能要花几天的时间去阅读代码。而，你重写那几十行代码可能只会花上你不到一天的时间。但是如果你没办法理解当时为什么这么做，你的修改只会带来更多的 Bug。修 Bug，更多的是维护代码。还是前人总结的那句话对:

> 写代码容易，读代码难。

假设我们写这些代码只要半天，而别人读起来要一天。为什么不试着用一天的时间去写这些代码，让别人花半天或者更少的时间来理解。

###重命名

在上一节中，我们提到了命名的重要性，这里首先要说到的也就是重命名~~~。再看看《编写可读代码的艺术》也提到了这几点：

1. 选择专业的词。最好是可以和业务相关的，它应该极具表现力。
2. 避免像 tmp 和 retval 这样泛泛的名字。不得不提到的一点是，tmp 实在是一个有够烂的名字，将其变为 timeTemp 或者类似的会更直观。它只应该是名字中的一部分。
3. 用具体的名字代替抽象的名字。
4. 为名字赋予更多的信息。
5. 名字应该有多长。
6. 利用名字的格式来传递含义。

###提取变量

先让我们来看看一个简单的情况：

```javascript
if ($scope.goodSkills.indexOf('analytics') !== -1) {
  skills.analytics = 5;
}
```

在上面的代码里比较难以看懂的就是数字5，这时候你会怎么做？写一行注释？这里的5就是一个 Magic Number。

而实际上，最简单有效的办法就是把5提取成一个变量：


```javascript
var LEVEL_FIVE = 5;
if ($scope.goodSkills.indexOf('analytics') !== -1) {
  skills.analytics = LEVEL_FIVE;
}
```

###提炼函数

这个简单有效的方法就是为了对付之前太长的函数，抽取提炼函数出应该抽取出来的部分成为一个新的函数。引自《重构》一书的说法，短的精巧的函数有以下的特点：

1. 如果每个函数的粒度都很小，那么函数被复用的机会就更大；
2. 是这会让高层函数读起来就像一系列注释一样，容易理解；
3. 是如果函数都是细粒度，那么函数的复写也会更加容易。

在提炼函数中我们所要做的就是——判断出原有的函数的意图，再依据我们的新意图来命名新的函数。然后判断依赖——变量值，处理这些变量。提取出函数，再对其测试。

这里只简单地对重构进行一些介绍，更多详细信息请参阅《重构：改善既有代码的设计》。
