J

JS 重构组合:用 Guards 替换嵌套的 If-Else

2025-06-07

JS 重构组合:用 Guards 替换嵌套的 If-Else

嵌套的 if-else 语句会使推断函数的不同执行路径和结果变得过于复杂。这可能会导致生产力下降,并因误解而引入错误。

Martin Fowler 的书“重构 - 改进现有代码的设计(第二版) ”中的重构“用保护子句替换嵌套条件”可以在这些情况下提供帮助。

保护子句检查某个条件,如果条件成立,则从函数返回,这可能会进行一些计算并返回结果。通过提前结束一条执行路径,可以更轻松地推断函数。

下面是重构之前的示例函数(来自《用保护子句替换嵌套条件》,Martin Fowler):

function getPayAmount() {
  let result;
  if (isDead)
    result = deadAmount();
  else {
    if (isSeparated)
      result = separatedAmount();
    else {
      if (isRetired)
        result = retiredAmount();
      else
        result = normalPayAmount();
    }
  }
  return result;
}
Enter fullscreen mode Exit fullscreen mode

在此示例中,三个嵌套的 if-else 语句检查不同的条件(例如isSeparated),并更新变量result。该变量在函数末尾返回。

目标是将该函数重构为以下版本:

function getPayAmount() {
  if (isDead) return deadAmount();
  if (isSeparated) return separatedAmount();
  if (isRetired) return retiredAmount();
  return normalPayAmount();
}
Enter fullscreen mode Exit fullscreen mode

重构后的函数使用保护子句代替嵌套的 if-else 语句。变量result不再需要,已被移除。重构后的代码更易于理解,因为状态更少(没有变量),并且每个执行路径都提前返回。

如何一步步重构原有的功能?

您可以通过对每个条件应用两个重构来简化原始代码:

  • 内联返回将变量赋值转换为 return 语句。当控制流中赋值语句后的语句返回该变量时,可以进行这种转换。
  • 将 if-else 转换为保护子句将包含内部语句的 if-else 语句更改return为保护子句,从而删除 else 块周围的缩进。

您可以手动或自动执行这些步骤。VS Code 的 P42 JavaScript 助手是一款支持这两种操作的重构工具。P42 用蓝色波浪下划线表示改进机会。通过自动化重构,只需几秒钟即可改进代码。经过最后的格式化步骤后,该函数已重构为简化版本。

以下是使用 P42 在 VS Code 中重构代码的样子:

💡 本博文展示的是 P42 JavaScript Assistant v1.29

重构

重构对于维护健康的代码库至关重要,许多小的改进都会带来很大的帮助。通过引入保护子句,通常可以简化嵌套的 if-else 语句,并使代码库更加完善。

重构快乐!

文章来源:https://dev.to/p42/javascript-refactoring-in-action-replace-nested-if-else-with-guards-41nl
PREV
使用 32 个 JavaScript 重构增强 VS Code
NEXT
成为前端开发人员的 6 项技能