APP下载

基于源代码的软件设计模型生成工具的设计与实现

2021-08-24汤艳马骁骅孙萍王鑫

中国科技纵横 2021年11期
关键词:源代码代码文档

汤艳 马骁骅 孙萍 王鑫

(中国电子科技集团公司第15研究所,北京 100083)

0.概述

随着我国各行业信息化技术应用的不断深入和发展,软件开发规模越来越大。通常,项目需要多人甚至多个团队一起工作,软件开发过程所产生的文档有时多达几千甚至上万页,另一方面,项目交付时间紧迫又要保证质量,这就对开发工作的标准化,实施效率文档质量都提出更高的要求[1]。

目前,在软件设计阶段,市场上存在很多成熟的建模、画图工具,为软件设计文档提供各种更为直观的图形化展示,但软件设计文档本身仍主要以手工编制为主。由此,产生了软件设计文档的诸多问题。如由于开发工期紧迫,造成软件设计文档粗劣、甚至缺少设计文档;或由于开发团队对设计工作的不重视,开发人员没有完全依照设计文档进行编码,造成软件设计文档与软件源代码脱节,设计文档形同虚设。

本文针对软件设计文档缺失或源代码与设计脱节的问题,提出了一种基于源代码的软件设计模型自动生成工具设计方案和实现方法,通过从源代码中提取抽象语法树(Abstract Syntax Tree,AST),逆向生成与软件代码结构一致的软件设计文档。

1.需求分析

文中所介绍的软件设计模型生成工具主要用于分析源代码、提取抽象语法树,并根据源代码的抽象语法树逆向生成软件设计文档。该工具由源代码分析和生成设计文档两大功能模块构成,如图1所示。

图1 功能模块划分

源代码分析模块包括:分析源代码、查看源代码分析结果、修改源代码分析结果3个子功能,分别实现以下功能:

(1)分析源代码。实现对源代码的分析功能,用于提取源代码的抽象语法树结构,包括:包、类、注释等信息;

(2)查看源代码分析结果。实现对源代码分析结果的展示功能,用于查看源代码中包、类的详细信息;

(3)修改源代码分析结果。实现对源代码分析结果的编辑功能,用于人工维护分析结果中缺失或需要修改的信息。

生成软件设计模块包括:生成关系图、生成设计文档2个子功能,分别实现以下功能:

(1)生成关系图。实现对源代码中包、类、方法之间关联关系的展示功能;

(2)生成设计文档。实现根据源代码分析结果,逆向生成与软件代码结构一致的软件设计文档的功能。

启动工具后,为工具指定源代码所在目录文件夹,并选择源代码的开发语言,然后执行源代码分析操作。工具完成源代码分析后,显示源代码的抽象语法树结构,并提供以下功能:

(1)查看分析结果。选择抽象语法树上某一节点,可以查看相应节点的详细信息,以及所包含的包、类、方法的清单列表;

(2)修改分析结果。抽象语法树上各节点的详细信息可以在清单列表中进行手动修改;

(3)生成关系图。选择抽象语法树上某一节点,通过生成关系图功能,可以生成该节点与其所有子孙节点之间的包、类关系图;

(4)生成设计文档。选择抽象语法树上某一节点,通过生成设计文档功能,可以按照修改后的分析结果生成设计文档,文档中包含所选节点及其所有子孙节点的详细设计信息,包括:包的划分及设计、详细设计两部分。其中,包的划分及设计包括:包的划分、各个包的类图及说明;详细设计包括:类的名称、说明、父类,类中所有属性的名称、类型、说明,类中所有方法的函数名、参数、返回值、说明等信息。

2.软件设计

软件设计模型生成工具没有大量结构化数据的存储需求,所有数据保存到本地硬盘中,因此不使用数据库。由于不存在数据安全问题,工具也不需要用户和权限控制策略。

