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;
}
在此示例中,三个嵌套的 if-else 语句检查不同的条件(例如isSeparated
),并更新变量result
。该变量在函数末尾返回。
目标是将该函数重构为以下版本:
function getPayAmount() {
if (isDead) return deadAmount();
if (isSeparated) return separatedAmount();
if (isRetired) return retiredAmount();
return normalPayAmount();
}
重构后的函数使用保护子句代替嵌套的 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