第 27卷 第 9期
2010年 9月
计 算 机 应 用 研 究
Application Research of Computers
Vo1.27 No.9
Sep. 2020
基 于 关 系演 算 的 Java模 式 识 别
苗 康,余 啸,赵 吉,沈 宇
(华 东师范大学 计算机 理论 研究所,上海 200062)
摘 要:分析 了面向对 象类与对 象间的关系,在 此基础 上建立 了对应的属性模型 并且 以关 系演算 的方法进行捕
获模 型的对 象关 系;讨 论 并 实现 了动 、静 态相 结合 的基 于 Java语 言的 经典设计 模 式检查 工具 ,并 以该 工具为基 础
做 实验对 一些 设 计模 式进行 了验 证 。
关键 词 :关 系演算 ;设计 模式 ;Java虚拟机 ;属性检 查
中图分类 号 :TP311 文献标 志码 :A 文章编 号 :2001—3695(2010)09—3425—06
doi:10.3969/j.issn.1001—3695.2020.09.060
Java design pattern recognition based on relational calculus
MIAO Kang,YU Xiao,ZHAO Ji,SHEN Yu
(Institute of Computer Theoretical,East China Normal University,Shanghai 200062,China)
Abstract:This paper discussed about the relations both between classes and objects and established the relational calculus
about model property.Finally,implemented a tool to check design pattern based on Java language through static and dynamic
ways and did experiment based on the tool to verify several user’s codes which using design pattern.
Key words:relational calculus;design pattern ;Java virtual machine;property checking
0 引言
随着面 向对象语言 的不断 发展 ,类与类 以及对象与对象之
间的关 系变得越 发复杂 ,使人们更加关心彼此之 间的关 系。在
得 到类之 间的关 系和对 象关 系的基础 上 ,衍生 出了许 多应 用 。
Alloy语言 和分析器 …就是在此基础上建立 的支 持一 阶逻辑量
词 、传递性和 闭包 的工具 。它 的应 用 范围包 括源 代码 分 析
和测试 用例 自动生成 以及 网络配置 等。在对 象关系 的基础 上
建立起来的关系型数据库 也在逐渐 被人们 所接受 。关系 型数
据库借用 了面 向对象 的建模在 层次 表达 的丰富性 和对象 间关
系建立 的强逻辑性 。此外 一些 项 目如 ObjectMapper等致力 于
在得到对象关系 的基础 上解决 面 向对象编程 与关 系型数 据库
建模之间的障碍 问题 。rCOS是 一种 面 向对 象 的语 言 ,也 是一
种基于组件 的模 型驱 动 的 软件 开 发 途 径 J。它 是 在关 系语
义 、精化演算和模型检 验 的基础 上建立 起来 的语 言。rCOS为
每个模型定义 了它 的属 性 ,目的是为了保证模型的正确性和可
验证性 。这些属 性包 括子类 型 、可 见性 、引用 、继承 、转 型 等 。
这就激 发了人们去定义一 些属性 用于检查 和识 别设计模 式 中
所用 到的模式 匹 配。不 同于之 前 的工作 ,本 文定 义 了两类
属性 ,一类是通用 }生,另外 一类是用 户相关 属性 。第 二种属
性 是第 一种 的灵 活扩 展 ,是为 了检查避免 随着代码复杂度加 大
等原因用户虽然正确使 用了某种设 计模式 ,但实 际上并 没有 按
照其预期运行。
为了刻画类 之间以及对象之间 的关系 ,对其 建立 了一定 关
系 。在类的层次上 ,建 立继 承 (inheritance)和包涵 (contain)两
种关系 ;在对象层 次上 ,建立 创建 (create)、调 用 (cal1)和引 用
(reference)三种 关系 。有 了这些 关 系 ,定 义 了关 系 的运 算 法
则 。利用这五种关 系以及运算法则 ,就可 以对 大部分 的关 系属
收稿 日期 :2010-02—18;修 回 日期 :2010—03—25
性加 以描述 。
设计模式 概念的引入 ,使得更多 的人开始在程序设计时使
用适 当的模 式简 化编 写代 码 的复杂 度 、提高 代码 质量 。但
随之而来 的问题是 由于人们对 设计模 式在理解 上存在错 误或
是因为在代码实现上与 自己预先设计 的存在偏 差所导致 的设
计模式使用错误的现象越来越 多 。为 了减 少这种事情 的发
生 ,笔者所做 的工作是 基于 Java语 言上 自动 检查 用户代 码是
否正确使用 了设计 模式 。在基 于 GoF实 现的理 解基 础上 ,实
现 了 Java语 言的设计模式检查工具 。通 过这种方法 实现 了完
全 由机器对用户代码 的设计 模式 的 自动检 查以及用 户 自定 义
关系 的 自动检查 。
为 了捕获之前在类与对象之 间建 立的五种关系 ,本文 实现
了 Java语言 的关系捕获工具。第一 阶段在 Java编译 得出的 ,并
从 class文件 中静态获取到类之 间的关系。这一 阶段 主要 是通
过 Java规范 中关 于 class文件 的格 式说 明,提取 出所 需要 的类
名/接 口名 、超类名和所 实现 的接 口名。第二阶段在运行时捕获
对象间的关系。为此设 计 了一套算法 ,通过维护一个栈结 构的
机制对对象上 的操作 进行 记 录,并借 助 Java虚 拟机 工具 接 口
(JVM tool interface)得 以实现 。接着设计 了适 当的关 系演算算
法用于检查模型属性 的可满足性 。最终 选择 了 SAT解析 器
进行求解并将之转换为图论 中的求解可达性问题。基 于以上思
想 ,本文的 Java对象关系捕获工具表示如图 1所示。
1 关 系演算
关系演算语言 即逻辑语言 ,是 由变量 、常量 、逻辑连接词和
量词等构成 的演算 。在一套语 言规 则上建立 的表达式 称为公
式 ,公 式的解 为满足该表达式 的一 组或多组 变量 的赋值使得表
达式为真 。UTP语言 是关系演算 中较为成熟 且应用 广泛 的