一种基于类继承关系分析的API推荐方法与流程

文档序号:20092243发布日期:2020-03-13 07:06阅读:286来源:国知局
一种基于类继承关系分析的API推荐方法与流程

本发明具体涉及一种基于类继承关系分析的api推荐方法,属于api方法推荐技术领域。



背景技术:

api(applicationprogramminginterface,即应用程序编程接口)方法的高效复用能够极大的提高开发人员的工作效率,降低开发成本并改善软件质量。但是,随着问题的深入,时间更迭,api方法数量呈爆炸式增长,开发人员在选择使用不同api方法的过程中面临更大的挑战。开发人员一旦在调用过程中错误使用api方法,不但会引发程序缺陷、运行错误等问题,还可能导致安全故障甚至项目崩溃等。

基于以上问题,目前国内外学者不断深入调研,已经取得了大量的研究成果。对于api方法推荐的研究,主要有基于数据挖掘的api方法推荐,基于自然语言处理的api方法推荐以及基于机器学习的api方法推荐三种方式。以上的各类研究均在一定程度上为开发人员推荐了合适的api方法,但是,这些方法的侧重点大都在程序的上下文,根据代码语言的重复性可预测性等特性来推荐相关结果,没有考虑方法所属类的继承关系,即没有考虑推荐的api方法之间的依赖关系。这些api方法推荐结果无论在理论研究成果还是实际场景的应用都存在推荐逻辑结构不严密和推荐准确率不足的问题。

针对这些问题,本发明提出基于类继承关系分析的api推荐方法,以一种新的角度来对api方法进行推荐,极大的利用了java语言特性,通过对方法进行基于不同类的层次结构划分,将较少使用属于更高类层次方法的推荐优先级提高,尤其是在调用高层次类方法较多的项目中,使得推荐的api方法结果列表具有更强的逻辑层次结构性,不仅能够让编程人员更加快速的找到解决问题的api方法,节约开发的时间和成本,更能将具有一定依赖关系的属于不同类层次的方法绑定输出,加深开发人员的学习效率并极大的提升推荐结果的准确率。



技术实现要素:

本发明正是针对现有技术中存在的问题,提供一种对方法所属类之间的层次结构关系以及方法间的依赖信息进行关联关系分析,以确定属于不同层次类的方法间的联系,并将此联系应用在api方法推荐的结果中,使得开发人员可以在当前推荐的方法列表中查找实现功能的相关api方法,以提高推荐结果的查准率。

为了实现上述目的,本发明的技术方案如下,一种基于类继承关系分析的api推荐方法,包括如下步骤:

步骤1)解析项目源码,将方法所属类根据该类的声明结构按层次划分,并获取所有方法的实际使用频率;

步骤2)根据方法所属类所在的层次结构,按照变量和方法两个级别分析属于高层次类的方法和属于低层次类的方法之间的关联关系以计算方法间的依赖度;

步骤3)综合方法间的依赖度、各方法的实际使用频率以及方法所属类所在的层次,计算api方法推荐的优先值;

步骤4)根据api方法推荐优先值的大小按类的声明层次结构由低到高推荐api方法。

上述方法中,步骤2)中计算方法间的依赖度dep,具体流程为:

(a)计算方法级依赖度dep1:

公式:

dep1=cm/|d1-d2|;

其中cm是子类方法调用高层次类方法的次数,d1和d2是子类方法和高层次类方法所属类的层次;

(b)计算变量级依赖度dep2:

公式:

dep2=cf/|d1-d2|;

其中cf为子类方法调用高层次类变量的数量,并且这些变量都在高层次类的方法中出现,d1和d2是子类方法和高层次类方法所属类的层次;

(c)求出dep1和dep2结果的平均值,即为子类方法和属于高层次类方法的依赖度dep。

上述方法中,步骤3)中得到每个api方法推荐优先值r:

(a)通过源代码解析获取api方法的实际使用频率f,通过jdt现有工具抽象语法树的绑定机制,获取当前方法所属类继承关系的层次d;

