热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

inkscape生成g代码_通过差异化和可视化支持探索性代码搜索

1引用WenjianLiuandXinPengandZhenchangXingandJunyiLiandBingXieandWenyunZhao.Supportingexplora
a74ee22b4fccea2169613eebd9dd54fb.png

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 概述

b11ea02c4da9aa91fc99eaa3300d08af.png

图 1 方法概述

图 1 显示了我们方法的主要步骤。我们的方法支持方法级探索性代码搜索。它把搜索结果中的一组候选方法输入到查询中,并从这些候选方法中生成一个探索图(见图 2)。用户可以与探索图进行交互以探索搜索结果。方法的输入可以是任何现有代码搜索技术的结果,这些技术可以将方法列表作为搜索结果返回给用户查询。

c8a981a021961b58830748db10bbd9c4.png

图 2 查询“将 InputStream 转换为 String”的探索图

代码搜索通常为查询返回大量方法。在在线代码搜索的上下文中,许多方法是相同的,或者在空间,布局,文字,注释等方面只有很小的差异。对于这类方法,通常只要检查其中任何一个并跳过其他方法就足够了,因为其他的将不太可能提供新的编程信息。因此,我们的方法使用克隆检测将候选方法聚类为 Type I / II 克隆方法的组(简称方法组)。

基于代表性方法之间的成对差异,可以生成完全连接的探索图。但这张图没有办法被有效勘探。我们的方法试图通过消除不必要的边缘来简化探索图。不必要的边缘意味着通过边缘连接的两种方法之间的差异可以通过它们之间的一些其他方法的一系列差异进行综合。此外,我们的方法还消除了两种方法之间存在较大差异的边缘。

最后,我们的方法将边缘简化的探索图可视化,以提供搜索结果中有代表性的方法及其差异的结构化视图。建议以总体差异最小的方法作为勘探的出发点。方法节点根据它们与起点方法的相对差异进行着色。用 API 对边缘进行标注,并从两种方法的不同令牌对中提取编程构造差异。

3.2 克隆检测

给定一组候选方法,我们使用克隆检测器(例如,在我们的实现中使用的 CCFinderX)对属于 Type-I 或 Type-II 型克隆的方法进行分组。每个方法组包括许多相同或接近相同的候选方法,它们被视为代码搜索的基本单元。请注意,方法组只能有一个方法。对于具有多个方法的每组,随机选择一个具有代表性的方法进行以下分析。

3.3 代码差异

为了确定两个方法组之间的差异,我们的方法使用 Lin 等人提出的代码差分算法比较了它们的代表性方法。该算法首先将每个方法转换为一个令牌序列,该序列由不同类型的令牌组成,如关键字、分隔符、运算符、文本和标识符。然后计算两个令牌序列之间的最长公共子序列(LCS)。然后,它识别出两个令牌序列中相应的差分范围,并生成相应的差分令牌对列表。

3.4 减少探索边缘

算法 1 基于代表方法之间的成对差异,在搜索结果中所有方法组的代表方法的完全连通图中识别出不必要的边缘,将代表方法 MG 的集合作为输入,并在这些方法 UEdges 之间返回一组不必要的探索。

9c43ea8d4f9f0d328884797b42b4cf1a.png

(1)

2c86d32117b6f16fb1075dda2262d7c3.png

消除由算法 1 中鉴定的不必要勘探边缘之后,我们的方法还消除了两个代表性方法其距离大于阈值之间的边缘。两种方法之间的距离较大表明它们的代码几乎没有共同点,因此无需在探索图中直接连接这两种方法。两种方法 mg1 和 mg2 之间的距离按公式 2 计算,其中 Length 函数返回方法的令牌长度或两种方法之间的差分令牌对的数量。一组代表性方法 MG 的距离阈值计算为等式 3,它首先计算 MG 中每种方法与其他方法的最短距离,然后返回所有最短距离的最大值,我们使用此动态计算的阈值 而不是静态指定的边缘,以消除一组代表性方法的距离相对较大的边缘。

484068bf069323cf189dcc93acd3cf6d.png

(2)

ea37c1a9a365cec0908543ee1eb9c42d.png

(3)

3.5 生成探索图

给定搜索结果中具有代表性的方法的边缘减少的勘探图,我们根据代表性方法之间的距离确定勘探图中的中心点。如果这两种方法直接相连,则它们的距离将计算为公式 2。否则,它们的距离是两种方法之间最短路径上直接连接的方法的距离之和。中心点是在中心点与所有其他方法之间具有最小总距离的方法。建议将中心点作为探索的起点。

我们使用渐变着色方案来反映两种代表性方法之间的差异程度。我们为中心点组和与中心点距离最大的组设置了两种基线颜色。然后,根据两个节点的相应方法与中心点方法之间的距离,在两个基线颜色之间按比例计算其他节点的颜色。

