简化条件表达式之二 :Consolidate Conditional Expression(合并条件式)

你有一系列条件测试,都得到相同结果。

将这些测试合并为一个条件式,并将这个条件式提炼成为一个独立函数。

  double disabilityAmount() {

      if (_seniority < 2) return 0;

      if (_monthsDisabled > 12) return 0;

      if (_isPartTime) return 0;

      // compute the disability amount

 

  double disabilityAmount() {

      if (isNotEligableForDisability()) return 0;

      // compute the disability amount

动机(Motivation)

有时你会发现这样一串条件检查:检查条件各不相同,最终行为却一致。如果发现这种情况,就应该使用logical-AND 和logical-OR 将它们合并为一个条件式。

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

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

作法(Mechanics)

·确定这些条件语句都没有副作用(连带影响)。
Ø如果条件式有副作用,你就不能使用本项重构。

·使用适当的逻辑操作符(logical operators),将一系列相关条件式合并为一个。

·编译,测试。

·对合并后的条件式实施Extract Method 。

范例:Ors

请看下列代码:

  double disabilityAmount() {

      if (_seniority < 2) return 0;

      if (_monthsDisabled > 12) return 0;

      if (_isPartTime) return 0;

      // compute the disability amount

      ...

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

  double disabilityAmount() {

      if ((_seniority < 2) || (_monthsDisabled > 12) || (_isPartTime)) return 0;

      // compute the disability amount

      ...

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

  double disabilityAmount() {

      if (isNotEligibleForDisability()) return 0;

      // compute the disability amount

      ...

  }

  boolean isNotEligibleForDisability() {

      return ((_seniority < 2) || (_monthsDisabled > 12) || (_isPartTime));

  }

范例:Ands

上述实例展示了"logical-OR"的用法。下列代码展示"logical-AND"的用法:

  if (onVacation())

      if (lengthOfService() > 10)

          return 1;

  return 0.5;

这段代码可以变成:

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

  else return 0.5;

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

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

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

  else return 0.5;

就变成了:

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值