CN111857691B - 一种软件体系结构恢复方法和装置 - Google Patents
一种软件体系结构恢复方法和装置 Download PDFInfo
- Publication number
- CN111857691B CN111857691B CN202010750819.5A CN202010750819A CN111857691B CN 111857691 B CN111857691 B CN 111857691B CN 202010750819 A CN202010750819 A CN 202010750819A CN 111857691 B CN111857691 B CN 111857691B
- Authority
- CN
- China
- Prior art keywords
- software
- feature
- software architecture
- class
- source code
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/31—Programming languages or programming paradigms
- G06F8/315—Object-oriented languages
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/36—Software reuse
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
- G06F8/71—Version control; Configuration management
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06N—COMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
- G06N3/00—Computing arrangements based on biological models
- G06N3/12—Computing arrangements based on biological models using genetic models
- G06N3/126—Evolutionary algorithms, e.g. genetic algorithms or genetic programming
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Life Sciences & Earth Sciences (AREA)
- Biophysics (AREA)
- Health & Medical Sciences (AREA)
- Computing Systems (AREA)
- Evolutionary Biology (AREA)
- Bioinformatics & Computational Biology (AREA)
- Bioinformatics & Cheminformatics (AREA)
- Artificial Intelligence (AREA)
- Physiology (AREA)
- Genetics & Genomics (AREA)
- Computer Security & Cryptography (AREA)
- Biomedical Technology (AREA)
- Computational Linguistics (AREA)
- Data Mining & Analysis (AREA)
- Evolutionary Computation (AREA)
- General Health & Medical Sciences (AREA)
- Molecular Biology (AREA)
- Mathematical Physics (AREA)
- Stored Programmes (AREA)
Abstract
本发明涉及一种软件体系结构恢复方法和装置,属于软件技术领域,解决了现有技术中只利用当前项目挖掘开发风格中的特征权重,恢复精度低的问题。软件体系结构恢复方法包括:使用JDT工具提取软件项目的源代码静态信息并存储于数据库中;基于所述源代码静态信息生成软件体系结构的特征矩阵;基于开源软件社区的同类软件项目数据获得特征权重;以及基于配置有特征权重的特征矩阵恢复所述软件项目的软件体系结构。实现了利用开源软件项目,从群体软件开发智慧中学习体系结构恢复的特征权重,提高了恢复精确度。
Description
技术领域
本发明涉及软件技术领域,尤其涉及一种软件体系结构恢复方法和装置。
背景技术
随着软件的规模不断变大,系统的总体结构设计和精确的规格说明要比计算机的算法更重要,在这种背景下,软件体系结构学术逐渐发展成为软件工程的重要研究领域。软件体系结构在开发中成为了不同人员共同交流的语言,体现了系统的设计决策,并为框架的实现、构件的共享与复用提供了有力的支持。
虽然软件体系结构被视为软件开发的蓝图,应当能够指导软件开发的整个生命周期,许多研究证实了缺乏良好的体系结构会导致软件质量的灾难,但一直良好地维护体系结构是非常困难的。许多软件系统在创建之初,就没有建立体系结构文档,或者建立后缺少持续的维护。出现这些问题的原因是多方面的,可能是由于紧张的工期压力,或者是最早的设计人员离开了团队等等。而软件开发的现状是,在软件的生命周期中,设计和开发的时间只占约22%,大多数时间被用于系统维护,而在这部分时间开销中,约50%-90%的时间和经费被开发人员用于理解程序。对于这些大型遗留软件系统,缺失、过时的文档使得开发人员无法从文档中获得体系结构信息,也无法掌握系统当前的状态。唯一能够获得软件系统信息的方式就是阅读源码,但大型系统的源码是难以分析和理解的,会消耗非常多的人力和时间,特别是对于刚加入团队工作的开发人员而言。即便是长期持续开发的人员,从代码中理解体系结构并追踪变化也是一件非常困难的事情。因此,在没有体系结构信息的情况下,难以快速和完全理解模块乃至系统的结构,会消耗大量的资源,并带来巨大的风险。
因此,如果能够利用源码自动化地生成体系结构模型,快速地展现当前软件系统的构件和构件之间的依赖关系,以直观的形式呈现给开发和维护人员,则能够帮助开发人员快速的从整体上理解系统。软件体系结构恢复技术可以解决上述问题。软件体系结构恢复技术的主要技术路线是:首先从代码级实体(例如Java语言的.java文件,C语言的.c文件)中提取信息,使用这些信息将代码级实体聚集成软件体系结构的构件,最终得到软件体系结构模型。
但是,目前的软件体系结构恢复技术的研究成果包括基于代码结构信息的LIMBO(scaLable InforMation BOttleneck)、ACDC(Algorithm for Comprehension-DrivenClustering)算法,以及基于代码文本信息的ARC(Architecture Recovery UsingConcerns)、ZBR(Zone Based Recovery)技术等。这些技术均基于项目自身的数据抽取体系结构特征,进而依据特征恢复体系结构。
发明内容
鉴于上述的分析,本发明实施例旨在提供一种软件体系结构恢复方法和装置,用以解决现有方法只利用当前项目挖掘开发风格中的特征权重,恢复精度低的问题。
一方面,本发明实施例提供了一种软件体系结构恢复方法,包括:使用JDT工具提取软件项目的源代码静态信息并存储于数据库中;基于所述源代码静态信息生成软件体系结构的特征矩阵;基于开源软件社区的同类软件项目数据获得特征权重;以及基于配置有特征权重的特征矩阵恢复所述软件项目的软件体系结构。
上述技术方案的有益效果如下:利用开源软件项目,从群体软件开发智慧中学习体系结构恢复的特征权重,弥补了现有方法只利用当前项目挖掘开发风格中的特征权重的问题,提高了恢复精确度,而且相较于前期工作的人工手动配置源码特征权重更加高效与精准,针对不同的软件系统适用性高。
基于上述方法的进一步改进,所述源代码静态信息包括结构信息和文本信息,其中,所述结构信息包括软件项目目录中包含的项目、包和类文件的结构元素;以及所述文本信息包括标识符名称、命名片段和出现位置。
基于上述方法的进一步改进,基于所述源代码静态信息生成软件体系结构恢复的特征矩阵包括:基于特征生成规则选择特征类别,其中,当包括m个类C1-Cm和n个命名片段A1-An时,所述特征生成规则包括:基于所述类C1-Cm,得到调用类Cx的特征并记为f1Cx,其中,m均为正整数,x为1至m的正整数;基于所述类C1-Cm,得到继承类Cx的特征并记为f2Cx;当类C1-Cm是接口时,得到是接口的特征并记为f3;以及当类C1-Cm包含命名片段Ay时,得到包含命名片段Ay的特征并记为f4Ay,其中,n为正整数,y为1至n的正整数;以及基于所述特征类别,生成特征向量(f1Cx,f2Cx,f3,f4Ay),所述特征向量包括2m+n+1个特征;其中,软件项目中所有类的特征向量形成所述特征矩阵。
基于上述方法的进一步改进,基于开源软件社区的同类软件项目数据获得特征权重进一步包括:从开源软件社区中选择与要进行软件体系结构恢复的软件系统相同或相似的项目作为训练数据;以及基于所述训练数据通过遗传算法训练所述特征权重;其中,所述遗传算法包括基因编码步骤、适应性函数步骤和基因操作步骤,以及在所述遗传算法收敛或者达到最大代数后,获得自动配置的所述特征权重,所述基因编码步骤将所述特征权重向量编码为二进制特征权重;所述适应性函数步骤使用适应性函数评价基因的优劣;以及基因操作步骤利用现有基因生成子代基因。
基于上述方法的进一步改进,所述基因操作包括选择操作、交叉操作、和变异操作。
基于上述方法的进一步改进,基于配置有所述特征权重的特征矩阵恢复所述软件体系结构进一步包括:使用LIMBO层次聚类计算实体件相似度,其中,所述LIMBO层次聚类选择信息熵损失最少的两个实体进行聚类;合并的实体作为新实体与其他实体进行逐层聚类;以及根据用户指定的聚类数量,恢复所述软件体系结构。
基于上述方法的进一步改进,所述软件体系结构恢复方法还包括:基于AMDL(Architecture Model Description Language)建模工具使恢复的所述软件体系结构模型可视化;以及使用软件体系结构评估指标,评估所述软件体系结构恢复结果。
另一方面,本发明实施例提供了一种软件体系结构恢复装置,包括:提取存储模块,用于使用JDT工具提取软件项目的源代码静态信息并存储于数据库中;特征矩阵生成模块,用于基于所述源代码静态信息生成软件体系结构的特征矩阵;特征权重获取模块,用于基于开源软件社区中的同类软件项目数据获得特征权重;以及恢复模块,用于基于配置有优化的特征权重的特征矩阵恢复所述软件项目的软件体系结构。
基于上述装置的进一步改进,所述源代码静态信息包括结构信息和文本信息,其中,所述结构信息包括软件项目目录中包含的项目、包和类文件的结构元素;以及所述文本信息包括标识符名称、命名片段、和出现位置。
基于上述系统的进一步改进,所述特征权重获取模块包括:训练数据获取子模块,从开源软件社区中选择与要进行软件体系结构恢复的软件系统相同或相似的项目作为训练数据;以及训练子模块,基于所述训练数据通过遗传算法训练所述特征权重;其中,所述遗传算法包括基因编码步骤、适应性函数步骤和基因操作步骤,以及在所述遗传算法收敛或者达到最大代数后,获得自动配置的所述特征权重,所述基因编码步骤将所述特征权重向量编码为二进制特征权重;所述适应性函数步骤使用适应性函数评价基因的优劣;以及基因操作步骤利用现有基因生成子代基因。
与现有技术相比,本发明至少可实现如下有益效果之一:
1、利用开源软件项目,从群体软件开发智慧中学习体系结构恢复的特征权重,弥补了现有方法只利用当前项目挖掘开发风格中的特征权重的问题,提高了恢复精确度,而且相较于前期工作的人工手动配置源码特征权重更加高效与精准,针对不同的软件系统适用性高;
2、本发明的方法恢复得到软件体系结构更加精确,能够更好地帮助开发和维护人员去理解软件系统;以及
3、通过AMDL建模工具,将软件体系结构模型可视化,展示出恢复后的软件体系结构,解决了目前技术缺少恢复后结果可视化的问题,提高了恢复后软件体系结构的可理解性。
本发明中,上述各技术方案之间还可以相互组合,以实现更多的优选组合方案。本发明的其他特征和优点将在随后的说明书中阐述,并且,部分优点可从说明书中变得显而易见,或者通过实施本发明而了解。本发明的目的和其他优点可通过说明书以及附图中所特别指出的内容中来实现和获得。
附图说明
附图仅用于示出具体实施例的目的,而并不认为是对本发明的限制,在整个附图中,相同的参考符号表示相同的部件。
图1为根据本发明实施例的软件体系结构恢复方法的流程图;
图2为本发明的软件体系结构恢复技术整体流程图;
图3为本发明源代码的静态信息提取过程中提取信息内存数据结构图;
图4为本发明源代码的静态信息提取过程中源码静态信息提取组件核心类类图;
图5为本发明基于遗传算法的特征权重自动配置过程中遗传算法权重优化执行流程图;
图6为本发明基于AMDL建模工具的软件体系结构模型可视化过程中恢复后的软件体系结构模型图;以及
图7为根据本发明实施例的软件体系结构恢复装置的框图。
附图标记:
702-提取存储模块;704-特征矩阵生成模块;706-特征权重获取模块;以及708-恢复模块
具体实施方式
下面结合附图来具体描述本发明的优选实施例,其中,附图构成本申请一部分,并与本发明的实施例一起用于阐释本发明的原理,并非用于限定本发明的范围。
本发明的一个具体实施例,公开了一种软件体系结构恢复方法,如图1所示。参考图1,软件体系结构恢复方法包括:步骤S102,使用JDT工具(Java Development Tools)提取软件项目的源代码静态信息并存储于数据库中;步骤S104,基于源代码静态信息生成软件体系结构的特征矩阵;步骤S106,基于开源软件社区的同类软件项目数据获得特征权重;以及步骤S108,基于配置有特征权重的特征矩阵恢复软件项目的软件体系结构。
与现有技术相比,本实施例提供的软件体系结构恢复方法,利用开源软件项目,从群体软件开发智慧中学习体系结构恢复的特征权重,弥补了现有方法只利用当前项目挖掘开发风格中特征权重的问题,提高了恢复精确度,而且相较于前期工作的人工手动配置源码特征权重更加高效与精准,针对不同的软件系统适用性高。
下文中,将参考图1,对软件体系结构恢复方法进行详细描述。
参考图1,软件体系结构恢复方法包括:步骤S102,使用JDT工具提取软件项目的源代码静态信息并存储于数据库中。具体地,源代码静态信息包括结构信息和文本信息,其中,结构信息包括软件项目目录中包含的项目、包和类文件的结构元素;以及文本信息包括标识符名称、命名片段和出现位置。
在提取源代码静态信息并存储于数据库中之后,进入步骤S104,基于所述源代码静态信息生成软件体系结构的特征矩阵。基于源代码静态信息生成软件体系结构恢复的特征矩阵包括:基于特征生成规则选择特征类别,其中,当包括m个类C1-Cm和n个命名片段A1-An时,特征生成规则包括:基于类C1-Cm,得到调用类Cx的特征并记为f1Cx,其中,m为正整数,x为1至m的正整数,对应m个类,得到该特征类别对应的m个特征;基于类C1-Cm,得到继承类Cx的特征并记为f2Cx,对应m个类,得到该特征类别对应的m个特征;当类C1-Cm是接口时,得到是接口的特征并记为f3;以及当类C1-Cm包含命名片段Ay时,得到包含命名片段Ay的特征并记为f4Ay,其中,n为正整数,y为1至n的正整数;对应n个命名片段,得到该特征类别对应的n个特征;以及基于特征类别,生成特征向量(f1Cx,f2Cx,f3,f4Ay),所述特征向量包括2m+n+1个特征;其中,软件项目中所有类的特征向量形成特征矩阵。
在生成软件体系结构的特征矩阵之后,进入步骤S106,基于开源软件社区的同类软件项目数据获得特征权重。基于开源软件社区的同类软件项目数据获得特征权重进一步包括:从开源软件社区中选择与要进行软件体系结构恢复的软件系统相同或相似的项目作为训练数据;以及基于训练数据通过遗传算法训练特征权重;其中,遗传算法包括基因编码步骤、适应性函数步骤和基因操作步骤,以及在遗传算法收敛或者达到最大代数后,获得自动配置的特征权重,基因编码步骤将特征权重向量编码为二进制特征权重;适应性函数步骤使用适应性函数评价基因的优劣;以及基因操作步骤利用现有基因生成子代基因。基因操作包括选择操作、交叉操作、和变异操作。
在获得特征权重之后,进入步骤S108,基于配置有特征权重的特征矩阵恢复所述软件体系结构。具体地,基于配置有特征权重的特征矩阵恢复软件体系结构进一步包括:使用LIMBO层次聚类计算实体件相似度,其中,LIMBO层次聚类选择信息熵损失最少的两个实体进行聚类;合并的实体作为新实体与其他实体进行逐层聚类;以及根据用户指定的聚类数量,恢复软件体系结构。
另外,在恢复所述软件体系结构之后,软件体系结构恢复方法还包括:基于AMDL建模工具使恢复的软件体系结构模型可视化;以及使用软件体系结构评估指标,评估软件体系结构恢复结果。
下文中,将参考图2至图6,以具体实例的方式对软件体系结构恢复方法进行详细描述。
本发明提供基于开源项目的群智化软件体系结构恢复技术,其实现步骤包括:
步骤一:源代码的静态信息提取与存储:使用JDT工具提取用于软件体系结构恢复的源代码静态信息,包括结构信息、元素关系信息、文本信息,将提取的信息存储于本发明设计的数据结构中。
步骤二:软件体系结构恢复的特征矩阵生成:将步骤一中所提取的源代码静态信息作为软件体系结构恢复所需的特征。基于这些特征,为所有代码级实体生成特征向量,最终形成特征矩阵。
步骤三:基于开源项目代码学习的特征权重自动配置:选取与目标项目功能和开发风格类似的开源项目作为训练数据,利用类似的开源项目数据体现体系结构共性特征这一特点,采用遗传算法学习特征权重值,分配给步骤二中得到的特征。
步骤四:基于层次聚类的体系结构恢复:通过层次聚类算法,,使用步骤三得到的特征权重,赋予给特征矩阵。通过特征矩阵,计算代码级实体间的相似度,将相似度高的实体聚集为一个聚类,最终的聚类结果作为软件体系结构的构件。
步骤五:基于AMDL建模工具的软件体系结构模型可视化:通过AMDL建模工具展示出恢复后的体系结构模型。
步骤六:软件体系结构恢复结果评估:使用软件体系结构评估指标,通过实验验证本发明的源码特征权重自动配置优于本发明的前期工作(该工作为人工配置),能够有效提高软件体系结构恢复技术的精确度,并且也优于目前无源码特征权重配置的方法。
本发明的优点和积极效果在于:(1)本发明方法有效地使用开源软件项目作为训练数据,自动学习目标项目源码的特征权重,充分发挥不同源码特征在软件体系结构恢复过程中的重要性,使用源码特征权重自动配置,恢复得到更精确的软件体系结构;(2)本发明方法使用AMDL建模工具,通过可视化技术展示出恢复后的软件体系结构模型,增强了软件体系结构的可理解性。
图2示出了软件体系结构恢复技术整体流程图,下面将详细说明本发明的技术方案。
1、源代码的静态信息提取与存储:使用JDT工具提取用于软件体系结构恢复的源代码静态信息,包括结构信息、元素关系信息、文本信息。
(1)结构信息:对于Java语言开发的项目,项目是通过包的目录形式组织的,目录中包含项目、包、类文件等结构元素。项目、包和类都是本发明的关注的元素,需要提取的具体信息种类如表1所示。
表1结构信息种类及其说明
类文件的内部元素包括了包声明、导入声明、类声明、字段声明、继承声明、实现声明、字段声明、方法声明等一系列元素,这些元素是面向对象模型中重要的组成部分,构成了类的骨架,是体系结构关心的特征。所以类文件中需要提取的具体信息种类如表2所示。
表2从软件系统的类文件中提取的静态结构信息种类
(2)元素关系信息:元素之间的关系都在类文件的内部声明,并通过端口暴露给其他构件。对于Java语言项目,需要提取的信息如表3所示。
表3元素关系信息种类及其说明
(3)文本信息:代码在编写的过程中会形成一种开发风格(Coding style),产生特定的数据工作流、命名风格并影响开发人员使用的接口,另外,实现相同功能或者相似功能的实体会在标识符的命名上具有一定的相似性。例如在Spring框架中,Controller层的类文件会倾向于命名为XXController。因此,标识符名称、命名片段和标识符出现的位置等特征需要提取。需要提取的文本信息如表4所示。
表4文本信息种类及其说明
依据上述对数据和相关操作的分析,本发明设计数据结构并绘制类图,如图3所示。其中,ProjectInfo为最重要的数据结构,以Map结构为核心的存储容器,能够通过全限定名快速地在整个项目的范围内获取到指定的包或类元素,也避免了通过包递归查询所有的类元素;ClassInfo是另外一个重要的数据结构,能够作为字段、方法、关系的索引;ProjectInfo中会对所有标识符、命名片段和出现位置进行存储和统计,该功能会委托给RouterWordCounter完成,而ClassInfo中会对命名片段进行存储和统计,委托给BasicWordCounter完成。由于ProjectInfo能够持有所有对象的引用,因此在信息抽取完成之后,只需要在模块间传递ProjectInfo的对象的引用,即可访问所有信息。
为了获取Java源码中的信息,需要将源码文件转换为抽象语法树(AbstractSyntax Tree)。JDT是一套基于Eclipse且包含词法分析和语法分析的开源组件,能够直接将工作空间中的Java资源转换为其内部实现的AST对象。本发明涉及的源码信息抽取组件和核心类类图如图4所示。
设计模式中的访问者设计模式能够对遍历和访问操作进行抽象和分离,结合Java多态性,能够保证遍历和访问的方式具有较高的可扩展性。其中,文件目录遍历者BaseWalker及其子类负责对AST节点的遍历,文件目录访问者BaseJdtVisitor及其子类负责对AST节点的访问,并在访问的过程中,收集项目元素、包元素和元素间的包含关系等静态结构信息;类文件访问者JdtCompilationUnitDomVisitor负责从AST节点对应的JavaModel对象中访问类文件中的静态结构信息。因此,图4所示的结构实现了遍历与访问的职责分离。
对于可扩展性,JdtCompilationUnitDBWalker是遍历器的另外一种实现,会在提取到完整的类文件信息后,将提取的信息保存至数据库中。简单分析可知,将提取的信息由内存存储转换为数据库存储时,只需要在初始化BaseWalker时使用JdtCompilationUnitDBWalker即可。同理,如果必须重新实现词法分析器和语法分析器以满足特定需求,只需要派生抽象类BaseJdtVisitor并在实例化时使用新的子类即可,具有较高的可扩展性。
2、软件体系结构恢复的特征矩阵生成:将第1步中所提取的源代码静态信息经过筛选后作为软件体系结构恢复的特征,基于这些特征,为所有代码级实体生成特征向量,最终形成特征矩阵。
(1)特征类别的选择
当软件项目中包括m个类C1-Cm和n个命名片段A1-An时,特征生成规则包括:
a、基于类C1-Cm,得到调用类Cx的特征并记为f1Cx,其中,m为正整数,x为1至m的正整数;
b、基于类C1-Cm,得到继承类Cx的特征并记为f2Cx;
c、当类C1-Cm是接口时,得到是接口的特征并记为f3;以及
d、当类C1-Cm包含命名片段Ay时,得到包含命名片段Ay的特征并记为f4Ay,其中,n为正整数,x为1至n的正整数。
每一种特征生成规则对应1种特征类别,得到选择的4种特征类别,例如,调用类Cx的特征、继承类Cx的特征、接口的特征和包含命名片段Ay的特征。
(2)特征向量与特征矩阵的生成
特征向量由实体的特征值构成,特征的值算法在初始化时一般是二元的,用1来表示实体具有该特征,而用0表示实体不具有该特征。基于选择的上述4种特征类别,每个类都具有一个特征向量(f1Cx,f2Cx,f3,f4Ay),特征向量包括2m+n+1个特征;最终软件项目中所有的类均形成特征矩阵,其中m是软件项目中所具有的类的数量,f1Cx可以为向量f1C1,…,f1Cm;f2Cx可以为向量f2C1,…,f2Cm;f4Ay可以为向量f4A1,…,f4An,以及f1Cx,f2Cx和f4Ay是特征类别。这些特征类别并不是具体的特征,而是特征选择规则。例如,每当从软件系统中给定一个类C,都可以得到一组特征(f1Cx,f2Cx),每给定一个命名片段A,可以得到一个特征f4Ay。因此,假设软件项目中包含m个类,n个命名片段,则能够为该软件系统创建(2m+n+1)个特征。这些特征组成了描述一个类文件的(2m+n+1)维的特征向量,组成维度为m*(2m+n+1)的特征矩阵。
3、基于开源项目代码学习的特征权重自动配置:
选取与目标项目功能和开发风格类似的开源软件项目,作为目标项目的体系结构恢复学习数据。本发明认为框架特征对同一个框架下开发的软件系统的影响方式是相似的,所以,从相似的软件系统源码中能够学习到开发框架特征应当如何影响聚类结果,即如果某种权重配置方案能够对基于开发框架的一组软件系统的进行聚类平均精确度最高,理论上权重配置方案也能够在基于开发的另一软件系统上获得较好的聚类精确度。
不同的软件的开发风格不同。一些软件系统的各模块结构内聚性较高,模块内的实体相互交互,相互调用,共同完成同一个功能,为其他模块提供服务;而一些软件系统的各模块语义内聚性较高,模块内的实体可能在结构上没有调用关系,但是它们的功能是相同或者相似的。例如基于Spring开发框架开发的软件系统,软件架构师和开发人员通常将具有控制器职责,即完成控制功能的实体放在同一模块中,这些实体虽然不互相调用,在结构上没有关系,但是它们之间具有很强的语义内聚性。所以要恢复不同风格的软件的体系结构,显然需要发挥不同源码特征的作用。
本发明的前期工作使用人工配置的方法为不同的源码特征配置权重,对于不理解设计架构的人员来说,很难针对不同风格的软件,精准地配置特征权重,将降低软件体系结构恢复的精确度,导致软件体系结构恢复方向发生偏移。
本发明基于开源软件社区的大量同类软件项目数据,自动学习目标项目的架构特征权重。与前期工作的区别在于使用了开源项目数据,提出了群智化的软件体系结构恢复方法。前期提出的体系结构恢复方法中已经包含了特征权重的概念,但该权重是由开发人员根据对目标项目的理解,人工配置获得权重,并未基于开源数据从群体智慧中学习。
首先使用与将进行体系结构恢复的软件系统相同或相似的项目作为训练数据,再引用遗传算法训练源码特征权重,最终得到特征权重,分配给特征矩阵,发挥出不同源码特征在软件体系结构恢复中的作用。源码特征权重训练过程如图5所示。需要说明的是,本方法对步骤3中提出的特征类进行权重配置,而不是对每个特征类中的每个特征单独进行配置。
(1)基因编码
本发明假定特征的权重的变化范围为0-127,则每一个权重需要7bit的二进制片段进行表示,因此将上述4类特征的所有二进制片段连接后,能够将特征权重向量转换为一条长度为28bit的二进制数,例如特征权重向量为(127,0,78,32),则转换成二进制后为(111111100000001001110100000),转换成二进制后便于进行基因操作。
(2)适应性函数
在遗传算法中,适应性函数用于评价基因的优劣,而优劣决定了基因能够存活到下一代的可能性。在本发明中,适应性函数事实上是用于评价基因对应的特征权重的优劣程度,可以对一批软件系统的平均聚类精确度作为评价,平均聚类精确度越高,则其对应的基因,即特征权重存活下的几率越大,否则反之。我们使用的适应性函数如下所示。
公式解释:假定某软件体系划分标准Cinit,在抹除所有的文件的包层次结构信息后,对所有的文件执行软件体系结构恢复算法,得到新的划分方式Cnew,则将两种划分方式的重合程度作为聚类精确度的衡量指标。其中,Ci init是标准划分中的第i个分组,Ci new是聚类结果中的第i个分组。具有较高的聚类精确度的基因将被选中,淘汰聚类精确度低的基因。
(3)基因操作
选择、交叉、变异操作主要用于利用现有的基因生成子代基因,在遗传算法的种群初始化完毕之后,基因操作是种群进化的主要推动力。
1)选择操作:负责从当前种群中选择交配的父基因,基本遗传算法中使用的选择方案是轮转法。轮转法认为每个个体被选中的概率与基因的适应性函数分值成正比。在从种群中选出两个父基因之后,即可进行交叉操作。
2)交叉操作:对当前解周围的空间进行探索的操作,本文所使用的交叉操作会从28bit的二进制数中选择一段区间,并交换两个父基因该区间的基因片段。在交叉后,新一对生成的基因,其中每一个基因都包含父基因的一段片段。该操作可以视作特征权重在解空间中发生了一次位移,由于选中的双亲是优质基因的概率比较大,因此交叉操作有较大的概率是特征权重在解空间在最优解的方向上的一次尝试。如果尝试的结果获得了更好的基因,则下次迭代的过程中仍然有较高的概率被选中,而如果获得了非常差的基因,则可能在下一代选择双亲的阶段中被淘汰,以此来保证聚类权重在聚类精确度最优解的方向搜索。例如当两个双亲基因分别是:111111100000001001110100000和110011101010001001110100000时,将第3、4位执行交叉操作后,得到的新基因分别为110011100000001001110100000和111111101010001001110100000。
3)变异操作:在基础遗传算法中随机挑选一位二进制位进行翻转操作。变异操作是基因拷贝出错的自然现象启发而来,目标是能够让遗传算法具有局部的随机搜索能力,在当前解周围随机变化以加速收敛;另外变异操作也是对种群多样性的维持,减缓种群中基因的趋同,防止出现解过早地收敛在局部。例如基因111111100000001001110100000,将第2位从1突变为0后,得到新基因101111100000001001110100000。
当遗传算法收敛或者达到最大代数后,我们能够得到较优的特征权重。针对不同的项目,该算法会得到不同的特征权重。
4、基于层次聚类的体系结构恢复:使用第3步得到的赋予权重的特征矩阵,计算代码级实体间的相似度,该相似度计算方法是基于信息熵理论的,我们选择信息熵损失最少的两个实体进行聚类,最终的聚类结果作为软件体系结构的构件。
本发明在计算实体间相似度的过程中,使用LIMBO层次聚类作为体系结构恢复的算法。LIMBO算法基于信息熵理论,在每一轮迭代中选择合并后信息损失最小的两个实体合并,合并后的实体作为新的实体和其他实体进行逐层聚类。用户可指定聚类数量,恢复得到指定构件数的软件体系结构。
5、基于AMDL建模工具的软件体系结构模型可视化:
第4步恢复后的软件体系结构是一种中间结构,保存于本发明所设计的ClusterResult类中。为了提供给AMDL建模工具进行展示,本发明使用RPC技术,将恢复结构转换为XML格式的文件传输到AMDL工具中。AMDL工具自动解析该XML文件,将XML文件中的标签映射为对应的AMDL元素,最终形成图形化的软件体系结构模型(参考图6),增强恢复后软件体系结构的可理解性。
6、软件体系结构恢复结果评估:
首先本发明与前期工作进行对比。这些软件系统来自于Github网站中具有较高评星的项目。其中权重1,权重10,权重100,自动配置分别表示人工手动配置的特征权重数量级为1,数量级为10,数量级为100,以及使用本发明提出的特征权重自动配置方法得到的特征权重,进行软件体系结构恢复后的聚类精确度。聚类精确度算法为(在上面提及过)
公式解释:假定某软件体系划分标准Cinit,在抹除所有的文件的包层次结构信息后,对所有的文件执行软件体系结构恢复算法,得到新的划分方式Cnew,则将两种划分方式的重合程度作为聚类精确度的衡量指标。其中,Ci init是标准划分中的第i个分组,Ci new是聚类结果中的第i个分组。
本发明选取了两种框架风格的软件系统作为实验对象,分别为Spring和Struts风格的软件系统,这些软件系统分别为:Spring风格的软件系统有act、cms、gen、oa、sys和SpringBlog,Struts风格的软件系统有easyee-ssh-base、easyee-ssh-sys和B2CWEB。针对这些软件系统选取的开源项目包含:
作为Spring框架的训练开源项目:ssm-maven、ssm-cluster、perfect-ssm、tianti-common、AdminEAP-activiti和AdminEAP-query
作为Struts框架的训练开源项目:easyee-ssh-hr、structs2shop和struts2-spring-hibernate
测试集实验结果:
表5 Spring框架风格的测试集软件项目的恢复精确度
表6 Struts框架风格的测试集软件项目的恢复精确度
另外,本发明与其他没有使用特征权重或者只利用当前项目挖掘开发风格中的特征权重的方法比较软件体系结构恢复的精确度,分析本发明提出方法的有效性、权威性与通用性。本发明使用的评价指标为MoJoFM,该指标是软件体系结构恢复领域所认可的。该指标用于比较两个软件体系结构的相似度,数值单位为百分比,MoJoFM值越高,表示两个体系结构的相似度越高,否则反之。将使用软件体系结构恢复技术恢复后的体系结构与标准集的体系结构作为该评价指标算法的输入,得到两者之间的相似度。本发明提出的方法和目前流行方法的效果对比如表7所示。
表7本发明提出的方法与其他方法在软件体系结构恢复精确度中的对比
从整体数据中可以看出,本发明对源码特征权重进行自动配置,进行软件体系结构恢复后,得到的软件体系结构精的确度,不仅优于无特征权重的方法,而且优于前期工作的人工配置方法。本实验验证了本发明的有效性、权威性与通用性。
下文中,将参考图7,对软件体系结构恢复装置进行描述。
参考图7,软件体系结构恢复装置包括:提取存储模块702,用于使用JDT工具提取软件项目的源代码静态信息并存储于数据库中;特征矩阵生成模块704,用于基于源代码静态信息生成软件体系结构的特征矩阵;特征权重获取模块706,用于基于开源软件社区中的同类软件项目数据获得特征权重;以及恢复模块708,用于基于配置有优化的特征权重的特征矩阵恢复软件项目的软件体系结构。具体地,源代码静态信息包括结构信息和文本信息,其中,结构信息包括软件项目目录中包含的项目、包和类文件的结构元素;以及文本信息包括标识符名称、命名片段、和出现位置。
特征权重获取模块包括:训练数据获取子模块,从开源软件社区中选择与要进行软件体系结构恢复的软件系统相同或相似的项目作为训练数据;以及训练子模块,基于训练数据通过遗传算法训练特征权重;其中,遗传算法包括基因编码步骤、适应性函数步骤和基因操作步骤,以及在遗传算法收敛或者达到最大代数后,获得自动配置的特征权重,基因编码步骤将特征权重向量编码为二进制特征权重;适应性函数步骤使用适应性函数评价基因的优劣;以及基因操作步骤利用现有基因生成子代基因。
软件体系结构恢复装置还包括多个其他模块,由于软件体系结构恢复装置与软件体系结构恢复方法相对应,所以本文中省略了对于多个其他模块的详细描述以避免赘述。
与现有技术相比,本发明至少可实现如下有益效果之一:
1、利用开源软件项目,从群体软件开发智慧中学习体系结构恢复的特征权重,弥补了现有方法只利用当前项目挖掘开发风格中的特征权重的问题,提高了恢复精确度,而且相较于前期工作的人工手动配置源码特征权重更加高效与精准,针对不同的软件系统适用性高;
2、本发明的方法恢复得到软件体系结构更加精确,能够更好地帮助开发和维护人员去理解软件系统;以及
3、通过AMDL建模工具,将软件体系结构模型可视化,展示出恢复后的软件体系结构,解决了目前技术缺少恢复后结果可视化的问题,提高了恢复后软件体系结构的可理解性。
本领域技术人员可以理解,实现上述实施例方法的全部或部分流程,可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于计算机可读存储介质中。其中,所述计算机可读存储介质为磁盘、光盘、只读存储记忆体或随机存储记忆体等。
以上所述,仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。
Claims (7)
1.一种软件体系结构恢复方法,其特征在于,包括:
使用JDT工具提取软件项目的源代码静态信息并存储于数据库中;
基于所述源代码静态信息生成软件体系结构的特征矩阵,其中,基于所述源代码静态信息生成软件体系结构恢复的特征矩阵包括:基于特征生成规则选择特征类别,其中,当包括m个类C1-Cm和n个命名片段A1-An时,所述特征生成规则包括:基于所述类C1-Cm,得到调用类Cx的特征并记为f1Cx,其中,m为正整数,x为1至m的正整数;基于所述类C1-Cm,得到继承类Cx的特征并记为f2Cx;当类C1-Cm是接口时,得到是接口的特征并记为f3;以及当类C1-Cm包含命名片段Ay时,得到包含命名片段Ay的特征并记为f4Ay,其中,n为正整数,y为1至n的正整数;以及基于所述特征类别,生成特征向量(f1Cx,f2Cx,f3,f4Ay),所述特征向量包括2m+n+1个特征;其中,软件项目中所有类的特征向量形成所述特征矩阵;
基于开源软件社区的同类软件项目数据获得特征权重,其中,基于开源软件社区的同类软件项目数据获得特征权重进一步包括:从开源软件社区中选择与要进行软件体系结构恢复的软件系统相同或相似的项目作为训练数据;以及基于所述训练数据通过遗传算法训练所述特征权重;其中,所述遗传算法包括基因编码步骤、适应性函数步骤和基因操作步骤,以及在所述遗传算法收敛或者达到最大代数后,获得自动配置的所述特征权重,所述基因编码步骤将所述特征权重向量编码为二进制特征权重;所述适应性函数步骤使用适应性函数评价基因的优劣;以及基因操作步骤利用现有基因生成子代基因;以及
基于配置有特征权重的特征矩阵恢复所述软件项目的软件体系结构。
2.根据权利要求1所述的软件体系结构恢复方法,其特征在于,所述源代码静态信息包括结构信息和文本信息,其中,
所述结构信息包括软件项目目录中包含的项目、包和类文件的结构元素;以及
所述文本信息包括标识符名称、命名片段和出现位置。
3.根据权利要求1所述的软件体系结构恢复方法,其特征在于,所述基因操作包括选择操作、交叉操作、和变异操作。
4.根据权利要求1所述的软件体系结构恢复方法,其特征在于,基于配置有所述特征权重的特征矩阵恢复所述软件体系结构进一步包括:
使用LIMBO层次聚类计算实体件相似度,其中,所述LIMBO层次聚类选择信息熵损失最少的两个实体进行聚类;
合并的实体作为新实体与其他实体进行逐层聚类;以及
根据用户指定的聚类数量,恢复所述软件体系结构。
5.根据权利要求1所述的软件体系结构恢复方法,其特征在于,所述软件体系结构恢复方法还包括:
基于AMDL建模工具使恢复的所述软件体系结构模型可视化;以及
使用软件体系结构评估指标,评估所述软件体系结构恢复结果。
6.一种软件体系结构恢复装置,其特征在于,包括:
提取存储模块,用于使用JDT工具提取软件项目的源代码静态信息并存储于数据库中;
特征矩阵生成模块,用于基于所述源代码静态信息生成软件体系结构的特征矩阵,其中,基于所述源代码静态信息生成软件体系结构的特征矩阵包括:基于特征生成规则选择特征类别,其中,当包括m个类C1-Cm和n个命名片段A1-An时,所述特征生成规则包括:基于所述类C1-Cm,得到调用类Cx的特征并记为f1Cx,其中,m为正整数,x为1至m的正整数;基于所述类C1-Cm,得到继承类Cx的特征并记为f2Cx;当类C1-Cm是接口时,得到是接口的特征并记为f3;以及当类C1-Cm包含命名片段Ay时,得到包含命名片段Ay的特征并记为f4Ay,其中,n为正整数,y为1至n的正整数;以及基于所述特征类别,生成特征向量(f1Cx,f2Cx,f3,f4Ay),所述特征向量包括2m+n+1个特征;其中,软件项目中所有类的特征向量形成所述特征矩阵;
特征权重获取模块,用于基于开源软件社区中的同类软件项目数据获得特征权重,其中,所述特征权重获取模块进一步包括:训练数据获取子模块,从开源软件社区中选择与要进行软件体系结构恢复的软件系统相同或相似的项目作为训练数据;以及训练子模块,基于所述训练数据通过遗传算法训练所述特征权重;其中,所述遗传算法包括基因编码步骤、适应性函数步骤和基因操作步骤,以及在所述遗传算法收敛或者达到最大代数后,获得自动配置的所述特征权重,所述基因编码步骤将所述特征权重向量编码为二进制特征权重;所述适应性函数步骤使用适应性函数评价基因的优劣;以及基因操作步骤利用现有基因生成子代基因;以及
恢复模块,用于基于配置有优化的特征权重的特征矩阵恢复所述软件项目的软件体系结构。
7.根据权利要求6所述的软件体系结构恢复装置,其特征在于,所述源代码静态信息包括结构信息和文本信息,其中,
所述结构信息包括软件项目目录中包含的项目、包和类文件的结构元素;以及
所述文本信息包括标识符名称、命名片段、和出现位置。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010750819.5A CN111857691B (zh) | 2020-07-28 | 2020-07-28 | 一种软件体系结构恢复方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010750819.5A CN111857691B (zh) | 2020-07-28 | 2020-07-28 | 一种软件体系结构恢复方法和装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN111857691A CN111857691A (zh) | 2020-10-30 |
CN111857691B true CN111857691B (zh) | 2021-07-23 |
Family
ID=72945529
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010750819.5A Active CN111857691B (zh) | 2020-07-28 | 2020-07-28 | 一种软件体系结构恢复方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN111857691B (zh) |
Families Citing this family (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111857691B (zh) * | 2020-07-28 | 2021-07-23 | 北京航空航天大学 | 一种软件体系结构恢复方法和装置 |
CN112947995B (zh) * | 2021-03-03 | 2022-07-26 | 北京航空航天大学 | 一种Java项目的体系结构策略定位方法及系统 |
CN112988216B (zh) * | 2021-03-12 | 2022-07-29 | 北京航空航天大学 | 一种基于功能结构的软件体系结构恢复方法 |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105303450A (zh) * | 2015-11-09 | 2016-02-03 | 北京工业大学 | 基于谱聚类改进交叉的复杂网络社区发现方法 |
CN109992271A (zh) * | 2019-03-31 | 2019-07-09 | 东南大学 | 一种基于代码词汇和结构依赖的分层架构识别方法 |
CN110597735A (zh) * | 2019-09-25 | 2019-12-20 | 北京航空航天大学 | 一种面向开源软件缺陷特征深度学习的软件缺陷预测方法 |
CN111222847A (zh) * | 2019-12-29 | 2020-06-02 | 东南大学 | 基于深度学习与非监督聚类的开源社区开发者推荐方法 |
CN111240897A (zh) * | 2020-01-07 | 2020-06-05 | 腾讯科技(深圳)有限公司 | 一种数据处理方法及相关设备 |
CN111857691A (zh) * | 2020-07-28 | 2020-10-30 | 北京航空航天大学 | 一种软件体系结构恢复方法和装置 |
Family Cites Families (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20120054081A1 (en) * | 2010-08-24 | 2012-03-01 | Automated Equity Finance Markets, Inc. | Recovery from participant default in a securities lending transaction |
CN106201465B (zh) * | 2016-06-23 | 2020-08-21 | 扬州大学 | 面向开源社区的软件项目个性化推荐方法 |
CN109768924B (zh) * | 2019-02-14 | 2021-06-08 | 山东省计算中心(国家超级计算济南中心) | 一种面向多流共存的sdn网络多链路故障恢复方法及系统 |
CN110688456A (zh) * | 2019-09-25 | 2020-01-14 | 北京计算机技术及应用研究所 | 一种基于知识图谱的漏洞知识库构建方法 |
CN111224942B (zh) * | 2019-11-20 | 2021-11-16 | 重庆邮电大学 | 基于三元关联图检测的恶意软件传播控制方法及装置 |
-
2020
- 2020-07-28 CN CN202010750819.5A patent/CN111857691B/zh active Active
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105303450A (zh) * | 2015-11-09 | 2016-02-03 | 北京工业大学 | 基于谱聚类改进交叉的复杂网络社区发现方法 |
CN109992271A (zh) * | 2019-03-31 | 2019-07-09 | 东南大学 | 一种基于代码词汇和结构依赖的分层架构识别方法 |
CN110597735A (zh) * | 2019-09-25 | 2019-12-20 | 北京航空航天大学 | 一种面向开源软件缺陷特征深度学习的软件缺陷预测方法 |
CN111222847A (zh) * | 2019-12-29 | 2020-06-02 | 东南大学 | 基于深度学习与非监督聚类的开源社区开发者推荐方法 |
CN111240897A (zh) * | 2020-01-07 | 2020-06-05 | 腾讯科技(深圳)有限公司 | 一种数据处理方法及相关设备 |
CN111857691A (zh) * | 2020-07-28 | 2020-10-30 | 北京航空航天大学 | 一种软件体系结构恢复方法和装置 |
Non-Patent Citations (1)
Title |
---|
《一种基于层次聚类的软件架构恢复方法》;李寒等;《计算机科学》;20170430;第75-78页 * |
Also Published As
Publication number | Publication date |
---|---|
CN111857691A (zh) | 2020-10-30 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN111857691B (zh) | 一种软件体系结构恢复方法和装置 | |
Meier et al. | SQL & NoSQL databases | |
CN102341781B (zh) | 软件测试台生成 | |
Saks | JavaScript Frameworks: Angular vs React vs Vue. | |
O’Madadhain et al. | Analysis and visualization of network data using JUNG | |
CN100498763C (zh) | 一种使用应用程序处理数据的方法 | |
Beck et al. | Visual comparison of software architectures | |
CN106716342A (zh) | 数据沿袭概括 | |
US10474657B2 (en) | Augmenting relational databases via database structure graph | |
CN112667735A (zh) | 一种基于大数据的可视化模型建立分析系统和方法 | |
Wang et al. | Visual genealogy of deep neural networks | |
US20050216501A1 (en) | System and method of providing and utilizing an object schema to facilitate mapping between disparate domains | |
Qian et al. | Mining logical clones in software: Revealing high-level business and programming rules | |
CN115756477A (zh) | 一种基于多路智能推荐的低代码集成开发系统 | |
CN109582294A (zh) | 一种内嵌式机器学习系统的软件体系结构设计方法 | |
Proper | Data schema design as a schema evolution process | |
Yang et al. | User story clustering in agile development: a framework and an empirical study | |
Xiao et al. | ChoroWare: a software toolkit for choropleth map classification | |
Mou et al. | Visual life sciences workflow design using distributed and heterogeneous resources | |
Nguyen | Model-based version and configuration management for a web engineering lifecycle | |
Belaid et al. | An Ontology and Indexation based Management of Services and Workflows Application to Geological Modeling. | |
Alifi et al. | Relational data modeling on the document-based NoSQL | |
CN100403788C (zh) | 用于处理视听内容的描述的方法和系统 | |
Beznosov | Architecture of information enterprises: Problems and perspectives | |
Alanazi | Software Analytics for Improving Program Comprehension |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant | ||
TR01 | Transfer of patent right |
Effective date of registration: 20220120 Address after: 215488 No. 301, building 11, phase II, Taicang University Science Park, No. 27, Zigang Road, science and education new town, Taicang City, Suzhou City, Jiangsu Province Patentee after: Tianhang Changying (Jiangsu) Technology Co.,Ltd. Address before: 100191 No. 37, Haidian District, Beijing, Xueyuan Road Patentee before: BEIHANG University |
|
TR01 | Transfer of patent right |