重构函数-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();}

相关内容

热门资讯

新华保险三重基石,为家庭顶梁柱... 文/王书望 编辑/福保摘要:作为30-50岁的家庭经济支柱,你是否时常感到“压力山大”?房贷、车贷、...
预计2025年第四季度环比增亏... 市值超300亿元的头部硅片企业TCL中环(002129.SZ)2025年经营继续承压。据公司1月14...
吉林文旅爆火背后,藏着普通人都... 作者:蔚蓝寒假开始,各地“小神兽”进入了散养状态,家庭游、亲子游成为家长们假期遛娃看娃的热门话题。作...
午后跳水,并不简单 2026年1月14日上午,大A股上涨气势如虹,上证指数一度达到4190点,距离4200点仅有一步之遥...
规模再创新高 我国2025年外... 据海关统计,2025年我国外贸进出口达45.47万亿元,增长3.8%。其中,出口26.99万亿元,增...
负债超6.6亿元,泰山啤酒被法... 近日,山东省泰安市泰山区人民法院发出(2026)鲁0902破申1号民事裁定书,正式受理山东泰山啤酒股...
“死了么”APP官宣改名 1月13日,死了么APP发布消息: 经团队审慎决策,“死了么”APP将于即将发布的新版本中,正式启用...
再提长株潭一体化,湖南为何急着... 本文来源:时代周报 作者:阿力米热长株潭一体化再提速。2026年长沙市政府工作报告披露,预计2025...
华润元大基金拟增资引战,可获2... 来源:密探财经(ID:Spy Finance)近日,华润元大基金管理有限公司(注:华润元大基金)增资...
上海新天地的五星级酒店,0元卖... 上海黄金地段的五星级酒店,直接被“白送”了。近日,北京国资委旗下的京投发展发布一则公告,宣布拟以0元...