一种基于功能结构的软件体系结构恢复方法

文档序号:25542912发布日期:2021-06-18 20:39阅读:649来源:国知局
一种基于功能结构的软件体系结构恢复方法

本发明涉及软件体系恢复技术领域,尤其涉及一种基于功能结构的软件体系结构恢复方法。



背景技术:

软件体系结构被相关学者与从业人员视作为软件开发和演化的重要依据,但在软件开发和演化过程中存在着三个问题:第一,在敏捷开发的大环境下,从业人员认为“可工作的软件胜过宽泛的文档”,他们简单地设计了一个软件体系结构,而没有经过充分的验证,或者没有设计相应的软件体系结构,仅仅通过用户提供的需求,就开始实现软件系统。第二,即使设计了软件体系结构、并进行了充分的验证,但在开发过程中存在没有按照设计的软件体系结构进行开发的问题,导致实现的软件体系结构与设计的软件体系结构不一致。第三,在软件持续演化的过程中,经常会出现软件的源代码更新后、而未更新软件体系结构的问题,这被业界称为“软件体系结构侵蚀与漂移”。最终,缺失、过时的软件体系结构会造成软件质量降低、迭代与维护困难等问题,这是当今软件存在的普遍问题。

基于以上问题,许多学者与从业人员致力于研究软件体系结构恢复技术,研究如何从源代码实体中抽取出一组构件,形成软件系统的体系结构,以重建、更新软件体系结构文档,从而提高软件的质量,降低软件开发、维护和演化风险。

目前,软件体系结构恢复技术是一个热门的研究领域,已经有了众多的研究成果,如bunch,acdc,limbo,mca,eca,arc和zbr等。其中,大多数的研究工作通过将结构高内聚、低耦合作为恢复目标来恢复软件体系结构。尽管这些研究工作取得了一定的成果,但是将结构高内聚低耦合作为恢复目标、使用源代码的结构信息进行恢复过程中,并没有使用或者未充分考虑功能结构知识和功能语义信息,从而使得恢复出的构件没有清晰的功能语义,造成软件体系结构难以理解、甚至不合理的。因此,目前的研究工作在软件体系结构恢复中考虑功能结构知识还尚且不足,而且恢复方法的平均恢复精确度不足50%。



技术实现要素:

鉴于上述的分析,本发明实施例旨在提供一种基于功能结构的软件体系结构恢复方法,用以解决现有软件结构体系结构恢复过程未充分考虑功能结构造成的软件体系结构难以理解、甚至不合理的问题。

本发明公开了一种基于功能结构的软件体系结构恢复方法,包括:

构建待恢复体系结构的软件的功能结构知识;所述功能结构知识中的每一功能包括父功能和/或子功能,以及包括功能相关类;其中,所述功能中的最低层功能直接包含所述功能相关类;

将父功能、子功能、最低层功能分别映射为对应的父构件、子构件和叶子构件,并将所述最低层功能直接包含的功能相关类划分至该最低层功能映射到的叶子构件中;

从类的源代码中获取结构信息和文本信息,并基于所述文本信息及叶子构件的名称和功能描述,得到所有类和所有叶子构件的关键词;

从所有的类中剔除所述构件中已包括的类得到未恢复的类;基于所述结构信息和关键词,得到每一未恢复的类与每一叶子构件的相关性,将相关性超过相关性阈值的类划分至与其相关性最高的叶子构件中;重复遍历所有未恢复的类,得到更新后的构件;

若所有的类均完成恢复,则基于更新后的构件恢复出所述软件的软件体系结构。

在上述方案的基础上,本发明还做出了如下改进:

进一步,所述基于所述文本信息及所述叶子构件的名称、功能描述,得到所有类和所述叶子构件的关键词,包括:

对于每一类,从其对应的文本信息中提取出类的词汇,对提取出的词汇进行分词、排序处理,得到该类的关键词;

对于每一叶子构件,提取该叶子构件的所有构件中的类中的词汇、以及叶子构件的名称和功能描述中的词汇,对提取出的词汇进行分词、排序处理,得到该叶子构件的关键词。

