针对面向对象程序设计语言源代码的软件可视化方法转让专利

申请号 : CN201010266831.5

文献号 : CN102385505B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 胡昌振王国强王崑声王志刚胡鹤洪孝金

申请人 : 北京理工大学

摘要 :

本发明涉及一种针对面向对象程序设计语言源代码的软件可视化方法,属于软件可视化技术领域。本发明包括如下步骤:①从源代码中提取关键信息;②获取原始图数据信息;③获取有向图数据信息;④设计图形布局;⑤进行可视化映射。本文提出了一种新的针对面向对象程序设计语言源代码的软件可视化方法,弥补了类图用于软件可视化中的不足,能够更准确直观的反应软件的内部结构和软件内类的地位和作用,便于使用者快速获得软件设计层次上的理解。

权利要求 :

1.一种针对面向对象程序设计语言源代码的软件可视化方法,其特征在于:其具体操作步骤为:步骤一、从源代码中提取关键信息;

从待处理的面向对象程序设计语言源代码中提取关键信息;所述关键信息包括:类所在的包、类名、父类、继承方式、类的类型、类的修饰符、类所包含的嵌套类、类属性的类型、类属性的修饰符、类构造函数参数、类方法的名字、类方法的参数、类方法的返回值类型以及类方法的修饰符;

所述继承方式包括一般继承和接口实现两种继承方式;

所述类的类型包括抽象类型、接口类型、普通类型和不确定类型;

从所述关键信息中可以获取类间关系,类间关系包括:嵌套关系、继承关系、接口继承关系、组成关系、关联关系;

嵌套关系是从所述关键信息中“类所包含的嵌套类”信息中得到的;

组成关系是从所述关键信息中类的“类属性的类型”或“类构造函数的参数”信息中得到的;

关联关系是从所述关键信息中“类方法的参数”或“类方法的返回值的类型”信息中得到的;

继承关系和接口继承关系是从所述关键信息中“继承方式”信息中得到的;

步骤二、获取原始图数据信息;

将步骤一得到的关键信息,以类作为节点,类间关系作为边,按照表2所示的图的属性、表3所示的边的属性、表4所示的节点的属性的数据结构进行存储,即可得到一个仅包含节点名称和边名称的原始图数据信息;

表2存储关键信息的数据结构设计表1-图的属性 属性名称 数据类型

包含的节点的名称 文本

包含的边名称 文本

表3存储关键信息的数据结构设计表2-边的属性 属性名称 数据类型

与其邻接的节点的名称 文本

优先级 正整数

表4存储关键信息的数据结构设计表3-节点的属性 属性名称 数据类型

节点类型 正整数

节点名称 文本

节点上文本的内容 文本

节点所在文件的创建时间 正实数步骤三、获取有向图数据信息;

对步骤二得到原始图数据信息,依次使用冗余边的消减原则和存在环路时的消减原则进行处理,即可得到有向图数据信息;具体为:步骤3.1:对原始图数据信息使用冗余边的消减原则进行处理:设定V为原始图中节点的集合,节点A,B∈V,如果节点A和B之间有多于1条的连线时,按照以下3种情况处理:情况1:节点A和B之间的连线为同向时,则按照 或 的属性信息中“优先级”的值,保留一条优先级最高的边;删除其它边;

情况2:节点A和B之间的连线为非同向时,且在其中一个方向上存在的最高优先级高于另一个方向上存在的最高优先级,则保留一条优先级最高的边;删除其它边;

情况3:节点A和B之间的连线为非同向时,且在其中一个方向上存在的最高优先级与另一个方向上存在的最高优先级相等,则删除节点A和B之间的所有边;

原始图数据信息经过冗余边的消减原则处理后,即可去除多重边和只有一跳的环路;

步骤3.2:对经过步骤3.1处理后得到的图数据信息使用存在环路时的消减原则,分为

3种情况进行处理:

情况1:若该环路上只存在一条优先级最低的边,则删除此边,解除环路;

情况2:若环路上存在2个以上优先级最低的关系,且这些关系中的有一个节点的出度最大,则将指向该节点的边全部删除;这是因为该节点的出度最大说明它为其它节点提供了更多服务,其偏向于基础类;

