『重构--改善既有代码的设计』读书笔记----Introduce Explaning Variable
有时候你会遇到一系列复杂的表达式连续运算的时候,这个时候你可能根本招架不住如此长或者是如此复杂的长函数。这个时候你可以通过引用临时变量来储存他们的结果,将这些长函数的结果分成一个个临时变量来让函数清晰化。但在这里,我的想法与作者的想法是一样的,我会更倾向于去用Extract Method去将复杂函数弄清晰,而尽量不去Introduce Explaning Vaiable,因为Extract Method优点很多,除了不增加临时变量增加函数长度之外,他的生命周期也比临时变量来的长,他可以让类中的所有成员都可以用到。除非临时变量让Extract Method很难进行,我才会真正去考虑采用临时变量来解决。
做法一般是用const声明一个临时变量来存储表达式的值,然后对引用表达式结果的地方进行替换。下面看下具体例子
double price()
{
return m_quantity * m_itemPrice - qMax(, m_quantity - ) * m_itemPrice * 0.05
+ qMin(m_quantity * m_itemPrice * 0.1, 100.0);
}
对于这种长函数我们很难招架,可以进行Introduce Explaning Variable,将m_quanity * m_itemPrice进行提炼,得到如下
double price()
{
const double basePrice = m_quantity * m_itemPrice;
return basePrice - qMax(, m_quantity - ) * m_itemPrice * 0.05
+ qMin(basePrice * m_itemPrice * 0.1, 100.0);
}
我们将basePrice以const double类型声明并且初始化,将所有引用这个表达式结果的地方进行替换,我们可以看到,算法的逻辑清晰了一点。
在这里为了验证我的观点,我们来用下Extract Method来进行重构,看看结果会有何不同。
double price()
{
return basePrice() - qMax(, m_quantity - ) * m_itemPrice * 0.05
+ qMin(basePrice() * 0.1, 100.0);
} double basePrice()
{
return m_quantity * m_itemPrice;
}
看了运用Extract Method手法的结果,对比之后我们可以发现有前者有以下几个优点:
【1】也是最明显的,Extract Method之后的结果要比Introduce Explaning Variable清晰并且简短的多,其实这也是肯定的,因为后者会引入临时性变量,更加会增加函数的长度。
【2】对于basePrice的提炼,对于price()这个函数来说,Introduce Explaning Variable提炼的临时变量只能在本函数中使用,而Extract Method确可以在类中所有地方都可以使用。
综合来看,Extract Method确实要比Introduce Explaning Variable好用的多,而且我们可以发现,工作量来说两者几乎没什么差别。那么同学会问,那这个重构手法什么时候才会去用?还是有的,就是当Extract Method无法顺利展开的时候,比如临时变量很多不能提炼,这个时候引入临时性变量就容易的多。而且等到代码逻辑清晰之后,你再运用Replace Temp with Query也可以很轻松的去除那些临时性变量。如果你最终要使用Replace Method with Method Object,那么这个手法也就对你提炼提供了价值。
『重构--改善既有代码的设计』读书笔记----Introduce Explaning Variable的更多相关文章
- 『重构--改善既有代码的设计』读书笔记----Introduce Foreign Method
当你无法获得一个类的源代码或者没有权限去修改这个类的时候,你对于这种为你服务的类,你可能会出现需要别的需求的时候,比如一个Date类,你需要能够让他本身直接返回出他的后一天的对象,但他没有,这个时候你 ...
- 『重构--改善既有代码的设计』读书笔记----Introduce Local Extension
同Introduce Foreign Method一样,很多时候你不能修改编辑原始类,你需要为这些服务类增加一些额外的函数,但你没有这个权限或者入口.如果你只需要一个或者两个外加函数那么你可以放心的使 ...
- 『重构--改善既有代码的设计』读书笔记----Split Temporary Variable
继续开始我们重构手法的系列,今天介绍的是Split Temporary Variable---分解临时变量. 在我们平常写的程序中肯定有某些临时变量被赋予了超过一个的责任.如果他们不是那种收集结果(t ...
- 『重构--改善既有代码的设计』读书笔记----Extract Method
在编程中,比较忌讳的一件事情就是长函数.因为长函数代表了你这段代码不能很好的复用以及内部可能出现很多别的地方的重复代码,而且这段长函数内部的处理逻辑你也不能很好的看清楚.因此,今天重构第一个手法就是处 ...
- 『重构--改善既有代码的设计』读书笔记----Change Value to Reference
有时候你会认为某个对象应该是去全局唯一的,这就是引用(Reference)的概念.它代表当你在某个地点对他进行修改之后,那么所有共享他的对象都应该在再次访问他的时候得到相应的修改.而不会像值对象(Va ...
- 『重构--改善既有代码的设计』读书笔记----Replace Method with Method Object
有时候,当你遇到一个大型函数,里面的临时变量和参数多的让你觉得根本无法进行Extract Method.重构中也大力的推荐短小函数的好处,它所带来的解释性,复用性让你收益无穷.但如果你遇到上种情况,你 ...
- 『重构--改善既有代码的设计』读书笔记---Duplicate Observed Data
当MVC出现的时候,极大的推动了Model与View分离的潮流.然而对于一些已存在的老系统或者没有维护好的系统,你都会看到当前存在大把的巨大类----将Model,View,Controller都写在 ...
- 『重构--改善既有代码的设计』读书笔记----Replace Array with Object
如果你有一个数组,其中的元素各自代表不同东西,比如你有一个 QList<QString> strList; 其中strList[0]代表选手姓名,strList[1]代表选手家庭住址,很显 ...
- 『重构--改善既有代码的设计』读书笔记----Self Encapsulate Field
如果你直接访问一个字段,你就会和这个字段直接的耦合关系变得笨拙.也就是说当这个字段权限更改,或者名称更改之后你的客户端代码都需要做相应的改变,此时你可以为这个字段建立设值和取值函数并且只以这些函数来访 ...
随机推荐
- LVM 命令集总结
PV 命令 下面的命令是在与物理卷相关的操作中最常用的命令: lsdev 列出ODM中的设备. chdev 修改设备的特征. mkdev 增加一个设备到系统中. chpv 修改物理卷的状态. lspv ...
- Ubuntu下SSH设置
网上有很多介绍在Ubuntu下开启SSH服务的文章,但大多数介绍的方法测试后都不太理想,均不能实现远程登录到Ubuntu上,最后分析原因是都没有真正开启ssh-server服务.最终成功的方法如下: ...
- Qt入门(17)——组装复杂的控件
下面是如何把两个窗口部件封装成一个新的组件.首先,我们使用一个自定义的窗口部件作为一个子窗口部件. #include <qapplication.h> #include <qpush ...
- 数学计数原理(Pólya,高精度):SGU 294 He's Circles
He's Circles He wrote n letters "X" and "E" in a circle. He thought that there ...
- 数据结构(线段树):HDU 5649 DZY Loves Sorting
DZY Loves Sorting Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Oth ...
- 网络流(最大流) HDU 1565 方格取数(1) HDU 1569 方格取数(2)
HDU 1565 方格取数(1) 给你一个n*n的格子的棋盘,每个格子里面有一个非负数.从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取的数所在的2个格子不能相邻,并且取出的数的 ...
- call, apply && bind, currying
简要概括: apply(): 将函数作为指定对象的方法来调用,传递给它的是指定的参数数组 ——function.apply(thisobj, args) 或者 function.apply(thiso ...
- HDOJ(HDU) 2192 MagicBuilding(用Java的Map做了下)
Problem Description As the increase of population, the living space for people is becoming smaller a ...
- Windows下移动硬盘无法识别但是Mac下可以识别
今天遇到一个问题,具体如下: 在Mac下正常使用的移动硬盘,在Windows下无法识别,打开显示"磁盘结构损坏且无法读取" 分析:Mac下既然能够正常使用,那么硬盘就应该是正常的, ...
- hdu 1175 连连看 DFS
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1175 解题思路:从出发点开始DFS.出发点与终点中间只能通过0相连,或者直接相连,判断能否找出这样的路 ...