重构笔记——以查询取代临时变量
来源:互联网 发布:数据库并发保证一致性 编辑:程序博客网 时间:2024/05/21 06:37
本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/42386305
在上一篇文章中介绍了“ 内联临时变量“。本文将介绍“以查询取代临时变量”这种重构手法。
下面让我们来学习这种重构手法吧。
开门见山
发现:你的程序以一个临时变量保存某一表达式的运算结果。
解决:将这个表达式提炼到一个独立函数中。将这个临时变量的所有引用点替换为对新函数的调用。
//重构前double basePrice = _quantity * _itemPrice;if(basePrice > 5000)return basePrice * 0.95;elsereturn basePrice * 0.98;
//重构后if(basePrice() > 5000)return basePrice() * 0.95;elsereturn basePrice() * 0.98;...double basePrice(){ return _quantity * _itemPrice;}
动机
我们都知道临时变量都是暂时的,而且只能在所属的函数中使用。所以它们会驱使你写出更长的函数,因为只有这样你才能访问到需要的临时变量。如果把临时变量替换为一个查询,那么同一个类中所有函数都将可以获得这份信息。这将带给你极大帮助,使你能够为这个类编写出更清晰的代码。
该重构方法往往是你运用提炼函数之前必不可少的一个步骤。局部变量会使得代码难以提炼,所以应该尽可能把它们替换为查询式。比较简单的情况是:临时变量只被赋值一次,或者赋值给临时变量的表达式不受其它条件影响。
做法
我们常常使用临时变量保存循环中的累加信息。在这种情况下,整个循环都可以被提炼为一个独立的函数,这可以减少原函数中几行循环逻辑代码。该手法的使用可能会让你担心性能上的问题。就像和其它性能问题一样,我们现在不用管它,因为十有八九根本没有造成任何影响。就算真的出问题了,你也可以在优化时期解决它。代码组织良好,你也会发现更有效的优化方案;如果没有进行重构,好的优化方案就可能与你失之交臂。
示例
//重构前double getPrice() {int basePrice = _quantity * _itemPrice;double discountFactor;if (basePrice > 5000)discountFactor = 0.95;elsediscountFactor = 0.98;return basePrice * discountFactor;}我们希望将其中的两个临时变量都去掉。当然,每次一个进行处理。
double getPrice() {final int basePrice = _quantity * _itemPrice;final double discountFactor;if (basePrice > 5000)discountFactor = 0.95;elsediscountFactor = 0.98;return basePrice * discountFactor;}这样,一旦有问题编译器就会警告。之所以需要这个做是因为如果临时不安路口不只被赋值一次,就不该进行这项重构。
double getPrice() {final int basePrice = basePrice();final double discountFactor;if (basePrice > 5000)discountFactor = 0.95;elsediscountFactor = 0.98;return basePrice * discountFactor;}private double basePrice() {return _quantity * _itemPrice;}然后,编译并测试,再开始使用内联临时变量。
double getPrice() {final int basePrice = basePrice();final double discountFactor;if (basePrice() > 5000)discountFactor = 0.95;elsediscountFactor = 0.98;return basePrice * discountFactor;}编译、测试,然后进行下一个。由于下一个是最后一个引用点,所以把basePrice临时变量的声明式一并去掉:
double getPrice() {final double discountFactor;if (basePrice() > 5000)discountFactor = 0.95;elsediscountFactor = 0.98;return basePrice() * discountFactor;}完成basePrice之后,以类似的方法提炼出discountFactor():
double getPrice() {final double discountFactor = discountFactor() ;return basePrice() * discountFactor;}private double discountFactor(){if (basePrice() > 5000)return 0.95;elsereturn 0.98;}你会发现,如果没有把临时变量basePrice替换为一个查询式,将多么难以提炼discountFactor()!
//重构后double getPrice() {return basePrice() * discountFactor();}
重构笔记文章如下
重构笔记——入门篇
重构笔记——代码的坏味道(上)
重构笔记——代码的坏味道(下)
重构笔记——构筑测试体
重构笔记——提炼函数
重构笔记——内联函数
重构笔记——内联临时变量
- 重构笔记——以查询取代临时变量
- 以查询取代临时变量
- 重构---重构手法-----以查询取代临时变量(Replace Temp with Query)
- 重构--Replace Temp with Query(以查询取代临时变量)(六)
- 重构方法进阶(十二):代码常用重构方法(临时变量内联化&以查询取代临时变量)
- 重构笔记——以函数对象取代函数
- Replace Temp With Query(以查询取代临时变量)
- 6.4 Replace Temp with Query(以查询取代临时变量)
- Replace Temp with Query 以查询取代临时变量
- 重构笔记——内联临时变量
- 重构笔记——分解临时变量
- java重构学习3:以查询代替临时变量(Replace Temp with Query)
- 重新组织函数--以查询取代临时变量(Replace Temp with Query)
- 重构组合方法之——用查询方法代替临时变量
- 重新组织你的函数之四 :Replace Temp with Query(以查询取代临时变量)
- 将临时变量内联化 & 以查询代替临时变量
- 何时提炼函数 & 用查询取代临时变量
- <重构>读书笔记之<使用查询替换临时变量>
- HDU5154 Harry and Magical Computer【拓扑排序】
- 我国中职教育发展存在的问题、危机及发展前景
- 32位汇编语言学习笔记(29)--在NASM中使用宏
- 丘從直
- 虛庵 鄭希良
- 重构笔记——以查询取代临时变量
- ios 数据持久化之magical record(基于coredata)
- UVA 10879--Code Refactoring
- Mac设置显示和隐藏【隐藏文件】
- UVA 10392--Factoring Large Numbers
- 韩顺平php视频笔记45 循环相关语句break,continue常量
- java中文乱码解决之道(一)-----认识字符集
- jsp开发基础知识
- STL源码剖析---空间配置器