进一步,通过执行以下操作得到每一未恢复的类与每一叶子构件的相关性:

基于所述结构信息,得到未恢复的类的结构特征;基于所述结构特征,得到未恢复的类与叶子构件之间的结构相关性;

基于未恢复的类与叶子构件的关键词,分别生成对应的文本向量;基于所述文本向量,得到未恢复的类与叶子构件之间的功能语义相关性;

基于所述结构相关性、功能语义相关性及其对应的权重,获得每一未恢复的类与每一叶子构件的相关性。

进一步,所述结构特征包括:

依赖特征、被依赖特征、关联特征、被关联特征、继承特征、被继承特征、实现特征和被实现特征。

进一步,基于所述结构特征,得到未恢复的类与叶子构件之间的结构相关性,包括;

计算每一未恢复的类与每一叶子构件中存在所述结构特征的相关类的关系数;

对得到的关系数进行归一化处理;

基于归一化处理后的关系数,得到未恢复的类与叶子构件的结构相关性。

进一步,所述方法还包括:

若存在剩余未恢复的类,则将剩余未恢复的类聚类为伪叶子构件,所述伪叶子构件的数量等于聚类个数;

基于更新后的构件、所述伪叶子构件,恢复出所述软件的软件体系结构。

进一步,通过执行以下操作得到所述伪叶子构件:

基于所述结构信息和文本信息,得到剩余未恢复的类的结构-文本特征;

基于所述结构-文本特征,生成对应的特征向量;

对所述特征向量进行聚类处理,得到剩余未恢复的类的聚类结果,为聚成一类的类的分配伪叶子构件。

进一步,所述结构-文本特征包括:

调用特征、继承特征、注解特征和命名片段特征。

进一步,所述方法还包括:

迭代地对所述伪叶子构件进行聚类,形成更高功能抽象层级的构件;

基于更新后的构件、所述伪叶子构件以及所述更高功能抽象层级的构件,恢复出所述软件的软件体系结构。

进一步,通过执行以下操作形成更高功能抽象层级的构件:

将每一伪叶子构件中包含所有类的命名片段特征作为对应伪叶子构件的命名片段特征;

基于所述伪叶子构件的命名片段特征,生成每一伪叶子构件的命名片段特征向量;

对所述命名片段特征向量进行聚类处理,得到伪叶子构件的聚类结果,为聚成一类的伪叶子构件的分配更高功能抽象层级的构件。

与现有技术相比,本发明至少可实现如下有益效果之一:

本发明通过使用功能结构知识来辅助软件体系结构恢复,以提高恢复的精确度,同时能够恢复出合理且功能可理解的软件体系结构,帮助软件架构师和开发人员从整体上理解软件系统,从而更好地对软件系统进行迭代与维护,降低迭代与维护风险。

本发明中,上述各技术方案之间还可以相互组合,以实现更多的优选组合方案。本发明的其他特征和优点将在随后的说明书中阐述,并且,部分优点可从说明书中变得显而易见,或者通过实施本发明而了解。本发明的目的和其他优点可通过说明书以及附图中所特别指出的内容中来实现和获得。

附图说明

附图仅用于示出具体实施例的目的,而并不认为是对本发明的限制,在整个附图中,相同的参考符号表示相同的部件。

图1为本发明实施例中基于功能结构的软件体系结构恢复方法流程图;

图2为本发明实施例中另一基于功能结构的软件体系结构恢复方法流程图;

图3为本发明实施例中通过插桩技术获取的类调用链的示意图;

图4为本发明实施例中引入相关性阈值后的高相关性类分配阶段的一次恢复流程图;

图5为本发明实施例中引入相关性阈值后高相关性类分配阶段的迭代恢复流程图。

具体实施方式

下面结合附图来具体描述本发明的优选实施例,其中,附图构成本申请一部分,并与本发明的实施例一起用于阐释本发明的原理,并非用于限定本发明的范围。

本发明的一个具体实施例,公开了一种基于功能结构的软件体系结构恢复方法,流程图如图1-2所示,该方法包括如下步骤:

