论文笔记-Finding key classes in object-oriented software systems by techniques based on static analysis
Finding key classes in object-oriented software systems by techniques based on static analysis
基于静态分析的面向对象软件系统关键类查找技术
摘要
背景:软件维护由程序理解活动负担,这些活动消耗了大部分项目资源。程序理解很困难,因为要分析的代码非常大,文档可能没有很好的结构来帮助浏览代码。
目的:工具应该支持程序理解的早期阶段。我们的目标是构建分析代码并过滤大量信息的工具,以便仅将最重要的信息呈现给软件维护团队。在面向对象系统的情况下,找到重要信息意味着找到最重要的类,也称为系统的关键类。
方法:在这项工作中,我们制定并探索了几个假设,哪些是表征重要类别的类别属性。按类属性,我们在这里了解量化类属性的不同度量,例如它与其他类的连接和关系。用于计算类属性的所有必要输入数据都是通过静态分析从代码中提取的。我们通过实验研究哪些属性最适合根据类别的重要性对类别进行排名,对15个软件系统进行了广泛的实证研究。
结果:直接连接和网络中心性类别中的属性最适合查找关键类别。我们确定了三个最适合作为类排名标准的类属性:当关键类的目标集较小时为PR-U2-W和CONN-TOTAL-W,当目标集较大且可变时为CONN-TOTAL。我们表明,基于这些属性对类进行排名的方法优于寻找关键类的已知相关工作方法。
结论:我们的方法使我们能够构建易于使用的全自动工具,从代码开始几乎可以立即找到软件系统的关键类别。
1.介绍
Introduction
背景
软件系统维护的工作人员在执行任务时的首要挑战是理解现有的源代码,代码量的大小和文档缺失是加大程序理解难度的主要原因。
目前最常用的方法是:使用建模工具从代码中逆向设计UML图标图表,但是对于大型软件来说,会生成过大而且过于详细的逆向工程图表,即使可用,但是相比于正向工程图而言,也过于详细和分散。对于软件维护而言,最重要的就是一个简短的概述文档,类似于执行摘要,直接指出系统的最关键方面。
动机
开发一种推荐工具(源代码静态分析工具)来分析源代码,并直接指出经过简化后的关键类。
两种应用场景:①作为集成开发环境(IDE)中的插件,有助于用户通过直接导航到这些类来学习和理解代码。
②作为工具插件从代码中逆向设计UML图表,若逆向工程图很大,则用户可以使用该工具指定过滤阈值来筛选不重要的图表
以上两种应用场景都要求 论文目标所开发的推荐工具是一个简单的插件,可以访问源代码并且迅速给出结果,
因此选择基于静态分析的方法来开发该插件,寻找关键类
静态程序分析:在不运行代码的条件下,通过某些分析技术扫描程序,验证程序是否满足某些性质
静态程序分析工具:检查源代码中的变量、模块接口的一致性,逻辑上可能存在的错误结构和不可达的程序段
以前的工作
PageRank:对网页进行排名,原理:网页之间通过链接构建Web图,每个页面设置一样的PageRank值(入链数量),离线计算之后每个页面有最终的PR值,在一轮更新PR值之后,每个页面将其当前的PR值平均分配到本页面的出链,每个链接即获得相应的权重,这些链接称为其他页面的入链,将入链权值求和,得到新的PR值。
本文使用PageRank的一个变式:通过静态分析确定的程序依赖关系,使用图形排名算法对类进行排名
如果A依赖于B,(A指向B)这意味着A向B提供建议,但B也向A提供建议。我们称从A到B的边为正向推荐,而从B到A的边为反向推荐。从B到A的反向推荐权重 = 从A到B的正向推荐权重的1/2
当前工作
需要找到是否有其他的类属性可以作为度量标准,用来量化类的属性和特征。
这个度量标准可以量化类的属性和特征,这个度量标准可以是规模、或者与其他类之间的联系,本文定义了30种类属性,在软件系统的模型上计算。
方法概述:模型是通过对源代码的静态分析生成的。需要探索软件系统的不同类型的模型,并计算适当的类属性值。对于可以作为类的重要性度量的每个类属性,通过按属性值的降序对类列表进行排序,我们可以按重要性的顺序获得候选排序。设置切割阈值来划分排名靠前的类,这些类是找到的系统关键类集。
研究问题:1.找到哪个模型和计算哪个属性?
根据哪个模型的重要性和找到系统的关键类,计算哪个属性是对类进行排名的最佳属性?
2.与相关实验进行比较。(与已知的关键类参考解决方案进行比较)
过程:测试用例:一组15个相关的开源软件系统
判断依据:分析不同的评价指标(精确度/召回率,ROC-AUC)的适用性
精确度和召回率(precision / recall):True代表分类正确,False代表分类错误;Positive是正例,Negative是负例。
精确度又叫查准率,召回率又叫查全率
准确率:分类任务中全部分类正确(TP+TN )的总数与全体总数(TP+FP+TN+FN)的比值
AUC:被定义为ROC曲线下的面积,AUC是衡量二分类模型优劣的一种评价指标,表示预测的正例排在负例前面的概率。是机器学习中分类器的常用评价指标,auc取值范围为[0.5, 1],越大表示效果越好,小于0.5的即预测效果极差,则需把结果取反。
auc指标解决的问题:能客观反映对正样本、负样本综合预测的能力,还要考虑消除样本倾斜的影响(其实就是归一化之类的思想,实际中很重要,比如pv总是远远大于click
使用场景:根据推荐类所需要的数量为类排序方法确定两种不同的使用场景:
接收少量推荐类 / 接收数量更大且数量可变的类 --> 检查哪些指标最适合评估解决每个用户场景的排名方法
2.建模软件系统和反映类重要性的类属性
Modeling software systems and class attributes reflecting class importance
2.1将软件系统建模为图形
软件系统被建模为具有类似节点类和接口的图形,边被引入到节点之间,这些节点对应的是处于静态依赖的类或者接口。
面向对象系统中构成静态依赖关系的机制有不同的分类框架,区别两个类或者AB两个接口 有以下几种依赖的类别:
继承 inheritance、接口实现 interface realization、字段名 field、参数 parameter、返回类型 return type、
本地变量 local variable、字段访问 field access、方法调用 method call、实例化 instantiation、cast方法(强制转换)、
类型绑定 type binding
分配给不同依赖类型权重:
ArchRec加权方案:例如A类具有B类的数据成员,而且具有B类的参数方法 ,并且在总体上A类可以调用B类的不同方法
若A类调用B类四种不同的方法则依赖程度为:3+3+4×2=14
建模一个同样简单的软件系统,本文给出了五种可用的图模型
2.2衡量类重要性的属性
在定义了不同的类度量、类特征或者类属性之后,在查找关键类的过程中需要以不同的方式使用。为了分析这些类属性,实际上是量化了可以非正式描述的原因:
寻找大类、寻找与其他类有很多联系的类、寻找由类的整体网络拓扑产生的具有核心作用的类、寻找与其他重要类有着良好联系的类。
本文定义一组类属性来量化上述的条件,分为四类:
2.2.1尺寸属性
(size attributes)
类的大小可以被以下属性量化:字段数(NoF)、公共字段数(NoPF)、方法数(NoM),公共方法数(NoPM)和全局大小(size),这些定义为方法和字段数量的组合。
2.2.2直接联系属性
Direct connection attributes
通过两个类的直接连接,可以了解到两个类之间的任何静态依赖关系。直接连接是传入和传出类依赖关系。直接连接属性有:
1)CONN-IN 一个类的传入依赖关系的不同类的总数(使用该类的类的数量)
2)CONN-OUT 代表一个类的传出依赖关系的不同类的总数(该类使用类的数量)
3)CONN-TOTAL 代表与当前类连接的不同类的总数(CONN-IN + CONN-OUT)
4)CONN-IN-W 类的传入依赖项的总权重,与CONN-IN相反,CONN-IN-W总结了依赖关系的优势。例如一个类被另外两个类使用,一个类的依赖强度为3,另一个以来强度为7,则CONN-IN = 2;CONN-IN-W = 10
5)CONN-OUT-W 类的传出依赖项的总权重。总结了当前类使用的所有类的依赖关系的优势。类似CONN-IN-W
6)CONN-TOTAL-W 当前类的所有连接类的总权重。(CONN-IN-W + CONN-OUT-W)
2.2.3网络中心性措施
Network centrality measures
一个类在连接的整体拓扑结构中的中心作用可以通过系统依赖关系图上的不同中心度量来量化。
网络节点中心性:
A:介数中心性:衡量某节点的信息传递能力。(计算网络中任意两个节点的所有最短路径,如果这些最短路径中很多条都经过了某个节点,那么就认为这个节点的介数中心性高。)
B:接近中心性:描述某节点与其他所有节点距离的远近。(如果节点到图中其他节点的最短距离都很小,那么它的接近中心性就很高。)
C:特征向量中心性:测量某节点在网络中的影响力。(一个节点的中心性是相邻节点中心性的函数。某节点连接的节点越重要,则特征向量中心性越高。)
D:度中心性:与某节点直接相连的节点数目。(在无向网络中,用节点的度来衡量中心性,度越高的节点影响力越大,度中心性越高)
通过使用和调整PageRank、HITS、Betweenness、k-coreness的中心度量
1)PageRank:是一种测量节点重要性的算法,被用于衡量类的重要性,大多用于有向无权图,只考虑有向和无向依赖图,不用于加权依赖图。在五种系统图上计算PageRank值,定义五种类属性:
PR:PR值,有向无权图
PR-W:PR值,有向有权图
PR-U:PR值,无向无权图
PR-U-W:PR值,无向有权图
PR-U2-W:PR值,根据带有反向建议的加权图计算,首先定义并且用作先前工作的排名标准。
2)HITS:(Hyperlink-Induced Topic Search 超链接诱导主题搜索)
在HITS算法中,每个页面被赋予两个属性:hub(中心)属性和authority(权威)属性。
网页被分为两种:hub页面和authority页面
hub页面:包含了很多指向authority页面的链接的页面;authority页面:包含有实质性内容的页面
HITS算法的目的:当用户查询时,返回给用户高质量的authority页面。
用户输入关键词后,算法对返回的匹配页面计算两种值:枢纽值(Hub Scores)和权威值(Authority Scores)
一个好的枢纽代表其指向许多权威的节点;一个好的权威节点代表其被许多好的枢纽节点指向
枢纽值首先被用来作为区分重要类的属性,包括在静态和动态分析的的图形中。
本文在加权图和无权图中都计算枢纽值和权威值。由于HITS明确的区分了Hubs和Authorities,根据链接的方向,那么该算法在无向图中没有意义。定义了四种类属性:
AUTH:权威值,有向无权图
AUTH-W:权威值,有向有权图
HUB:枢纽值,有向无权图
HUB-W:枢纽值,有向有权图
3)betweenness:介数中心性
介数中心性量化了 某个节点包含在其他两个节点之间的最短路径的 次数(计算网络中任意两个节点的最短路径,如果这些最短路径中的很多条都经过这个节点,那么就认为这个节点的介数中心性很高)
使用不加权的依赖模型图,计算两个变量之间的中间性:即是否考虑依赖的权重
为了将短路径的语义与具有良好链接类的路径进行匹配,加权最短路径算法会考虑不到边的权重依赖的倒数。
在本文中,只是描述类的桥梁作用,忽视方向,只是用类依赖图的无向版本,定义两种类属性:
BETW:介数中心性值,无向无权图
BETW-W:介数中心性值,无向有权图
4)Core number of nodes:核心节点数
假设存在节点 n,其核心节点数最大整数值为 k,即在图中 n 是 k 核的节点,图的 k 核被定义为节点的最大子图,使得每个节点具有至少 k 的度,k 核是在无向图上确定的。核心较大的类是关键类,重要类与其他重要类存在许多有向的链接。Pan等人提出加权广义 k 核算法,用于识别关键类。定义两种类属性:
KCORE:核心数 使用k核的值在无向无权图上计算
KCORE-W:核心数 使用Pan等人描述的加权广义 k 核的值
2.2.4与其他关键类的直接联系
Direct connections with other key classes
某些类是否重要,用户是知道的。
提出一个两阶段的排名过程:
第一阶段:排名方法,使用的是PR-U2-W属性进行排名的方法 作为基线排名方法 以获得初步排名
第二阶段:通过基线方法排名前20的类(称为top类),被视为初步知识,被用于计算与其他类的直接连接度量
定义以下类属性:
DIRECT-TOP-IN:包含传入依赖关系的top类总数
DIRECT-TOP-OUT:包含传出依赖关系的top类总数
DIRECT-TOP :与当前类连接的top类总数(DIRECT-TOP-IN + DIRECT-TOP-OUT)
DIRECT-TOP-W-IN:来自top类的所有传入依赖的总权重
DIRECT-TOP-W-OUT:来自top类的所有传出依赖的总权重
DIRECT-TOP-W:所有top类连接的总权重(DIRECT-TOP-W-IN + DIRECT-TOP-W-OUT)
3.实验设置
Experimental setup
3.1实验方法
本文提出一种工具:该工具基于ART模型提取器工具从源代码中提取到所有的依赖项,构建图形模型并且计算上述提到的所有的类属性的值,之后使用每个类属性作为类排序的候选,根据类的重要性按照属性值的降序对类进行排序。
(ART模型:自适应共振理论,一种自组织神经网络结构,无教师的学习网络)
为了确定有效的用于排名的类属性,将ART模型提取器工具应用于一组开源的系统,评估和比较每个候选人产生的排名。
本文测试用例有15个开源系统,系统的大小在121个类到4450个类之间。参考解决方案的大小(即已知关键类的集合)在7到57个类之间变化。
为了验证该工具的排名准确性,需要有人类专家对其进行评估,但是一定程度上存在主观差异。为了确保验证的准确性,需要从开发人员文档中提取参考解决方案。这类文档中的关键类集作为参考集合,成员之间不存在排序,通常不赋予重要性。
3.2评估指标
Metrics for evaluation
本文设计了不同的指标来评估工具生成的解决方案和参考解决方案的质量,首先是原始结果的收集,然后介绍如何采用精确度/召回率,ROC-AUC等方法进行应用。
3.2.1收集原始结果
该工具的输入是 要进行分析的软件系统的源代码 ,令其类的数量为N。根据类的重要性进行排名。为了区分类的重要性,设置一个Top类的阈值,top类在1到N之间。
阈值的设定:前人认为top类的推荐值是类总数N的15%,本文认为15%甚至10%的候选集合对于该工具而言太大了,关键类是系统开始的起点,需要手动检查的和认定的不宜过多。
1)频繁的使用场景是用户想要接收相对数量较少的推荐关键类,根据开发人员文档中包含的类平均数量来看,已知关键类的数量和系统的大小不成比例,均值在20-30之间;
2)第二种使用场景是用户想要接受更大且可变的推荐关键类,本文进行一个最高阈值在1到N之间的实验,假设有K个类的参考方案(即已知有K个重要的类),
本文计算排名最靠前的类,让这个数字被确定,它则代表正例(TP)。
(FP)则代表排名最靠前的类但是并不是已知的K中的类。
TN代表不在参考方案k中且已经低于阈值的类。
FN表示在参考方案k中但是已经低于阈值的类
(True代表分类正确,False代表分类错误;Positive是正例,Negative是负例)
考虑到该工具的特殊性,本文认为假正例是一个不太相关的指标,用于提取开发人员参考方案的文档在两种情况下可能是错误的: 一是文档中没有包含一些非常重要的类,二是文档错误的包含了一些绝对不重要的类。第一种情况比第二种情况要多得多:可能是因为开发人员在主观上忽略了它,这就是为什么 在开发人员文档中找不到的类(将其视为FP,假正例),并不一定是在top类中是排名低的。第二种情况频率极低,可能是文件过时。因此,在查找关键类的开发人员文档中,基于真正例的指标比假正例更有用。
3.2.2精确率和召回率
在本文中精确率和召回率代表的含义为:
精确率:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报