You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何重构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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 06:36:08