如何重构多分支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; // 保持原逻辑的优先级:找到第一个匹配项就停止 } }
重构后的优势
- 性能提升:只调用一次
Authorization::getAdmin($Id),避免重复执行方法/查询 - 可读性拉满:所有权限规则集中在一个数组里,一眼就能看清所有场景和对应逻辑
- 维护成本骤降:加新分组组合?直接在数组里加一项;调整优先级?改数组顺序就行;合并相同逻辑?把多个
required集合指向同一个action即可 - 消除冗余:原代码里
item1+item2+item3和item2+item3+item1这种重复条件,用集合判断自动去重,不用写两遍
内容的提问来源于stack exchange,提问作者Prashanth
相关产品推荐
相关产品推荐

