当前位置:  开发笔记 > 编程语言 > 正文

用查询替换Temp

如何解决《用查询替换Temp》经验,为你挑选了2个好方法。

现在推荐使用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周期很便宜,但这样扔掉它们似乎不小心?

我错过了什么吗?



1> James Curran..:

阅读过Fowler的网页后,我认为这样做没有任何好处.唯一可能的收获是通过将可能经常使用的表达式隔离到一个点,但最好通过以下方式处理:

    double basePrice = basePrice();
    if (basePrice > 1000)
            return basePrice * 0.95;
    else
            return basePrice * 0.98;

除了阅读他的书之外,福勒没有解释为什么他修改后的代码比原版更好.



2> 小智..:

这是重要的重构,因为它是对单一职责的重构,它是DRY失败的解决方案!

临时文件的主要问题(特别是在使用长方法的幼稚代码中,长数百行!)是临时变量,它们是局部状态。明显的风险(如Fowler所讨论的那样)是,某人可能会在很长的方法中途进行更改,并最终破坏某些内容。(已看到产生的费用)

没有测试,此方法具有多种依赖性-真是一团糟!:)

删除临时人员是关于重构为单一职责。

示例-今天我发现了一个错误,它与将错误的temp变量传递到服务有关。如果我删除临时文件(有多个字符串),就不会发生该错误(疏忽)。

我的方法持有一个temp变量的原因是它在做它不应该做的工作...并且类似的类重复了此逻辑...是否全部一致?没有!

通过删除temp,我还将代码重构为具有适当职责的类,通过一些简单的测试即可覆盖110%。

没有巨大的工具可以测试琐碎的事情

如果我调用一些昂贵的东西,我将把结果作为值对象/集合返回。“临时代码”可能应该由集合内部化。

因此,删除temp将使您承担集中(单一)的职责-> SOLID!

推荐阅读
mobiledu2402851323
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有