构建千万级高可用企业级Node.js应用

261 阅读3分钟

构建千万级高可用企业级Node.js应用

下崽ZY:51xuebc.com/thread-421-1-1.html

运用兼并条件表达式消弭一大堆 if/else

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;
}
复制代码

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