软件设计模型生成工具通过读取源代码生成软件设计文档,仅在客户机本地就可以完成,不需要联机操作,因此采用单机结构,不设置服务器端。

为了便于后期的功能维护和扩展升级,软件设计模型生成工具的系统架构分为表示层和业务逻辑层。其中,表示层负责与用户进行信息交互、信息收集以及结果展示等相关功能;业务逻辑层主要实现提取源代码抽象语法树,并将抽象语法树结构转化为关系图和软件设计文档等核心业务逻辑。

系统流程图如图 2所示。

图2 系统流程图

3.基于AST的代码结构建模

3.1 抽象语法树

提取抽象语法树是建立软件代码结构的前提。抽象语法树中保存了软件代码的所有信息,通过对语法树进行深度优先遍历或广度优先遍历,就可以根据实际需求,在不同层次和维度上获取软件代码结构以及各个包、类、方法之间的逻辑关系[2]。

提取抽象语法树是一个非常复杂的过程,为了提高开发效率,本文使用已有开源工具实现抽象语法树的提取功能。使用已有的成熟工具实现相关功能,在提高开发效率的同时,也在一定程度上保证了软件的质量。

软件设计模型生成工具,分别使用PMD(Programming Mistake Detector)和ANTLR(Another Tool for Language Recognition)工具实现Java代码、C/C++代码的抽象语法树提取功能。

PMD是一个开源静态代码审查工具,可以在不运行代码的情况下检查代码中的内容[3]。因此,进行抽象语法树的提取不需要拥有完整、可运行的代码,在仅仅存在部分软件代码时就可以进行抽象语法树的提取。

ANTLR是一个开源语法分析生成器,其前身是PCCTS,它为包括Java、C++、C#在内的语言提供了一个通过语法描述来自动构造自定义语言的识别器、编译器和解释器的框架[4]。

以使用PMD工具提取Java代码结构为例,所提取的抽象语法树结构如图 3所示。

图3 抽象语法树结构

软件设计模型生成工具使用XML文件作为抽象语法树的载体,将软件代码结构的相关信息保存在XML格式文件中,从而实现抽象语法树的存储,为后续的软件代码建构建模功能提供支撑。

3.2 软件代码结构建模

通过建立软件代码结构设计模型,来实现抽象语法树结构读取和存储,模型结构如图4所示。

图4 软件代码结构设计模型

AbstractXmlElement类为软件代码结构设计模型中所有模型元素的基类,用于存放所有模型元素所共有的公共属性和方法。

ProjectElement类表示模型中的项目元素,用于存放项目的相关信息。它是软件代码结构的顶层节点,即所提取的抽象语法树的根节点,通过该类可以获取完整的抽象语法树的相关信息。

PackageElement类表示模型中的包元素,用于存放包的相关信息。

ClassBaseElement类为所有接口和类的父类,由于接口和类具有诸多相似属性和特征,因此通过设置相同的父类,来存放它们所共有的公共属性和方法,如名称、父类、注释等信息。

InterfaceElment类表示模型中的接口元素,用于存放接口类的相关信息。

ClassElement类表示模型中的类元素,用于存放普通类的相关信息。

FieldElement类表示模型中的属性元素,用于存放类的全局变量的相关信息。

MethodBaseElement类为所有构造函数和方法的父类,由于构造函数的本质也是方法,因此通过设置相同的父类,来存放它们所共有的公共属性和方法,如名称、参数列表、修饰符等信息。

ConstructorElement类表示模型中的构造函数元素,用于存放类的构造函数的相关信息。

MethodElement类表示模型中的方法元素,用于存放类的普通方法的相关信息。

其中,ProjectElement、PackageElement、Class-BaseElement、FieldElement、MethodBaseElement通过继承AbstractXmlElement类获得所有模型元素的公共属性和方法。

InterfaceElment和ClassElement通过继承Class-BaseElement类获得所有模型元素以及类元素的公共属性和方法。