(b)优先值r的结果由依赖绑定结果dep,依赖方法的优先值rm,api方法实际使用频率f,以及方法所属类的层次d加权所得:

公式:

r=0.1×dep×rm+2×f+log3d。

有益效果:本发明方法通过将api方法间类的层次结构关系和方法间的依赖信息应用到api方法推荐的结果中,与现有技术相比,本发明具有以下优点:

(1)需要的信息易于获取。现有的api方法推荐技术的侧重点大都根据程序的上下文,代码语言的重复性可预测性等特性来推荐相关结果,对输入信息均存在一定要求,需要在输入之前根据特定需求做相应的处理。而本发明的方法只需要输入程序源码,利用抽象语法树将源程序语言按上下文无关文法表示成树形结构并对节点进行分析,减少了对输入信息的要求。

(2)推荐结果具有可解释性。目前api方法推荐结果中,每个方法在类的层次结构上相对独立,方法的排序结果没有规律,即方法间缺少必然的逻辑结构关系。本发明方法方法以一种新的角度来对api方法进行推荐,极大的利用了java语言特性,通过对方法进行基于不同类的层次结构划分,将较少使用属于更高类层次方法的推荐优先级提高,尤其是在调用高层次类方法较多的项目中,使得推荐的api方法结果列表具有更强的逻辑层次结构性,不仅能够让编程人员更加快速的找到解决问题的api方法,节约开发的时间和成本,更能将具有一定依赖关系的属于不同类层次的方法绑定输出,加深开发人员的学习效率。

(3)推荐结果相对于传统方法准确率更高。根据面向对象中类的设计原则,子类继承自父类,大多数情况下父类设计如何解决一个问题,子类通过实现或者重写父类相关的方法具体解决相关问题的一个部分。在开发过程中,开发人员通常需要灵活调用这些方法来解决实际问题,而不是仅仅只调用当前对象所属类的方法。本发明方法将属于高层次类的方法优先级提高,使得推荐结果更加符合实际开发情况,极大的提高了结果的准确率。

附图说明

图1是本发明方法的流程图。

图2是本发明的实施例图,表示实施例中相关内容。

图3是本发明依赖信息的提取流程图。

图4是本发明依赖关系绑定流程图。

具体实施方式:

为了加深对本发明的理解,下面结合附图对本实施例做详细的说明。

本发明针对传统的api方法推荐结果在逻辑结构上联系不紧密而导致最终推荐结果精确度不高这一问题,从一种新的角度切入,根据类的声明层次,逐层向上推荐相关api方法,使得以往最终推荐的方法列表中容易被忽略的属于高层次类的方法能够得以被推荐,从而提升最终推荐结果在方法的类层次上的逻辑关联性,并提高属于更高层次类方法的排序名次,最终提高推荐结果的准确率。

一、体系结构

图1给出了基于类继承关系分析的api推荐方法的设计体系结构,下面给出几个

主要部分的具体说明。

1api方法依赖信息获取

本模块的功能为:通过输入目标项目源码,获取api方法所属类的层次结构信息,方法间的依赖信息以及方法的历史使用频率。

本发明方法需求的所有信息均可通过对源代码解析获取,在ast树中实现对源程序信息的剥离,ast树是抽象语法树,是计算机程序的一种中间表示形式,是将计算机高级语言按上下文无关文法表示成树形结构的一种数据结构。树上的每个节点都代表一种语法结构,树中的每个节点均对应一个源代码的结构。本发明方法的推荐主要涉及类、对象以及方法这三个粒度。使用这种结构能够充分保证在抽离依赖信息的过程中逻辑结构层次清晰。并且本发明方法基本上不涉及到语法信息,抽象语法树并不会表示出真实语法出现的每一个细节,从而使得获取的信息足够简洁明了。

