一种基于加权a指数的软件包重要性度量方法
【技术领域】
[0001] 本发明涉及一种软件包重要性度量方法,尤其是涉及一种基于加权a指数的软件 包重要性度量方法。
【背景技术】
[0002] 计算机软件已经渗透到我们工作和日常生活的各个方面,正在改变并且还将继续 改变我们的生活。随着软件技术的发展和互联网的普及,人们对软件的依赖与日倶增,对软 件质量的要求越来越高。这导致了系统规模的激增和软件应用环境的日益复杂,使得软件 开发的风险增加、软件质量很难得到有效的控制。
[0003] 同时演化性是软件的本质属性之一。软件系统同生物一样,在其生命周期内,也必 须不断的演化,否则就有可能提前被淘汰。软件演化的重要内容之一是对软件源代码的修 改。然而要修改代码,我们必须对软件系统有一定的了解。在维护资源有限的情况下,对于 一个新加入的开发者,加快其对系统的了解具有比较重要的意义。可以通过为新开发者推 荐重要的软件元素(如类、包等)从而加快其对系统的了解。尽管目前已经有不少软件度量 方面的研究工作,如L0C( Lines of Code)代码行、McCabe圈复杂度(Cyclomat ic Complexity)、Halstead度量法、CK度量组、MOOD度量集等,能够为认识软件的复杂性提供一 定的帮助,但是仍有如下不足:
[0004] (1)现有的工作主要集中于度量代码元素本身的复杂性,缺少对代码元素重要性 的度量。
[0005] (2)现有工作主要是针对元素级的度量,度量的往往是软件的局部特征,如度量一 个方法、一个类,缺少从整体角度进行软件度量的工作,更缺少从整体角度度量软件元素重 要性的工作。
[0006] 包是目前主流的面向对象软件的主要构成元素之一。因此,提供一种有效的包重 要性度量方法,从整体角度度量包的重要性,对于理解软件,提高代码维护效率具有重要意 义。
【发明内容】
[0007] 本发明的目的在于针对现有技术的不足,提供了一种基于加权a指数的软件包重 要性度量方法。
[0008] 本发明的上述技术问题主要是通过下述技术方案得以解决的:一种基于加权a指 数的软件包重要性度量方法,该方法包括以下步骤:
[0009] (1)将Java语言编写的软件源代码在特征粒度抽象为特征依赖网Π )Ν= (Nf,Df)。其 中,Nf为源代码中特征节点的集合;Df = {(f i,f j)} (f i eNf,f j eNf)是无向边的集合,表示特 征间的依赖关系。特征包括了 Java源代码中的属性和方法。特征间的依赖关系包括了方法 间的调用关系和方法对属性的使用关系。
[0010] (2)基于步骤(1)完成的Π )Ν构建类依赖网00~=(队,0。,?)。其中具为源代码中类 节点的集合;〇。(^卽。,(3卢〇。)是一个无向边的集合,表示类之间的依赖关系;?是一个|仏 X I N。|的矩阵,代表类之间依赖关系的强度矩阵。类包含了 Java中的类、内部类、抽象类和 接口。类之间的依赖关系是根据类包含的特征间的依赖关系得到的,即类包含的特征间具 有依赖关系,则相应的类之间也存在依赖关系。
[0011] (3)基于步骤⑵完成的CDN构建包依赖网^^二…义^丄其中為为源代码中包 节点的集合;〇Ρ(ρ#〇Ρ,ρ^〇Ρ)是一个无向边的集合,表示包之间的依赖关系;P p是一个|NP X |NP|的矩阵,代表包之间依赖关系的强度矩阵。包之间的依赖关系是根据包所包含的类 之间的依赖关系得到的,即包所包含的类间具有依赖关系,则相应的包之间也存在依赖关 系。
[00?2] (4)基于步骤(3)完成的FON计算节点i的加权h指数h(i)。
[0013] (5)基于步骤(3)完成的FON计算节点i的加权cit指数cit(i)。
[0014] (6)基于步骤(4)和步骤(5)计算节点i的加权a指数
[0015] (7)基于步骤(4)、(5)和(6)计算PDN中所有节点的加权a指数,作为节点相应包的 重要性值。
[0016] 进一步地,上述步骤(2)中⑶N的构建具体包括以下子步骤:
[0017] (2.1)提取Java语言编写的源代码中的所有类,构建一个只有节点没有边的⑶N, 即⑶N= (N。,Φ,P)。Φ代表边集为空,同时P是一个零矩阵。
[0018] (2.2)取步骤(1)加中的一条边(心,灼)6加,根据源代码得到匕和灼所定义的类,若 fi在类k中定义,f j在类p中定义,若k矣p,则将(k,p)加入D。,同时步骤(2.1)中P相应位置的P (k,p)自加1;若k与p相等,则不做任何处理。
[0019] (2 · 3)重复步骤(2 · 2),直到遍历完Π )Ν中的所有边。
[0020] 进一步地,上述步骤(3)中TON的构建具体包括以下子步骤:
[0021] (3.1)提取Java语言编写的源代码中的所有包,构建一个只有节点没有边的PDN, 即PDN= (ΝΡ,Φ,Pp)。Φ代表边集为空,同时-个零矩阵。
[0022] (3.2)取步骤(2)0。中的一条边((:1,(^)6〇。,根据源代码得到(3 1和(^所定义的包,若 ci在包k中定义,cj在包p中定义,若k矣p,则将(k,p)加入DP,同时步骤(3.1)中Pp相应位置的 PP(k,p)加上P(i,j);若k与p相等,则不做任何处理。
[0023] (3.3)重复步骤(3.2),直到遍历完⑶N中的所有边。
[0024] 进一步地,上述步骤(4)中节点i的加权h指数h (i)的计算具体包括以下子步骤:
[0025] (4.1)求步骤(3)所得PDN中所有节点的节点权。节点j的节点权Sj定义为PDN中与 该节点相连的所有边的权重和,即:
[0027]其中,Vj是节点j的邻居节点集合。
[0028] (4.2)求步骤(3)所得TON中节点i的邻居节点集合Vi。
[0029] (4.3)将^中的节点按其节点权降序排列(若存在节点权相等的情况,则相等的几 个值随机选择一种可能的排序),得到排序后的数组list,list[l]位置存放的是节点权最 大的那个节点。
[0030] (4.4)从list[1]开始,依次遍历list列表中的每个节点list[q],找到第一个满足 节点权小于(n+1)的节点1 ist [n+1 ],则节点i的加权h指数h(i)为η。
[0031] 进一步地,上述步骤(5)中节点i的加权cit指数cit(i)的计算具体包括以下子步 骤:
[0032] (5.1)求步骤(3)所得PDN中所有节点的节点权。节点j的节点权s j定义为PDN中与 该节点相连的所有边的权重和,即:
[0034]其中,Vj是节点j的邻居节点集合。
[0035] (5.2)求步骤(3)所得TON中节点i的邻居节点集合Vi。
[0036] (5.3)将^中的节点按其节点权降序排列(若存在节点权相等的情况,则相等的几 个值随机选择一种可能的排序),得到排序后的数组list,list[l]位置存放的是节点权最 大的那个节点,list[ | Vl | ]位置存放的是节点权最小的那个节点(| Vl |为^中节点个数)。
[0037]
节点i的加权cit指数cit(i)。
[0038] 与现有技术相比,本发明具有以下优点和积极效果:
[0039] (1)本发明中加权a指数的构建都考虑了软件作为一个整体的影响,因为构建a指 数所使用的加权h指数和加权cit指数都考虑了网络中其它节点的节点权,是一种整体视 角,在一定程度上克服了现有方法只关注局部特征忽略整体特征的问题。
[0040] (2)本发明提出用加权a指数度量软件中包的重要性,在一定程度上克服了现有方 法只关注软件元素复杂性的度量,忽略软件元素重要性度量的问题,可以为理解软件、提高 代码维护效率提供支持。
【附图说明】
[0041] 图1本发明的Java语言编写的源代码片段;
[0042]图2本发明的实施例构建的Π )Ν;
[0043] 图3本发明的实施例构建的无边⑶Ν;
[0044] 图4本发明的实施例构建的无边CDN相应的Ρ;
[0045] 图5本发明的实施例构建的无边⑶Ν加入一条边后的⑶Ν;
[0046] 图6本发明的实施例构建的无边⑶Ν加入一条边后的⑶Ν相应的Ρ;
[0047]图7本发明的实施例构建的最终⑶Ν;
[0048]图8本发明的实施例构建的最终CDN相应的Ρ;
[0049]图9本发明的实施例构建的无边TON;
[0050]图10本发明的实施例构建的无边TON相应的Pp;
[00511图11本发明的实施例构建的无边TON加入一条边后的TON;
[0052] 图12本发明的实施例构建的无边TON加入一条边后的TON相应的Pp;
[0053] 图13本发明的实施例构建的最终TON;
[0054] 图14本发明的实施例构建的最终TON相应的Pp。
【具体实施方式】
[0055] 下面通过实施例并结合附图对本发明的技术方案作进一步的说明:
[0056] 本发明提出的一种基于加权a指数的软件包重要性度量方法,具体步骤如下:
[0057] (1)将Java语言编写的软件源代码在特征粒度抽象为特征依赖网Π )Ν= (Nf,Df)。图 1所示的是一个Java源代码片段。按照图1所给的Java源代码片段,可以构建相应的Π )Ν(如 图2所示),节点边的文字为节点相应特征的名字(名字由包名,类名,特征名以相连构 成)。其中,Nf= {pi .classX.a(),pl .classX.v(),pl .classX.c(),pl .classX.b(), p2 · classY. d(),p2 · classZ. e(),p2 · classZ. f(),p3 · classL. g()}为特征节点的集合;Df = {(pl.classX.b(),pl.classX.a()),(pl.classX.a(),pl.classX.b()),(pl.classX.a(), pl.classX.v()),(pl.classX.v(),pl.classX.a()),(pl.classX.v(),pl.classX.c〇), (pl.classX.c(),pl.classX.v()),(pl.classX.a(),p2.classY.d()),(p2.classY.d(), pl.classX.a()),(p2.classY.d(),p2.classZ.e()),(p2.classZ.e(),p2.classY.d()), (pi.classX.a(),p2.classZ.f()),(p2.classZ.f(),pi.classX.a()),(p3.classL.g(), p2.classZ.f()),(p2.classZ.f(),p3.classL.g()),(pl.classX.c(),p2.classZ.f〇), (p2.classZ.f〇 ,pl .classX.cO)}是无向边的集合,表示特征间的依赖关系。
[0058] (2)基于步骤(1)完成的FDN构建类依赖网〇0~=(1,0。,?)』0_勺构建具体包括以 下子步骤:
[0059] (2.1)提取Java语言编写的源代码中的所有类,构建一个只有节点没有边的CDN, 艮口〇0~=(1,〇,?)。〇代表边集为空,同时?是一个零矩阵。按照图1所给的加抑源代码片 段,可以构建相应的CDN=(N c,Φ,P)(如图3所示),其中,Nc={pl.classX,p2.classY, p2.claSSZ,p3. classL}为源代码中类节点的集合,节点边的文字为节点相应类的名字(名 字由包名和类名以相连构成KP是一个零矩阵,如图4所示。
[0060] (2.2)取步骤(1)加中的一条边(心,灼)6加,根据源代码得到匕和灼所定义的类,若 fi在类k中定义,f j在类p中定义,若k矣p,则将(k,p)加入D。,同时步骤(2.1)中P相应位置的P (k,p)自加1;若k与p相等,则不做任何处理。如图2所示,若取边(pi.classX.a(), p2.classZ.f()),因 pl.classX.a()在pi · classX类中定义,p2 · classZ. f()在类 p2 · classZ 中定义,且pi. classX与p2. classZ不是同一类,故将(pi. classX,p2. classZ)加入Dc,可以 得到图5所示CDN及图6所示P。
[0061] (2.3)重复步骤(2.2),直到遍历完Π )Ν中的所有边,可以得到图7所示的⑶N,其中, Nc = {pi. clas sX,p2. clas sY,p2. classZ,p3. classL}为源代码中类节点的集合;Dc = {(pi .classX,p2.classY),(p2.classY,pi.classX),(pi .classX,p2.classZ), (p2.classZ,pi.classX),(p2.classY,p2.classZ),(p2.classZ,p2.classY),(p2.classZ, p3.classL), (p3.classL,p2.classZ)}是一个无向边的集合,表示类之间的依赖关系。相应 的P如图8所示。
[0062] (3)基于步骤(2)完成的CDN构建包依赖网TON = (NP,DP,Pp)。PDN的构建具体包括以 下子步骤:
[0063] (3.1)提取Java语言编写的源代码中的所有包,构建一个只有节点没有边的PDN, 即?〇~=(化,〇,6)。〇代表边集为空,同时匕是一个零矩阵。按照图1所给的拓抑源代码片 段,可以构建相应的PDN=(Np,?,Pp)(如图9所示),其中具={?1,?2,?3}为源代码中包节 点的集合,节点边的文字为节点相应包的名字。PP是一个零矩阵,如图10所示。
[0064] (3.2)取步骤(2)0。中的一条边((:1,(^)60。,根据源代码得到(3 1和(^所定义的包,若 ci在包k中定义,cj在包p中定义,若k矣p,则将(k,p)加入DP,同时步骤(3.1)中Pp相应位置的 PP(k,p)加上P(i,j);若k与p相等,则不做任何处理。如图2所示,若取边(pi .classX, p2. classZ),因 pi. classX在pi包中定义,p2. classZ在包p2中定义,且pi与p2不是同一包, 故将(p 1,p2)加入DP,可以得到图11所示CDN及图12所示Pp。
[0065] (3.3)重复步骤(3.2),直到遍历完⑶N中的所有边。可以得到图13所示的PDN,其 中,N P= {pi,p2,p3}为源代码中包节点的集合;DP= {(pi,p2),(p2,pl),(p2,p3),(p3,p2)} 是一个无向边的集合,表示包之间的依赖关系。相应的Pp如图14所示。
[0066] (4)基于步骤(3)完成的FON计算节点i的加权h指数h(i)。,具体包括以下子步骤:
[0067] (4.1)求步骤(3)所得PDN中所有节点的节点权。节点j的节点权Sj定义为PDN中与 该节点相连的所有边的权重和,即:
[0069] 其中,Vj是节点j的邻居节点集合。因此,图13中节点pi的节点权sPi = 3,p2的节点 权 81)2 = 3+1=443的节点权81)3=1。
[0070] (4.2)求步骤(3)所得TON中节点i的邻居节点集合Vi。因此,若令节点i为图13中的 节点p2,贝lj其邻居节点集合v P2= {pi,p3}。
[0071] (4.3)将^中的节点按其节点权降序排列(若存在节点权相等的情况,则相等的几 个值随机选择一种可能的排序),得到排序后的数组list,list[l]位置存放的是节点权最 大的那个节点。因此,若令节点i为图13中的节点p2,v P2= {pi,p3}中的节点pi的节点权sPi =3,,p3的节点权sP3 = l,因此可以得到list数组为{pi,p3},即list[l] = pl,list[2] = p3。
[0072] (4.4)从list[1]开始,依次遍历list列表中的每个节点list[q],找到第一个满足 节点权小于(n+1)的节点list[n+l],则节点i的加权h指数h(i)为η。因此,对于p2节点:当q =1时,sPi>l;当q = 2时,sP3〈2,故h(p2)的值为1。
[0073] (5)基于步骤(3)完成的PDN计算节点i的加权cit指数cit(i),具体包括以下子步 骤:
[0074] (
5.1)求步骤(3)所得PDN中所有节点的节点权。节点j的节点权Sj定义为PDN中与 该节点相连的所有边的权重和,即:
[0076]其中,Vj是节点j的邻居节点集合。因此,图13中节点p 1的节点权sPi = 3,p2的节点 权 81)2 = 3+1=443的节点权81)3=1。
[0077] (5.2)求步骤(3)所得TON中节点i的邻居节点集合Vi。因此,若令节点i为图13中的 节点p2,贝lj其邻居节点集合vP2= {pi,p3}。
[0078] (5.3)将^中的节点按其节点权降序排列(若存在节点权相等的情况,则相等的几 个值随机选择一种可能的排序),得到排序后的数组list,list[l]位置存放的是节点权最 大的那个节点,list[ | Vl | ]位置存放的是节点权最小的那个节点(| Vl |为^中节点个数)。因 此,若令节点i为图13中的节点p2,vP2 = {pi,p3}中的节点pi的节点权SP1 = 3,,p3的节点权 sP3 = l,因此可以得到list数组为{pi,p3},即list[l] = pl,list[2] = p3。
[0079]
'算节点i的加权cit指数cit(i)。因此,若令节点i为图
[0080] (6)基于步骤(4)和步骤(5)计算节点i的加权a指数
·因此,对于p2节点,
[0081 ] (7)基于步骤(4)、( 5)和(6)计算PDN中所有节点的加权a指数,作为节点相应包的
[0082]本文中所描述的具体实施例仅仅是对本发明精神作举例说明,实施例中a(pl)和a (P3)的值相等,这只是现实中可能的一种情况,但并不代表所有的情况都是如此。本发明所 属技术领域的技术人员可以对所描述的具体实施例做各种各样的修改或补充或采用类似 的方式替代,但并不会偏离本发明的精神或者超越所附权利要求书所定义的范围。
【主权项】
1. 一种基于加权a指数的软件包重要性度量方法,其特征在于,包括以下步骤: (1) 将Java语言编写的软件源代码在特征粒度抽象为特征依赖网FDN= (Nf,Df)。其中, Nf为源代码中特征节点的集合;Df= {(fi, fj)}(fi eNf,fj eNf)是无向边的集合,表示特征间 的依赖关系。 (2) 基于步骤(1)完成的FDN构建类依赖网CDN= (N。,D。,P)。其中,N。为源代码中类节点 的集合;〇。((^已〇。,(^已〇。)是一个无向边的集合,表示类之间的依赖关系;?是一个屮。|\ N。I的矩阵,代表类之间依赖关系的强度矩阵。 (3) 基于步骤⑵完成的CDN构建包依赖网PDN= (NP,DP,PP)。其中具为源代码中包节点 的集合J p(PieDhPjeDp)是一个无向边的集合,表示包之间的依赖关系;Pp是一个I Np I X Np I的矩阵,代表包之间依赖关系的强度矩阵。 (4) 基于步骤(3)完成的PDN计算节点i的加权h指数h (i)。 (5) 基于步骤(3)完成的PDN计算节点i的加权cit指数cit(i)。 (6) 基于步骤(4)和步骤(5)计算节点i的加权a指勠(7) 基于步骤(4 )、( 5)和(6)计算PDN中所有节点的加权a指数,作为节点相应包的重要 性值。2. 根据权利要求1所述一种基于加权a指数的软件包重要性度量方法,其特征在于,所 述的步骤(1)中的特征包括了 Java源代码中的属性和方法。3. 根据权利要求1所述一种基于加权a指数的软件包重要性度量方法,其特征在于,所 述的步骤(1)中特征间的依赖关系包括了方法间的调用关系和方法对属性的使用关系。4. 根据权利要求1所述一种基于加权a指数的软件包重要性度量方法,其特征在于,所 述的步骤(2)中的类包含了 Java中的类、内部类、抽象类和接口。5. 根据权利要求1所述一种基于加权a指数的软件包重要性度量方法,其特征在于,所 述的步骤(2)中类之间的依赖关系是根据类包含的特征间的依赖关系得到的,即类包含的 特征间具有依赖关系,则相应的类之间也存在依赖关系。6. 根据权利要求1所述一种基于加权a指数的软件包重要性度量方法,其特征在于,所 述的步骤(3)中包之间的依赖关系是根据包所包含的类之间的依赖关系得到的,即包所包 含的类间具有依赖关系,则相应的包之间也存在依赖关系。7. 根据权利要求1所述一种基于加权a指数的软件包重要性度量方法,其特征在于,所 述的步骤(2)中CDN的构建具体包括以下子步骤: (2.1) 提取Java语言编写的源代码中的所有类,构建一个只有节点没有边的CDN,即CDN =(Nc,Φ,P)。Φ代表边集为空,同时P是一个零矩阵。 (2.2) 取步骤(I)Df中的一条边出上)EDf,根据源代码得到心和心所定义的类,若心在 类k中定义,fj在类p中定义,若k矣p,则将(k,p)加入D。,同时步骤(2.1)中P相应位置的P(k, P)自加1;若k与p相等,则不做任何处理。 (2.3) 重复步骤(2.2 ),直到遍历完FDN中的所有边。8. 根据权利要求1所述一种基于加权a指数的软件包重要性度量方法,其特征在于,所 述的步骤(3)中TON的构建具体包括以下子步骤: (3.1)提取Java语言编写的源代码中的所有包,构建一个只有节点没有边的PDN JPTON =(NP,Φ,Pp)。Φ代表边集为空,同时?[)是一个零矩阵。 (3.2) 取步骤(2)0。中的一条边((:1,(^)60。,根据源代码得到(31和(^所定义的包,若(3 1在 包k中定义,Cj在包ρ中定义,若k矣ρ,则将(k, ρ)加入Dp,同时步骤(3.1)中Pp相应位置的Pp (让,口)加上?(;[,」);若1^与?相等,则不做任何处理。 (3.3) 重复步骤(3.2),直到遍历完⑶N中的所有边。9. 根据权利要求1所述一种基于加权a指数的软件包重要性度量方法,其特征在于,所 述的步骤(4)中节点i的加权h指数h (i)的计算具体包括以下子步骤: (4.1) 求步骤(3)所得TON中所有节点的节点权。节点j的节点权Sj定义为TON中与该节点 相连的所有边的权重和,即:其中,Vj是节点j的邻居节点集合。 (4.2) 求步骤(3)所得PDN中节点i的邻居节点集合Vl。 (4.3) 将^中的节点按其节点权降序排列(若存在节点权相等的情况,则相等的几个值 随机选择一种可能的排序),得到排序后的数组list,list[l]位置存放的是节点权最大的 那个节点。 (4.4) 从list[1]开始,依次遍历list列表中的每个节点list[q],找到第一个满足节点 权小于(n+1)的节点I ist [n+1 ],则节点i的加权h指数h(i)为η。10. 根据权利要求1所述一种基于加权a指数的软件包重要性度量方法,其特征在于,所 述的步骤(5)中节点i的加权c i t指数c i t (i)的计算具体包括以下子步骤: (5.1) 求步骤(3)所得TON中所有节点的节点权。节点j的节点权Sj定义为TON中与该节点 相连的所有边的权重和,即:其中,Vj是节点j的邻居节点集合。 (5.2) 求步骤(3)所得PDN中节点i的邻居节点集合Vi。 (5.3) 将^中的节点按其节点权降序排列(若存在节点权相等的情况,则相等的几个值 随机选择一种可能的排序),得到排序后的数组list,list[l]位置存放的是节点权最大的 那个节点,list[ I Vl I ]位置存放的是节点权最小的那个节点(I Vl I为^中节点个数)。 (5.4) 根据计算节点i的加权c i t指数c i t (i)。
【专利摘要】本发明公开了一种基于加权a指数的软件包重要性度量方法,包括以下步骤:将Java语言编写的软件源代码在特征粒度抽象为特征依赖网;基于特征依赖网构建类依赖网;基于类依赖网构建包依赖网;基于包依赖网计算节点的加权h指数;基于包依赖网计算节点的加权cit指数;基于节点的加权h指数和加权cit指数计算节点的加权a指数,并以节点的加权a指数作为包重要性的度量指标。本发明弥补了现有技术鲜有涉及包重要性度量的不足,对于理解软件,提高代码维护效率具有重要意义。
【IPC分类】G06F9/45
【公开号】CN105487913
【申请号】CN201510958716
【发明人】潘伟丰, 宋贝贝, 徐红伟, 姜波, 谢波, 王家乐
【申请人】浙江工商大学
【公开日】2016年4月13日
【申请日】2015年12月18日