步骤s1:构建待恢复体系结构的软件的功能结构知识;所述功能结构知识中的每一功能包括父功能和/或子功能,以及包括功能相关类;其中,所述功能中的最低层功能直接包含所述功能相关类;

考虑到软件系统功能,主要围绕功能的名称、别称及其相关术语,进一步描述功能的主要作用、用途以及功能之间的层次关系,以及实现这个功能可能会用到的类。因此,基于软件系统功能,构建的功能结构知识(又称“功能点知识”),包括如下内容/元素:

(1)功能名称(n):功能的名称。

(2)功能描述(d):描述功能的作用、用途,包括功能中每一父功能、子功能及最低层功能的功能描述。

(3)功能的相关术语(t):描述功能的别称、缩略语等相关词汇。

(4)功能相关术语集合(ts):表示功能相关的术语词汇集合。针对n个功能相关术语,可以得到功能相关术语集合ts={t1,t2,t3,…,tn}。

(5)功能的父功能(pf):表示功能的父(高层)功能,父功能是子功能的高层抽象描述。需要说明的是,父功能与子功能属于直系关系,一个功能可以有0个或者1个父功能。

(6)功能的子功能(cf):表示功能所包含的子(低层)功能,子功能是父功能的细化描述。需要说明的是,定义中的子功能与该功能属于直系关系。一个功能可以有0个、1个或者多个子功能。

(7)功能相关类(rc):表示实现该功能所涉及到的核心类组成的集合,其中不包括公共工具类。对于类,使用符号c表示,功能的相关类文件可以表示为rc={c1,c2,…,cn1},其中n1为构建出的与该功能相关的类的数量。需要说明的是,只有功能抽象级别最低的功能(即不包含子功能的功能)直接包含功能相关类。

(8)功能(f):由上述功能名称、功能描述、功能相关术语集合、功能的父功能、功能点的子功能、功能的相关类文件组成,可看作是一个关于上述6个元素的六元组,使用符号可表示为f=(n,d,ts,pf,cf,rc)。

(9)功能结构知识(fsk):功能结构知识是软件系统的功能以及它们之间的包含层次关系所组成的知识。针对软件系统s,其功能结构知识是由若干功能组成的集合,其中包括了功能之间的包含关系,使用符号可表示为其中fi=(ni,di,tsi,pfi,cfi,rci),i表示为第i个功能,n2为软件系统所包含的功能的数量。

功能知识所包括的组成元素可通过表1进行查看与查找。

表1功能知识的组成元素

具体地,在步骤s1中,可通过以下方式构建软件的功能结构知识:

运用领域知识构建功能结构知识:

(1)基于软件项目的源代码本身及相关技术手册,构建功能结构知识:

通过阅读软件项目的源代码以及相关技术手册(如需求文档、设计文档和功能说明书等相关资料),并结合软件系统的相关领域知识,构建得到初步的功能结构知识;可由软件系统的领域专家完成。

(2)为得到更为全面、完整的功能结构知识,在上述方式的基础上,还可基于源代码的动态运行信息和静态语义信息,辅助构建功能结构知识;

一方面,在使用源代码的动态运行信息进行构建时,首先构造一个用于抽取软件系统运行时所调用类的插桩程序;其次,在软件系统运行过程中,将该插桩程序嵌入至软件系统的程序中,通过操作软件系统的相应功能,从而获取得到实现该功能的类调用链,如图3所示;最后去除与其他功能共用的类,以及工具类,得到了与功能相关的核心类,进而构建出功能结构知识中的功能相关类文件信息。另一方面,本发明还可以使用源代码的静态语义信息构建功能结构知识。源代码的静态语义信息中具有丰富的功能语义知识,人们在阅读源代码时,可以了解到软件系统所具有的功能。因此,可以通过分析软件系统源代码的包文件名称、类文件名称、类的字段名称、类的方法名称、注解和注释等静态语义信息,并以源代码分析工具辅助,构建出功能结构知识。

由于软件架构师在设计软件体系结构时,会将某个功能设计为一个构件,因此,软件体系结构恢复实质上是从一组类中抽象出若干构件,因此,需要将功能映射为构件;

