合并条件表达式(Consolidate Conditional Expression)

JavaEdge 发表于 2022/04/03 14:02:56 2022/04/03
【摘要】 1 动机有时发现这样一串条件检查:检查条件各不相同,最终行为却一致。这时就该使用“逻辑或”和“逻辑与”将它们合并为一个条件表达式:合并后的条件代码会表述“实际上只有一次条件检查,只不过有多个并列条件需要检查,从而使这一次检查的用意更清晰。当然,合并前和合并后的代码有着相同的效果,但原先代码传达出的信息却是“这里有一些各自独立的条件测试,它们只是恰好同时发生”这项重构往往可以为使用【提炼函数...

1 动机

有时发现这样一串条件检查:检查条件各不相同,最终行为却一致。

这时就该使用“逻辑或”和“逻辑与”将它们合并为一个条件表达式:

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

条件语句的合并理由也同时指出不要合并的理由:若我认为这些检查的确彼此独立,的确不应该被视为同一次检查,我就不会使用本项重构。

2 做法

确定这些条件表达式都没有副作用。

若某个条件表达式有副作用,可先用【将查询函数和修改函数分离】处理。

使用适当的逻辑运算符,将两个相关条件表达式合并为一个。顺序执行的条件表达式用逻辑或来合并,嵌套的if语句用逻辑与来合并。

测试。

重复前面的合并过程,直到所有相关的条件表达式都合并到一起。

可以考虑对合并后的条件表达式实施【提炼函数】。

3 案例

案例一:逻辑或

public int disabilityAmount(Employee anEmployee) {
  if (anEmployee.seniority < 2) {
    return 0;
  }
  if (anEmployee.monthsDisabled > 12) {
    return 0;
  }
  if (anEmployee.isPartTime) {
    return 0; // compute the disability amount
  }
}

这里有一连串的条件检查,都指向同样的结果。既然结果相同,就应该把这些条件检查合并成一条表达式。对这样顺序执行的条件检查,可以用逻辑或运算符合并。

public int disabilityAmount(Employee anEmployee) {
  if ((anEmployee.seniority < 2) || (anEmployee.monthsDisabled > 12)) {
    return 0;
  }
  if (anEmployee.isPartTime) {
    return 0;
  }
  return 1;
}

然后把下一个条件检查也合并进来:

public int disabilityAmount(Employee anEmployee) {
  if ((anEmployee.seniority < 2) || (anEmployee.monthsDisabled > 12) || (anEmployee.isPartTime)) {
    return 0;
  }
  return 1;
}

合并完成后,再对这句条件表达式使用【提炼函数】

public int disabilityAmount(Employee anEmployee) {
  if (isNotEligableForDisability(anEmployee)) {
    return 0;
  }
  return 1;
}

public boolean isNotEligableForDisability(Employee anEmployee) {
  return ((anEmployee.seniority < 2) || (anEmployee.monthsDisabled > 12) || (anEmployee.isPartTime));
}

案例二:逻辑与

例如,嵌套if语句的情况:

public double disabilityAmount(Employee anEmployee) {
  if (anEmployee.onVacation) {
    if (anEmployee.seniority > 10) {
      return 1;
    }
  }
  return 0.5;
}

可以用逻辑与运算符将其合并:

public double disabilityAmount(Employee anEmployee) {
  if ((anEmployee.onVacation) && (anEmployee.seniority > 10)) {
    return 1;
  }
  return 0.5;
}

如果原来的条件逻辑混杂这两种情况,我也会根据需要组合使用逻辑与和逻辑或运算符。这时,代码很可能变得混乱,所以我会频繁使用【提炼函数】,把代码变得可读。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区),文章链接,文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:cloudbbs@huaweicloud.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。