重构函数-Replace Temp with Query以查询取代临时变量四
创始人
2025-05-28 15:50:36
0

重构函数-Replace Temp with Query以查询取代临时变量四

1.以查询取代临时变量

1.1.使用场景

你的程序以一个临时变量(temp)保存某一表达式的运算结果。

1.2.为什么用查询取代临时变量

  • 临时变量会增加函数的长度
    它们是暂时的,而且只能在所属函数内使用。由于临时变量只有在所属函数内才可见,所以它们会驱使你写出更长的函数,因为只有这样你才能访问到想要访问的临时变量
  • 扩展临时变量生命周期
    把临时变量替换为一个查询函数(query method),那么同一个class中的所有函数都将可以获得这份信息。这将带给你极大帮助,使你能够为这个编写更清晰的代码
  • 降低提炼函数重构手法难度
    Replace Temp with Query往往是你运用提炼函数 之前必不可少的一个步骤。局部变量会使代码难以被提炼,所以你应该尽可能把它们替换为查询函数

1.3.如何用

  1. 找出只被赋值一次的临时变量。
  2. 如果某个临时变量被赋值超过一次,考虑使用Split Temporary Variable剖解临时变量 将它分割成多个变量。
  3. 将该临时变量声明为final,这可确保该临时变量的确只被赋值一次。
  4. 编译。
  5. 将「对该临时变量赋值」之语句的等号右侧部分提炼到一个独立函数中。首先将函数声明为private。
  6. 日后你可能会发现有更多class需要使用 它,彼时你可轻易放松对它的保护。
  7. 确保提炼出来的函数无任何连带影响(副作用),也就是说该函数并不修改任何对象内容。如果它有连带影响,就对它进行Separate Query from Modifier将查询函数和修改函数分离
  8. 编译,测试。

1.4.查询函数替代临时变量示例

下面是一个临时变量的示例代码,通过几个步骤我们使用查询函数替代临时变量重构手法替换掉临时变量。

   double getPrice() {int basePrice = _quantity * _itemPrice;double discountFactor;if (basePrice > 1000) discountFactor = 0.95;else discountFactor = 0.98;return basePrice * discountFactor;}

我们希望将示例中两个临时变量都替换掉,但是我们不能一次都替换,要循序渐进。所以我们先替换basePrice
尽管这里的代码十分清楚,我还是先把临时变量声明为final,检查他们是否的确只被赋值一次.

这样一来,如果有任何问题,编译器就会警告我。之所以先做这件事,因为如果临时变量不只被赋值一次,我就不该进行该项重构。

   double getPrice() {//将临时变量申明为常量,测试它是否只赋值一次。final int basePrice = _quantity * _itemPrice;final double discountFactor;if (basePrice > 1000) discountFactor = 0.95;else discountFactor = 0.98;return basePrice * discountFactor;}

接下来我开始替换临时变量,每次一个。首先我把赋值(basePrice)动作的右侧表达式提炼出来:

   double getPrice() {// 将变量右边的表达式提取到新函数中final int basePrice = basePrice();final double discountFactor;if (basePrice > 1000) discountFactor = 0.95;else discountFactor = 0.98;return basePrice * discountFactor;}// 创建新函数private int basePrice() {return _quantity * _itemPrice;}

编译并测试,如果没有问题就开始使用Replace Temp with Query
首先把临时变量basePrice的第一个引用点替换掉:

   double getPrice() {final int basePrice = basePrice();final double discountFactor;// 替换掉basePrice变量第一个引用点,替换为新的函数if (basePrice() > 1000) discountFactor = 0.95;else discountFactor = 0.98;return basePrice * discountFactor;}

编译,测试。然后替换下一个引用点,直到所有的引用点都替换掉。
然后把basePrice临时变量的声明式一并摘除

   double getPrice() {// 去掉了basePrice临时变量final double discountFactor;//临时变量替换为函数if (basePrice() > 1000) discountFactor = 0.95;else discountFactor = 0.98;//临时变量替换为函数return basePrice() * discountFactor;}

搞定basePrice之后,我再以类似办法提炼出一个discountFactor()

   double getPrice() {final double discountFactor = discountFactor();return basePrice() * discountFactor;}//创建一个新函数private double discountFactor() {//复用了basePrice临时变量提炼的函数if (basePrice() > 1000) return 0.95;else return 0.98;}

你看,如果我没有把临时变量basePrice替换为一个查询式,将多么难以提炼discountFactor()
最终,getPrice()变成了这样

  double getPrice() {return basePrice() * discountFactor();}

相关内容

热门资讯

美伊谈判无果,国际金价大跌 由于美国和伊朗在伊斯兰堡谈判未达成任何协议,国际黄金价格12日开盘大跌,纽约商品交易所6月黄金期货价...
伊朗公布驱离美军舰视频 据伊朗伊斯兰革命卫队官方频道消息,当地时间4月12日,伊朗伊斯兰革命卫队发布视频并表示,美国海军两艘...
量子计算概念股IONQ涨4.8... 9月18日消息,量子计算概念股IONQ开盘走高,现上涨4.8%,此前公司与美国能源部签署谅解备忘录以...
费城半导体指数开盘大幅走高,现... 9月18日消息,费城半导体指数开盘大幅走高,现涨2.7%。(科股宝播报)
俄乌互相指责对方违反停火协议 【环球时报特约记者 柳玉鹏】俄罗斯总统普京与乌克兰总统泽连斯基近日先后宣布将于12日(东正教复活节)...
纳斯达克综合指数涨1.00%,... 9月18日消息,纳斯达克综合指数涨1.00%,再创历史新高。道琼斯指数涨0.34%,标普500指数涨...
美国至9月12日当周EIA天然... 9月18日消息,美国至9月12日当周EIA天然气库存增加900亿立方英尺,预期800亿立方英尺,前值...
欧盟强烈谴责以色列袭击黎巴嫩 欧盟外交事务发言人阿努瓦尔·阿努尼12日说,欧盟强烈谴责以色列对黎巴嫩发动袭击,要求以色列立即停止针...
华为云Stack8.6发布,正... 9月18日消息,华为全联接大会2025期间,华为混合云总裁肖霏正式发布华为云Stack8.6,并宣布...
原创 9... 当庞大的战争机器,在波斯湾沙漠里疯狂空转,帝国反噬的终极怒火,终于在华盛顿后院彻底引爆。 当地时间3...