重构手法之Replace Temp with Query(以查询取代临时变量)
4 Replace Temp with Query(以查询取代临时变量)
概要
你的程序以一个临时变量保存某一表达式的运算结果。
将这个表达式提炼到一个独立函数中。将这个临时变量的所有引用点替换为对函数的调用。此后,新函数就可以被其他函数使用。
动机
临时变量的问题在于:只在当前函数可见。如果你在同类的别的地方访问这个变量,你就必须重新写表达式来获取这个变量,这样的话你就会在不经意间让你的函数变得复杂起来。如果将临时变量替换为一个查询,那么同类中所有函数都可以获得这份信息。
所以如果你想要使用Extract Method,那么Replace Temp with Query是必不可少的一个步骤。而我们前面介绍的Inline Temp其实是这个手法的一部分,两者的区别在于Inline Temp已经有了表达式自身,只需要做简单的替换就可以,需要用表达式本身把临时变量给去掉。而Replace Temp with Query更加全面,里面包含了提炼表达式到函数本身,然后替换引用点(Inline Temp)。如果你把所有的临时变量都替换为一个查询,你的类的结构和逻辑将非常清晰,这样将更加有利于你的重构和进行优化。
范例
假设有以下简单函数:
double GetPrice()
{
int basePrice = _quantity * _itemPrice;
double discountFactor;
if (basePrice > )
{
discountFactor = 0.95;
}
else
{
discountFactor = 0.98;
}
return basePrice * discountFactor;
}
我们现在将basePrice 和discountFactor这两个临时变量都替换掉。
先来替换basePrice,将basePrice右侧表达式提炼出来,然后使用Inline Temp将basePrice的所有引用点都替换掉,并且把basePrice临时变量的声明去掉。
现在代码变成这样:
double GetPrice()
{
double discountFactor;
if (GetBasePrice() > )
{
discountFactor = 0.95;
}
else
{
discountFactor = 0.98;
}
return GetBasePrice() * discountFactor;
} private int GetBasePrice()
{
return _quantity * _itemPrice;
}
再以类似的方法提炼出GetDiscountFactor();
private double GetDiscountFactor()
{
if (GetBasePrice() > )
{
return 0.95;
}
return 0.98;
}
最终代码是这样的。
double GetPrice()
{
return GetBasePrice() * GetDiscountFactor();
} private double GetDiscountFactor()
{
if (GetBasePrice() > )
{
return 0.95;
}
return 0.98;
} private int GetBasePrice()
{
return _quantity * _itemPrice;
}
可以明显的看到,这个重构手法对于函数本身来说,提高了清晰度,也让我们进行后期重构能够更加便捷。
小结
我们常常在循环中用临时变量保存累加信息。如果是这种情况的话,我们可以将整个循环都提炼出来。如果在循环中要累加好几个值,那么就应该针对每个累加值重复一遍循环。这样,就可以很方便的将所有临时变量都替换为查询。
当然,这样一来,我们可能担心性能问题。本来我定义一个临时变量只需要查询一次,现在我每次都要去做查询。这个我们完全不必担心。重构的目的是让程序更加清晰,有了更加清晰的程序之后再具体做优化也不迟,况且根据二八原则,仅仅这条查询语句倘若你系统真的出现了性能问题也不大可能,如果实在是因为这条语句,你也可以把变量再放回去。
To Be Continued...
重构手法之Replace Temp with Query(以查询取代临时变量)的更多相关文章
- 代码重构与单元测试——使用“以查询取代临时变量”再次对Statement()方法进行重构(七)
代码重构与单元测试(一) 代码重构与单元测试--测试项目(二) 代码重构与单元测试--"提取方法"重构(三) 代码重构与单元测试--重构1的单元测试(四) 代码重构与单元测试--对 ...
- 重构改善既有代码设计--重构手法04:Replace Temp with Query (以查询取代临时变量)
所谓的以查询取代临时变量:就是当你的程序以一个临时变量保存某一个表达式的运算效果.将这个表达式提炼到一个独立函数中.将这个临时变量的所有引用点替换为对新函数的调用.此后,新函数就可以被其他函数调用. ...
- 《重构-改善既有代码的设计》学习笔记---Replace Temp with Query(以查询取代临时变量)
临时变量的问题在于: 它们是暂时的,而且只能在所属函数内使用.由于临时变量只在所属函数内可见,所以,如果很多地方都在用这个临时变量,就会驱使你写出更长的函数.如果把临时变量替换为一个查询,那么其他函数 ...
- 『重构--改善既有代码的设计』读书笔记----Replace Temp with Query
Replace Temp with Query,顾名思义,表示你用查询来替换临时变量本身,临时变量对于函数来说是只有当前函数可见的,如果你在同类的别的地方要用到这个变量你就必须重新写表达式来获取这个变 ...
- 重构代码 —— 函数即变量(Replace temp with Query)
函数即变量,这里的函数指的是返回值为某一对象的函数.Replace temp with query,query 是一种查询函数. example 1 double price() { return t ...
- Replace Temp with Query
double GetPrice() { int basePrice = _quantity * _itemPrice; double discountFactor; ) { discountFacto ...
- 重构改善既有代码设计--重构手法08:Replace Method with Method Object (以函数对象取代函数)
你有一个大型函数,其中对局部变量的使用,使你无法釆用 Extract Method. 将这个函数放进一个单独对象中,如此一来局部变量就成了对象内的值域(field) 然后你可以在同一个对象中将这个大型 ...
- 重构改善既有代码设计--重构手法01:Extract Method (提炼函数)
背景: 你有一段代码可以被组织在一起并独立出来.将这段代码放进一个独立函数,并让函数名称解释该函数的用途. void PrintOwing(double amount) { PrintBanner() ...
- 重构改善既有代码设计--重构手法02:Inline Method (内联函数)& 03: Inline Temp(内联临时变量)
Inline Method (内联函数) 一个函数调用的本体与名称同样清楚易懂.在函数调用点插入函数体,然后移除该函数. int GetRating() { return MoreThanfiveLa ...
随机推荐
- VS2017 编译 chromium和webrtc
Chromium的编译和WebRTC的编译方式相同,WebRTC官网也是使用的Chromium的编译文档. 步骤一.跳 - 墙,先跳 - 墙这是第一步哟,chromium大概有10几个G,webrtc ...
- 实现mysql在windows server 2008下自动备份
环境:MySQL 安装位置:D:\MySQL论坛数据库名称为:Db_Test数据库备份目的地:D:\db_bak\ 1.首先新建一个bat文件 rem ********************** ...
- 数据库中删除语句Drop、Delete、Truncate的相同点和不同点的比较
数据库删除语句的分别介绍: Delete:用于删除表中的行(注:可以删除某一行:也可以在不删除表的情况下(即意味着表的结构.属性.索引完整)删除所有行) 语法:删除某一行:Delete From 表名 ...
- Jquery Ajax和getJSON获取后台普通Json数据和层级Json数据解析
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Spring MVC 过滤静态资源访问
过滤的必要性 一般来说,HTTP 请求都会被映射到 DispatcherServlet,进而由具体的类来承接处理,但对于类似 js 或者 css 这样的静态资源则没必要这样,因为对资源的获取只需返回资 ...
- JAVA提高五:注解Annotation
今天我们学习JDK5.0中一个非常重要的特性,叫做注解.是现在非常流行的一种方式,可以说因为配置XML 比较麻烦或者比容易查找出错误,现在越来越多的框架开始支持注解方式,比如注明的Spring 框架, ...
- 用javascript和html5做一个音乐播放器,附带源码
效果图: 实现的功能 1.首页 2.底部播放控件 3.播放页面 4.播放列表 5.排行榜 6.音乐搜索 输入搜索关键词,点击放大镜图标 7.侧边栏 目录结构 开发心得与总结 1.轮播图 首先感谢作者S ...
- OpenSCAD 建模:相框
下载地址:https://github.com/ZhangGaoxing/openscad-models/tree/master/PhotoFrame 代码: module bottom(){ dif ...
- PHP连接mysql数据库进行增删改查--删除
删除: 1.首页 在foreach里面加入 <td><a href='dele.php?id={$i[0]}'>删除</a></td> 在上面< ...
- MySQL自定义函数用法详解-复合结构自定义变量/流程控制
自定义函数 (user-defined function UDF)就是用一个象ABS() 或 CONCAT()这样的固有(内建)函数一样作用的新函数去扩展MySQL. 所以UDF是对MySQL功能的一 ...