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。

读后感:

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

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

  1. 重构改善既有代码设计--重构手法08:Replace Method with Method Object (以函数对象取代函数)

    你有一个大型函数,其中对局部变量的使用,使你无法釆用 Extract Method. 将这个函数放进一个单独对象中,如此一来局部变量就成了对象内的值域(field) 然后你可以在同一个对象中将这个大型 ...

  2. 重构改善既有代码设计--重构手法07:Remove Assignments to Parameters (移除对参数的赋值)

    代码对一个 参数赋值.以一个临时变量取代该参数的位置.     int Discount(int inputVal, int quantity, int yearTodate) { if (input ...

  3. 重构改善既有代码设计--重构手法05:Introduce Explaining Variable (引入解释性变量)

      发现:你有一个复杂的表达式. 解决:将该复杂的表达式(或其中的部分)的结果放进一个临时变量,并以此变量名称来解释表达式用途. //重构前 if((platform.toUpperCase().in ...

  4. 重构改善既有代码设计--重构手法04:Replace Temp with Query (以查询取代临时变量)

    所谓的以查询取代临时变量:就是当你的程序以一个临时变量保存某一个表达式的运算效果.将这个表达式提炼到一个独立函数中.将这个临时变量的所有引用点替换为对新函数的调用.此后,新函数就可以被其他函数调用. ...

  5. 重构改善既有代码设计--重构手法01:Extract Method (提炼函数)

    背景: 你有一段代码可以被组织在一起并独立出来.将这段代码放进一个独立函数,并让函数名称解释该函数的用途. void PrintOwing(double amount) { PrintBanner() ...

  6. 重构改善既有代码设计--重构手法10:Move Method (搬移函数)

    你的程序中,有个函数与其所驻类之外的另一个类进行更多的交流:调用后者,或被后者调用.在该函数最常用引用的类中建立一个有着类似行为的新函数.将旧函数编程一个单纯的委托函数,或是将旧函数完全移除. 动机: ...

  7. 重构改善既有代码设计--重构手法06:Split Temporary Variable (分解临时变量)

    你的程序有某个临时变量被赋值超过一次,它既不是循环变量,也不被用于收集计算结果.针对每次赋值,创造一个独立.对应的临时变量 double temp = 2 * (_height + _width); ...

  8. 重构改善既有代码设计--重构手法16:Introduce Foreign Method (引入外加函数)&& 重构手法17:Introduce Local Extension (引入本地扩展)

    重构手法16:Introduce Foreign Method (引入外加函数)你需要为提供服务的类增加一个函数,但你无法修改这个类.在客户类中建立一个函数,并以第一参数形式传入一个服务类实例. 动机 ...

  9. 重构改善既有代码设计--重构手法11:Move Field (搬移字段)

    你的程序中,某个字段被其所驻类之外的另一个类更多的用到.在目标类建立一个新字段,修改源字段的所有用户,令它们改用新字段.        动机:在类之间移动状态和行为,是重构过程中必不可少的措施.随着系 ...

随机推荐

  1. 浅谈 Sql Server 游标

    查询语句可能返回多条记录,如果数据量非常大,需要使用游标来逐条读取查询结果集中的记录.应用程序可以根据需要滚动或浏览其中的数据.本篇介绍游标的概念.分类.以及基本操作等内容. 一:认识游标游标是SQL ...

  2. crontab & php实现多进程思路

    <?php $startTime = time(); while(1) { if (time() - $startTime > 600) { exit; } // ... Do SomeT ...

  3. react-自定义事件

    没有嵌套关系的组件(如兄弟组件)之间的通信,只能通过自定义事件的方式来进行. var EventEmitter = require('events').EventEmitter; import Rea ...

  4. [C/C++] 指针数组和数组指针

    转自:http://www.cnblogs.com/Romi/archive/2012/01/10/2317898.html 这两个名字不同当然所代表的意思也就不同.我刚开始看到这就吓到了,主要是中文 ...

  5. bootstrap练习制作网页

    导航条 <nav class="navbar navbar-default"> <div class="container-fluid"> ...

  6. FZU2127_养鸡场

    题目的意思为要你求出满足三边范围条件且周长为n的三角形的数目. 其实做法是直接枚举最短边,然后就可以知道第二条边的取值范围,同时根据给定的范围缩小范围. 同时根据第二条边的范围推出第三条边的范围,再次 ...

  7. Jstack、Jmap命令简单使用

    TOMCAT_ID为tomcat的进程号. 1.使用jstack查看jvm堆栈信息. /bin/ TOMCAT_ID:无法输出到单独的文件中,只能在tomcat的启动文件中打印相关的堆栈信息. jst ...

  8. hive 连接(join)查询

    1.内连接 hive> select b.*,a.name from userinfo2 b,userinfo a where a.userid=b.userid; hive> selec ...

  9. 【BZOJ3244】【NOI2013】树的计数(神仙题)

    [BZOJ3244][NOI2013]树的计数(神仙题) 题面 BZOJ 这题有点假,\(bzoj\)上如果要交的话请输出\(ans-0.001,ans,ans+0.001\) 题解 数的形态和编号没 ...

  10. 【BZOJ4443】小凸玩矩阵(二分答案,二分图匹配)

    [BZOJ4443]小凸玩矩阵(二分答案,二分图匹配) 题面 BZOJ Description 小凸和小方是好朋友,小方给小凸一个N*M(N<=M)的矩阵A,要求小秃从其中选出N个数,其中任意两 ...