4 个 case 148 行,合并成 1 个块 55 行——复制粘贴超过 2 次就该停
一句话: 协议处理函数里四个通道各有一个 case 分支每个 30 行逻辑完全一样只是通道号不同。修一个 bug 要改 4 个地方修完还漏了一处。把这些 case 合并成参数化的一代码块148 行缩到 55 行修 bug 只改一处。适合谁读写过 switch-case、维护过重复代码的嵌入式开发者。改之前的样子四个通道四个 case逻辑几乎一样——只有通道号和系数不同switch (u8Cmd) { case 1: // 通道 0 if (bCalMode) { u16Dac EEPROM_Read(EEPROM_CH0 u16Idx); } else { u16Dac (rxBuf[3] 8) | rxBuf[4]; } DAC_Write(0, u16Dac); txBuf[2] COEFF_SINGLE; txBuf[3] (u16Dac 8) 0xFF; txBuf[4] u16Dac 0xFF; break; case 2: // 通道 1 — 几乎一样 ... case 3: // 通道 2 — 又一样 ... case 4: // 通道 3 — 还是几乎一样除了系数不同 ... }问题修一个 bug → 改 4 个地方 → 容易漏新增通道 → 复制粘贴 → 又多了 30 行扫一眼四个 case 都一样 → 跳过错过隐藏的差异合并后case 1: case 2: case 3: case 4: { uint8_t u8Ch u8Cmd - 1; // 0/1/2/3 float fCoeff (u8Ch 3) ? COEFF_SINGLE : COEFF_DUAL; uint16_t u16Dac; if (bCalMode) { u16Dac EEPROM_Read(g_au32EepromBase[u8Ch] u16Idx); } else { u16Dac (rxBuf[3] 8) | rxBuf[4]; } DAC_Write(u8Ch, u16Dac); // 通道 3 是双路并联写完主通道必须写副通道 if (u8Ch 3) { DAC_Write(4, u16Dac); } txBuf[2] (uint8_t)(fCoeff); txBuf[3] (u16Dac 8) 0xFF; txBuf[4] u16Dac 0xFF; break; }差异项合并前合并后通道号每个 case 硬编码u8Cmd - 1自动映射系数每个 case 不同值三元表达式EEPROM 地址每个 case 不同常量用数组双路并联case 4 单独一个 if块内一行if (u8Ch 3)应答帧四个 case 完全一样块末尾统一处理经验复制粘贴超过 2 次时停下来找参数化的方式。四个通道 只是通道号不同。系数只有两种。地址用数组。剩下的逻辑完全一样——为什么要写四遍合并后修 bug 只改一处。新增通道只需改数组。真正的差异双路并联、系数不同一眼能看到。实测对比4个case 148行: 修bug改4处容易漏 | 1个块 55行: 修bug改1处不可能漏有用的话点个收藏下次调试直接用。有问题欢迎评论区交流看到了都会回。下一篇保姆级教程——状态机、编码规范、编译链接——每个嵌入式新人都要过的三道坎