如何高效实现端口匹配并返回含描述的自定义错误信息?
高效实现多端口列表的带描述检查逻辑
解决这类重复判断的核心思路是把分散的检查规则配置化,将端口列表、错误码、错误信息模板整合到统一的配置结构中,通过遍历配置完成检查,彻底消除重复的if-else逻辑。
先看你可能正在用的繁琐写法示例
假设你的代码现在是这样的(大量重复判断分支):
// 原繁琐实现 function checkPortsWDesc(ports) { const errors = []; for (const port of ports) { // 检查第一个资源列表 const desc1 = checkPortInListWDesc(port, resourceList1); if (desc1) { errors.push(`错误码1001:端口${port}属于「${desc1}」,禁止使用`); continue; } // 检查第二个资源列表 const desc2 = checkPortInListWDesc(port, resourceList2); if (desc2) { errors.push(`错误码1002:端口${port}属于「${desc2}」,禁止使用`); continue; } // 后续N个资源列表的重复判断... } return errors; }
优化后的配置化实现
步骤1:定义统一的检查规则配置
把所有检查分支的规则集中管理,新增规则时只需追加配置项,无需修改核心检查逻辑:
// 定义检查规则配置数组,所有分支逻辑在这里统一维护 const PORT_CHECK_RULES = [ { list: resourceList1, errorCode: 1001, msgTemplate: (port, desc) => `错误码${1001}:端口${port}属于「${desc}」,禁止使用` }, { list: resourceList2, errorCode: 1002, msgTemplate: (port, desc) => `错误码${1002}:端口${port}属于「${desc}」,禁止使用` }, // 可继续添加任意数量的资源列表规则 ];
步骤2:实现核心检查逻辑
遍历配置数组完成检查,完全消除重复判断:
function checkPortsWDesc(ports) { const errors = []; for (const port of ports) { // 遍历规则,找到第一个匹配的项 const matchedRule = PORT_CHECK_RULES.find(rule => { const desc = checkPortInListWDesc(port, rule.list); if (desc) { // 临时挂载匹配到的描述,方便生成错误信息 rule.matchedDesc = desc; return true; } return false; }); if (matchedRule) { errors.push(matchedRule.msgTemplate(port, matchedRule.matchedDesc)); } } return errors; }
进阶:支持自定义检查函数
如果不同资源列表的检查逻辑有差异(不止是调用checkPortInListWDesc),可以把检查函数也纳入配置:
const PORT_CHECK_RULES = [ { checkFn: (port) => checkPortInListWDesc(port, resourceList1), errorCode: 1001, msgTemplate: (port, desc) => `错误码${1001}:端口${port}属于「${desc}」,禁止使用` }, { checkFn: (port) => checkSpecialPortListWDesc(port, resourceList2), // 自定义检查函数 errorCode: 1002, msgTemplate: (port, desc) => `错误码${1002}:端口${port}属于「${desc}」,禁止使用` }, ]; function checkPortsWDesc(ports) { const errors = []; for (const port of ports) { for (const rule of PORT_CHECK_RULES) { const desc = rule.checkFn(port); if (desc) { errors.push(rule.msgTemplate(port, desc)); break; // 找到匹配项后停止当前端口的检查 } } } return errors; }
这种方式的优势:
- 扩展性极强:新增资源列表或检查规则时,只需在配置数组中追加项,无需修改核心逻辑
- 代码可读性更高:所有规则一目了然,无需在冗长的if-else中找分支
- 维护成本低:规则集中管理,修改错误码或提示文案只需改配置
内容的提问来源于stack exchange,提问作者arnon
相关产品推荐
相关产品推荐

