当前位置: 首页 > 专利查询>东南大学专利>正文

一种基于代码词汇和结构依赖的分层架构识别方法技术

技术编号:21570821 阅读:28 留言:0更新日期:2019-07-10 15:14
本发明专利技术提出了一种基于代码词汇和结构依赖的分层架构识别方法,通过提取源代码中的关键词汇进行职责聚类,再利用程序实体之间的依赖进行软件系统层次的识别;结合了分层模式的特征与应用场景,识别精度更高,识别结果更容易帮助设计人员理解系统现有状态。

A Layered Architecture Recognition Method Based on Code Vocabulary and Structure Dependence

【技术实现步骤摘要】
一种基于代码词汇和结构依赖的分层架构识别方法
本专利技术是一种基于代码词汇和结构依赖的分层架构识别方法,主要用于架构偏移和文档缺失的情况下逆向进行系统分层结构恢复问题。
技术介绍
软件系统随着演进过程会变得越来越复杂,但是系统架构信息却没有及时同步跟新和文档化,这就导致现有软件系统的架构随时间推移往往会偏离原始架构。架构信息缺失与架构偏移问题会随着系统演进愈发严重,在软件架构或结构复杂性得不到有效控制的情况下,最终导致软件系统生命周期走向终结,无法持续演进。为解决这类问题,业界多采用架构恢复的方法尽量获取现有系统的真实架构信息,并借此帮助理解现有软件系统和发现潜在的架构设计缺陷,进而及时进行架构重构,从而降低软件系统维护的难度和成本,最终保证软件能够持续演进。然而,通用的架构恢复方法并没有考虑到软件系统设计过程中经常会使用架构模式。因此设计一个针对分层模式的定向架构恢复方法十分必要。目前的研究针对分层模式的定向架构恢复主要基于程序实体之间的结构依赖关系,即直接在程序依赖图上进行分层模式识别,这类做法忽视了分层模式主要用作系统关注点分离的特性,从而导致恢复结果与目标系统实际层次比较差距较大。因此,提取分层模式本身的特征,再利用模式的特征反过来进行定向的恢复是本专利技术所关注的问题。
技术实现思路
本专利技术的目的是提供一种基于代码词汇和结构依赖的分层架构识别方法,用于在文档丢失和架构偏移情况下获取目标软件系统的分层架构视图,分层架构视图不仅能帮助开发维护人员从层次依赖结构角度更深入地了解整个软件系统的实现,降低复杂系统的理解难度,而且能帮助发现目标系统层次结构中出现的分层违例情况进而获取潜在架构重构需求,最终协助进行重构。为实现上述目的,采用如下技术方案:一种基于代码词汇和结构依赖的分层架构识别方法,考虑了分层模式的特征以及应用场景,再逆向使用这些特征进行分层结构识别,所述方法包括如下步骤:整体流程分为三个步骤:步骤1)通过静态分析程序源代码获得目标系统中所有package对应的关键词集合W(关键词即代码中的标识符,如类名、方法名、参数名)、程序实体之间的依赖关系集合E(依赖的类型包括四种:继承inherit、实现implement、组合composition、聚合aggregate);步骤2)基于步骤1)中所提取的关键词集合W进行源代码词汇主题提取,获得程序中暗含的主题集合T以及每个package对应的主题向量分布集合V,并基于每个package对应的向量分布进行聚类获得抽象粒度更高的组件集合C;步骤3)结合步骤1)提取的程序依赖集合E推导出组件之间的依赖集合Ec,并基于步骤2)获得的组件集合C得到组件依赖图G,并基于分层模式特征在组件依赖图G上进行层次识别获得系统现有状态下的软件层次集合L;本专利技术所提出的方法步骤1)具体流程如下:(11)通过静态代码分析工具将目标系统源代码转换为AST抽象语法树结构;(12)遍历AST树节点,从节点上提取源代码文件中相应位置的词汇以及程序实体之间的依赖关系;(13)利用正则表达式提取AST树无法获取的注释词汇;具体所要提取的代码词汇及程序实体依赖定义如下:a)每个package对应的词汇集合W={wp1,wp2,….,wpn},其中wpi为pi(pi为目标系统中的一个package,1≤i≤n,n为目标系统中package的数目)中程序实体所包含的全部关键词文本了;b)程序实体之间的依赖关系集合E={e1,e2,e3…,em},ei(1≤i≤m)代表的是程序实体之间的依赖边,e的两端是最小粒度的程序实体(如类);本专利技术步骤2)目标是基于信息提取所获得的词汇文本信息进行概念耦合聚类,最终获得系统每个层次中所包含的一定粒度的组件;本专利技术步骤2)背景如下:通过研究分层模式的特点,本专利技术发现分层原则认为层次式系统中每个层次都有具体的功能意义,而这个意义是由一组职责所支撑,且这一组职责处于相同的抽象级别。最上层的职责对应于最终用户感知的系统的整体功能,而较低层的职责则是为了帮助实现上层的职责。每个职责可能通过多个特定于一个具体领域的包(如GUI,Web界面)来实现。Infrastructure层的两个组件I/O和Network,又分别由三个package和两个package负责实现。经验研究发现一个层次的职责经常会被划分为更细的职责,每个细的职责(组件)可能由多个package共同负责实现。因此,负责实现相同职责的package应该先聚类在一起,然后再分配到层次中。每个聚类获得的组件都是由一组负责实现相类似职责的package组成,这个组件是个在功能职责上高内聚的package组。事实上,软件开发人员经常将他们的对系统的领域知识嵌入在散布在源代码各处的词汇信息中。词汇或文本信息(包括文件名、方法名、数据类型名称中的关键字)提供了对程序元素功能的暗示,传递了开发人员的意图,因此,词汇文本信息包含了有关系统实体职责的一些线索。本专利技术步骤2)具体流程如下:(21)基于词汇文本集合W进行预处理操作,对每个wpi中包含的词汇进行预处理操作得到新的词汇文本集合W’={w’p1w’p2,….,w’pn}(wpi经过预处理得到w’pi),预处理主要包含四个步骤:a)分词:将信息提取获得的标识符等词汇进行切分,并将所有词汇转化为小写。Java程序源代码中的驼峰式的标识符在经过分词后会得到两个以上独立的词;b)词干化:对英文关键词进行提取词干操作,抽取表达相同意义词汇的共同词根;c)过滤停用词:过滤一些编程语言中存在的关键字以及字母个数少于3的单个字符或字符串;d)针对出现在源代码不同位置(如类名,方法名,注释)的词汇进行不同等级的加权,加权操作即将wp不同位置的词汇进行不同数量级的复制,对类名中的关键词就重复更多次,参数名中的关键词就重复1次。(22)基于词汇文本集合W’进行LDA主题提取,提取得到相应主题T={t1,t2,t3…,tn}(3≤i≤10)以及每个package对应的主题向量分布集合V={vp1,vp2,vp3…,vpn},其中vpi对应的就是pi(即目标系统中的一个package)对应的主题分部向量,即为pi的功能语义特征向量;(23)基于package主题分布向量集合V计算package之间的功能相似度(即package对应主题向量v之间的余弦相似度),得到package之间相似度矩阵M,在M基础上将功能相似度高的package聚类到相同组件中,将功能相似度低的package聚类到不同组件中,最终得到系统抽象粒度更高的组件集合C={c_1,c_2,…,c_n}(c_i代表组件i,1≤i≤n);本专利技术步骤3)在恢复得到的系统组件基础上,结合信息提取过程中提取到的依赖关系,利用分层模式原则识别系统中存在的软件层次,具体流程如下:(31)基于步骤1)获得的程序实体之间的依赖边集合E={e1,e2,e3…,en}推算得到组件之间的依赖边集合Ec={ec1,ec2,ec3…,ecn},结合步骤2)获得的组件集合C生成组件依赖图G={Ec,C};(32)为了将步骤2)获得的组件分配到层次中,引入先前研究中所提到的增量层次依赖(ILD)属性。这个属性暗示着,如果在层次之间存在一些跨层次调用(本文档来自技高网...

【技术保护点】
1.一种基于代码词汇和结构依赖的分层架构识别方法,其特征在于,该方法包括如下步骤:步骤1)通过静态分析程序源代码获得目标系统中所有package对应的关键词集合W(关键词即代码中的标识符,包括类名、方法名、参数名)、程序实体之间的依赖关系集合E(依赖的类型包括四种:继承inherit、实现implement、组合composition、聚合aggregate);步骤2)基于步骤1)中所提取的关键词集合W进行源代码词汇主题提取,获得程序中暗含的主题集合T以及每个package对应的主题向量分布集合V,并基于每个package对应的向量分布进行聚类获得抽象粒度更高的组件集合C;步骤3)结合步骤1)提取的程序依赖集合E推导出组件之间的依赖集合Ec,结合基于步骤2)获得的组件集合C得到组件依赖图G,并基于分层模式特征在组件依赖图G上进行层次识别获得系统现有状态下的软件层次集合L。

