【代码重构(Refectoring)系列教程】以查询代替临时变量(Replace Temp with Query)如何消除代码中繁多的表达式和临时变量?

以查询代替临时变量

●适用场景

  你将一个表达式的计算结果放在一个局部变量中来供代码后续使用。

●解决方案

  将这整个表达式放到一个单独的方法之中,并通过返回值返回这个表达式的结果。如果有必要,也可以将这个新方法合并到其它方法中。


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. 使用新的方法来替代这个包含着表达式的变量。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值