1 引用
Wenjian Liu and Xin Peng and Zhenchang Xing and Junyi Li and Bing Xie and Wenyun Zhao. Supporting exploratory code search with differencing and visualization. In Proceedings of the 25th International Conference on Software Analysis, Evolution and Reengineering, 2018, 300-310.
2 摘要
搜索和重用在线代码已经成为软件开发中的一种常见做法。在线代码的两个重要特性在当前的工具支持中没有得到仔细的考虑。首先,许多在线代码大体上相似,但细微不同。其次,一些代码可能通过它们的差异形成复杂的关系。这两个特点使得在线代码很难正确地排列到搜索查询中,降低了检查搜索结果的效率。本文提出了一种探索性的在线代码搜索方法,该方法明确地考虑了在线代码的上述两个特点。给定一个搜索查询返回的方法列表,我们的方法使用克隆检测和代码差异技术来分析搜索结果中方法之间的共性和差异。然后,它生成一个探索图,用来可视化方法差异以及通过这些差异得到的方法间的关系。探索图允许开发人员在搜索结果中呈现的不同方法组的结构化视图中探索搜索结果,并将隐式代码差异转换为视觉提示,以帮助开发人员导航搜索结果。我们在一个名为 CodeNuance 的基于 web 的工具中实现了我们的方法。通过与基于排名表和基于代码聚类的搜索结果检测方法的比较,对我们的搜索结果检测工具 CodeNuance 的有效性进行了实验评价。我们还比较了使用我们的工具和其他探索性代码搜索工具时的性能和用户行为差异。
3 方法
在本节中,我们首先概述该方法,然后描述其关键步骤。
3.1 概述
图 1 方法概述
图 1 显示了我们方法的主要步骤。我们的方法支持方法级探索性代码搜索。它把搜索结果中的一组候选方法输入到查询中,并从这些候选方法中生成一个探索图(见图 2)。用户可以与探索图进行交互以探索搜索结果。方法的输入可以是任何现有代码搜索技术的结果,这些技术可以将方法列表作为搜索结果返回给用户查询。
图 2 查询“将 InputStream 转换为 String”的探索图
代码搜索通常为查询返回大量方法。在在线代码搜索的上下文中,许多方法是相同的,或者在空间,布局,文字,注释等方面只有很小的差异。对于这类方法,通常只要检查其中任何一个并跳过其他方法就足够了,因为其他的将不太可能提供新的编程信息。因此,我们的方法使用克隆检测将候选方法聚类为 Type I / II 克隆方法的组(简称方法组)。
基于代表性方法之间的成对差异,可以生成完全连接的探索图。但这张图没有办法被有效勘探。我们的方法试图通过消除不必要的边缘来简化探索图。不必要的边缘意味着通过边缘连接的两种方法之间的差异可以通过它们之间的一些其他方法的一系列差异进行综合。此外,我们的方法还消除了两种方法之间存在较大差异的边缘。
最后,我们的方法将边缘简化的探索图可视化,以提供搜索结果中有代表性的方法及其差异的结构化视图。建议以总体差异最小的方法作为勘探的出发点。方法节点根据它们与起点方法的相对差异进行着色。用 API 对边缘进行标注,并从两种方法的不同令牌对中提取编程构造差异。
3.2 克隆检测
给定一组候选方法,我们使用克隆检测器(例如,在我们的实现中使用的 CCFinderX)对属于 Type-I 或 Type-II 型克隆的方法进行分组。每个方法组包括许多相同或接近相同的候选方法,它们被视为代码搜索的基本单元。请注意,方法组只能有一个方法。对于具有多个方法的每组,随机选择一个具有代表性的方法进行以下分析。
3.3 代码差异
为了确定两个方法组之间的差异,我们的方法使用 Lin 等人提出的代码差分算法比较了它们的代表性方法。该算法首先将每个方法转换为一个令牌序列,该序列由不同类型的令牌组成,如关键字、分隔符、运算符、文本和标识符。然后计算两个令牌序列之间的最长公共子序列(LCS)。然后,它识别出两个令牌序列中相应的差分范围,并生成相应的差分令牌对列表。
3.4 减少探索边缘
算法 1 基于代表方法之间的成对差异,在搜索结果中所有方法组的代表方法的完全连通图中识别出不必要的边缘,将代表方法 MG 的集合作为输入,并在这些方法 UEdges 之间返回一组不必要的探索。
(1)
消除由算法 1 中鉴定的不必要勘探边缘之后,我们的方法还消除了两个代表性方法其距离大于阈值之间的边缘。两种方法之间的距离较大表明它们的代码几乎没有共同点,因此无需在探索图中直接连接这两种方法。两种方法 mg1 和 mg2 之间的距离按公式 2 计算,其中 Length 函数返回方法的令牌长度或两种方法之间的差分令牌对的数量。一组代表性方法 MG 的距离阈值计算为等式 3,它首先计算 MG 中每种方法与其他方法的最短距离,然后返回所有最短距离的最大值,我们使用此动态计算的阈值 而不是静态指定的边缘,以消除一组代表性方法的距离相对较大的边缘。
(2)
(3)
3.5 生成探索图
给定搜索结果中具有代表性的方法的边缘减少的勘探图,我们根据代表性方法之间的距离确定勘探图中的中心点。如果这两种方法直接相连,则它们的距离将计算为公式 2。否则,它们的距离是两种方法之间最短路径上直接连接的方法的距离之和。中心点是在中心点与所有其他方法之间具有最小总距离的方法。建议将中心点作为探索的起点。
我们使用渐变着色方案来反映两种代表性方法之间的差异程度。我们为中心点组和与中心点距离最大的组设置了两种基线颜色。然后,根据两个节点的相应方法与中心点方法之间的距离,在两个基线颜色之间按比例计算其他节点的颜色。
- API 或本地类和方法调用,e.g. StringBuilder;
- 条件语句, e.g. if (BufferedReader.readLine() == null);
- 循环语句,e.g. while(BufferedReader.readLine() ! = null);
- switch 语句,e.g. switch(tag);
- return 语句,e.g. return String;
- 捕获异常,e.g. catch IOException;
- 其他,e.g. 代数运算。
4 评估
我们的方法的目的是通过分析和可视化代码搜索结果中存在的共性、差异和关系来改进代码搜索。为了评估我们实现这一目标的方法和工具,我们进行了一系列实证研究,以回答以下研究问题:
RQ1:探索图是否减少了代码搜索中的结果检查工作?
RQ2:与其他探索性代码搜索工具相比,CodeNuance 能否帮助用户更快、更准确地找到所需的代码?
RQ3:边缘缩小和差异标签如何影响用户的代码搜索体验?
4.1 分析研究 - 结果检查工作(RQ1)
图 3 给出了通过一组排名列表、基于 FCA 的树视图或我们的勘探图的结果进行搜索结果的检查这三种方法的结果检查工作量的描述性统计数据。对于基于排名列表的检查和基于 FCA 的树形视图,我们考虑了两种处理方法:一种是原始搜索结果(分别表示为 RList-Original 和 FCA-TV-Original);另一个是减少克隆的搜索结果(表示为 RList-NoClone 和 FCA-TV-NoClone)。
图 3 结果检验工作的比较
这反映了我们的 CodeNuance 方法与基于 FCA 的方法之间的关键区别:CodeNuance 同时考虑了代码共性和候选方法之间的差异,并通过它们之间的差异分析了方法之间的关系,而基于 FCA 的方法仅考虑了候选方法之间的共性。
4.2 用户研究 - CodeNuance 与 KeywordRec(RQ2)
图 4 这些结果表明,与 KeywordRec 相比,参与者在使用 CodeNuance 时能够更快、更准确地找到所需的代码。结果表明,TG2 任务的性能比 TG1 任务的性能差。根据参与者的反馈,TG2 任务比 TG1 任务更困难,因为从任务描述中不容易识别出所需方法的正确查询。由此可见,在更具探索性的任务中,CodeNuance 的优势更为显著。
图 4 TG1 的代码搜索表现(T1-T5)和 TG2 的代码搜索表现(T6-T10)
4.3 用户研究 - 边缘缩小和差异标签(RQ3)
图 5 显示了三个任务的默认探索图中的边数和参与者首选探索图中的边数。#Node 显示,克隆减少的搜索结果分别有 83、86 和 83 种方法用于这三个任务。我们可以看到,对于所有这三个任务,首选的探索图比默认图拥用更少边。我们对参与者的采访表明,这部分是由边缘重叠的差异标签造成的。参与者更喜欢一个他们能清楚看到不同标签的探索图。如果有很多重叠的标签,它们通常会选择消除更多的边以使图形更清晰。或者,它们可能忽略差异标签,只需沿着边检查方法的相邻方法。
图 5 首选边缘缩减率
根据参与者的反馈,虽然差异标签准确地反映了候选方法之间的差异,但是他们更喜欢抽象的和更短的差异标签。他们建议,该工具应允许他们按不同类型筛选差异标签。例如,有时它们只关心 API 的使用或异常处理差异。在这种情况下,显示所有的差异是没有意义的。他们还建议,为了更有效地通过探索边来探索相邻方法,该工具应在两个方法单击边时为它们提供一个代码比较框。这将减少它们在理解方法差异时对边缘标签的依赖。
5 本文主要贡献
本文的主要贡献如下:
1)提出了有效在线代码搜索必须明确处理的两个重要特征;
2)提出了一种探索性的代码搜索方法和工具,在系统设计中明确地解决了在线代码的这两个特征;
3)我们进行了一系列实验和用户研究,以评估我们的方法的有效性并确定改进机会。
致谢
感谢国家重点研发计划课题:基于协同编程现场的智能实时质量提升方法与技术(2018YFB1003901)和国家自然科学基金项目:基于可理解信息融合的人机协同移动应用测试研究(61802171)支持!
本文由南京大学软件学院 2018 级硕士生韩奇翻译转述。