何谓重构?
重构(名词):对软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下,提高其可理解性,降低其修改成本。如上面提到的各种重构手法。
重构(动词):使用一系列重构手法,在不改变软件可观察行为的前提下,调整其结构。
为何重构?
1 重构改进软件的设计。人们只为短期目的(支持新功能)而修改代码时,经常没有完全理解架构的整体设计,导致程序的内部设计会逐渐腐败变质。
2 重构使软件更容易理解。程序设计,很大程度上就是与计算机对话,编程的核心就在于“准确地说出我想要的”,但是,除了计算机外,源码还有其他读者(未来的开发者)。重构可以让代码更好地表达自己的意图--更清晰地说出我想要做的。关于这点,重命名这个手法应该经常使用,好的名字帮助读者更好的理解代码意图。
3 重构帮助找到bug。重构可以深入理解代码的所作所为,借此找到不易察觉的bug。
4 重构提高编程速度。这是重构的长期价值,让代码与时俱进,减轻或者丢弃历史包袱。
常见重构手法
1 重命名(变量、字段、函数、类)、移动语句、拆分循环、拆分阶段、拆分变量、以查询取代临时变量、以查询取代参数、移除死代码、移除标记参数、移除中间人、移除设值函数、将查询函数和修改函数分离
2 合并条件表达式、分解条件表达式、以多态取代条件表达式、以卫语句取代嵌套条件表达式、以子类取代类型码
3 提炼/内联 + 类/函数/变量
4 封装、提炼超类、折叠继承体系、移除子类、构造函数本体上移、字段/函数+上移/下移、以工厂函数取代构造函数、以委托取代子类/超类(委托取代继承) -- 建议审慎地组合使用委托(对象组合)和类继承
举例:移除标记参数,主要目的是使得函数调用处意图更明确。
function setDimension(name, value) {
if ("height" == name) {
this._height = value;
return;
}
if ("width" == name) {
this._width = value;
return;
}
}
重构后,
function setHeight(value) {this._height = value;}
function setWidth(value) {this._width = value;}