找重复代码别找函数,找“副作用组合“——12 处温控收到 2 个函数

发布时间:2026/7/17 9:48:16
找重复代码别找函数,找“副作用组合“——12 处温控收到 2 个函数 一句话: 每次调温控温度都要做四件事设值→算 DAC 码→写芯片→清标志位。这组操作被复制粘贴了 12 次散在 5 个文件里。找一个函数名看不出重复找副作用组合一看就找到——收口到一个函数后限幅逻辑只在一处改阈值只改一个宏。适合谁读适合嵌入式开发者、单片机初学者及遇到类似问题的工程师怎么发现这 12 处重复的温控需要限制在 35°C ~ 70°C 范围。改了上限发现漏了几个地方——有的手动 if-else有的判上下限有的完全没保护。开始找所有能改温度的地方来源位置触摸屏直接输入1 处四个加减按钮4 处初始化界面 main3 处上位机协议指令 5 和 132 处发光序列2 处加起来 12 个调用点每个处理限幅的方式不一样。怎么找到这些重复的不是找函数像不像。是找同样的副作用序列设 fValue → 算 u16DacCode fValue × DAC_SCALE → 写 DAC芯片 DAC 通道 6 → 清更新标志位这组四步操作在 12 个地方一模一样。函数名各不相同但副作用链一模一样 重复代码。收口float Set_Temp_Limit(void, float fTemp) { if (fTemp MIN_LIMIT) fTemp MIN_LIMIT; else if (fTemp MAX_LIMIT) fTemp MAX_LIMIT; fValue fTemp; u16DacCode (uint16_t)(fTemp * DAC_SCALE); DAC_Write(6, u16DacCode); bUpdated 1; return fTemp; // 返回实际值调用方可以知道有没有被限幅 }然后 12 个调用点全部替换// 改前每个地方自己 if-else 算值 写芯片 if(fValue - fStep MIN_LIMIT) { fValue fValue - fStep; u16DacCode (uint16_t)(fValue * DAC_SCALE); DAC_Write(6, u16DacCode); ... } // 改后一行 Set_Temp_Limit(ptMainSet, fValue - fStep);函数返回实际值不只是设值限幅函数如果返回void调用方永远不知道值被改了。返回float后float fActual Set_Temp_Limit(ptMainSet, fRequested); if (fActual ! fRequested) { // 被限幅了显示提示已设到边界值 }上位机协议也用这个返回值。原来上位机写 TEC 后应答直接回传原始值重构后回传fValue等于告诉上位机我实际设了多少。限幅策略拒绝还是夹断策略做法用户体验拒绝超限不执行用户按按钮按不动感觉出 bug 了夹断超限设到边界用户可能不知道被限幅了当前选了夹断因为函数返回实际值后续可以加提示。策略应该是有意识的选择不是代码里随手写的。总结要点说明找重复找副作用链不是找函数名收口所有调温控走一个函数返回值返回实际值让调用方知道有没有被限幅策略拒绝/夹断是有意识的选择不是随手写的找重复代码的时候别搜函数名。搜那组写完值之后必定做的操作。操作链一样的就是该被收口的。有用的话点个收藏下次调试直接用。有问题欢迎评论区交流看到了都会回。