步骤s2:将父功能、子功能、最低层功能分别映射为对应的父构件、子构件和叶子构件,并将所述最低层功能直接包含的功能相关类划分至该最低层功能映射到的叶子构件中。此外,还将各功能的名称、功能描述作为对应构件的名称、功能描述:即将功能名称作为构件的名称,使用功能的描述和相关术语描述构件的功能;还根据功能包含的层次关系构建构件包含的层次关系:例如,将父功能和子功能之间的关系作为父构件与子构件之间的功能包含层次关系;

但是,在构建功能结构知识时,难以找全一个功能的所有相关类;即,存在一些类与功能相关,但还未划分至与功能对应的构件中。所以,执行完步骤s1和s2之后,还无法得到完整的恢复结果。考虑到上述问题,本实施例通过计算未恢复的类与叶子构件的相关性,进而将其划分至相关的叶子构件中。具体过程参考步骤s3和步骤s4:

步骤s3:从类的源代码中获取结构信息和文本信息,并基于所述文本信息及叶子构件的名称和功能描述,得到所有类和所有叶子构件的关键词;

步骤s31:从类的源代码中获取结构信息和文本信息,其中:

结构信息包括:类与类之间的依赖关系、关联关系、继承关系、实现关系;

文本信息包括:类的全限定名、字段名、方法名、注解、注释和类所属包的全限定名。

考虑到软件体系结构恢复实质上是从一组类中抽象出若干构件,在此过程中会使用从类的源代码中获取结构和文本信息,因此需要对这些信息进行提取。jdt(javadevelopmenttools)是eclipse平台开发的工具,用于对java语言编写的源代码文件(类文件)进行提取、解析与分析,本实施例采用jdt软件源代码分析工具从类的源代码中获取结构信息和文本信息,其具体说明如表2所示。

表2提取的源代码静态信息

需要说明的是,对于java语言来说,虽然可以通过导入声明(import)来提取类之间的依赖与关联关系,但是由于开发人员的疏忽或者开发不规范,存在虽然在类a中通过导入声明导入了类b,但是实际上并没有使用类b的情况。如果只是依赖于导入声明提取关系,则会提取到不真实存在的类与类之间的关系,从而影响软件体系结构恢复效果。因此,本发明从类的字段和方法中识别并抽取类与类之间的关联和依赖关系,而不是依赖于导入声明。

通过执行步骤s31,提取出了结构信息和文本信息,接下来还需要对这些信息作进一步处理。

步骤s32:基于s31所述文本信息及叶子构件的功能信息,提取出类的关键词和叶子构件的关键词。

对于类:从它的文本信息中提取出类的词汇,然后对提取出的词汇进行分词处理,最后通过关键词提取算法对分词后的词汇进行排序,得到该类的关键词;

对于叶子构件:提取叶子构件的所有构件中的类中的词汇,从叶子构件的功能信息(例如构件名称(即构件名称)、功能描述、相关术语)中提取词汇;对通过以上两种方式提取出的词汇进行分词处理,最后通过关键词提取算法对分词后的词汇进行排序,得到该叶子构件的关键词;

本实施例使用的分词方法为:

由于提取的词汇包含大量的复合词,涉及多种命名规则,例如驼峰命名法和下划线命名法,所以需要依据不同的命名规则对提取的词汇进行分词。

1)对于符合驼峰命名法的词汇,可基于以下方式进行分词:

判断所述方法名中是否包含大写字母,若不包含,则将所述方法名作为一个单词;否则,以所述方法名中的大写字母为分界,将所述方法名拆分成数个单词;其中,第i个大写字母为第i+1个单词的首字母;i取1,......,n3,n3表示大写字母的个数;拆分完成后,将所有字母转换为小写;例如accountcontroller和addaccount,分词后并将所有字母转换为小写,得到单词account,controller和add。

2)对于符合下划线命名法的词汇,以下划线为分界,对下划线前后的单词进行拆分:例如account_num,分词后并将所有字母转换为小写,得到单词account和num。