ast树通过解析java源代码,将代码表示为树形结构,通过访问ast树的节点可以准确得到需要的信息。通过节点可以访问该节点所对应对象的类信息,通过对类信息的逐层向上访问获取类名,可依次得到类的声明层次结构信息以及将方法根据类名划分层次结构;获取类的属性信息,用于查找子类和父类都使用这些属性的方法。方法信息的获取按类划分,本发明需要获取方法的返回值类型,用于过滤某些不适合在当前上下文使用的方法;获取方法的参数列表和变量列表,用于判定是否使用了某些类的属性;获取方法名,用于推荐结果显示。

如图3所示本发明方法依赖信息的获取具体可分为如下三个步骤:

(1)源代码解析:通过对目标源码的解析将源码转化为抽象语法树的结构;

(2)抽取节点信息:遍历抽象语法树的节点,根据当前对象所属类以及抽象语法树的绑定机制抽取整个类声明的层次结构信息;

(3)依赖信息获取:分别提取类和方法这两个粒度的依赖信息。在类级别的信息提取过程中可通过其对象所属类访问该类中所包含的全部变量信息、方法名、方法的返回类型、方法参数列表等信息;在方法级别的信息提取过程中可通过该方法查找各个方法对属性的使用情况。

2api方法关联关系分析

如图4所示本模块的功能为:基于上述依赖信息,分析同一对象所有方法之间的依赖程度。

(1)根据方法的返回值类型,过滤掉大量不应该推荐的方法,以便减少后续分析的时间,优化实验结果。

(2)分析每个方法的调用方法列表,若该列表中出现属于父类的某些方法,并且该方法可由当前对象调用,则认为这些方法之间存在依赖dep1并记录下这些方法。

公式:

dep1=cm/|d1-d2|;

其中cm是子类方法调用高层次类方法的次数,d1和d2是子类方法和高层次类方法所属类的层次。

(3)分析每个方法的参数列表以及该方法使用的所有变量,若其中存在该对象某些父类的属性,而这些属性也被父类的某些方法使用,同样要保证当前对象可调用这些父类方法,则认为这些方法之间存在依赖dep2并记录下这些方法。

公式:

dep2=cf/|d1-d2|;

其中cf为子类方法调用高层次类变量的数量,并且这些变量都在高层次类的方法中出现,d1和d2是子类方法和高层次类方法所属类的层次。

(4)整理(2)和(3)中两种依赖模式的依赖列表,第一种模式根据两个方法所属类的层次结构的距离计算依赖程度,距离越小依赖程度越高;第二种模式根据两个方法所属类的层次结构距离和变更属性的个数结合的形式计算依赖程度,距离越小,变更属性越多,则依赖程度越高。

(5)根据依赖程度dep的高低排序并绑定这些方法,绑定后的方法会在推荐时作为api方法推荐的候选结果。

3api方法推荐结果

本模块的功能为:将类的继承关联关系应用到api方法推荐结果中。

(1)设定一个优先值r,其结果由依赖绑定结果dep,依赖方法的优先值rm,api方法历史使用频率f,以及方法所属类的层次d加权所得:

公式:

r=0.1×dep×rm+2×f+log3d。

(2)依据r值的大小以及类声明的层次结构关系,按照类的声明层次由低到高,r值由大到小依次将结果排序输出。

二、方法流程

参见图1、图2,一种基于类继承关系分析的api推荐方法,包括如下:

步骤1)解析项目源码,将方法所属类根据该类的声明结构按层次划分,并获取所有方法的实际使用频率;

步骤2)根据方法所属类所在的层次结构,按照变量和方法两个级别分析属于高层次类的方法和属于低层次类的方法之间的关联关系以计算方法间的依赖度;

(a)计算方法级依赖度dep1:

公式:

dep1=cm/|d1-d2|;

其中cm是子类方法调用高层次类方法的次数,d1和d2是子类方法和高层次类方法所属类的层次;

(b)计算变量级依赖度dep2:

公式:

dep2=cf/|d1-d2|;

其中cf为子类方法调用高层次类变量的数量,并且这些变量都在高层次类的方法中出现,d1和d2是子类方法和高层次类方法所属类的层次;

