第2章 重新组织函数:内联函数和内联临时变量

Posted 浅墨浓香

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第2章 重新组织函数:内联函数和内联临时变量相关的知识,希望对你有一定的参考价值。

2. 内联函数(Inline Method)

2.1 动机

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

(2)有时遇到某些函数,其内部代码和函数名称同样清晰易读,采用内联函数可以提供代码的执行速度(因为少掉了函数调用的开销)

(3)在Replace Method withd Method Object之前,将一些组织不合理的函数内联到一个大型函数,再从中提炼组织合理的小型函数时效果很好。

(4)使用太多的间接层时,特别是一部分函数只是对另一个函数的简单委托时,可同去掉一些无用的间接层。

2.2 做法

(1)检查函数,确定它不具有多态性。如果子类继承了这个函数,就不要将此函数内联,因为子类无法覆写一个根本不存在的函数。

(2)找出这个函数的所有被调用点。

(3)将这个函数的所有被调用点都替换为函数本体

(4)删除该函数的定义

2.3 范例

//重构前
int getRating()
{
    return moreThanFiveLateDeliveries() ? 2 : 1;
}

bool moreThanFiveLateDeliveries()
{
    return _numberOfLateDeliveries > 5;
}

//重构后
int getRating()
{
    return  (_numberOfLateDeliveries > 5) ? 2 : 1;
}

2.4 思考

(1)对于递归、多返回点不适合用内联函数来重构

(2)内联至另一个对象中,而该对象并无提供访问函数。这种情况也不适合使用这个重构手法。

3. 内联临时变量

3.1 动机

(1)内联临时变量多半是作为Replace Temp with Query的一部分使用,所以真正的动机出现在后者那儿。

(2)如果某个临时变量被赋值为某个函数的返回值。一般这个临时变量不会有任何危害,可以保留下来。但这样的变量会妨碍重构,使重构变成比较困难,所以可以将它内联化。

3.2 做法

(1)检查临时变量赋值的语句,确保等号右边的表达式没有副作用

(2)将该变量声明改为const变量,以确定该变量真的只被赋值一次。

(3)找到该临时变量的所有引用点,将它们替换为“为临时变量赋值的”表达式

(4)删除该临时变量的声明和赋值语句。

3.3 范例

//内联临时变量
//重构前
double basePrice = anOrder.basePrice(); //basePrice只被赋值一次

return (basePrice > 1000)

//重构后
return (anOrder.basePrice() > 1000);

 

以上是关于第2章 重新组织函数:内联函数和内联临时变量的主要内容,如果未能解决你的问题,请参考以下文章

我的重构第三步

第2章 重新组织函数:引入解释性变量分解临时变量和移除对参数的赋值

重构 重构手法

学习重构-目录

重构列表

7. 第 7 章 类和对象简介