3)对于包含专有名词的词汇,例如dfsclient,分词后并将所有字母转换为小写,得到单词dfs和client。

本实施例使用的关键词提取方法:

本文采用高效的textrank算法,从一组单词中提取出若干关键词,作为类和构件的文本。textrank算法是基于图排序的关键词提取算法。其基本原理是把若干单词表示为一个有向带权图,采用投票机制对单词进行排序,进而得到关键词。对于软件体系结构恢复方法,textrank算法的输入为从类和构件中提取并经处理的一组单词,输出为按照重要程度从大到小排序后的一组关键词。

经过以上操作,便得到了每一个类的一组关键词与构件的一组关键词。

步骤s4:从所有的类中剔除所述构件中已包括的类后得到未恢复的类;基于所述结构信息和关键词,得到每一未恢复的类与每一叶子构件(又称“种子构件”)的相关性,将相关性超过相关性阈值的类划分至与其相关性最高的叶子构件中;重复遍历所有未恢复的类,直至不存在相关性超过相关性阈值的类;得到更新后的构件;具体地,

步骤s41:基于所述结构信息,得到未恢复的类的结构特征;基于所述结构特征,得到未恢复的类与叶子构件之间的结构相关性;

从结构方面进行分析,如果一个类与另一个类之间存在依赖、被依赖、关联、被关联、继承、被继承、实现、被实现关系,则这两个类具有一定的通信内聚性和逻辑内聚性。如果一个未恢复的类与叶子构件中存在上述关系的相关类的数量越多,则未恢复的类属于该叶子构件的可能性越大,未恢复的类与该叶子构件的结构相关性越大。因此,本文从源代码的结构信息中获取以下8种结构特征用于计算类与构件之间的结构相关性:

(1)依赖特征:如果类c1依赖叶子构件中的类c2,得到“依赖”特征。

(2)被依赖特征:如果类c1被叶子构件中的类c2依赖,得到“被依赖”特征。

(3)关联特征:如果类c1关联叶子构件中的类c2,得到“关联”特征。

(4)被关联特征:如果类c1被构叶子件中的类c2关联,得到“被关联”特征。

(5)继承特征:如果类c1继承叶子构件中的类c2,得到“继承”特征。

(6)被继承特征:如果类c1被叶子构件中的类c2继承,得到“被继承”特征。

(7)实现特征:如果类c1实现叶子构件中的接口类c2,得到“实现”特征。

(8)被实现特征:如果接口类c1被叶子构件中的类c2实现,得到“被实现”特征。

为了计算未恢复的类c与叶子构件com之间的结构相关性,首先计算每一未恢复的类与每一叶子构件中存在上述结构特征的相关类的关系数,并对得到的关系数进行归一化处理,从而得到的未恢复的类与叶子构件的结构相关性corrstruct(c,com),其数值范围为[0,1]。

如果类与叶子构件中的类的关系数量越多,则它与叶子构件的结构相关性越高,corrstruct值越大,否则越小。算法描述如算法1所示。

步骤s42:基于未恢复的类与叶子构件的关键词,分别生成对应的文本向量;基于所述文本向量,得到未恢复的类与叶子构件之间的功能语义相关性;

从功能语义方面进行分析,如果一个类所包含的关键词与叶子构件所包含的关键词相似,则类与叶子构件之间存在着一定的功能语义相关性。因此,需要分别从类和叶子构件中提取出关键词,生成文本向量,通过计算未恢复的类与叶子构件之间文本相似度,来确定它们之间是否具有一定的功能语义相关性。

文本相似度计算方法如下:

本实施例采用余弦文本相似度计算方法,计算未恢复的类与叶子构件之间的文本相似度。首先对类与叶子构件中的每一关键词进行编码,编码过程使用独热编码方式(one-hot),将其转化为一个通过0和1表示的文本向量,以抽象表示类与叶子构件的文本。最后通过余弦函数计量两个文本向量的余弦夹角值,如果夹角值越大,说明两个文本向量越相似,进而说明未恢复的类与叶子的文本越相似。针对未恢复的类与叶子的文本相似度计算方式的余弦函数如公式1所示。其中classtext和comtext分别表示未恢复的类与叶子的文本向量,i表示文本向量中的第i个元素,n4为文本向量的长度。