情况3:如不属于情况1和情况2,则从步骤二所述原始图数据信息中查找优先级最低的边所涉及节点所在的文件的创建时间,如果能够找到一个创建时间最早的那个节点,将指向该节点的边全部删除;否则,将优先级最低的边全部删除;

经过步骤三的处理,即可获得有向图数据信息;

步骤四、设计图形布局;

在步骤三的基础上,根据图形布局算法设计图形布局;

所述图形布局算法具体为:

步骤4.1:设定画布的左上角为坐标原点,设定原点垂直向下方向为Y轴的正方向;原点水平向右方向为X轴的正方向;

步骤4.2:对步骤三得到的有向图进行深度搜索,得到其最大深度d、层序号i,每层所包含的节点集合Vi、集合Vi所包含的节点的个数numi以及所有节点的各自所在层数deep;

其中,d,i均为正整数且1≤i≤d;

步骤4.3:根据步骤4.2得到的结果,获得每个节点边框的左上角的坐标;

①每个节点边框的左上角的纵坐标y的计算方法:设定H为画布的高度,根据公式1可得到有向图中每一层的高度差h:h=(H-h1-h2)/(d-1) (1)其中,h2和h1分别为画布的上、下留白高度;

根据公式2可得到该节点的左上角的纵坐标y:y=h1+(i-1)×h (2)②每个节点边框的左上角的横坐标x的计算方法:第a步:将各层中的节点按照字母表升序排序;

第b步:通过公式3得到同一层中两个相邻节点的距离w,通过公式4得到第s层,第t个节点的横坐标值x,其中,3≤s≤d,1≤t≤nums且s、t均为正整数;

w=(W-x1-x2)/(nums-1+2) (3)x=x1+t×w (4)其中,W为画布的宽度,x1,x2分别为第s层左右两边的留白;

步骤4.4:对步骤三得到的有向图中的所有节点,根据每个节点上的文本的内容和样式,得到节点的边框长宽信息;

步骤4.5:根据步骤4.3得到的每个节点边框的左上角的坐标及步骤4.4得到的节点边框长宽信息得到与边框相关的线的开始点和结束点坐标;

步骤五、进行可视化映射;

在步骤四的基础上,根据预先定义的图形表示规则完成可视化数据的映射;图形表示规则包括定义节点颜色、节点形状、节点样式、边的颜色、边的形状和边的样式。

2.如权利要求1所述的一种针对面向对象程序设计语言源代码的软件可视化方法,其特征在于:步骤四中所述图形布局算法包括:开源工具VCG中使用的深度优先布局算法。

说明书 :

针对面向对象程序设计语言源代码的软件可视化方法

技术领域

[0001] 本发明涉及一种针对面向对象程序设计语言(Object-Oriented Programming Language,OOPL)源代码的软件可视化方法,属于软件可视化技术领域。

背景技术

[0002] 基于程序源代码获得软件的高级设计抽象的方法,最原始和直接的解决方案就是程序员通过阅读源代码,经过一系列脑力分析,最终用一些高度抽象的图形或者文字表达来阐述一个软件的内部结构和实现逻辑。
[0003] 软件可视化通常采用软件自动化方式将软件系统的各种属性(包括关键字、类间关系等)或者各种属性的相关统计信息,通过静态或者动态的2D或3D的图形加以概括表示,从而展示软件系统的内部结构,软件的演化信息,和软件的行为特性,实现对源码的自动分析和抽象,产生能反映软件内部结构或者其他度量信息的高度概括的图形表示。通过对软件系统进行可视化可以获得软件的高级抽象,便于快速获得软件设计层次上的理解。
[0004] 软件可视化的意义在于:①通过对软件进行可视化获得对软件系统设计层次上的抽象,便于系统的维护、巩固、移植和改进,为软件系统尤其是遗产系统的重构、再工程以及设计的恢复提供有力的帮助;②随着开源社区的发展和完善,开源系统尤其是基于Java代码的开源系统种类日臻完善和丰富,且代码量也在飞速增加,但其文档化往往又严重滞后甚至缺乏,所以软件可视化的作用也变的尤为重要。
[0005] 类图是一种展现软件系统结构的可视化方式。
[0006] 类图所表示的类间的关系包括:泛化,依赖,关联,聚合,组合,实现。其对应的代码特征如表1所示:
[0007] 表1类图关系对应的代码特征
[0008]
[0009] 由表可以看出:关联关系、聚合关系和组合关系在语法上是没办法区分的,只有从语义上才能区分,除此以外,将类图用作软件源码逆向可视化,其缺点有:
[0010] ①因为类图主要应用于正向开发中,当其应用于软件源码可视化这样的逆向过程中时,类图中的一些语义相关的关系很难得到正确的表达;
[0011] ②在现有的一些自动化测试软件中或者某些IDE集成开发工具中提供了由源码到类图的实现,但是由其得到的类图往往由多个连通子图构成,且类图的布局方式有很大的随意性,所以表达不够简洁,清晰,不具有统一性,不利于用户快速了解软件的结构体系。
[0012] ③类图只能表示软件系统中各个类之间的某些特定关系,对软件系统结构的表示也是通过这些关系体现的,所以在表示系统结构时也局限在了类及类关系层面,对某个具体类在系统中所扮演的角色、所起的作用的表述也具有同样的局限性。
[0013] 因此类图不适用于软件可视化。

