</>YZIF
博客

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 或策略模式),立即获得干净的代码。