如何重构switch-case代码,支持在其他类扩展新增case无需重复代码
实现方案
这里分两种场景给你可落地的实现方式,都能完全避免重复编写原有case逻辑:
方案1:封装公共分支函数(适合分支数量固定、新增case不多的场景)
先把原有5个case的逻辑抽成独立公共函数,用返回值标记是否命中原有分支,不需要改动原有逻辑的调用方式,新增分支的位置只要先处理自己的额外case即可。
第一步:抽离公共逻辑
// 返回值:true=命中原有case并处理完成,false=未命中原有分支 bool handleCommonCases(int something) { switch(something){ case Case1: validate(); doSomething1(); return true; case Case2: validate(); doSomething2(); return true; case Case3: validate(); doSomething3(); return true; case Case4: validate(); doSomething4(); return true; case Case5: validate(); doSomething5(); return true; default: return false; } }
第二步:原有调用位置改造
if (!handleCommonCases(something)) { handleDefault(); }
第三步:新增case的位置实现
switch(something) { // 仅需编写新增的case逻辑 case Case6: validate(); doSomething6(); break; default: // 未命中新分支时走原有公共逻辑 if (!handleCommonCases(something)) { handleDefault(); } break; }
方案2:策略映射表(适合后续还会频繁新增分支的场景)
把所有分支的处理逻辑和枚举值的映射关系抽成表,不用写switch代码,后续新增分支只要加映射项即可,可扩展性更强,还能顺便消除原代码里每个case重复写validate()的冗余。
// 定义处理函数类型 typedef void (*CaseHandler)(void); // 分支映射结构体 typedef struct { int caseKey; CaseHandler handler; } CaseMapping; // 原有5个case的公共映射表,全局复用 CaseMapping commonMappings[] = { {Case1, doSomething1}, {Case2, doSomething2}, {Case3, doSomething3}, {Case4, doSomething4}, {Case5, doSomething5}, }; #define COMMON_MAPPING_CNT (sizeof(commonMappings)/sizeof(commonMappings[0])) // 统一处理函数,支持传入额外分支映射 void handleCases(int something, CaseMapping* extraMappings, int extraCnt) { // 优先处理额外新增的分支 for (int i = 0; i < extraCnt; i++) { if (extraMappings[i].caseKey == something) { validate(); extraMappings[i].handler(); return; } } // 处理公共原有分支 for (int i = 0; i < COMMON_MAPPING_CNT; i++) { if (commonMappings[i].caseKey == something) { validate(); commonMappings[i].handler(); return; } } // 未命中任何分支走default逻辑 handleDefault(); }
原有逻辑调用方式
不需要新增分支的场景直接传空的额外映射即可:
handleCases(something, NULL, 0);
新增case的调用方式
仅需定义自己的额外分支映射:
CaseMapping extraMappings[] = { {Case6, doSomething6} }; handleCases(something, extraMappings, 1);
内容的提问来源于stack exchange,提问作者corvo
相关产品推荐
相关产品推荐

