『重构--改善既有代码的设计』读书笔记----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
如果你直接访问一个字段,你就会和这个字段直接的耦合关系变得笨拙.也就是说当这个字段权限更改,或者名称更改之后你的客户端代码都需要做相应的改变,此时你可以为这个字段建立设值和取值函数并且只以这些函数来访 ...
随机推荐
- 常用的用户状态命令包括:whoami、id、groups、newgrp 等
用户状态命令 常用的用户状态命令包括:whoami.id.groups.newgrp 等.
- 在线LCA模板
在线LCA 如求A,B两点的LCA,先计算出各个结点的深度d[],然后,通过递推公式求出各个结点的2次方倍的祖先p[],假设d[A] > d[B],则找到d[p[A][i]] == d[B]也就 ...
- Delphi 重写控件的一个例子。
unit DBGridEx; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, ...
- HDU1510 White rectangles
White Rectangles Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- maven上传自定义jar到本地仓库
mvn install:install-file -Dfile=D:/baidu/ueditor-1.1.1.jar -DgroupId=com.baidu.ueditor -Dartifact ...
- 如何让自己的类用 copy 修饰符?如何重写带 copy 关键字的 setter?
出题者简介: 孙源(sunnyxx),目前就职于百度 整理者简介:陈奕龙,目前就职于滴滴出行. 转载者:豆电雨(starain)微信:doudianyu 若想令自己所写的对象具有拷贝功能,则需实现 N ...
- [置顶] android 图片库的封装
大家在做安卓应用的时候 经常要从网络中获取图片 都是通过URL去获取 可是如果本地有图片数据 从本地获取数据不更加快一些 自己在工作中遇到这个问题 所以采用了一个URL和本地图片的一个映射关系 ...
- oracle权限问题
Assign the "Create global objects" user right to the non-Administrator account. 1. Click S ...
- 在 Java 中高效使用锁的技巧--转载
竞争锁是造成多线程应用程序性能瓶颈的主要原因 区分竞争锁和非竞争锁对性能的影响非常重要.如果一个锁自始至终只被一个线程使用,那么 JVM 有能力优化它带来的绝大部分损耗.如果一个锁被多个线程使用过,但 ...
- Swift: 下标(Subscripts)
类.结构体.枚举都可以定义下标(subscript),下标是访问集合.列表.序列的元素的快捷方式. 在Swift中可以为类型定义下标,而且不限于一维. 语法 下标定义的方法:跟实例方法的语法类似,su ...