第二十二章 代码重构

22.1 提炼函数

如果在函数中有一段代码可以被独立出来,那我们最好把这些代码放进另一个独立的函数中。好处:

  • 避免出现超大函数。
  • 独立出来的函数有助于代码复用。
  • 独立出来的函数更容易被覆写。
  • 独立出来的函数如果拥有一个良好的命名,它本身就起到了注释的作用。

22.2 合并重复的条件片段

如果一个函数体内有一些条件分支语句,而这些条件分支语句内部散布了一些重复的代码,就有必要进行合并去重工作。

22.3 把条件分支语句提炼成函数

复杂的条件分支语句是导致程序难以阅读和理解的重要原因,而且容易导致一个庞大的函数。把条件分支语句提炼成单独的函数,既能更准确表达代码的意思,函数名本身又能起到注释的作用。

22.4 合理使用循环

在函数体内,如果有些代码实际上负责的是一些重复性的工作,合理利用循环不仅可以完成同样的功能,还可以使代码量更少。

22.5 提前让函数退出代替嵌套条件分支

嵌套的条件分支语句相比平铺的在阅读和理解上更加困难。用《重构》里的话说,嵌套的条件分支往往是由一些深信“每个函数只能有一个出口”的程序员写出的。但实际上如果对函数的剩余部分不感兴趣,就应该立即退出。

1
2
3
4
5
6
7
8
9
10
11
var del = function (obj) {
if (obj.isReadOnly) {
return;
}
if (obj.isFolder) {
return deleteFolder(obj)
}
if (obj.isFile) {
return deleteFile(obj)
}
}

22.6 传递对象代替过长的参数列表

参数的数量越多,函数就越难理解和使用。我们可以把参数都放入一个对象内,然后把该对象传入函数,函数需要的数据可以自行从该对象里获取。现在不用再关心参数的数量和顺序,只要保证参数对应的 key 值不变就可以了。

22.7 尽量减少参数数量

22.8 少用三目运算符

如果条件分支逻辑简单且清晰,这无碍我们使用三目运算符。

但如果条件分支逻辑非常复杂,最好的选择还是按部就班编写 ifelse

22.9 合理使用链式调用

在 JavaScript 中可以很容易实现方法的链式调用,即让方法调用结束后返回对象自身:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var User = function () {
this.id = null;
this.name = null;
};

User.prototype.setId = function(id) {
this.id = id;
return this;
};

User.prototype.setName = function(name) {
this.name = name;
return this;
};

或者:

1
2
3
4
5
6
7
8
9
10
11
12
var User = {
id: null,
name: null,
setId: function (id) {
this.id = id;
return this;
},
setName: function (name) {
this.name = name;
return this;
}
};

链式调用的坏处就是在调试的时候非常不方便。

如果该链条的结构相对稳定,后期不易发生修改,那么使用链式调用无可厚非。

22.10 分解大型类