发明内容

[0014] 本发明的目的是为了克服已有技术中存在的不足,提出一种针对面向对象程序设计语言源代码的软件可视化方法。
[0015] 本发明的目的是通过以下技术方案实现的。
[0016] 一种针对面向对象程序设计语言源代码的软件可视化方法,具体为:
[0017] 步骤一、从源代码中提取关键信息。
[0018] 从待处理的面向对象程序设计语言源代码中提取关键信息。所述关键信息包括:类所在的包、类名、父类、继承方式、类的类型、类的修饰符、类所包含的嵌套类、类属性的类型、类属性的修饰符、类构造函数参数、类方法的名字、类方法的参数、类方法的返回值类型以及类方法的修饰符。
[0019] 所述继承方式包括一般继承(extends)和接口实现(implements)两种继承方式;
[0020] 所述类的类型包括抽象类型、接口类型、普通类型和不确定类型。
[0021] 从所述关键信息中可以获取类间关系,类间关系包括:嵌套关系、继承关系、接口继承关系、组成关系、关联关系。
[0022] 从所述关键信息中可以获取类间关系,类间关系包括:嵌套关系、继承关系、接口继承关系、组成关系、关联关系;
[0023] 嵌套关系是从所述关键信息中“类所包含的嵌套类”信息中得到的;
[0024] 组成关系是从所述关键信息中类的“类属性的类型”或“类构造函数的参数”信息中得到的;
[0025] 关联关系是从所述关键信息中“类方法的参数”或“类方法的返回值的类型”信息中得到的;
[0026] 继承关系和接口继承关系是从所述关键信息中“继承方式”信息中得到。
[0027] 步骤二、获取原始图数据信息。
[0028] 将步骤一得到的关键信息,以类作为节点,类间关系作为边,按照表2所示的图的属性、表3所示的边的属性、表4所示的节点的属性的数据结构进行存储,即可得到一个仅包含节点名称和边名称的原始图数据信息。
[0029] 表2存储关键信息的数据结构设计表1-图的属性
[0030]属性名称 数据类型
包含的节点的名称 文本
包含的边名称 文本
[0031] 表3存储关键信息的数据结构设计表2-边的属性
[0032]属性名称 数据类型
与其邻接的节点的名称 文本
优先级 正整数
[0033] 表4存储关键信息的数据结构设计表3-节点的属性
[0034]属性名称 数据类型
节点类型 正整数
节点名称 文本
[0035]节点上文本的内容 文本
节点所在文件的创建时间 正实数
[0036] 步骤三、获取有向图数据信息。
[0037] 对步骤二得到原始图数据信息,依次使用冗余边的消减原则和存在环路时的消减原则进行处理,即可得到有向图数据信息;具体为:
[0038] 步骤3.1:对原始图数据信息使用冗余边的消减原则进行处理:
[0039] 设定V为原始图中节点的集合,如果节点A和B(A,B∈V)之间有多于1条的连线时,按照以下3种情况处理:
[0040] 情况1:节点A和B之间的连线为同向时,则按照 或 的属性信息中“优先级”的值,保留一条优先级最高的边;删除其它边。
[0041] 情况2:节点A和B之间的连线为非同向时,且在其中一个方向上存在的最高优先级高于另一个方向上存在的最高优先级,则保留一条优先级最高的边;删除其它边。
[0042] 情况3:节点A和B之间的连线为非同向时,且在其中一个方向上存在的最高优先级与另一个方向上存在的最高优先级相等,则删除节点A和B之间的所有边。
[0043] 原始图数据信息经过冗余边的消减原则处理后,即可去除多重边和只有一跳的环路。
[0044] 步骤3.2:对经过步骤3.1处理后得到的图数据信息使用存在环路时的消减原则,分为3种情况进行处理:
[0045] 情况1:若该环路上只存在一条优先级最低的边,则删除此边,解除环路。
[0046] 情况2:若环路上存在2个以上优先级最低的关系,且这些关系中的有一个节点的出度最大,则将指向该节点的边全部删除。这是因为该节点的出度最大说明它为其它节点提供了更多服务,其偏向于基础类。
[0047] 情况3:如不属于情况1和情况2,则从步骤二所述原始图数据信息中查找优先级最低的边所涉及节点所在的文件的创建时间,如果能够找到一个创建时间最早的那个节点,将指向该节点的边全部删除;否则,将优先级最低的边全部删除。
[0048] 经过步骤三的处理,即可获得有向图数据信息。
[0049] 步骤四、设计图形布局。
[0050] 在步骤三的基础上,根据图形布局算法设计图形布局。
[0051] 所述图形布局算法包括:开源工具VCG(Visualization of Compiler Graphs)中使用的深度优先布局算法。
[0052] 优选的,所述图形布局算法具体为:
[0053] 步骤4.1:设定画布的左上角为坐标原点,设定原点垂直向下方向为Y轴(纵轴)的正方向;原点水平向右方向为X轴(横轴)的正方向。
[0054] 步骤4.2:对步骤三得到的有向图进行深度搜索,得到其最大深度d、层序号i,每层所包含的节点集合Vi、集合Vi所包含的节点的个数numi以及所有节点的各自所在层数deep;其中,d,i均为正整数且1≤i≤d。
[0055] 步骤4.3:根据步骤4.2得到的结果,获得每个节点边框的左上角的坐标。
[0056] ①每个节点边框的左上角的纵坐标y的计算方法:
[0057] 设定H为画布的高度,根据公式1可得到有向图中每一层的高度差h:
[0058] h=(H-h1-h2)/(d-1) (1)[0059] 其中,h2和h1分别为画布的上、下留白高度;
[0060] 根据公式2可得到该节点的左上角的纵坐标y:
[0061] y=h1+(i-1)×h (2)[0062] ②每个节点边框的左上角的横坐标x的计算方法:
[0063] 第a步:将各层中的节点按照字母表升序排序;
[0064] 第b步:通过公式3得到同一层中两个相邻节点的距离w,通过公式4得到第s层,第t个节点的横坐标值x,其中,3≤s≤d,1≤t≤nums且s、t均为正整数。
[0065] w=(W-x1-x2)/(nums-1+2) (3)[0066] x=x1+t×w (4)[0067] 其中,W为画布的宽度,x1,x2分别为第s层左右两边的留白。
[0068] 步骤4.4:对步骤三得到的有向图中的所有节点,根据每个节点上的文本的内容和样式,得到节点的边框长宽信息。
[0069] 步骤4.5:根据步骤4.3得到的每个节点边框的左上角的坐标及步骤4.4得到的节点边框长宽信息得到与边框相关的线的开始点和结束点坐标。
[0070] 步骤五、进行可视化映射。
[0071] 在步骤四的基础上,根据预先定义的图形表示规则完成可视化数据的映射。图形表示规则包括定义节点颜色、节点形状、节点样式、边的颜色、边的形状和边的样式。
[0072] 有益效果
[0073] 本文提出了一种新的针对面向对象程序设计语言源代码的软件可视化方法,弥补了类图用于软件可视化中的不足,能够更准确直观的反应软件的内部结构和软件内类的地位和作用,便于使用者快速获得软件设计层次上的理解。

