Skip to main content
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 生成,并经人工编辑审核。