Replace Temp with Query,顾名思义,表示你用查询来替换临时变量本身,临时变量对于函数来说是只有当前函数可见的,如果你在同类的别的地方要用到这个变量你就必须重新写表达式来获取这个变量,这样的话你就会在不经意间让你的函数变得复杂起来,所以如果你想要使用Extract Method,那么Replace Temp with Query是必不可少的一个步骤。而我们前面介绍的Inline Temp其实是这个手法的一部分,两者的区别在于Inline Temp已经有了表达式自身,只需要做简单的替换就可以,表示用表达式本身把临时变量给去掉。而Replace Temp with Query更加全面,里面包含了提炼表达式到函数本身,然后替换引用点(Inline Temp)。如果你把所有的临时变量都替换为一个查询,你的类的结构和逻辑将非常清晰,这样将更加有利于你的重构和进行优化。

这个重构手法有个很重要的前提就是临时变量只能被赋值一次,或者赋值给临时变量的表达式不受别的条件约束进行改变。对于其他情况,可能你应该需要Split Temporary Variable或Separate Query from Modifer把情况弄的简单点之后再运用本手法。对于有那种收集结果的临时变量或者循环中要进行累积的变量,你需要将程序的逻辑复制到查询函数中去。

做法一般都是找到只被赋值一次的临时变量,然后用const加以修饰进行编译(表示之后没有对这个变量进行修改),然后将所有对这个变量等号右边的表达式提炼到一个函数中去(这个步骤其实已经是Inline Temp的前提条件),然后将这个函数先声明为private(如果以后有别的类需要再改为public,这样可以保证接口的整洁性),判断这个查询函数本身会不会修改对象内容,如果会的话就需要运用Separate Query from Modifer进行重构。这些步骤都做好之后,就可以用Inline Temp将之前做好的函数进行变量替换。

有些同学可能会担心性能问题,我明明一个变量放在那好好的,你不要用,导致你每次去使用多要做一次查询。对于这种情况大可放心,重构的目的是让程序更加清晰,有了更加清晰的程序之后再具体做优化也不迟,况且根据二八原则,仅仅这条查询语句倘若你系统真的出现了性能问题也不大可能,如果实在是因为这条语句,你也可以把变量再放回去。

下面来看下具体例子:

double getPrice()
{int basePrice = m_quanity * m_itemPrice;double discountFactor;if (basePrice > 1000){discountFactor = 0.95}else{discountFactor = 0.98}return basePrice * discountFactor;
}

例子很简单,但是有两个临时变量,可以看到basePrice和discountFactor都被赋值了一次,如果我想重构这个函数,我们上面讲到了,Extract Method之前要做Replace Temp with Query,那么用Query来取代这两个临时变量那会让我们更加清晰重构的路线。

首先第一步,我们来进行basePrice的提炼,在之前加上const,进行编译,发现没有问题。

double getPrice()
{const int basePrice = m_quanity * m_itemPrice;double discountFactor;if (basePrice > 1000){discountFactor = 0.95}else{discountFactor = 0.98}return basePrice * discountFactor;
}

然后我们将等号之后的提炼到独立小函数中去(为了确保查询函数本身的特质--不修改对象本身,我们这里可以利用C++特性给函数加上const限定)

int basePrice() const
{return m_quanity * m_itemPrice;
}

这样原来的函数就变成了

double getPrice()
{const int basePrice = basePrice();double discountFactor;if (basePrice > 1000){discountFactor = 0.95}else{discountFactor = 0.98}return basePrice * discountFactor;
}

然后逐步使用Inline Temp把对basePrice的地方进行替换并进行编译测试,最后直接把basePrice的声明去掉。重复这个动作来进行提炼discountFactor得到

double getPrice() const
{return basePrice() * discountFactor();
}int basePrice() const
{return m_quanity * m_itemPrice;
}
double discountFactor(){    if (basePrice() > 1000)    {        return 0.95    }    else    {        return 0.98    }}

可以看到,在提炼discountFactor的时候,对于临时变量basePrice如果没有进行提炼,那么就需要将这个临时变量传进去。像这样

double discountFactor(int basePrice)
{if (basePrice > 1000){return 0.95}else{return 0.98}
}

可以明显的看到,这个重构手法对于函数本身来说,提高了清晰度,也让我们进行后期重构能够更加便捷。

转载于:https://www.cnblogs.com/rickyk/p/4120686.html

