嵌入式代码如何进行重构?

💡 原文中文,约7700字,阅读约需19分钟。
📝

内容提要

本文讨论了重构时的基本方法论,包括使用Source Insight的Smart Rename功能和在线调试、自动化测试等工具。重构的目标是改善代码设计,提高代码的可读性和可维护性。作者提出了代码研读、规范命名、注释到位、改写方法和封装函数等实践方法。通过重构,成功降低了代码复杂度,精简了代码量。

🔎

延伸解读

重构与缺陷修改的边界

文章强调重构的主要目标是改善既有代码的设计,而非修改缺陷或新增功能。但在实践中,作者并未进行纯粹的“重构”,而是兼做缺陷修改并增加自动化测试等辅助功能。这提示读者,在资源有限、故障不断的维护场景下,严格区分重构与缺陷修复可能不现实,但需明确原则:对既有代码注重重构,对新增代码注重复用,避免重构被缺陷修改带偏方向。

轻量工具与测试保护网

作者没有采用重量级重构工具或CUnit等单元测试框架,仅使用Source Insight的Smart Rename功能,并通过在线调试和自动化测试来保证正确性。这说明在嵌入式开发中,工具选择可以灵活务实,关键在于建立有效的测试保护网。文章将没有测试保护网的重构比作没有血源的外科手术,凸显了自动化测试在重构中的必要性,尤其是批量修改代码时能快速获知影响。

先核心后外围的重构顺序

传统重构步骤常先易后难、先外围后核心,但作者反其道而行,首先重构核心公共代码。这样做便于梳理头文件包含关系,避免重复工作或返工,还能在逐步叠加外围代码时迭代验证公共代码的正确性和易用性,从而增强大规模重构的信心。这种顺序尤其适合公共代码被广泛依赖的嵌入式模块,可减少牵一发而动全身的风险。

在线调测与模拟数据库的支撑作用

嵌入式终端通常需交叉编译后下载到单板运行,调试效率低。作者在Linux服务器搭建在线调测工程,提取模块代码稍作改造后直接编译运行,避免频繁重启单板。同时编写模拟数据库屏蔽平台相关接口,并二次封装统一接口,消除数据库操作代码的凌乱和重复。这些辅助工程虽非重构本身,却为高效重构和后续自动化测试提供了必要的基础环境。

❓

Q&A

嵌入式代码重构的主要目标是什么?

重构的主要目标是改善既有代码的设计,而不是修改缺陷或新增功能。通过重构可以将杂乱无章的代码整理为清晰易读的结构,提高代码的可读性和可维护性,使代码更健壮、易于扩展和修改。

在嵌入式代码重构中,如何提高代码研读的效率?

可以采用分工阅读和代码注释的方法。分工阅读是将模块分为若干子功能,组内每人负责一块,定期交流和轮值;代码注释是在学习代码过程中随手注释,记录功能、意图、技巧、缺陷和疑问等,避免重复钻研,积累经验。

重构时如何提升代码的可读性?

首先规范变量、函数等命名;其次注释到位,尤其是全局变量和通用函数;最后整改晦涩难懂的代码,主要通过改写方法和封装函数两种手段,使代码逻辑清晰易懂。

为什么在重构时要搭建在线调测工程?

嵌入式终端通常需要交叉编译后下载到单板运行,调试效率低。搭建在线调测工程可以在Linux服务器上直接编译和运行模块代码,避免频繁重启单板升级大版本,极大提高调测效率。

重构时如何确保代码修改的正确性?

通过在线调试和自动化测试来保证代码的正确性。为公共接口和函数编写测试函数,并增加自动化测试功能(TestSuite),可验证批量或单个实体的配置和查询操作,快速获知修改影响,确保重构后代码质量和功能正确。

重构步骤应该从核心代码开始还是外围代码开始?

作者建议反其道而行之,首先重构核心公共的代码。这样做便于梳理头文件包含关系,避免重复工作甚至返工,可以迭代验证公共代码的正确性和易用性,并增强大规模重构的信心。

🏷️

标签

➡️

继续阅读