步骤s43:基于所述结构相关性、功能语义相关性及其对应的权重,获得每一未恢复的类与每一叶子构件的相关性。

在得到未恢复的类与叶子构件的结构相关性、语义相关性数值和权重之后,还利用公式(2)计算得到类与叶子构件间的相关性矩阵:

corr(c,com)=wstruct·corrstruct(c,com)+wfunc·corrfunc(c,com)(2)

其中,wstruct表示结构相关性权重,为类与构件之间的结构相关性配置的权重,权重值的范围为[0,1]。wfunc表示功能语义相关性权重:为类与构件之间的功能语义相关性配置的权重,权重值的范围为[0,1]。

通过公式(2)可以计算一个未恢复的类与通过功能结构知识构建出的种子构件之间的相关性,得到相关性向量f,如公式(3)所示,其中n5为叶子构件的数量;m个未恢复类可以生成相关性矩阵m,如公式(4)所示。

f=(corr(c,com1),corr(c,com2),···,corr(c,comn5))(3)

步骤s43:基于所述结构相关性、功能语义相关性及其对应的权重,获得每一未恢复的类与每一叶子构件的相关性;并基于相关性矩阵和相关性阈值,对类进行恢复:

通过类c与叶子构件com之间的相关性corr(c,com),即对类进行恢复,相关性阈值是一个类能否划分至叶子构件中的最小值,可以对恢复行为加以限制,以避免将不相关的类划分至叶子构件中。当相关性高于相关性阈值时,则将类划分至叶子构件中;如果相关性低于相关性阈值,则不对类进行恢复,不将其从未恢复类集合中移除。对于达不到相关性阈值的类时,暂时不将其划分至任何叶子构件中。需要说明的是,上述恢复过程是一个迭代的过程。每当结束一轮恢复后,则会重新生成一个的相关性矩阵,进一步求解与未恢复类最相关的叶子构件,并判断最大相关性是否达到相关性阈值,如果达到,则将类划分至相应叶子构件中。当未恢复类集合在下一次迭代过程中不再发生改变时,停止恢复过程。图3和图4表示了在引入相关性矩阵和相关性阈值进行恢复后,一次恢复的流程和迭代恢复流程。

通过执行步骤s4,得到了图2中高相关性类分配阶段(对应图2中的“第一阶段”)的恢复结果。此时,将步骤s2中部分或者全部未恢复的类分配到了相应叶子构件中。

步骤s5:若所有的类均完成恢复,则基于更新后的构件恢复出所述软件的软件体系结构。

在该阶段的体系结构恢复中,可能存在构建出的功能不能完全匹配源代码中存在的功能的问题,使得部分类无法分配至基于功能结构知识构造出的构件中,需要对这些类进一步恢复,具体过程参考步骤s6和s7。

步骤s6:若存在剩余未恢复的类,则将剩余未恢复的类聚类为伪叶子构件,所述伪叶子构件的数量等于聚类个数;基于更新后的构件、所述伪叶子构件,恢复出软件体系结构。具体地,通过执行以下操作得到伪叶子构件:

步骤s61:基于所述结构信息和文本信息,得到剩余未恢复的类的结构-文本特征;

恢复叶子构件时,选择了以下特征:

1)调用特征(又称,调用类)调用类:如果类a和类b都调用了同一个类c,则它们之间可能存在通信性内聚,记为“调用类c”特征f1c。该特征属于结构特征。

2)继承特征(又称,继承类/实现接口):如果类a和类b都继承了同一个类c或实现了同一个接口c,则它们之间可能存在逻辑性内聚,记为“继承类c”特征f2c。该特征属于结构特征。

3)注解特征(又称,标记注解)标记注解:如果类a和类b都标记了同一个注解c,则它们之间可能存在功能性内聚,记为“标记注解c”特征f3c。该特征属于功能语义特征。