『重构--改善既有代码的设计』读书笔记----Replace Temp with Query相关推荐

  1. 『重构--改善既有代码的设计』读书笔记----序

    作为C++的程序员,我从大学就开始不间断的看书,看到如今上班,也始终坚持每天多多少少阅读技术文章,书看的很多,但很难有一本书,能让我去反复的翻阅.但唯独『重构--改善既有代码的设计』这本书让我重复看了 ...

  2. 『重构--改善既有代码的设计』读书笔记----Move Method

    明确函数所在类的位置是很重要的.这样可以避免你的类与别的类有太多耦合.也会让你的类的内聚性变得更加牢固,让你的整个系统变得更加整洁.简单来说,如果在你的程序中,某个类的函数在使用的过程中,更多的是在和 ...

  3. 『重构--改善既有代码的设计』读书笔记----Remove Middle Man

    如果你发现某个类做了过多的简单委托动作,你就可以考虑是否可以让客户直接去调用受托类.在Hide Delegate中,我们介绍了封装受托对象的好处,但好处归好处也存在代价,就是当你每次需要在受托对象中增 ...

  4. 『重构--改善既有代码的设计』读书笔记----Split Temporary Variable

    继续开始我们重构手法的系列,今天介绍的是Split Temporary Variable---分解临时变量. 在我们平常写的程序中肯定有某些临时变量被赋予了超过一个的责任.如果他们不是那种收集结果(t ...

  5. 《重构-改善既有代码的设计》读书笔记心得体会

    定义:(名词)对软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下,提高其可理解性,降低其修改成本 (动词)使用一系列重构手法,在不改变软件可观察行为的前提下,调整其结构 重构的目的是使软件 ...

  6. 【书中自有黄金屋】《重构-改善既有代码的设计》读书笔记

    前言 为何阅读这本书 阅读这本书的初心在于,半年多的时间里一直在重构项目代码. 阅读了不少人移交过来的代码,项目代码整体看下来,就会发现代码的阅读起来非常费劲,并且复用性和拓展性都很差,另外代码逻辑上 ...

  7. 《重构-改善既有代码的设计》读书笔记(二)

    12.Lazy Class – 冗赘类 对于几乎没有用的类,运用inline class 将其功能移动.去除这些不值得维护的类. 13.Speculative Generality – 夸夸其谈未来性 ...

  8. 《重构——改善既有代码的设计》读书笔记(三)

    一.构筑测试体系 在一个程序员的日常工作中,大概只有两件事:思考如何写新的代码,改旧代码中的bug.其中在做改bug时,我相信大多数人和我一样,时间更多的是花在找到这个bug上,其实该bug大多时候都 ...

  9. 【《重构 改善既有代码的设计》学习笔记2】重构原则

    [<重构 改善既有代码的设计>学习笔记2]重构原则 本篇文章的内容来自<重构 改善既有代码的设计>一书学习笔记整理并且加上自己的浅显的思考总结! 上一篇通过一个简单的例子体验了 ...

最新文章

  1. 中国大学的现实:层次越低,上课越多,学生读书越少
  2. 动态规划-重叠区间2020.3.30
  3. python知识点总结(有空就往里面添加)
  4. .Net 下载网络图片
  5. Visual Studio Code五月版本更新
  6. BJFU 质数相关
  7. 阮一峰的Javascript模块化编程(三):require.js的用法
  8. (转)Hadoop入门进阶课程
  9. 传统ORB-SLam中位姿优化中雅克比矩阵讲解
  10. windows 10
  11. Xeen的Source Safe 备份
  12. python读取内存指针_从dll读取内存值+指针+偏移量
  13. 经典算法问题——稳定匹配(Stable Matching)
  14. Shiro总结和常见面试题
  15. Python语音基础操作--5.4小波分解
  16. 十五个免费Windows桌面系统工具(附下载)
  17. Adobe Acrobat 如何批量删除PDF文件最后一页或倒数第二页?
  18. 全民小视频逆势崛起:短视频的“小趋势”与“信用飞轮”
  19. OpenCV 2 计算机视觉编程手册
  20. java和php做网站区别_做网站java与php的区别是什么?

热门文章

  1. Git实战手册(三): stash解惑与妙用
  2. 互联网项目管理流程(SOP)总结
  3. Azkaban工作流调度器(1)--azkaban的安装
  4. CentOS下搭建测试WEB平台
  5. bzoj1625[Usaco2007 Dec]宝石手镯*
  6. scala语言+Spark学习一箩筐
  7. 性能之巅:Linux网络性能分析工具
  8. 正则表达式的先行断言(lookahead)和后行断言(lookbehind)
  9. 横向的二级导航菜单,在多浏览器下可用
  10. 【专题三】如何考量虚拟化的投资回报率?——服务器虚拟化的阴暗面