多权限组合逻辑优化咨询:替代大量if-else的可行方案探讨
权限组合下拉列表逻辑实现方案建议
保留if-else的可行场景
如果确定这套权限逻辑未来不会变更,且当前的if-else结构你和团队能快速理解,完全可以继续使用。但要做几个小优化提升可读性:
- 给每个条件添加业务含义注释,比如
// 无权限1和权限2时,展示基础操作选项 - 将重复的字符串列表提取为常量,避免硬编码冗余
- 对于需要收集所有符合条件的独立if,注意条件的优先级顺序(如果存在优先级差异)
重构为映射表/规则数组(更优雅的选择)
哪怕逻辑不变,把权限组合与对应字符串列表的关系整理成映射表或规则数组,能让代码结构更清晰,比零散的if-else更易读。
示例代码(伪代码)
场景1:单一匹配返回结果
// 将四个布尔权限转为唯一标识键(比如二进制转十进制) function getPermissionKey(p1, p2, p3, p4) { return (p1 ? 8 : 0) + (p2 ? 4 : 0) + (p3 ? 2 : 0) + (p4 ? 1 : 0); } // 定义权限组合与结果列表的映射 const permissionResultMap = { 0: list_of_strings_1, // !p1 && !p2 && !p3 && !p4 12: list_of_strings_2, // p1 && p2 && !p3 && !p4 // 其他所有权限组合依次对应 }; // 获取结果 function getDropdownList(p1, p2, p3, p4) { const key = getPermissionKey(p1, p2, p3, p4); return permissionResultMap[key] || []; }
场景2:收集所有符合条件的结果
// 定义所有规则集合 const permissionRules = [ { condition: (p1,p2,p3,p4) => !p1 && !p2, list: list_of_strings_1 }, { condition: (p1,p2,p3,p4) => p1 && p2 && !p3, list: list_of_strings_2 }, // 其他规则依次添加 ]; // 收集所有匹配的列表 function getDropdownLists(p1, p2, p3, p4) { const result = []; permissionRules.forEach(rule => { if (rule.condition(p1, p2, p3, p4)) { result.push(...rule.list); } }); return result; }
这种方式的优势:
- 所有规则集中管理,权限组合与结果的对应关系一目了然
- 后续哪怕临时调整,修改规则集合即可,无需改动大量分支判断
- 新接手代码的人能快速理解整体逻辑
总结
- 若团队对当前if-else结构无阅读障碍,且逻辑确定不会变动,完全可以保留现有实现,无需重构
- 若想提升代码的可读性和整洁度,哪怕逻辑不变,重构为映射表/规则数组是更优的选择,长期来看更易维护
内容的提问来源于stack exchange,提问作者user2957592
相关产品推荐
相关产品推荐