4)命名片段特征(又称,包含命名片段):如果类a和类b都包含了同一命名片段c,则它们之间可能存在功能性内聚,记为“包含命名片段c”特征f4c。命名片段来源于标识符分词后形成的关键词。该特征属于功能语义特征。

步骤s62:基于所述结构-文本特征,生成对应的特征向量;恢复叶子构件时特征向量与特征矩阵的生成:

在该阶段中为结构和功能语义特征赋予了不同的权重,并做出如下定义:

结构特征权重(ws):为结构特征配置的权重,权重值的范围为[0,1]。

功能语义特征性权重(wf):为功能语义特征配置的权重,权重值的范围为[0,1]。

以上两个权重之和为1。

假设软件系统s中共有m个类和接口,包括n个命名片段和k个注解,则会生成m个“调用类”特征,m个“继承类/实现接口”特征,n个“包含命名片段”特征以及k个“标记注解”特征,共计(2m+n+k)个特征。如果实体具有上述特征,则特征值为1,否则为0。因此,每个实体可以生成一个维度为(2m+n+k)的特征向量。

对于类ci,可以得到其赋予结构和功能语义特征权重后的特征向量ui:

对于未恢复的p个类,可以得到特征矩阵a:

步骤s63:对所述特征向量进行聚类处理,得到剩余未恢复的类的聚类结果,为聚成一类的类的分配伪叶子构件。

为每个未恢复的类生成了特征向量并组成了特征矩阵。这个特征矩阵将作为近邻传播算法的输入,对未恢复的类进行聚类,从而得到一批伪叶子构件。

为更好地满足软件体系结构恢复需求,还可对伪叶子构件进行聚类,形成更高功能抽象层级的构件,以更好地体现出软件软件体系结构恢复的层次。具体过程如步骤s7所示:

步骤s7:迭代地对所述伪叶子构件进行聚类;基于更新后的构件、所述伪叶子构件以及所述更高功能抽象层级的构件,恢复出所述软件的软件体系结构。

步骤s71:将每一伪叶子构件中包含所有类的命名片段特征作为对应伪叶子构件的命名片段特征;

在恢复高层构件时,选择了以下特征:

命名片段特征(又称“包含命名片段”):如果构件a和构件b都包含了同一命名片段c,则它们之间可能存在功能性内聚,记为“包含命名片段c”特征rc。命名片段来源于标识符分词后形成的关键词。该特征属于功能语义特征。

步骤s72:基于所述伪叶子构件的命名片段特征,生成每一伪叶子构件的命名片段特征向量;恢复高层构件时特征向量与特征矩阵的生成:

假设当前共有m个命名片段,则会生成m个“包含命名片段”特征。如果实体具有上述特征,则特征值为1,否则为0。因此,每个实体可以生成一个维度为m的特征向量。

对于构件comi,可以得到其特征向量vi:

对于p个构件,可以得到特征矩阵b:

步骤s73:对所述命名片段特征向量进行聚类处理,得到伪叶子构件的聚类结果,为聚成一类的伪叶子构件的分配更高功能抽象层级的构件。

通过执行步骤s6、步骤s7,得到了图2中低相关性类聚合阶段(对应图2中的“第二阶段”)的恢复结果。

首先将上述未恢复的类生成的特征矩阵输入至ap算法中,该算法经过计算后会输出一个聚类结果,表示每一个未恢复的类所属的聚类编号,即伪叶子构件的编号,将具有相同聚类编号的类划分在同一个伪叶子构件中。之后,需要根据指定的恢复层数,迭代地恢复出高层构件。最终恢复出了一组具有功能包含层次的构件,完成低相关性类聚合阶段的软件体系结构恢复。

在得到伪叶子构件和更高功能抽象层级的构件后,即可整理所有构件之间的层级关系,形成一个完整的软件体系结构恢复结果。

本领域技术人员可以理解,实现上述实施例方法的全部或部分流程,可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于计算机可读存储介质中。其中,所述计算机可读存储介质为磁盘、光盘、只读存储记忆体或随机存储记忆体等。

以上所述,仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。

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