以查询代替临时变量
●适用场景
你将一个表达式的计算结果放在一个局部变量中来供代码后续使用。
●解决方案
将这整个表达式放到一个单独的方法之中,并通过返回值返回这个表达式的结果。如果有必要,也可以将这个新方法合并到其它方法中。
Java --重构前代码
double calculateTotal() {
double basePrice = quantity * itemPrice;
if (basePrice > 1000) {
return basePrice * 0.95;
}
else {
return basePrice * 0.98;
}
}
Java --重构前代后
double calculateTotal() {
if (basePrice() > 1000) {
return basePrice() * 0.95;
}
else {
return basePrice() * 0.98;
}
}
double basePrice() {
return quantity * itemPrice;
}
python --重构前代码
def calculateTotal():
basePrice = quantity * itemPrice
if basePrice > 1000:
return basePrice * 0.95
else:
return basePrice * 0.98
python --重构前代后
def calculateTotal():
if basePrice() > 1000:
return basePrice() * 0.95
else:
return basePrice() * 0.98
def basePrice():
return quantity * itemPrice
●为何需要重构
在使用方法提炼法将一个很长的方法的一部分提取成函数的过程中,以查询代替临时变量为这个过程奠定基础。
同样的表达式可能在其它方法中使用到,这也是一个考虑创建一个新函数的原因。
●优势
更好的代码可读性。相比于这一行代码orderPrice()*0.2来说,我们更容易理解方法getTax()的目的。
如果这一行被替代的表达式在多个方法中被使用了,通过这种方式消除了重复代码,获得了更"苗条"的代码。
●你需要知道的
性能方面
这样的重构可能会让人疑问:这样会不会使得性能降低。最诚实的回答是:是的,它会,因为相关的代码会因为一个查询的新方法而增加负担。但是今天计算机有着多个高速的CPU和出色的编译器,这些负担几乎总是很小的。相比之下,具备可读性的,并且方法可以被程序中其它地方重用的代码(由以查询代替临时变量重构法带来的)的优势是显而易见的。
尽管如此,如果你的临时变量是用来存储非常耗费时间的的表达式的结果,当你将表达式重构成新方法后,你可能想要中止这种重构方法。
如何重构
1. 确保这个变量在方法内被赋值并且只会被赋值一次。如果不是这样,就使用分离临时变量法来确保这个变量之被用来存储表达式的结果。
2. 使用方法提炼法将感兴趣的表达式提炼成新的方法。确保这个方法只返回一个数值并且不会改变这个对象的状态。如果这个方法影响了方法内的状态,就该使用查询函数和修改函数分离法。
3. 使用新的方法来替代这个包含着表达式的变量。