Replace If-Else with Early Return
How to simplify nested conditionals using early return and Map structures for cleaner, more readable code.
死去的记忆突然刺痛我——想起以前有个同事特别喜欢 v-else 嵌套,我在版本迭代修 bug 的时候顺手把那段逻辑改了。项目负责人看到直接反对,说不理解,不相信我的写法是对的。
原来的嵌套大概是这样:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
if (this.packageInfo.havePackage) {
if (!this.hasDeposit && this.packageInfo.residueDay > 0) {
type = 1;
} else if (!this.hasDeposit && this.packageInfo.residueDay == 0) {
if (this.packageInfo.residueHours > 0) {
type = 1;
} else {
type = 4;
}
} else {
type = 2;
}
} else {
type = 4;
}
光是读这段,逻辑就已经绕起来了。梳理一下:
- 没买过套餐 → 4
- 买过套餐,有押金 → 2
- 买过套餐,没押金,有剩余天数 → 1
- 买过套餐,没押金,天数为 0 但有剩余小时 → 1
- 其余 → 4
条件其实没几个,但嵌套把它们搅在一起,每个分支都要记清楚自己在第几层。
用提前 return 改写,把条件打散排开:
1
2
3
4
5
6
7
formatType(packageInfo) {
if (!packageInfo.havePackage) return 4;
if (this.hasDeposit) return 2;
if (packageInfo.residueDay > 0) return 1;
if (packageInfo.residueHours > 0) return 1;
return 4;
},
每个 if 只管一件事:满足就 return,不满足就继续往下走,最后兜底 return 4。读起来是线性的,不需要追踪当前在哪层 else 里。
负责人当时的意见是:没有需求文档,他读这段代码读了半天,不确定逻辑对不对。我能理解——嵌套版本虽然乱,但每个分支的意图写得很「显式」,改完之后更简洁,对没见过这种写法的人来说,反而要花时间重新建立映射关系。
说到底是习惯问题。见过提前 return 的人会觉得这很自然,没见过的人第一眼确实会愣一下。
This post is licensed under CC BY 4.0 by the author.