用查询替换Temp
问题
将表达式的结果放在局部变量中,以便稍后在代码中使用。
解决方案
将整个表达式移动到一个单独的方法,并从该方法返回结果。查询方法而不是使用变量。如有必要,将新方法合并到其他方法中。
之前
double calculateTotal() {double basePrice =数量* itemPrice;if (basePrice > 1000){返回basePrice * 0.95;} else{返回basePrice * 0.98;}}
后
double calculateTotal() {if (basePrice() > 1000){返回basePrice() * 0.95;} else{返回basePrice() * 0.98;}} double basePrice(){返回数量* itemPrice;}
之前
double CalculateTotal() {double basePrice =数量* itemPrice;if (basePrice > 1000){返回basePrice * 0.95;} else{返回basePrice * 0.98;}}
后
double CalculateTotal() {if (BasePrice() > 1000){返回BasePrice() * 0.95;} else{返回BasePrice() * 0.98;}} double BasePrice(){返回数量* itemPrice;}
之前
$basePrice = $this->quantity * $this->itemPrice;if ($basePrice > 1000){返回$basePrice * 0.95;} else{返回$basePrice * 0.98;}
后
if ($this->basePrice() > 1000){返回$this->basePrice() * 0.95;} else{返回$this->basePrice() * 0.98;}……函数basePrice(){返回$this->quantity * $this->itemPrice;}
之前
def calculateTotal(): basePrice = quantity * itemPrice如果basePrice > 1000:返回basePrice * 0.95否则:返回basePrice * 0.98
后
def calculateTotal(): if basePrice() > 1000:返回basePrice() * 0.95 else:返回basePrice() * 0.98 def basePrice():返回数量* itemPrice
之前
calculateTotal(): number {let basePrice = quantity * itemPrice;if (basePrice > 1000){返回basePrice * 0.95;} else{返回basePrice * 0.98;}}
后
calculateTotal(): number {if (basePrice() > 1000){返回basePrice() * 0.95;} else{返回basePrice() * 0.98;}} basePrice():数字{返回数量* itemPrice;}
为什么重构
这种重构可以为应用奠定基础提取方法一个很长的方法的一部分。
在其他方法中有时也会发现相同的表达式,这是考虑创建公共方法的一个原因。
好处
代码可读性。理解这个方法的目的要容易得多
getTax ()
而不是直线orderPrice() * 0.2
.如果要替换的行用于多种方法,则通过重复数据删除简化代码。
知道就好
性能
这种重构可能会引发这样的问题:这种方法是否容易导致性能下降。诚实的回答是:是的,因为结果代码可能会因查询新方法而负担过重。但是有了今天快速的cpu和优秀的编译器,这种负担几乎总是最小的。相比之下,可读的代码和在程序代码的其他地方重用该方法的能力——多亏了这种重构方法——是非常明显的好处。
但是,如果您的临时变量用于缓存一个非常耗时的表达式的结果,那么您可能希望在将表达式提取到一个新方法之后停止这种重构。