8a4b455ded13890e256ced131368b037.png
  • 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)。

17529628335e5f939e729480aff7ba7d.png

图 3 结果检验工作的比较

这反映了我们的 CodeNuance 方法与基于 FCA 的方法之间的关键区别:CodeNuance 同时考虑了代码共性和候选方法之间的差异,并通过它们之间的差异分析了方法之间的关系,而基于 FCA 的方法仅考虑了候选方法之间的共性。

4.2 用户研究 - CodeNuance 与 KeywordRec(RQ2)

图 4 这些结果表明,与 KeywordRec 相比,参与者在使用 CodeNuance 时能够更快、更准确地找到所需的代码。结果表明,TG2 任务的性能比 TG1 任务的性能差。根据参与者的反馈,TG2 任务比 TG1 任务更困难,因为从任务描述中不容易识别出所需方法的正确查询。由此可见,在更具探索性的任务中,CodeNuance 的优势更为显著。

aac6c03e9f7767c95c2a2de2f43c7522.png

图 4 TG1 的代码搜索表现(T1-T5)和 TG2 的代码搜索表现(T6-T10)

4.3 用户研究 - 边缘缩小和差异标签(RQ3)

图 5 显示了三个任务的默认探索图中的边数和参与者首选探索图中的边数。#Node 显示,克隆减少的搜索结果分别有 83、86 和 83 种方法用于这三个任务。我们可以看到,对于所有这三个任务,首选的探索图比默认图拥用更少边。我们对参与者的采访表明,这部分是由边缘重叠的差异标签造成的。参与者更喜欢一个他们能清楚看到不同标签的探索图。如果有很多重叠的标签,它们通常会选择消除更多的边以使图形更清晰。或者,它们可能忽略差异标签,只需沿着边检查方法的相邻方法。

7021f431dc1b18b356030d3b7f44c678.png

图 5 首选边缘缩减率

根据参与者的反馈,虽然差异标签准确地反映了候选方法之间的差异,但是他们更喜欢抽象的和更短的差异标签。他们建议,该工具应允许他们按不同类型筛选差异标签。例如,有时它们只关心 API 的使用或异常处理差异。在这种情况下,显示所有的差异是没有意义的。他们还建议,为了更有效地通过探索边来探索相邻方法,该工具应在两个方法单击边时为它们提供一个代码比较框。这将减少它们在理解方法差异时对边缘标签的依赖。

5 本文主要贡献

本文的主要贡献如下:

1)提出了有效在线代码搜索必须明确处理的两个重要特征;

2)提出了一种探索性的代码搜索方法和工具,在系统设计中明确地解决了在线代码的这两个特征;

3)我们进行了一系列实验和用户研究,以评估我们的方法的有效性并确定改进机会。

致谢

感谢国家重点研发计划课题:基于协同编程现场的智能实时质量提升方法与技术(2018YFB1003901)和国家自然科学基金项目:基于可理解信息融合的人机协同移动应用测试研究(61802171)支持!

本文由南京大学软件学院 2018 级硕士生韩奇翻译转述。



推荐阅读
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • Whatsthedifferencebetweento_aandto_ary?to_a和to_ary有什么区别? ... [详细]
  • node.jsurlsearchparamsAPI哎哎哎 ... [详细]
  • 本文介绍了如何使用PHP向系统日历中添加事件的方法,通过使用PHP技术可以实现自动添加事件的功能,从而实现全局通知系统和迅速记录工具的自动化。同时还提到了系统exchange自带的日历具有同步感的特点,以及使用web技术实现自动添加事件的优势。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • Python实现变声器功能(萝莉音御姐音)的方法及步骤
    本文介绍了使用Python实现变声器功能(萝莉音御姐音)的方法及步骤。首先登录百度AL开发平台,选择语音合成,创建应用并填写应用信息,获取Appid、API Key和Secret Key。然后安装pythonsdk,可以通过pip install baidu-aip或python setup.py install进行安装。最后,书写代码实现变声器功能,使用AipSpeech库进行语音合成,可以设置音量等参数。 ... [详细]
  • Commit1ced2a7433ea8937a1b260ea65d708f32ca7c95eintroduceda+Clonetraitboundtom ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • PHP反射API的功能和用途详解
    本文详细介绍了PHP反射API的功能和用途,包括动态获取信息和调用对象方法的功能,以及自动加载插件、生成文档、扩充PHP语言等用途。通过反射API,可以获取类的元数据,创建类的实例,调用方法,传递参数,动态调用类的静态方法等。PHP反射API是一种内建的OOP技术扩展,通过使用Reflection、ReflectionClass和ReflectionMethod等类,可以帮助我们分析其他类、接口、方法、属性和扩展。 ... [详细]
  • ejava,刘聪dejava
    本文目录一览:1、什么是Java?2、java ... [详细]
author-avatar
卢军好2602912493
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有