圣诞大减价开始了!

用查询替换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和优秀的编译器,这种负担几乎总是最小的。相比之下,可读的代码和在程序代码的其他地方重用该方法的能力——多亏了这种重构方法——是非常明显的好处。

但是,如果您的临时变量用于缓存一个非常耗时的表达式的结果,那么您可能希望在将表达式提取到一个新方法之后停止这种重构。

如何重构

  1. 确保在方法中为变量赋值一次且仅一次。如果没有,请使用分裂临时变量以确保该变量仅用于存储表达式的结果。

  2. 使用提取方法用一种新的方法表达兴趣。确保这个方法只返回一个值,而不改变对象的状态。如果该方法影响对象的可见状态,请使用将查询和修饰符分开

  3. 用对新方法的查询替换该变量。

Baidu
map