If-Else 逻辑可视化:快速重构复杂条件判断
2026-06-18
嵌套 If-Else 的问题
嵌套条件是代码复杂性的首要原因。它们创造隐藏路径,使测试变得困难,并且是常见的 bug 来源。让我们重构两个实际示例。
示例 1:折扣计算
**重构前——深层嵌套:**
function calculateDiscount(user) {
let discount = 0;
if (user.isMember) {
if (user.years > 5) {
if (user.hasCoupon) {
discount = 0.4;
} else {
discount = 0.3;
}
} else {
if (user.hasCoupon) {
discount = 0.25;
} else {
discount = 0.15;
}
}
} else {
if (user.hasCoupon) {
discount = 0.1;
} else {
discount = 0;
}
}
// 季节性奖励
if (discount > 0) {
const month = new Date().getMonth();
if (month >= 11 || month <= 1) {
discount += 0.05;
}
}
return Math.min(discount, 0.5);
}
**重构后——提前返回 + 查找表:**
function calculateDiscount(user) {
const baseDiscounts = {
"member_5plus_coupon": 0.4,
"member_5plus": 0.3,
"member_coupon": 0.25,
"member": 0.15,
"coupon": 0.1,
};
const key = [
user.isMember ? "member" : "",
user.years > 5 ? "5plus" : "",
user.hasCoupon ? "coupon" : "",
].filter(Boolean).join("_");
let discount = baseDiscounts[key] || 0;
// 季节性奖励
if (discount > 0) {
const month = new Date().getMonth();
if (month >= 11 || month <= 1) {
discount += 0.05;
}
}
return Math.min(discount, 0.5);
}
示例 2:用户角色访问控制
**重构前——嵌套 switch:**
function checkAccess(user, resource) {
if (user && user.roles) {
switch (user.role) {
case "admin":
return true;
case "editor":
if (resource.type === "article") return true;
if (resource.type === "comment" && resource.authorId === user.id) return true;
return false;
case "viewer":
if (resource.isPublic) return true;
return false;
default:
return false;
}
}
return false;
}
**重构后——策略模式:**
const accessRules = {
admin: () => true,
editor: (resource, user) =>
resource.type === "article" ||
(resource.type === "comment" && resource.authorId === user.id),
viewer: (resource) => resource.isPublic,
};
function checkAccess(user, resource) {
if (!user?.roles?.length) return false;
const rule = accessRules[user.role];
return rule ? rule(resource, user) : false;
}
这些重构为什么有效
1. **消除嵌套** — 每个缩进层级都加倍了心理负担 2. **单一职责** — 每个函数或规则处理一个关注点 3. **可独立测试** — 将规则提取为纯函数,单元测试轻而易举 4. **自文档化** — 策略对象名称描述了逻辑本身尝试 If-Else 重构工具
使用 YZIF 的 If-Else 重构工具 自动转换你的嵌套 if-else 代码。粘贴代码,选择目标风格(提前返回、switch 或策略模式),立即获得干净的代码。