附图说明

[0074] 图1为本发明关于针对面向对象程序设计语言源代码的软件可视化方法的实施例1中的流程示意图;
[0075] 图2为本发明关于针对面向对象程序设计语言源代码的软件可视化方法的实施例1中的原始数据对应的原始图结构;
[0076] 图3为本发明关于针对面向对象程序设计语言源代码的软件可视化方法的实施例1中的得到的有向图;
[0077] 图4为本发明关于针对面向对象程序设计语言源代码的软件可视化方法的实施例1中的得到的布局效果图;
[0078] 图5为本发明关于针对面向对象程序设计语言源代码的软件可视化方法的实施例1中得到的可视化效果图。

具体实施方式

[0079] 下面结合附图和实施例对本发明技术方案进行详细描述。
[0080] 实施例1:
[0081] 源代码如下所示:
[0082] 源码文件1:carlib.java:
[0083]
[0084]
[0085] 源码文件2:Linklist.java:
[0086]
[0087]
[0088]
[0089] 源码文件3:Link list.java
[0090]
[0091] 针对上述3个Java的源码文件,使用本发明提出的方法进行可视化,其流程示意图如图1所示,具体操作步骤如下:
[0092] 步骤一、从源代码中提取关键信息。
[0093] 从源码文件1、2、3的源代码中提取关键信息,以Linklist类为例,提取的信息如下:
[0094] 类所在的包、类名、父类、继承方式、类的类型、类的修饰符、类所包含的嵌套类等信息,如表5所示。
[0095] 表5类相关信息
[0096]
[0097] 类构造函数参数、类方法的名字、类方法的参数、类方法的返回值类型以及类方法的修饰符等的信息,如表6所示。
[0098] 表6方法相关信息
[0099]
[0100] 类属性的类型、类属性的修饰符等信息,如表7所示。
[0101] 表7类属性
[0102]类属性 类属性的类型 类属性的修饰符
first Link public
size int public
[0103] 步骤二、获取原始图数据信息。
[0104] 将步骤一得到的关键信息存储到图以及与其相关的边和节点数据结构的相应位置,即可到一个仅包含节点名称和边名称的原始图数据信息,即得到一个图结构,如图2所示。其中,方框代表节点,方框内的文字为节点的名称,节点之间的有向边表示节点之间的服务关系,有向边上面的数字表示服务关系的优先级;其节点类型和节点所在类文件创建时间,如表8所示。
[0105] 表8节点的其它相关属性
[0106]节点 节点类型 节点所在类文件创建时间
Linklist 3 1273422602
Link 3 1273422602
CAR 2 1273420800
void 4 0
boolean 4 0
int 4 0
Link_list 3 1273423212
String 4 0
SmallCar 3 1273420800
BigCar 3 1273420800
[0107] 注:1表示抽象类,2表示接口类,3表示普通类,4表示未定类型。
[0108] 步骤三、获取有向图数据信息。
[0109] 对步骤二得到原始图数据信息,依次使用冗余边的消减原则和存在环路时的消减原则进行处理,即可得到有向图数据信息;具体为:
[0110] 以节点Linklist与节点Link之间的冗余边为例,因为存在最高优先级的边所以将仅保留优先级为1的边,其它删除。其它节点间的冗余边按照前文所提方法均可消减掉。
[0111] 因为此图中不存在环路所以删除所有冗余边后即可得到两点间仅含有一个边的有向无环图,如图3所示。
[0112] 步骤四、设计图形布局。
[0113] 经图形布局算法处理后,按照各个节点的位置坐标重新绘制得到图4:
[0114] 步骤五、进行可视化映射。
[0115] 在步骤四的基础上,根据预先定义的图形表示规则完成可视化数据的映射。图形表示规则中边的颜色、边的形状、边的样式,如表9所示。
[0116] 表9边的颜色、形状和样式
[0117]
[0118] 节点颜色、节点形状、节点样式如表10所示。
[0119] 表10节点颜色、节点形状、节点样式
[0120]
[0121] 实施例1的可视化效果图如图5所示。
[0122] 以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进,或者对其中部分技术特征进行等同替换,这些改进和替换也应视为本发明的保护范围。