【技术特征摘要】
1.一种基于代码词汇和结构依赖的分层架构识别方法,其特征在于,该方法包括如下步骤:步骤1)通过静态分析程序源代码获得目标系统中所有package对应的关键词集合W(关键词即代码中的标识符,包括类名、方法名、参数名)、程序实体之间的依赖关系集合E(依赖的类型包括四种:继承inherit、实现implement、组合composition、聚合aggregate);步骤2)基于步骤1)中所提取的关键词集合W进行源代码词汇主题提取,获得程序中暗含的主题集合T以及每个package对应的主题向量分布集合V,并基于每个package对应的向量分布进行聚类获得抽象粒度更高的组件集合C;步骤3)结合步骤1)提取的程序依赖集合E推导出组件之间的依赖集合Ec,结合基于步骤2)获得的组件集合C得到组件依赖图G,并基于分层模式特征在组件依赖图G上进行层次识别获得系统现有状态下的软件层次集合L。2.根据权利要求1中所述的基于代码词汇和结构依赖的分层架构识别方法,其特征在于,步骤1)中程序源码关键词汇集合与依赖关系集合的获取,具体如下:(11)通过静态代码分析工具将目标系统源代码转换为AST抽象语法树结构;(12)遍历AST树节点,从节点上提取源代码文件中相应位置的词汇以及程序实体之间的依赖关系;(13)利用正则表达式提取AST树无法获取的注释词汇;具体所要提取的代码词汇及程序实体依赖定义如下:a)每个package对应的词汇集合W={wp1,wp2,….,wpn},其中wpi为pi(pi为目标系统中的一个package,1≤i≤n,n为目标系统中package的数目)中程序实体所包含的全部关键词文本;b)程序实体之间的依赖关系集合E={e1,e2,e3…,em},ei(1≤i≤m,m为目标系统中程序实体依赖的总数量)代表的是程序实体之间的依赖边,e的两端是最小粒度的程序实体。3.根据权利要求1中所述的基于代码词汇和结构依赖的分层架构识别方法,其特征在于,所述步骤2)中对程序实体进行主题提取并聚类的方法,具体流程为:(21)基于词汇文本集合W进行预处理操作,对每个wpi中包含...

【专利技术属性】
技术研发人员:李必信杜鹏程王璐璐孔祥龙廖力周颖
申请(专利权)人:东南大学
类型:发明
国别省市:江苏,32

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1