现在推荐使用Query Temp with Query重构方法进行相当广泛的推广,但似乎非常低效,只获得很少的收益.
Martin Fowler网站的方法给出了以下示例:
将表达式提取到方法中.用表达式替换对temp的所有引用.然后可以在其他方法中使用新方法.
double basePrice = _quantity * _itemPrice; if (basePrice > 1000) return basePrice * 0.95; else return basePrice * 0.98;
变
if (basePrice() > 1000) return basePrice() * 0.95; else return basePrice() * 0.98; double basePrice() { return _quantity * _itemPrice; }
为什么这是个好主意?这肯定意味着计算不必要地重复,你有调用函数的开销.我知道CPU周期很便宜,但这样扔掉它们似乎不小心?
我错过了什么吗?
阅读过Fowler的网页后,我认为这样做没有任何好处.唯一可能的收获是通过将可能经常使用的表达式隔离到一个点,但最好通过以下方式处理:
double basePrice = basePrice(); if (basePrice > 1000) return basePrice * 0.95; else return basePrice * 0.98;
除了阅读他的书之外,福勒没有解释为什么他修改后的代码比原版更好.
这是重要的重构,因为它是对单一职责的重构,它是DRY失败的解决方案!
临时文件的主要问题(特别是在使用长方法的幼稚代码中,长数百行!)是临时变量,它们是局部状态。明显的风险(如Fowler所讨论的那样)是,某人可能会在很长的方法中途进行更改,并最终破坏某些内容。(已看到产生的费用)
没有测试,此方法具有多种依赖性-真是一团糟!:)
删除临时人员是关于重构为单一职责。
示例-今天我发现了一个错误,它与将错误的temp变量传递到服务有关。如果我删除临时文件(有多个字符串),就不会发生该错误(疏忽)。
我的方法持有一个temp变量的原因是它在做它不应该做的工作...并且类似的类重复了此逻辑...是否全部一致?没有!
通过删除temp,我还将代码重构为具有适当职责的类,通过一些简单的测试即可覆盖110%。
没有巨大的工具可以测试琐碎的事情
如果我调用一些昂贵的东西,我将把结果作为值对象/集合返回。“临时代码”可能应该由集合内部化。
因此,删除temp将使您承担集中(单一)的职责-> SOLID!