重构条件-Consolidate Conditional Expression合并条件式二
创始人
2025-06-01 14:58:56

重构条件-Consolidate Conditional Expression合并条件式二

1.合并条件式

1.1.使用场景

你有一系列条件测试,都得到相同结果。将这些测试合并为一个条件表达式,并将这个条件表达式提炼成为一个独立函数。

有时你会发现这样一串条件检查:检查条件各不相同,最终行为却一致。如果发现这种情况,就应该使用“逻辑或”和“逻辑与”将它们合并为一个条件表达式。

之所以要合并条件代码,有两个重要原因。首先,合并后的条件代码会告诉你“实际上只有一次条件检查,只不过有多个并列条件需要检查而已”,从而使这一次检查的用意更清晰。当然,合并前和合并后的代码有着相同的效果,但原先代码传达出的信息却是“这里有一些各自独立的条件测试,它们只是恰好同时发生”。其次,这项重构往往可以为你使用Extract Method (110)做好准备。将检查条件提炼成一个独立函数对于厘清代码意义非常有用,因为它把描述“做什么”的语句换成了“为什么这样做”。

条件语句的合并理由也同时指出了不要合并的理由:如果你认为这些检查的确彼此独立,的确不应该被视为同一次检查,那么就不要使用本项重构。因为在这种情况下,你的代码已经清楚表达出自己的意义。

1.2.如何做

  • 确定这些条件语句都没有副作用。
  • 如果条件表达式有副作用,你就不能使用本项重构。
  • 使用适当的逻辑操作符,将一系列相关条件表达式合并为一个。
  • 编译,测试。
  • 对合并后的条件表达式实施Extract Method (110)。

1.3.示例

1.使用逻辑或

请看下列代码

  double disabilityAmount() {if (_seniority < 2) return 0;if (_monthsDisabled > 12) return 0;if (_isPartTime) return 0;// compute the disability amount...

在这段代码中,我们看到一连串的条件检查,它们都做同一件事。对于这样的代码,上述条件检查等价于一个以逻辑或连接起来的语句:

  double disabilityAmount() {if ((_seniority < 2) || (_monthsDisabled > 12) || (_isPartTime)) return 0;// compute the disability amount...

现在,我可以观察这个新的条件表达式,并运用Extract Method (110)将它提炼成一个独立函数,以函数名称表达该语句所检查的条件:

  double disabilityAmount() {// 将条件提炼为一个函数if (isNotEligibleForDisability()) return 0;// compute the disability amount...}boolean isNotEligibleForDisability() {return ((_seniority < 2) || (_monthsDisabled > 12) || (_isPartTime));}

2.使用逻辑与

上述实例展示了逻辑或的用法。下列代码展示逻辑与的用法:

  if (onVacation())if (lengthOfService() > 10)return 1;return 0.5;

这段代码可以变成:

  if (onVacation() && lengthOfService() > 10) return 1;else return 0.5;

你可能还会发现,某些情况下需要同时使用逻辑或、逻辑与和逻辑非,最终得到的条件表达式可能很复杂,所以我会先使用Extract Method (110)将表达式的一部分提炼出来,从而使整个表达式变得简单一些。

如果我所观察的部分只是对条件进行检查并返回一个值,就可以使用三元操作符将这一部分变成一条return语句。因此,下列代码:

  if (onVacation() && lengthOfService() > 10) return 1;else return 0.5;

就变成了:

  return (onVacation() && lengthOfService() > 10) ? 1 : 0.5;

相关内容

热门资讯

玛雅人的五大预言 玛雅人预言2... 曾经玛雅人预言2012年是世界末日,但当时好像没有发生什么。没想到10年后的2022年,疫情,战争,...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
cad打印线条粗细设置 cad... 004-线型(下)打印样式设置和线型文件使用一、线宽设置方法制图规范里边的线宽要求,我们已经定义好,...
阿西吧是什么意思 阿西吧相当于... 即使你没有受到过任何外语培训,你也懂四国语言。汉语:你好英语:Shit韩语:阿西吧(아,씨발! )日...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...