ConstructorElement和MethodElement通过继承MethodBaseElement类获得所有模型元素以及方法元素的公共属性和方法。

此外,上述模型元素之间还存在相互关联关系。如:一个项目元素下包含一个或多个包元素;一个包元素下包含一个或多个接口元素或类元素;一个类元素下包含一个或多个属性元素和方法元素等。

通过将抽象语法树转化为上述模型元素,并建立模型元素之间的逻辑关系,实现了软件代码结构建模,为生成软件设计文档提供依据。

各个类的含义及与抽象语法树结构的对应关系如表1所示。

表1 设计模型类与抽象语法树结构对应关系

4.功能实现

本工具无需安装,可直接打开使用本工具。由于软件设计模型生成工具不提供用户和权限控制,工具启动后直接打开主界面,如图5所示。

图5 工具主界面

设置选择项目、保存路径、以及开发语言等项目信息后,可以通过“开始分析”按钮执行源代码分析。

工具首先根据项目路径获取软件代码,根据所设置的开发语言,使用相应工具提取软件代码的抽象语法树,再将抽象语法树保存在“保存路径”中的XML文件中,以便随时获取。最后读取抽象语法树的XML文档,生成软件代码结构设计模型,并将其以树型展示在左侧,右侧各个标签页用于显示抽象语法树上各节点的详细信息。

所提取的抽象语法树的部分XML文件如下:

4.1 清单列表

默认显示“包的一览表”标签页,用于显示源代码中所包含的所有包的名称、标识、层级编号及其简要描述,如图6所示。其中,层级编号、简要描述列可进行修改编辑。

图6 包的一览表

工具从代码结构设计模型的顶层包开始,采用深度优先遍历算法,逐层递归遍历所有包,同时记录递归层级作为包的层级编号。最后,将遍历结果展示在“包的一览表”列表中。

在“类的一览表”标签页中显示源代码中所包含的所有类的名称、标识、归属包标识、父类、层级编号及其实现功能,如图 7所示。其中,层级编号、实现功能列可进行修改编辑。

图7 类的一览表

4.2 包的说明

选择抽象语法树上包含子包的包节点,在“包的说明”标签页中显示所选包节点中子包的名称、标识、层级编号及其简要描述。其中,层级编号、简要描述列可进行修改编辑。在“包图”标签页中显示所选包节点的所有子包结构图。

4.3 类的说明

选择抽象语法树上不包含子包的包节点,在“类的说明”标签页中显示所选包节点中所有类的类名、标识、实现功能。其中,实现功能列可进行修改编辑。在“包的类图”标签页中显示所选包节点的所有类的类图。

4.4 类的详细设计

选择抽象语法树上的类节点,在“类的详细设计”标签页中显示所选类的类名、标识、父类、说明,类中所有属性的名称、类型、说明,类中所有方法的函数名、参数、返回值、说明,如图8所示。在“类图”标签页中显示所选类节点的类图。

图8 类的详细设计

4.5 导出设计文档

完成对源代码分析结果的修改后,通过“导出设计文档”按钮,可以根据修改后的源代码分析结果,生成软件设计文档,如图9所示。

图9 生成设计文档

5.结语

文中针对软件设计文档缺失或源代码与设计脱节的问题,使用Java语言和Java Swing图形界面工具,开发设计了一套基于源代码的软件设计模型生成工具。实现了从源代码中逆向提取软件设计模型,并生成与软件代码结构一致的软件设计文档。其对于提高软件质量,完善软件配套文档,提高软件开发效率均具有重要意义。

猜你喜欢

源代码代码文档
人工智能下复杂软件源代码缺陷精准校正
浅谈Matlab与Word文档的应用接口
有人一声不吭向你扔了个文档
基于TXL的源代码插桩技术研究
创世代码
创世代码
创世代码
创世代码
软件源代码非公知性司法鉴定方法探析
基于RI码计算的Word复制文档鉴别