摘 要 研究了逆向构造程序类模型的基本规则, 并且提出了一种可以自动绘制的、基于继承关系的层次型类图结构(inheritance-layered class diagram).在这种层次型类图上,可以清晰地展示程序中的对象类及其相互之间的继承关系、组成关系和关联关系等,并可以直观方便地对程序中定义的对象类进行各种相关性或依赖性分析.文中还介绍了一个根据上述规则和方案实现的实用工具SafePro/Re-OM.
关键词 软件工程;软件工具;自动绘图;逆向工程;面向对象方法
对象建模是面向对象方法的一个核心技术.UML(Unified Modeling Language)获得OMG (Object Management Group)的批准标志着面向对象方法正在走向成熟和统一[1,2].UML规定了统一的模型体系和表示法, 以及一个推荐的迭代式开发过程范型.一致的模型表示也为软件开发过程中准确地建立从概念模型、设计模型直至代码实现之间的对应关系提供了有力的支持.
本文着重研究面向对象软件的逆向分析与建模技术,它是软件分析理解、测试和维护的重要基础.
本文首先简要列举类图的基本成分与特征, 研究了依据程序源代码逆向生成程序类模型的基本规则, 然后介绍了一种基于继承关系的层次型类图结构(inheritance-layered class diagram)及其自动绘制的基本规则.最后介绍了根据这些规则实现的一个实用工具SafePro/Re-OM.
1 类模型
在面向对象软件开发方法中,类模型是一个基本的软件模型.它既可以用来构造真实世界中的问题模型,也用于准确地定义软件系统的体系结构,并在统一的模型下逐步细化,直至最终生成程序代码.
类表示了一类具有相同特性的对象.类图的基本元素, 如类、类的属性和操作, 以及继承、关联和聚合等, 构成了类模型的主体结构.此外,类图还提供了丰富的表达符号来直观和准确地描述系统的种种详细特征.在系统的概念层模型中,这些特征反映了应用问题和应用领域对系统的要求和约束;在说明层模型中,它们用以准确地定义系统的接口标准;而在实现层模型中,它们确定了具体的实现方案.表1列举了类模型的一些主要特征.
表1 类模型主要元素说明和举例
模型元素 | 简要说明 | 举例 |
类 | 相同属性和行为的对象集合 | 公司,雇员 |
继承 | 对象集合分类,基类和子类间的一般与特殊关系. | 经理和秘书都是雇员 |
关联 | 类之间的语义联系 | 雇佣关系 |
聚合 | 关联,部分与整体关系,但二者独立存在 | 项目组与其成员 |
组成 | 聚合,但部分依存于整体 | 合同及其附件 |
多重性 | 相关联对象的数量 | 项目组有0或多个成员 |
派生 | 可由其它属性或关联派生出的属性或关联 | 年龄属性 爷孙关系 |
多重继承 多值继承 动态继承 |
子类有多个基类 对象集合多种分类的组合 动态分类 |
两栖车辆 (性别,职业) 职业变迁 |
依赖 | 元素间的依赖性,即一个元素的改动对另一个可能产生影响 | 友元关系、,类中引用另一个类的对象 |
包 | 依据语义分组 | 用户界面包 |
约束 | 对元素语义的约束 | {18岁以上} |
2 类图的逆向分析
类图具有强大的描述能力和丰富的表达手段.然而,逆向构造程序的类模型则面临诸多的问题.首先,类图的一些元素在面向对象程序设计语言中没有直接对应的实现方法.此外,类图中各种成分的实现方法也是不唯一的.比如,聚合和关联在C+ +中都可能采用指针或者成员函数来实现.实际上,既使在概念层模型中,聚合和关联之间也没有绝对的鉴别标准,在许多情况下,人们会根据自己对应用对象的不同理解而作出不同的选择.这些问题破坏了模型的细化和实现过程中的可追踪性,给逆向分析建模造成了困难.
但是尽管如此,依据对程序的基本语法成分的分析,仍然可以提取出基本的模型特征.根据这些特征逆向生成的类模型与系统的设计模型具有很好的可比性.
2.1 类模型的逆向建模规则
由于篇幅的限制,本节将主要的逆向映射规则列举在简表2中.根据逆向映射规则可以将程序中有关类定义的基本元素映射为类模型中的对应成分,从而逆向构造出程序的基本类模型框架.
表2 直接映射规则
程序元素 | 类图元素 |
类 | 类 |
成员变量 | 属性 |
成员函数 | 操作 |
继承 | 继承 |
模板 | 模板 |
类A的一个成员变量的类型是类B | |
类A的成员函数的返回值类型是类B | 关联 |
类A的成员函数的一个形参的类型是类B | |
类A中定义的子类B 类A的成员变量是类B 的一个对象 类A的构造函数和析构函数中创建与消除一个类型为类B的对象 |
组成 |
类A的成员函数使用了类B的局部变量 类A的成员函数使用了类B的全局对象 类A的实现中调用了另一个类B的类域(class-scope)操作 类A与类B之间有友元关系 |
依赖 |
仅涉及对象自身属性的成员函数 | 派生属性 |
一个源代码文件中定义的所有类 | |
一个子目录中的所有源文件 | 包 |
类库或子系统 |
2.2 逆向模型与设计模型的比较
一个采用规范化的方法开发的软件应当具有充分细化的设计模型, 并且该模型与程序之间应当具有良好的对应关系,即良好的可追踪性.一般而言,软件设计和实现应当遵循以下一些基本规则,它们将有助于对程序的逆向模型和设计模型进行对照比较.
1) 采用面向对象程序设计语言;
2) 用程序设计语言提供的相应机制来实现类模型中的类、类模板和类的继承关系;
3) 类模型中的多值分类、动态分类、,多元关联等复杂成分应当在模型细化过程中预先进行解消;
4) 程序中的各种成分,比如类型、变量、函数及其参数、类及其属性和操作等均直接采用类图中对应元素的名称.
依据上述规则产生的程序, 其逆向模型与设计模型之间在基本结构上存在对应.表3列举了一些基本的匹配规则.
表3 逆向模型与设计模型的对应关系
设计模型 | 逆向类图 |
类、类模板、继承 | 类、类模板、继承 |
属性 | 属性(或操作) |
派生属性 | 派生属性或操作 |
操作 | 操作 |
组成 | 组成、属性或操作 |
聚合和关联 | 关联、依赖、属性或操作 |
包 | 包或包的集合 |
存在不匹配元素的主要原因有:设计模型细化不充分;逆向模型中的有些元素是为实现目的增加的;名字不一致;设计或实现中的错误.
3 基于继承关系的层次型类图
逆向建模的一个关键技术在于模型图的自动绘制.特别是对于复杂的应用系统,数百个类之间的各种关系纵横交错,所以合理的布图结构是保证图形具有良好可读性和易于分析理解的关键.
3.1 类模型的层次化结构
继承关系是类模型中的基本关系,它描述了一个应用系统中的所有对象的类及其分类特性.从结构上讲, 继承具有清晰的层次化结构.继承是非递归的.在实现中,面向对象程序语言直接支持继承关系的定义,包括多重继承.基于这些特点, 本文提出了一种可以自动绘制的、基于继承关系的层次化的类图模型.基本构造规则如下:
1) 层次规则
以类及其继承关系构成类图的基本结构框架,自顶向下地建立类的层次化模型, 即
* 所有无基类的类置于图的顶层;
* 子类置于其基类层的下一层.
2) 对称规则
同层的类依其子类数目的多少优先居中排放.
3) 标识规则
各种不同类型的关系连线, 如继承、组成或关联等, 采用不同的表示符号(如UML表示法), 同时选用不同的颜色加以区分.
4) 相邻层连线规则
相邻层间的各种连线为直线或斜线.
5) 通道规则1
非相邻层的类之间的各种连线与被跨越层中的类互不相交, 即连线从类之间的通道中通过.
6) 通道规则2
同层的2个相邻的类之间有有限个通道,即可以通过有限条连线,以使其中的连线清晰可辨.
7) 通道规则3
2个不相邻层上的类之间的连线仅通过1条“垂直” 通道,即在跨越多层时途中无折点,以保持线路简捷.
8) 通道规则4
同层的类之间的连线有组成和关联等,它们由类的背后通过.
9) 自关联规则
类的自关联连线置于类的边角处.
根据上述规则绘制的类图具有清晰的结构,如图1所示.
图1 SafePro/Re-OM自动生成的逆向类图(部分)
3.2 类模型的、相关性分析
相关性分析是软件分析理解与维护的重要内容.逆向建模是分析程序中各种成分之间的相互依赖性的基础.在程序的逆向类图上,可以直观地展示程序中类及其构成元素之间的各种依赖关系和耦合度.基本的分析包括:
* 泛化与特化分析
在类图上加亮显示指定类的基类和子类, 包括直接和间接的.
* 组成分析
在类图上加亮显示指定类的“部件”及“组件”.
* 关联性分析
在类图上加亮显示与指定类直接或间接关联的类.
* 依赖性分析
在类图加亮显示所有与指定类有某种依赖性的类,这种依赖性可以包括继承、组成和关联等关系,也可以是狭义的,即在类操作的实现体中对类和对象的引用.
4 逆向建模工具SafePro /Re-OM
SafePro/Re-OM[3]是一个C+ +程序逆向建模的工具.它以C+ +分析与测试工具SafePro/C+ +[4~7]为基础,由静态分析器分析C+ +程序的源代码并产生相应的测试信息库, 然后,SafePro/Re-OM从库中提取有关类定义及其使用信息,自动生成逆向类图, 并提供各种相关分析功能.
参 考 文 献
1 Flower M,Scott K.UML distilled—applying the standard object modeling language.Massachusetts: Addison-Wesley, 1997
2 Eriksson H,Penker M.UML toolkit.New York:John Wiley & Sons Inc,1998
3 沈海华.对象模型图的逆向分析与自动生成工具的研究与开发:[学位论文].北京:北京航空航天大学计算机科学与工程系,1998
4 李 健,刘 超,金茂忠.面向对象建模技术及其支持工具. 见: 杨芙清,何新贵主编.软件工程进展——技术、方法和实践. 北京:清华大学出版社,1996.217~220
5 吴鹏程,金茂忠.面向对象软件测试模型与测试策略.见: 杨芙清,何新贵主编.软件工程进展——技术、方法和实践. 北京:清华大学出版社,1996.342~344
6 李 健,金茂忠.对象状态测试.北京航空航天大学学报,1997, 23(1):98~104
7 吴鹏程,金茂忠.基于对象模型的C+ +程序静态分析器. 北京航空航天大学学报,1997,23(1):105~110