Node.js中替代多层嵌套if else方案咨询:AWS CloudWatch事件处理场景
优化方案:策略模式+配置表替代嵌套if/else
核心思路是将不同Namespace的处理逻辑抽离为独立的配置映射表,实现逻辑与数据分离,后续新增Namespace仅需新增配置项,无需修改主判断逻辑,彻底解决多层嵌套判断的可维护性问题。
具体实现代码
// 1. 定义Namespace策略配置表:按优先级配置每个服务的维度组合规则 const namespaceConfig = { "AWS/ApiGateway": [ ['ApiId', 'Stage'], ['ApiName', 'Stage'], ['ApiId'], ['ApiName'] ], "AWS/S3": [ ['BucketName', 'StorageType'] ], "AWS/Lambda": [ ['FunctionName'] ], "AWS/Logs": [ ['LogGroupName'] ] // 后续新增其他Namespace仅需在此处加对应配置即可 } // 2. 通用维度值拼接函数:按规则优先级匹配第一个符合条件的维度组合 function getDimensionsValue(config) { for (const dimensionGroup of config) { // 判断当前组合的所有维度是否都存在 const allExist = dimensionGroup.every(key => dimensionName(key)) if (allExist) { // 拼接对应维度值返回 return dimensionGroup.map(key => dimensionValue(key)).join('_') } } // 无匹配规则时返回默认值,可按需调整 return '' } // 3. 主逻辑仅需一行,无任何嵌套判断 const sns_DimensionsValue = getDimensionsValue(namespaceConfig[sns.Trigger.Namespace])
方案优势
- 可读性强:所有Namespace的维度规则集中在配置表中,一目了然,无需逐层扒if判断逻辑
- 可扩展性好:新增AWS服务的判断规则,仅需在
namespaceConfig中加一行配置,无需修改主逻辑 - 易维护易测试:通用拼接逻辑和配置规则完全分离,可单独对配置项、通用函数做单元测试
特殊场景扩展
如果后续出现某类Namespace的判断逻辑非常复杂,无法用简单的维度组合规则实现,可将配置项改为函数处理,灵活兼容所有场景:
const namespaceConfig = { // 复杂逻辑用函数实现 "AWS/XXService": () => { // 自定义处理逻辑,返回拼接后的结果 if(xxx) return 'xxx' return 'yyy' }, "AWS/ApiGateway": [ ['ApiId', 'Stage'], ['ApiName', 'Stage'], ['ApiId'], ['ApiName'] ] } // 对应调整通用函数即可 function getDimensionsValue(config) { if (typeof config === 'function') return config() for (const dimensionGroup of config) { const allExist = dimensionGroup.every(key => dimensionName(key)) if (allExist) { return dimensionGroup.map(key => dimensionValue(key)).join('_') } } return '' }
内容的提问来源于stack exchange,提问作者user630702
相关产品推荐
相关产品推荐

