您的位置:首页 > 编程语言

重构(改善既有代码的设计)--读书笔记2

2016-03-06 14:56 429 查看
重构(改善既有代码的设计)–读书笔记1中,总结了什么是重构,为什么要重构,该在什么地方重构以及代码的坏味道。接着上一篇博客,本篇博客总结常用的重构手法,对于每一个重构手法,我将会做一个简要介绍,必要的时候我会再给出一个简单的示例加以说明。

一.重新组织函数

1. Extract Method(提炼函数)

你有一段代码可以被组织在一起并独立出来。

将这段代码放进一个独立的函数中,并让函数名称解释该函数的用途。

2. Inline Method(内联函数)

一个函数的本体与名称同样清楚易懂。

在函数调用点插入函数本体,然后移除该函数。

3. Inline Temp(内联临时变量)

你有一个临时变量,只被一个简单表达式赋值一次,而它妨碍了其他重构手法。

将所有对该变量的引用动作,替换为对它赋值的那个表达式自身。

double basePrice = anOrder.basePrice();
return (basePrice > 1000);


改为:

return (anOrder.basePrice() > 1000)


4.Replace Temp with Query(以查询取代临时变量)

你的程序以一个临时变量保存某一表达式的运算结果。

将这个表达式提炼到一个独立的函数中,将这个临时变量的所有引用点替换为对新函数的调用。此后,新函数就可以被其他函数使用。

double basePrice = _quantity * _itemPrice;
if (basePrice > 1000)
return basePrice * 0.95;
else
return basePrice * 0.98;


改为:

if (basePrice > 1000)
return basePrice * 0.95;
else
return basePrice * 0.98;

...

double basePrice(){
return _quantity * _itemPrice;
}


动机:临时变量的问题在于,它们是暂时的,而且只能在所属函数内使用。由于临时变量只在所属函数内可见,所以它们会驱使你写出更长的函数,因为只有这样你才能访问到需要的临时变量。如果把临时变量替换为一个查询,那么同一个类中的所有函数都将可以获得这份信息。这将给你带来极大的帮助,使你能够为这个类编写更清晰的代码。

5. Introduce Explaining Variable(引入解释性变量)

你有一个复杂的表达式。

将该复杂表达式(或其中一部分)的结果放进一个临时变量,以此变量名称来解释表达式的用途。

6. Split Temporary Variable(分解临时变量)

你的程序有某个临时变量被赋值超过一次,它既不是循环变量,也不被用于收集计算结果。

针对每次赋值,创造一个独立、对应的临时变量。

动机:除了“循环变量”和“结果收集变量”这两个变量,还有很多变量用于保存一段冗长代码的运算结果,以便稍后使用,这种变量应该只被赋值一次。如果它们被赋值超过一次,就意味着它们在函数中承担了一个以上的责任。如果临时变量承担多个责任,它就应该被分解为多个临时变量,每个变量只承担一个责任。同一个变量承担两件不同的事情,会令代码阅读者糊涂。

7. Remove Assignments to Parameters(移除对参数的赋值)

代码对一个参数进行赋值。

以一个临时变量取代该参数的位置。

8. Replace Method with Method Object(以函数对象取代函数)



9. Substitute Algorithm(替换算法)



二、在对象之间搬移特性

1. Move Method(搬移函数)



2. Move Field(搬移字段)



3. Extract Class(提炼类)



4. Inline Class(将类内联化)



5. Hide Delegate(隐藏“委托关系”)



6. Remove Middle Man(移除中间人)



7. Introduce Foreign Method(引入外加函数)



8. Introduce Local Extension(引入本地扩展)



本篇博客总结了两大重构手法,“重新组织函数”和“在对象之间搬移特性”,累死宝宝了,后期还会总结其他重构手法,敬请关注。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: