重构改善既有代码设计--重构手法02:Inline Method (内联函数)& 03: Inline Temp(内联临时变量)

时间:2021-08-28 13:59:24

Inline Method (内联函数)

一个函数调用的本体与名称同样清楚易懂。在函数调用点插入函数体,然后移除该函数。

int GetRating()

{

return MoreThanfiveLateDeliverise() ? 2 : 1;

}

bool MoreThanfiveLateDeliverise()

{

return _numberOfLateLiveries > 5;

}

int GetRating()

{

return _numberOfLateLiveries > 5 ? 2 : 1;

}

动机: 有时候你会遇到某些函数,其内部代码和函数名称同样清晰易读。也可能你重构了改函数,使得其内容和其名称变得同样清晰。果真如此,你应该去掉这个函数,直接使用其中的代码。间接性可能带来帮助,但非必要的间接性总是让人不舒服。

另一种需要使用Inline Method (内联函数)的情况是:你手上有一群不甚合理的函数。你可以将它们都内联到一个大型函数中,再从中提炼出合理的小函数。实施Replace Method with Method Object (以函数对象取代函数)之前这么做,往往可以获得不错的效果。你可以把所要的函数的所有调用对象的函数内容都内联到函数对象中。比起既要移动一个函数,又要移动它所调用的其他所有函数,将整个大型函数作为整体来移动比较简单。

如果别人使用了太多间接层,使得系统中所有函数都似乎只是对另一个函数的简单委托,造成在这些委托动作之间晕头转向,那么就使用 Inline Method (内联函数)。当然,间接层有其价值,但不是所有间接层都有价值。试着使用内联手法,可以找出那些有用的间接层,同时将那些无用的间接层去除。

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

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

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

4、编译、测试。

5、删除该函数定义。

Inline Temp(内联临时变量)

与Inline Method相同,有时候犹豫需要Extract Method,,需要对一些临时变量进行内联,而这个往往是Replace Temp with Query的一部分。简单来说,当你看到这种

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

对于这种情况,basePrice完全是多余的变量,完全可以用函数本身来替代他。这里有个小窍门,你要内联这个变量,你必须要保证函数之后没有对这个变量进行过操作,换句话说,你可以利用C++的特性----const,将函数变量声明为

const double basePrice = anOrder.basePrice();

然后你进行编译,看看能不能编译通过,如果能编译通过,证明你这个变量确实只有读操作没有写操作,那么你就可以放心的进行内联

return (anOrder.basePrice() > 1000);

这样就完成了Inline Temp。

读后感:

个人感觉,这个内联无论是内联函数还是临时变量,其目的都在于简化函数,但是并不是所有场景都适合,比如内联函数,对于递归调用、多返回点、内联至另一个对象中而该对象并无提供访问函数…,当然还有其他的,比如公共用的时候,有时候提炼出来反而会更好,所以这种要视情况而定,但目标就是函数精简化。