文摘
在软件维护和演化过程中,开发人员所面临的重要任务之一就是理解一个系统快速、准确。规模和复杂性的增加一个进化系统,程序理解活动变得日益困难。给定一个目标系统的理解,理解开发人员可能首先关注包。包的大小不同的系统。小型包装系统中,开发人员可以很容易地理解它们。然而,对于大型软件包,它们很难理解。在本文中,我们专注于理解这些大型包和提出一个针对大型包程序理解的新方法,它利用潜在狄利克雷(LDA)模型分配到集群大型包。因此,这些大型包分离小型集群,开发人员更容易理解。实证研究在四个实际软件项目证明了我们的方法的有效性。结果表明,我们的方法的有效性比潜在语义索引(LSI)和概率潜在语义分析-基于(向量)的聚类方法。 In addition, we find that the topic that labels each cluster is useful for program comprehension.
1。介绍
程序理解是最频繁执行的活动之一,在软件维护1,2]。这是一个过程,一个软件从业者理解一个程序使用的域和语义知识和语法知识,构建一个程序的心智模型(3,4]。开发人员在软件维护任务花费60%左右的时间对项目的理解(5]。随着软件的发展,其复杂性越来越高。此外,一些附属文件系统也成为过时的或无法访问,这使得程序理解更加困难。
在实践中,自然自上而下的程序理解过程可以有效地促进开发人员理解系统一步一步(6]。对于面向对象的Java软件系统,开发人员也可以理解一个系统在这种自上而下的方式。包是第一考虑。选择有趣的包,和开发人员进一步深入类的包。小型包(有几类),开发人员很容易理解他们。然而,对于包有很多类,这些类是更具挑战性的开发人员理解,他们的关系,他们的功能7,8]。援助项目的理解,这些大型包中的类可以聚集成小群体。这样的集群,开发人员可以更容易理解一个系统。
有几种方法,集群项目基于静态结构依赖关系在源代码中(9]。静态结构基于依赖关系的方法通常是集群类系统中基于静态结构程序元素之间的依赖关系,如变量和类的引用,过程调用,使用包,协会和类之间的继承关系8,10,11]。这些方法更合适的过程中实现一个变更请求在源代码中。但在源代码中实现一个变更请求之前,开发人员应该知道哪一部分源代码相关变更请求。具体来说,他们需要知道系统的功能点,在源代码中对应于这些功能特性。一个特性或功能点代表一个功能,由需求定义和访问开发人员和用户。然后,他们可以实现源代码级别的变化。因此,一些研究集中在理解系统的功能特性,提出了语义聚类,利用语言信息的源代码,如标识符名称和评论(12]。这些方法通常需要整个系统作为输入,并生成集群在一些粒度级别,例如,类级别或方法。使用生成的簇对应于不同的功能特性将系统划分为不同的单位(13,14]。本文还着重于利用语言信息在源代码中了解不同集群在大型包的功能特性。在一个大型包,有许多功能特性或担忧。这些问题是在一组类中实现。以前的研究集中在集群软件单元。然而,开发人员仍然不容易知道每个集群的功能特性表达。为了得到一个好的理解的关切和类,实现每个人,在本文中,我们进一步生成一组主题来描述每个集群。
本文提出了一种技术来生成一组集群类大型包,在不同的集群对应不同的功能特性或担忧。我们的方法是基于潜在狄利克雷分配(LDA),这是一个主题模型和受欢迎的方法之一来分析非结构化文本的语料库(15]。LDA可以发现一组思想或主题,描述整个语料库。我们用LDA整整一个包和提取潜在的主题捕捉它的功能特性。然后,类的包具有类似话题都聚集在一起。
我们的方法可以有效地用于自上而下的程序理解在软件维护。小型包,开发者可以直接理解他们。对于大型包,我们的方法可以用来划分包成小集群。每一个小的集群可以比原来的更容易理解大型包。本文的主要贡献如下:(1)我们建议用LDA为大型包生成集群。LDA生成的主题是有用的指示这些类集群的功能特性。(2)我们进行实证研究来显示我们的方法的有效性在四个现实世界的开源项目,JHotDraw,jEdit,JFreeChart,和muCommander。结果表明,我们的方法更有效地识别相关类集群中比其他语义聚类的方法,也就是说,潜在语义索引(LSI)和基于概率潜在语义分析-(向量)集群。(3)实证研究的四个选择包从四个方面系统表明,我们的方法所产生的主题是有用的,可以帮助开发人员理解这些包。
本文的其余部分组织如下:在下一节中,我们介绍了程序理解和LDA模型的背景。部分3描述了我们的方法。我们描述我们的实验的设计,实验结果,威胁我们的部分研究的有效性4,5,6,分别。节7,使用聚类相关工作程序的理解进行了探讨。最后,我们总结这篇文章和轮廓未来工作方向8。
2。背景
在本文中,我们利用LDA在大型集群类包程序理解更容易。本节讨论程序理解和LDA话题的背景模型。
2.1。项目的理解
对于软件开发人员来说,程序理解是一个过程,他们了解一个软件构件使用的知识域和语义和语法知识10]。程序理解可以分为自下而上的理解,自上而下的理解,这两个过程的各种组合。在自下而上的理解,开发人员可能首先阅读源代码finer语句或方法级和抽象特性根据底层信息和概念。然后,粗类级别或包访问的元素是阅读和理解。最后,开发人员理解整个系统。自上而下的理解,开发人员首先利用知识域的期望构建一组映射到源代码。然后,他/她了解粗包访问或类级元素,紧随其后的是更好的方法级或语句级别元素。最后,开发人员也会理解整个系统。在实践中,自上而下的程序理解更容易接受,因为它符合人类的思维方式从简单到复杂,从整体到部分(3]。
软件聚类是一种自顶向下的程序理解的有效技术。在软件维护过程中,开发人员通常需要确定他们感兴趣的功能特性来帮助他们完成一个变更请求。在本文中,我们提出一个软件集群技术利用LDA为开发人员提供一些功能来促进自顶向下的程序理解的过程。
2.2。潜在狄利克雷分配
主题模型起源于信息检索(IR)领域的指数,搜索和集群大量非结构化和标记文件。主题是一组术语频繁cooccur语料库的文件中。之一,主要用于话题模型在软件工程社区潜在狄利克雷分配(LDA) (16- - - - - -18]。它不需要训练数据,可以扩展到成千上万的文件。
LDA模型每个文档的混合物corpus-wide主题,每个主题的混合条件的语料库(15]。更具体地说,它意味着是一组主题来描述整个语料库;每个文档可以包含一个以上的这些主题;和每一项在整个存储库可以包含在一个以上的这些话题。因此,LDA能够发现一组思想或主题,描述整个语料库。它假设文件被使用的概率分布生成的主题和语言文件中生成概率以类似的方式。
为了应用LDA源代码,我们代表一个文档的集合(即软件系统。类),每个文档与一组相关联的概念(即。、主题)。具体来说,LDA模型由以下组成:(1)一个单词是离散数据的基本单位,定义为一个项目从软件词汇,比如一个标识符和一个词从一个评论。(2)一个文档,它对应于一个类时,是用一系列单词,在那里是词的序列。(3)语料库是文档的集合(类)用。
鉴于文件包含主题表达了独特的词汇,的分布主题在单词和的分布文档在主题可以表示。
利用LDA,可以制定的问题发现一组主题描述一组源代码类通过查看这些类的混合概率主题。有关LDA的进一步细节,有兴趣的读者被称为布莱的原创作品等。15]。
LDA,可以挖掘潜在的主题,让我们集群的基础上他们的共同话题。在本文中,为了有效地利用LDA,我们把它应用在包级别语料库,而不是每个类中提取潜在的主题来模拟软件包的功能特性或担忧因为小(类级)语料库太小,产生良好的主题(19- - - - - -23]。集群的类,我们根据这些主题和不同的类分配给相应的主题23]。
3所示。我们的方法
面对一个软件系统的源代码,开发人员需要使用他们的领域知识来理解这个项目从粗包级别在每个包类级别。理解不同的包的过程是不同的。在这个过程中,小型包很容易理解,而大型包是复杂的,他们需要分为小型集群。在本文中,我们专注于聚类中的类大型包以及相应的功能特性。
理解包描述在图的过程1。首先,我们分析软件系统中的每个包的大小。小型手工包是理解。对于大型包,有两个步骤。首先,LDA用于提取潜在的关键信息,以促进理解的过程。然后,在每个包的关键信息的基础上,我们采用集群建立小型集群分解每个包。因此,鉴于软件系统的源代码,程序员可以理解小型包本身和大型包的帮助下我们的方法。在以下部分,我们将讨论我们的方法的更多细节。
3.1。分析包的大小
我们的方法侧重于理解大型包。所以我们首先需要选择大型包在一个程序中。在这里,我们设置一个阈值包中的类的数量。包括以上的包类选择进行分析。这些包分离成更小的集群促进程序理解。图2显示了一个示例的分离包成大型包和小型包六包jEdit当设置为5。的包jarbunder,浏览器,和asm被归类为大型包。
3.2。基于LDA提取关键信息
在程序理解的过程中,开发人员更专注于项目的功能特性或担忧。程序的源代码包含不仅语法信息,也非结构化数据,如自然语言标识符和注释(24]。这些非结构化的源代码标识符和注释可用于捕获开发者的意图的语义(25]。他们代表域信息的重要来源,通常可以作为一个起点在许多程序理解任务(26,27]。然而,在源代码中存在噪声,这可能混淆LDA的应用程序。所以自然语言处理(NLP)技术通常用来执行一个或多个预处理操作之前应用LDA模型对源代码的数据。然后,LDA可以有效地用于生成主题。为了有效地利用LDA,我们在包级别语料库应用于模拟软件包的功能特性或担忧。最后,我们集群类根据这些主题和不同的类分配给相应的主题。
3.2.1之上。预处理的源代码
有几个典型的预处理操作的非结构化的部分源代码。这些预处理操作可以减少噪音,提高执行的质量产生的文本LDA (28]。
我们首先隔离标识符和注释和去掉语法和编程语言关键字(例如,“公共”和“int”)。首先,我们删除标题评论,因为他们通常包括通用软件的信息都包含在源代码文件。然后,我们标记每个单词基于共同命名惯例,如驼峰式大小写(“oneTwo”)和下划线(“one_two”)和删除常见的英语单词(,它,)和编程语言相关的关键字(公共,int,虽然)。
预处理后的非结构化的源代码文件的一部分,LDA可用于更有效地提取关键信息。图3显示了一个示例的详细过程预处理源代码InvalidHeaderException.java在jEdit。预处理后的源代码,大多数有用的单词保存LDA的应用程序。
3.2.2。从大型包中提取关键信息
在大型包每个类预处理后,我们需要从他们中提取关键信息。LDA是一种有效的方法来发现一组思想或主题,描述整个语料库。利用LDA之前,我们需要设置主题的数量,也就是说,K。这个参数影响LDA应用的有效性。在这篇文章中,K有关集群为包的大小,这是由用户决定。
LDA应用程序生成两个文件:一个是word-topic矩阵列表为每个主题的话,另一个是topic-document矩阵显示的比例在每个文档主题,也称为成员的值。图给出了一个例子4。结果显示不同话题的分布在不同的类,并且每个主题是描述不同的单词有不同的可能性。这些主题包中的类表达不同的功能特性。
3.3。在大型集群类包
从目标中提取主题包后,类有类似的主题应该分配在一个集群中帮助他们理解。在本节,我们将讨论细节为集群包中的类。
3.3.1。生成初始集群
聚类在一个包中,应首先确定集群的数量。然而,很难知道这些信息。在本文中,集群的数量估计基于类的数量在一个集群中。
让我们假设类的数量在一个初始集群米,在那里是一个用户定义的参数。也就是说,如果用户认为一个米剂量集群是他/她容易理解,他/她可以设置每个集群的初始大小米例如,5和10。一个包的类(),每一个类应该放到一个集群。因此将会有(整数)集群为包。我们设置的主题一样的集群的数量(例如,),因为我们需要一个主题标签每个集群。
在预处理方案应用LDA之后,我们得到了两个文件,word-topic矩阵列表为每个主题的话,topic-document矩阵显示的比例在每个文档的主题。将不同的类分配给相应的话题,我们使用topic-document矩阵。也就是说,我们分配这些文件主题topic-document矩阵。因此可以生成一组集群,我们称之为初始集群对于一个包。
最初的集群的理想情况是,每个类只分配给自己的集群和排他的。不可避免的是,有两个特殊情况;一个是一个类可能在topic-document矩阵匹配不同的主题。这些课程被称为共享类,我们需要重新分配。另一个例子是,可能会有一些其他类不包括在顶部文件在任何主题。这样的类被称为nonmatching类,需要分配给最可能的集群相关。在下面,我们处理这些类来保证每一个类被分配给一个且只有一个集群。
3.3.2。分配共享类和Nonmatching类
共享类的类匹配不同的主题在生成topic-document矩阵。这些类都列在上面类为每个主题。我们列出所有的类共享的不同主题,每个主题的成员值。共享类分配给集群主题对应会员最高的价值。
最初nonmatching类不匹配任何集群,以类似的方式处理他们共享类。我们列出所有这些nonmatching类及其成员的值。这些nonmatching类放入相对应的集群成员价值最高的话题。
最后,每个集群在一个包只包含类高成员价值观和每一个类都是只有一个集群成员。word-topic矩阵的基础上,我们可以看到这句话描述的主题,这表明集群的特性。图5显示了一个示例流程生成的大型的集群方案。首先,生成初始集群根据会员的价值五个主题。然后,共享类和nonmatching类被分配到相应的初始集群基于他们的成员值。最后,获得一组大型集群的包图的左下角所示部分5。
4所示。案例研究
在本节中,我们进行案例研究来评估我们的方法的有效性。在我们的研究中,我们研究解决以下三个问题(rq):RQ1:主题的数量影响共享类和nonmatching类?RQ2:是我们的LDA聚类方法比其他语义聚类方法更有效,也就是说,LSI-based集群和PLSA-based集群?RQ3:我们的方法能提供有用的主题为开发人员理解类的包?
在我们的方法中,主题是由用户自己设置的数量。我们调查RQ1看到这个参数如何影响共享和nonmatching类的数量。此外,我们调查RQ2是否我们的集群使用LDA方法是更有效的比其他基于语义聚类的方法将基于LSI和查询(12,29日- - - - - -31日),分别。最后,还有一个我们的方法之间的区别和其他聚类方法;即每个集群是由我们的方法是用一个主题来促进集群的理解。所以RQ3旨在回答这个话题标签是否每个集群可以帮助开发人员理解集群。
4.1。实验环境
我们实现了我们的方法与Java语言在Eclipse环境中。此外,所有选中的主题项目也是Java程序。所以我们的案例研究是在Eclipse环境中进行的。
4.2。主体系统
我们解决研究问题进行案例研究在四个著名的软件系统的源代码,JHotDraw(https://sourceforge.net/projects/jhotdraw),jEdit(https://sourceforge.net/projects/jedit),JFreeChart(https://sourceforge.net/projects/jfreechart),muCommander(http://www.mucommander.com),如表所示1。
JHotDraw是一个中型的,开源的,2 d绘图框架开发的Java编程语言。jEdit是一个中型的,用Java编写的开源的文本编辑器。JFreeChart100%是一个免费的Java图表库,可以让开发人员在他们的应用程序中显示专业质量图表。muCommander是一个轻量级的、跨平台的文件管理器,运行在任何支持Java的操作系统。
这些项目属于不同的问题领域。他们是一般足以代表真实的软件系统,并且他们已经广泛应用于实证研究在软件维护和演化的背景下32,33]。此外,他们已经成为事实上的标准系统实验和分析主题和关心矿业(州和墨菲(例如,通过罗毕拉德34)和Binkley et al。35])。此外,这四个主题系统的不同大小的选择既不能太小,也不能太大,由于其良好的设计和可控的大小进行人工分析。
4.3。参数设置
在我们的方法中,有两个参数,和。代表一个包的大小和是主题的数量对LDA模型作为输入。这两个参数的值会影响包的数量分为集群和集群的数量在一个包中。表2显示的百分比类与不同数量的包类。结果,当5、10和15日的平均百分比类包的大尺寸的89.3%,74.7%,和61.4%,分别。在这项研究中,我们考虑包大小大于10的大型软件包用来评估我们的方法。因此,所有四个系统,大部分的类和包是用来评估我们的方法。
其他参数的数量在我们的方法是主题对LDA的分析。是一个重要的参数也表明集群的数量最终的聚类结果。它决定了每个集群的大小。我们设置是5、10和15我们的研究中,分别。
4.4。方法和措施
LDA计算,我们使用锤(http://mallet.cs.umass.edu),这是一个高度可扩展的Java实现吉布斯抽样算法。我们跑了10000个采样迭代,第一个1000是用于参数优化。我们选择使用不同数量的主题锤生成word-topic矩阵和topic-document矩阵。然后,我们基于这两个矩阵集群每个大型包。
基于LSI和查询词的语义聚类12,29日- - - - - -31日],我们用我们的方法来比较,他们是受欢迎的聚类分析方法,特别是对于集群nonstructured数据。大规模集成电路使用奇异值分解来探索模式中包含的术语和概念之间的关系非结构化语料库[36]。大规模集成电路实现基于假设单词在相同的上下文中使用往往有相似的含义。因此,大规模集成电路能够从语料库中提取的概念内容,这些术语之间建立关联,发生在类似的环境。概率潜在语义分析(向量)是一种数据分析的统计方法,基于混合分解来自潜在的类模型(30.,31日]。
我们选择这些聚类方法比较,因为(1)被广泛应用于集群软件和数据显示有前景的结果(37,38),(2)他们也聚类方法基于词汇信息,类似于我们的方法。在我们的研究中,他们是由聚类类类似的词汇。在计算每一对文档之间的相似度,执行会凝聚的层次聚类算法。有很多相似的措施,例如,余弦相似性,曼哈顿距离和欧几里得距离39]。余弦相似度是一个受欢迎的相似性度量是这里使用33,40]。
回答RQ1,我们计算共享类和nonmatching类和数量共享发生数(或共享的数共享类的)。例如,如果一个类共享主题1和主题2,其共享的数是1。如果类也是共享的主题3,共享数是2。我们分析共享类和nonmatching类的百分比以及共享不同数量的重要话题。
为RQ2,我们的研究涉及10个参与者从大学和产业。其中一半来自我们的实验室有2 - 3年的发展经验,另一半来自行业5 - 6年的开发经验尤其是大型项目开发经验。他们之前不熟悉系统。然后,他们分配了一个类,第四列的表所示3。他们的任务是确定最可能的类与给定类的封闭包。然后每个参与者获得一个集群为每个给定类的类。不同的参与者可能产生不同的集群,他们需要讨论结果和达成共识为每个给定类的聚类结果。我们使用的聚类结果作为权威的集群与集群由我们的方法和LSI-based / PLSA-based聚类方法。LSI-based聚类方法和我们的方法用于比较,我们需要设置价值。根据权威的集群的规模,我们设置包的值,最后一列的表所示3。回答RQ2,我们首先提供了三种方法的聚类结果。在这个过程中,保证公平对待,他们不知道我们的方法所产生的聚类结果或LSI-based / PLSA-based聚类方法。然后,每个参与者评估每个投票的三个集群最好的。此外,定量地比较这两种方法,我们使用精度和召回,两个广泛使用的信息检索和分类指标(41),来验证不同的聚类方法的准确性。精密测量类的分数被聚类方法在同一集群给定类真正相关(基于权威集群),尽管召回措施相关的结果(即的分数。类,出现在权威的集群)放在同一集群给定类的聚类方法。在数学上,他们定义如下:
在上面的方程中,类的聚类结果和权威的结果集。
回答RQ3中,参与者被要求写的单词标识符或评论标签权威的集群。这个过程是类似的RQ2,一组权威的话。显示我们的方法所产生的主题是否有用,参与者需要评估生成的主题为他们检查他们是否有用了解集群。每个参与者都需要提供一个评级五点李克特量表,1(非常无用的)到5(非常有用)。最后,我们还计算精度和召回中的词主题通过比较权威的词。计算精度和召回的方式类似于他们的计算方式来回答RQ2。
总的来说,参与者评估过程中需要回答四个问题。在RQ2,他们被要求给权威的答案结果之间的集群和评估结果大规模集成电路或PLSI和我们的方法。在RQ3,他们需要提供标签的集群和评估我们的方法所产生的主题。
5。结果
在本节中,我们收集和分析结果收集的案例研究来回答RQ1,RQ2,和RQ3。
5.1。RQ1
首先,我们看到的存在共享类和nonmatching类在初始集群。表4显示初始簇的平均百分比没有nonmatching类和共享类。从结果中,我们发现确实存在一些共享类和nonmatching类在初始集群。所以我们需要执行的操作重新分配这些共享类和nonmatching类。然后,我们看到主题的数量如何影响结果的共享类和nonmatching类。图6显示了箱形图的共享类和nonmatching类和共享的次数在聚类的过程中与不同数量的话题。结果的数据6(一)和6 (b),我们注意到,随着数量的话题,共享和共享类的数量也会增加。所以设置不同的值的数量的话题会影响共享类的数量。此外,图6 (c)显示了nonmatching结果聚类过程中类的类。我们看到nonmatching类少于共享类。此外,nonmatching类的数目的范围与不同数量的主题是相似的。即价值观不同数量的主题不明显影响nonmatching类的数目。
(一)共享项不同类别和不同数量的初始集群主题(5、10和15)
(b)的共享类初始集群不同数量的话题(5、10和15)
(c) nonmatching类的数目在初始集群不同数量的话题(5、10和15)
从上面所讨论的,结果共享类和nonmatching类中存在初始集群。然而,大多数的类共享和nonmatching都没有的。此外,一些共享类是由三个或更多的话题,分享和共享类的数量大于nonmatching类。此外,结果还表明,不同的设置数量的话题会影响共享类的数量,但是不会影响nonmatching类的数目。
5.2。RQ2
在本节,我们比较三种聚类方法的精度显示我们的方法的有效性。
首先,我们邀请参与者评估聚类结果从三个聚类方法。投票结果如表所示5。结果表明,在大多数情况下,我们的方法所产生的结果更符合他们的需求。为jfreechart.source.org.jfree.chart.plot包,LSI-based集群的投票结果,我们的方法是相似的。当我们深入调查结果在这个包中,两种聚类方法输出集群有两个真阳性相关类(真阳性相关类的类属于权威集群)。因此参与者不确定哪一个比另一个好。所以从参与者的定性分析,我们注意到,我们的方法可以生成聚类结果更好地适应他们的需求相比LSI-based和PLSA-based聚类的方法。
此外,定量比较这些聚类方法,计算精度和召回的结果,如表所示6。从回忆的角度来看,我们的方法总是比(或至少一样好)LSI-based和PLSA-based聚类方法。然而,从精确的角度来看,有时我们的结果更好,有时LSI-based集群或PLSA-based集群是更好的。当我们调查的结果,我们的方法达到降低精度,我们注意到集群中的类的数量由我们的方法比,到大LSI-based集群和PLSA-based集群。例如,对于jfreechart.source.org.jfree.chart.plot包中,有六个类集群的权威。而我们的方法生成五个真阳性相关类LSI-based集群方法生成4和4是真阳性相关类。所以的精度LSI-based集群方法是高的,而我们的方法是更糟。但各自的程序理解,回忆更重要,因为有更多的相关课程,开发人员可以更好地理解集群。也就是说,我们的方法可以覆盖更多的相关类权威集群,可以有效地促进程序理解。从上面所讨论的结果,与之相比LSI-based集群和PLSA-based集群,我们的方法可以有效地识别更相关的类在一个集群中帮助程序理解。
5.3。RQ3
不同于其他聚类方法,我们的方法也与主题标签每个集群,这是由一些词来形容集群。在本节,我们将讨论这些主题是否有用的理解集群。
首先,我们为参与者提供了每个集群的主题。他们使用了五点李克特量表来回答题目的质量。结果如表所示7。结果的平均分数是4左右,这表明参与者认为主题是有用的了解集群。所以对程序理解,主题标签集群有助于用户理解程序。
此外,我们也评估集群的主题从精度和召回的角度定量。结果如表所示8。对于每个集群,我们的方法可以产生一个主题,包括有些字标签。这些话可以覆盖大部分的单词的参与者。例如,对于集群包括AbstractPieLabelDistributor.java类,可以覆盖82%的单词。因此,参与者可以使用这些词来帮助他们了解集群。此外,从精确的角度来看,我们的方法不是很好,大多数的精度结果约10%。然而,其他90%无关紧要的话,一些显然不相关的集群,这很容易被参与者,例如,“方法,”“请参考,”和“jEdit。”这些话都包含在主题,因为他们不是在预处理过程中删除。改善的结果,我们可以提高预处理操作删除单词相关的特定主题项目。虽然有些嘈杂的信息从我们的方法生产,参与者仍觉得主题是有用的了解集群。
因此,从结果,我们看到这个话题在我们的方法是帮助开发人员理解聚类结果。
6。威胁的有效性
像任何实证验证,我们有其局限性。在下面,威胁我们的案例研究的有效性进行了讨论。
第一个威胁与我们的实验的正确性和实现。我们已经检查了实现和修复bug。另一个威胁与参与者的偏见。我们有这种偏见减少了不告诉参与者我们的方法产生的结果和产生的基准方法。此外,我们只有我们的技术应用于四个主题项目。此外,我们认为只有一个编程语言(Java)和一个开发环境(Eclipse)。还需要进一步的研究来概括我们的研究与开发人员有足够的大型工业项目和领域知识和熟悉系统。因此我们不能保证在我们的案例中研究结果可以推广到其他更复杂的或任意科目。然而,这些受试者选择从开源项目,广泛用于实验研究[42,43]。在评价聚类结果的有效性,我们随机选择一个包的数量。进一步减少威胁的有效性,在未来,我们打算评估我们的聚类方法,甚至更多的包从软件项目。最后的威胁来自措施用来评估我们的方法的有效性,也就是说,精度和召回。这两个指标只集中在假阳性和假阴性则权威的聚类结果。然而,对于程序理解,其他因素或许更为重要。
7所示。相关工作
程序理解是最重要的一个活动,软件维护和逆向工程8,10,23,44,45]。集群技术通常用于软件系统分解成小单元更容易理解。一些研究分析语法特性或集群软件的依赖关系(46- - - - - -50),而其他人则依赖于语义信息在聚类的源代码51- - - - - -54]。
聚类方法基于句法(结构)在源代码中通常集中在实体之间的结构关系,例如,变量和类的引用,程序调用,使用包和类间关联和继承关系。Mancoridis等人提出了一个方法产生集群使用模块依赖图的软件系统8]。他们对待集群作为一个优化问题,利用传统的爬山和遗传算法。在[46,55),介绍了群集群系统。群产生集群使用加权依赖图进行软件维护。Sartipi和Kontogiannis交互式方法恢复四个阶段组成的内部凝聚力的子系统系统。在第一阶段,之间的关系程序中提取。在第二个阶段,这些关系是用来建立一个关系图。在第三阶段,图为手动或自动分区使用数据挖掘技术(56]。这些语法关系可以帮助开发人员理解的功能特性是程序的源代码。在本文中,我们专注于集群基于源代码的功能特性。我们用LDA的语义分析这些功能特性。
基于语义聚类方法试图展示系统的功能特性(57- - - - - -60]。源代码的功能特性进行了分析评论,标识符名称和文件名(61年]。库恩等人提出了一个独立于语言的方法来组织软件构件基于大规模集成电路。他们分组源代码包含类似条款在评论(12,62年]。Scanniello等人提出了一种方法来执行软件系统分区。这种方法首先分析软件实体(例如,程序或类),并使用大规模集成电路不同实体之间,由迭代调用分组k - means聚类算法(63年]。桑托斯等人支持remodularization语义聚类分析用于输入程序(58]。我们的方法使用LDA生成集群,特别是对于大型包,促进他们的理解。
此外,一些程序理解技术两者优点结合起来的语法和语义聚类(7,38,64年- - - - - -66年]。的交直流算法是其中的一个例子相结合方法名称和依赖的类用于集群系统中的所有类成小簇的理解(3]。Andritsos和Tzerpos提议地狱的边缘层次聚类算法软件(7]。聚类算法既考虑结构和非结构化属性来降低软件系统的复杂性分解成集群。Saeidi等人提出了集群软件系统通过合并系统的知识从不同的观点,也就是说,知识嵌入到源代码以及内部的结构性依赖系统,产生聚类结果(67年]。然后,他们采用了一种基于搜索的方法来提供一个多视图集群的软件系统。在本文中,我们侧重于语义分析的聚类的源代码。此外,我们的方法还生成主题来帮助用户更容易地理解类的集群。
8。结论和未来的工作
在本文中,我们提出一个方法在大型集群类包的程序理解。我们的方法利用LDA集群大型包成小簇,它会被标以主题来显示他们的特性。我们进行了案例研究,展示我们的方法的有效性在四个现实世界的开源项目。我们的方法的结果表明,该聚类结果更比其他集群技术相关,也就是说,LSI-based和PLSA-based集群。此外,主题标签这些集群是有用的,可以帮助开发人员理解他们。因此,我们的方法可以为开发人员提供了一个有效的方法快速、准确地理解大型包。
在我们的研究中,我们只进行了研究四个java程序,它并不意味着其他类型的系统的通用性。未来的工作将集中在进行更多的研究在不同的系统来评估我们的方法的通用性。此外,在聚类过程中,我们发现一些类是弱耦合的包,但是他们更相关的另一个包。也就是说,存在问题与当前包的结构。所以我们考虑将我们的聚类方法应用于提高包结构。最后,我们的方法是自顶向下的程序理解过程的第一步;在未来,我们打算集群其他一些程序元素,例如,方法,提供一个更全面的自上而下的程序理解支持更好地理解软件系统。
的利益冲突
作者宣称没有利益冲突有关的出版。
确认
这项工作是支持部分由自然科学基金批准号。61402396,61472344,61602267,和61472343,开放基金的南京大学计算机软件新技术国家重点实验室在批准号KFKT2016B21、江苏秦局域网项目、中国博士后科学基金会批准号2015 m571489,江苏省六大人才高峰计划下批准号2011 - dzxx - 032、自然科学基金中国江苏高等教育机构在批准号15 kjb520030,优先级的学术程序开发江苏高等教育机构和江苏协同创新中心大气环境和设备技术。