摘要:许多代码文件随着软件演化逐渐膨胀并承担了过多职责, 严重影响了软件的可维护性和可理解性. 开发者常需要重构这些文件, 将一个大的代码文件分解成多个较小的子文件. 现有研究工作主要聚焦类文件的分解重构, 并不完全适用于分解复杂头文件. 这是因为分解头文件面临一些独有的挑战: 既需要考虑整个软件项目的构建依赖以降低编译成本, 也需要确保分解后的子文件之间不会存在循环依赖. 为此, 提出了一种面向复杂头文件的自动化分解与重构方法——HeaderSplit. 该方法首先为复杂头文件构造蕴含多种代码关系的代码元素图, 其中就包括体现项目构建依赖的共同使用关系; 然后通过节点合并与多视图聚类算法识别关联紧密的代码元素聚类; 随后引入启发式的循环依赖修正算法生成可行的文件分解方案. 用户确认分解方案后, HeaderSplit能够自动执行重构, 生成新的子文件内容, 并更新软件项目内直接或间接引用原头文件的代码语句. 在合成复杂头文件与真实复杂头文件上对HeaderSplit进行评估, 结果表明: 1) HeaderSplit在准确率上比现有方法提升了11.5%, 并且具有更强的跨软件项目稳定性; 2) HeaderSplit分解得到的子文件模块度更高且无循环依赖, 具有更好的架构设计; 3) 使用HeaderSplit分解复杂头文件可以降低其演化历史中15%–60%的重编译成本; 4) HeaderSplit可以高效实施自动化重构, 在5 min以内完成百万行软件项目内的头文件分解重构, 具有很高的实用价值.