QUICK REVIEW
[论文解读] Clone Removal in Java Programs as a Process of Stepwise Unification
Daniel Speicher, Andri Bremm|arXiv (Cornell University)|Jan 11, 2013
Software Engineering Research参考文献 5被引用 4
一句话总结
本文提出一种分步统一方法,通过在程序依赖图(PDGs)上建模重构操作,实现Java程序中代码克隆的自动化消除。通过分析数据依赖和控制依赖,该方法识别可统一的语句,应用如提取方法或lambda表达式等重构操作,并利用回溯法生成精确、语义保持的重构建议,以消除克隆代码。
ABSTRACT
Cloned code is one of the most important obstacles against consistent software maintenance and evolution. Although today's clone detection tools find a variety of clones, they do not offer any advice how to remove such clones. We explain the problems involved in finding a sequence of changes for clone removal and suggest to view this problem as a process of stepwise unification of the clone instances. Consequently the problem can be solved by backtracking over the possible unification steps.
研究动机与目标
- 解决现有克隆检测工具的不足,即仅能识别克隆但无法建议如何消除它们。
- 提供一种系统化、自动化的策略,生成精确的重构序列,以消除代码克隆并保持程序行为不变。
- 将克隆消除建模为通过重构操作统一语句和控制流的过程,由PDG分析引导。
- 通过使用如提取lambda表达式和提取方法等重构操作,支持复杂类型的克隆,特别是表达式或控制结构不同的克隆。
提出的方法
- 为每个克隆候选构建程序依赖图(PDGs),建模控制依赖和数据依赖,包括将方法调用表示为读/写访问。
- 通过比较PDGs识别可统一的语句,考虑重构操作如重命名、引入参数和泛型化类型。
- 在可能的统一步骤上应用回溯,以探索可消除克隆的有效重构序列。
- 使用提取方法和提取lambda表达式重构操作隔离不可统一的语句,尤其适用于表达式或控制流差异的情况。
- 保持数据依赖顺序以确保语义正确性,包括处理反向依赖以防止意外的行为改变。
- 利用JTransformer等现有工具提供AST和绑定信息,以实现精确的重构应用。
实验结果
研究问题
- RQ1如何系统化地生成保持语义的重构序列,以消除Java程序中的代码克隆?
- RQ2程序依赖图(PDGs)在识别可统一语句和指导重构决策中发挥什么作用?
- RQ3哪些重构操作——如提取方法、lambda表达式或重新排序参数——在统一非完全相同的克隆中最为有效?
- RQ4如何安全地重构控制流,以分离不可统一的语句,同时保持程序语义?
- RQ5在何种场景下,使用lambda表达式比模板方法等设计模式更适用于克隆消除?
主要发现
- 该方法通过基于PDG分析生成的重构序列,成功将非完全相同的克隆统一为一致代码。
- lambda表达式能够有效提取不同的表达式,如具有不同参数的方法调用,而无需使用复杂的结构模式。
- 当不可统一的语句构成一个数据依赖较少的连续代码块时,提取方法重构在隔离这些语句方面非常有效。
- 在统一步骤上应用回溯,使工具能够探索并建议多种有效的重构序列,从而提高克隆消除的灵活性。
- 该方法通过仅关注现有克隆检测工具识别出的相关方法对,避免对整个程序进行比较,从而降低了克隆消除的成本。
- 使用扩展了数据依赖建模(包括方法调用和别名)的PDGs,提高了识别安全重构点的准确性。
更好的研究,从现在开始
从阅读论文到最终审阅,大幅缩短您的研究时间。
无需绑定信用卡
本解读由 AI 生成,并经人工编辑审核。