You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何重构多分支else-if代码块?有没有更优实现方案

重构冗余的权限判断逻辑:从噩梦级else-if到可维护的结构化方案

哇,这段嵌套的else-if链看着真头疼——重复调用同一个方法、条件组合零散又冗余,以后要加新分组或者调整权限规则,简直是维护噩梦!咱们一步步把它重构得干净、好懂又易维护。

第一步:先解决重复调用的问题

原代码每次判断都调用Authorization::getAdmin($Id),既浪费性能又让代码乱糟糟。先把用户的分组缓存起来,只调用一次:

// 缓存用户所属分组,避免重复查询/方法调用
$userGroups = Authorization::getAdmin($Id);

第二步:用结构化规则替代冗长的条件链

原逻辑是按「拥有分组数量从多到少」的优先级判断的:先检查4个分组全有的情况,再是3分组组合、2分组组合,最后单个分组。我们可以把这些权限场景整理成结构化的规则数组,把「需要的分组集合」和「对应的处理逻辑」绑定在一起,以后改规则直接改数组就行,不用动条件判断的核心代码。

重构后的完整代码

// 第一步:缓存用户分组
$userGroups = Authorization::getAdmin($Id);

// 辅助函数:检查用户是否拥有所有要求的分组
function hasAllRequiredGroups(array $userGroups, array $requiredGroups): bool {
    return count(array_intersect($requiredGroups, $userGroups)) === count($requiredGroups);
}

// 第二步:定义权限规则(按优先级从高到低排列,多分组组合优先)
$permissionRules = [
    // 4个分组全匹配
    [
        'required' => ['item1', 'item2', 'item3', 'item4'],
        'action' => function() {
            // 原第一个if里的业务逻辑
        }
    ],
    // 3分组组合场景
    [
        'required' => ['item2', 'item3', 'item4'],
        'action' => function() {
            // 原第二个else-if的逻辑
        }
    ],
    [
        'required' => ['item1', 'item3', 'item4'],
        'action' => function() {
            // 原第三个else-if的逻辑
        }
    ],
    [
        'required' => ['item1', 'item2', 'item4'],
        'action' => function() {
            // 原第四个else-if的逻辑
        }
    ],
    [
        'required' => ['item1', 'item2', 'item3'],
        'action' => function() {
            // 原第六个else-if的逻辑(集合不考虑顺序,自动合并重复条件)
        }
    ],
    // 2分组组合场景
    [
        'required' => ['item2', 'item3'],
        'action' => function() {
            // 原第七个else-if的逻辑
        }
    ],
    [
        'required' => ['item1', 'item3'],
        'action' => function() {
            // 原第八个else-if的逻辑
        }
    ],
    [
        'required' => ['item1', 'item2'],
        'action' => function() {
            // 原第九个else-if的逻辑
        }
    ],
    [
        'required' => ['item1', 'item4'],
        'action' => function() {
            // 原第十个else-if的逻辑
        }
    ],
    [
        'required' => ['item2', 'item4'],
        'action' => function() {
            // 原第十一个else-if的逻辑
        }
    ],
    [
        'required' => ['item3', 'item4'],
        'action' => function() {
            // 原第十二个else-if的逻辑
        }
    ],
    // 单个分组场景
    [
        'required' => ['item1'],
        'action' => function() {
            // 原第十三个else-if的逻辑
        }
    ],
    [
        'required' => ['item2'],
        'action' => function() {
            // 原第十四个else-if的逻辑
        }
    ],
    [
        'required' => ['item3'],
        'action' => function() {
            // 原第十五个else-if的逻辑
        }
    ],
    [
        'required' => ['item4'],
        'action' => function() {
            // 原第十六个else-if的逻辑
        }
    ]
];

// 第三步:遍历规则,执行第一个匹配的逻辑
foreach ($permissionRules as $rule) {
    if (hasAllRequiredGroups($userGroups, $rule['required'])) {
        $rule['action']();
        break; // 保持原逻辑的优先级:找到第一个匹配项就停止
    }
}

重构后的优势

  1. 性能提升:只调用一次Authorization::getAdmin($Id),避免重复执行方法/查询
  2. 可读性拉满:所有权限规则集中在一个数组里,一眼就能看清所有场景和对应逻辑
  3. 维护成本骤降:加新分组组合?直接在数组里加一项;调整优先级?改数组顺序就行;合并相同逻辑?把多个required集合指向同一个action即可
  4. 消除冗余:原代码里item1+item2+item3和item2+item3+item1这种重复条件,用集合判断自动去重,不用写两遍

内容的提问来源于stack exchange,提问作者Prashanth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:46:24