(c)求出dep1和dep2结果的平均值,即为子类方法和属于高层次类方法的依赖度dep。

步骤3)综合方法间的依赖度、各方法的实际使用频率以及方法所属类所在的层次,计算api方法推荐的优先值;

(a)通过输入源代码获取api方法的历史使用频率f,通过jdt现有工具抽象语法树的绑定机制,根据当前对象获取此对象所属类继承关系的层次d;

(b)优先值r的结果由依赖绑定结果dep,依赖方法的优先值rm,api方法历史使用频率f,以及方法所属类的层次d加权所得:

公式:

r=0.1×dep×rm+2×f+log3d。

步骤4)根据api方法推荐优先值的大小按类的声明层次结构由低到高推荐api方法。

具体实施例:

为了方便描述,我们假定有如下简化的应用实例:目标程序源码的层次结构集合,方法间的依赖信息集合以及方法使用频率的排序集合如下所示:

目标程序源码包含的三个类,类中的变量以及其中涉及的方法列表:

myclass:

{name,superclass,count},

{getname,setname,getsuperclass,setsuperclass,getcount,setcount}

allclass:

{current,allclass},

{getallclass,setallclass,getcurrent,setcurrent,clear}

object:

{},

{equals,getclass,hashcode,notify,notifyall,tostring,wait};

层次结构c:

c1:myclass

c2:allclass

c3:object;

方法间存在的依赖信息m:

m1:setname{current,getallclass}

m2:setsuperclass{getallclass}

m3:setcount{current};

方法的实际使用频率排序f:

f:{setname,setsuperclass,getcount,setallclass,setcurrent,getname,getsuperclass,setcount,getallclass,clear,getcurrent,getclass,tostring,equals,ashcode,notify,notifyall,wait};

根据我们前面提到的计算步骤,依次实施:

第一步,得到目标程序源码的层次结构c,方法间的依赖信息m以及方法的实际使用频率排序f。

第二步,计算依赖信息m中各方法间的依赖度(以setname和tostring为例):

首先,计算方法级依赖度。该依赖度为属于高层次类的方法对属于低层次类方法的依赖,即该依赖度结果赋予给tostring。根据公式计算得到setname和tostring间的方法级依赖度为:1/|2|=0.5。

然后,计算变量级依赖度。根据公式计算得到setname和tostring间的方法级依赖度为:0/|2|=0。

最后,综合以上计算结果。setname和tostring的依赖度为方法级依赖度和变量级依赖度的加权平均:0.25。

按此方法计算其余api方法间的依赖度,得到依赖绑定关系d(未显示在表中的方法间没有提取到依赖信息,即不存在依赖关系):

d1:setname{setcurrent,getcurrent,getallclass,tostring}

d2:setsuperclass{getallclass,clear}

d3:setcount{setcurrent,getcurrent};

第三步,按层次类型和实际使用频率对各api方法进行分类排序,得到方法排序q。

q1:myclass{setname,setsuperclass,getcount,getname,getsuperclass,setcount}

q2:allclass{setallclass,setcurrent,getallclass,clear,getcurrent}

q3:object{getclass,tostring,equals,ashcode,notify,notifyall,wait}

第四步,结合依赖绑定关系d和方法排序q,计算推荐优先值r(以setname为例)。根据公式计算得到setname的推荐优先值为:0.1×0×0+2×0.3+log31=0.6。

第五步,根据方法推荐优先值r的大小按照类的声明层次由低到高推荐api方法列表r:

r1:setname-myclass

r2:setsuperclass-myclass

r3:getcount-myclass

r4:getcurrent-allclass

r5:setcurrent-allclass

r6:getallclass-allclass

r7:clear-allclass

r8:tostring-object

r9:getclass-object

r10:equals-object;

需要说明的是上述实施例,并非用来限定本发明的保护范围,在上述技术方案的基础上所作出的等同变换或替代均落入本发明权利要求所保护的范围。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1