20.01.2015 Views

一种约束制导的软件编程辅助方法 - 北京大学软件工程研究所

一种约束制导的软件编程辅助方法 - 北京大学软件工程研究所

一种约束制导的软件编程辅助方法 - 北京大学软件工程研究所

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

一 种 约 束 制 导 的 软 件 编 程 辅 助 方 法<br />

刘 海 文 , 孟 娜 , 李 进 辉 , 王 千 祥<br />

( 北 京 大 学 信 息 科 学 技 术 学 院 软 件 研 究 所 , 北 京 100871)<br />

( 高 可 信 软 件 技 术 教 育 部 重 点 实 验 室 )<br />

摘 要 : 软 件 的 代 码 需 要 遵 守 各 种 各 样 的 约 束 。 这 些 约 束 有 些 是 与 业 务 逻 辑 无 关 的 , 有 些 是 业 务 逻 辑 相 关 的 。 编<br />

程 语 言 的 BNF 是 最 重 要 的 业 务 逻 辑 无 关 的 约 束 。 除 此 之 外 , 还 有 许 多 业 务 逻 辑 无 关 的 约 束 , 例 如 调 用 语 句 之 间 的<br />

先 后 顺 序 等 。 如 果 能 将 这 些 约 束 进 行 形 式 化 的 描 述 , 再 根 据 这 种 描 述 在 程 序 编 写 过 程 中 由 已 输 入 的 代 码 推 出 后 面<br />

输 入 的 代 码 片 段 , 就 可 以 提 高 代 码 的 编 写 速 度 与 质 量 。 本 文 为 这 类 约 束 提 出 了 一 种 描 述 方 法 , 并 实 现 了 一 个 基 于<br />

该 方 法 的 辅 助 编 程 工 具 , 它 能 够 依 据 约 束 规 则 对 编 码 过 程 进 行 实 时 制 导 。<br />

关 键 字 : 约 束 制 导 , 约 束 描 述 , 辅 助 工 具<br />

An Constraint-Directed Programming Assistant Approach<br />

LIU Hai-Wen, MENG Na, LI Jin-Hui, WANG Qian-Xiang<br />

(Institute of Software, School of Electronics Engineering and Computer Science,<br />

Peking University, Beijing 100871, China)<br />

(Key laboratory of High Confidence Software Technologies, Ministry of Education, China)<br />

Abstract The codes of software have to follow various kinds of constraints. Some of these constraints are business-logic-independent, and<br />

others are business-logic- related. BNF of programming language are the most important business-logic-independent constraints. Besides,<br />

there are also plenty of other business-logic-independent constraints, such as constraints on the location relationship between code<br />

components. Through providing a formal description for these constraints and drawing the following code snippet to be written from existing<br />

codes by this description, we can code more quickly with higher quality. In this paper, we proposed an approach to describe such kind of<br />

constraints on code components, and implemented a programming assistant based on such approach, which can immediately provide<br />

proposals according to the constraint rules in coding stage.<br />

Keywords Constraint-Directed, Constraint Description, Programming Assistant<br />

1 引 言<br />

软 件 约 束 (Constraint) 是 指 程 序 编 写 、 编 译 、 运 行 等 各 个 阶<br />

段 需 要 遵 守 的 规 则 , 如 语 法 、 编 码 风 格 、API 使 用 规 范 和 运 行<br />

时 限 定 等 。 有 些 约 束 是 与 业 务 逻 辑 相 关 的 , 而 有 些 约 束 是 与 业<br />

务 逻 辑 无 关 的 , 如 语 法 和 编 码 风 格 等 。 在 软 件 开 发 过 程 中 遵 守<br />

这 些 约 束 是 保 证 代 码 质 量 , 进 而 获 得 高 质 量 软 件 的 关 键 。 任 何<br />

对 约 束 的 违 反 都 构 成 软 件 的 缺 陷 。<br />

现 在 , 软 件 代 码 量 日 趋 庞 大 , 软 件 开 发 和 维 护 日 趋 复 杂 。<br />

各 种 语 言 、 开 发 包 和 框 架 等 不 断 推 出 。 随 之 而 来 的 是 为 数 众 多<br />

的 语 法 规 则 、API 使 用 规 范 等 各 种 约 束 。 例 如 ,JDK 就 包 括 数<br />

以 千 计 的 类 和 数 以 万 计 的 方 法 。 这 大 大 增 加 了 程 序 员 的 学 习 成<br />

本 , 也 加 大 了 缺 陷 产 生 的 概 率 , 从 而 增 加 了 生 产 高 可 维 护 性 、<br />

高 效 率 和 高 安 全 性 的 软 件 产 品 的 困 难 程 度 。<br />

为 了 得 到 高 质 量 的 软 件 , 人 们 开 发 了 各 种 技 术 和 工 具 , 在<br />

软 件 开 发 的 各 个 阶 段 对 软 件 进 行 检 查 以 发 掘 和 消 除 其 中 的 缺<br />

陷 : 编 码 阶 段 有 IDE 的 错 误 标 记 、 代 码 补 全 和 辅 助 修 正 等 ; 编<br />

译 阶 段 有 各 种 编 译 器 技 术 ; 测 试 和 集 成 阶 段 有 自 动 化 测 试 和 代<br />

码 静 态 检 查 技 术 等 ; 执 行 阶 段 有 运 行 时 监 测 技 术 ; 等 等 。 显 然 ,<br />

越 早 发 现 缺 陷 , 对 其 进 行 定 位 和 修 正 的 成 本 越 低 。 倘 若 在 编 码<br />

时 刻 就 及 时 进 行 约 束 检 查 , 及 早 地 发 现 当 前 代 码 中 隐 藏 的 缺 陷 ,<br />

给 出 具 有 针 对 性 的 提 示 和 修 改 意 见 , 则 不 但 能 较 大 地 减 轻 程 序<br />

员 的 负 担 , 提 高 编 码 速 度 , 更 能 以 较 小 的 代 价 有 效 地 提 高 代 码<br />

的 质 量 , 有 如 错 误 标 记 、 代 码 补 全 和 辅 助 修 正 等 技 术 。<br />

约 束 检 查 的 基 础 是 约 束 的 描 述 。 对 语 义 无 关 的 约 束 , 尤 其<br />

是 语 法 , 已 有 成 熟 的 描 述 方 法 ——BNF 范 式 ; 而 语 义 相 关 的 约<br />

束 则 相 对 庞 杂 , 很 难 提 出 统 一 的 描 述 模 型 , 这 大 大 限 制 了 约 束<br />

检 查 的 配 置 性 和 扩 展 性 。<br />

事 实 上 , 很 多 约 束 本 质 上 是 关 于 代 码 语 句 及 其 之 间 的 位 置<br />

关 系 ( 调 用 顺 序 、 出 现 位 置 等 ) 的 。 例 如 ,PMD[1] 和 FindBugs[2]<br />

所 检 查 的 规 则 中 分 别 有 大 约 92% 和 76% 属 于 这 一 类 型 。 这 部 分<br />

基 金 项 目 : 国 家 科 技 支 撑 计 划 , 项 目 编 号 :2006BAH02A02; 国 家 高 技 术 研 究 发 展 计 划 (863), 项 目 编 号 :2007AA010301; 国 家 高 技 术 研 究 发 展 计 划 (863), 项<br />

目 编 号 :2006AA01Z175; 国 家 自 然 基 金 项 目 , 项 目 编 号 :60773160<br />

作 者 简 介 : 刘 海 文 (1985-), 男 , 主 要 研 究 方 向 : 软 件 工 程 , 中 间 件 ; 孟 娜 (1983-), 女 , 主 要 研 究 方 向 : 软 件 工 程 , 中 间 件 ; 李 进 辉 (1983-), 男 , 主 要 研 究<br />

方 向 : 软 件 工 程 , 中 间 件 ; 王 千 祥 (1970-), 男 , 教 授 , 主 要 研 究 方 向 : 软 件 工 程 、 中 间 件 。<br />

通 讯 地 址 :100871 北 京 大 学 信 息 科 学 技 术 学 院 软 件 研 究 所 ;Tel: (010) 62759074;E-mail:wqx@pku.edu.cn


约 束 相 对 规 整 , 其 描 述 方 法 比 较 简 单 。 针 对 这 部 分 约 束 , 本 文<br />

提 出 了 一 种 描 述 方 法 , 并 设 计 了 一 个 约 束 制 导 的 编 程 辅 助 方 法 。<br />

该 方 法 在 编 码 时 刻 从 当 前 输 入 代 码 中 提 取 焦 点 信 息 , 根 据 该 焦<br />

点 信 息 激 活 约 束 库 中 相 关 约 束 的 检 查 , 再 依 据 检 查 结 果 和 约 束<br />

信 息 给 出 代 码 提 示 。 我 们 以 Eclipse 插 件 的 形 式 实 现 了 一 个 的 Java<br />

编 程 辅 助 工 具 ——CoDPAss(Constraint-Directed Programming<br />

Assistant)。<br />

本 文 后 续 的 章 节 是 这 样 安 排 的 : 第 2 部 分 介 绍 相 关 工 作 ;<br />

第 3 部 分 详 细 说 明 本 文 所 关 注 的 软 件 约 束 ; 第 4 部 分 叙 述 约 束<br />

制 导 的 编 程 辅 助 方 法 ; 第 5 部 分 介 绍 该 辅 助 方 法 的 一 个 实 现 ;<br />

第 6 部 分 对 本 文 进 行 总 结 并 给 出 后 续 工 作 安 排 。<br />

2 相 关 工 作<br />

软 件 质 量 要 求 的 日 趋 严 格 使 得 代 码 约 束 的 检 查 越 来 越 重<br />

要 , 相 关 的 工 作 不 断 被 介 绍 。 其 中 , 除 了 传 统 的 语 法 制 导 的 IDE<br />

错 误 标 记 、 代 码 补 全 和 辅 助 修 正 等 技 术 , 还 有 不 少 工 作 同 样 专<br />

注 于 编 码 时 刻 的 提 示 和 建 议 :PROSPECTOR[3] 将 API 规 范 建 模<br />

为 有 向 图 , 并 利 用 对 例 程 代 码 的 挖 掘 来 完 善 该 有 向 图 , 它 通 过<br />

图 的 路 径 搜 索 给 出 由 T in 类 型 对 象 得 到 T out 类 型 对 象 的 语 句 序 列 ;<br />

XSnippet[4] 与 PROSPECTOR 类 似 , 它 将 例 程 代 码 建 模 为 有 向 图 ,<br />

能 给 出 初 始 化 所 需 类 型 的 对 象 的 语 句 序 列 ; 关 键 字 编 程 [5] 将 API<br />

信 息 建 模 为 关 键 字 向 量 , 将 表 达 式 建 模 为 函 数 树 (Function Tree),<br />

能 够 根 据 用 户 提 供 的 关 键 字 建 造 函 数 树 , 进 而 生 成 所 需 类 型 的<br />

表 达 式 。<br />

这 三 项 工 作 的 研 究 重 点 均 在 于 如 何 通 过 一 个 语 句 序 列 从<br />

可 访 问 的 源 类 型 对 象 得 到 目 标 类 型 对 象 , 以 便 能 在 编 码 时 刻 给<br />

出 下 文 代 码 提 示 , 以 提 高 编 码 效 率 。 解 决 问 题 的 思 路 也 有 很 多<br />

共 性 : 都 是 通 过 对 已 有 代 码 片 段 或 API 规 范 进 行 建 模 , 然 后 结<br />

合 上 下 文 环 境 和 用 户 输 入 信 息 对 所 建 模 型 进 行 匹 配 搜 索 , 再 按<br />

照 某 种 排 序 策 略 给 出 代 码 建 议 清 单 。 虽 然 这 些 工 作 都 没 有 明 确<br />

提 出 约 束 的 概 念 , 但 它 们 建 立 的 这 些 模 型 其 实 也 是 约 束 的 种 种<br />

表 现 形 式 , 只 是 约 束 的 表 现 形 式 随 建 模 方 式 的 变 化 而 有 所 不 同 。<br />

这 些 工 作 的 一 个 不 足 就 是 它 们 的 约 束 是 通 过 对 例 程 代 码<br />

或 API 规 范 自 动 建 模 得 到 的 , 未 经 确 认 , 也 就 不 能 确 定 约 束 的<br />

正 确 性 和 必 要 性 , 所 以 常 常 给 出 不 相 关 的 提 示 。 我 们 的 工 作 与<br />

之 最 大 的 不 同 在 于 : 它 直 接 基 于 直 观 而 确 切 的 约 束 , 更 具 针 对<br />

性 、 配 置 性 和 扩 展 性 。 同 时 , 它 使 用 的 约 束 是 经 过 人 工 判 定 和<br />

锤 炼 的 , 而 非 从 例 程 代 码 和 API 规 范 中 挖 掘 出 来 的 含 糊 的 约 束 ,<br />

因 此 它 能 保 证 约 束 的 正 确 性 和 有 效 性 。 而 且 它 不 需 要 进 行 约 束<br />

的 建 模 和 挖 掘 等 附 加 操 作 , 使 用 时 的 开 销 较 小 , 给 出 提 示 的 速<br />

度 也 更 快 。<br />

3 软 件 约 束 分 析<br />

软 件 约 束 指 的 软 件 系 统 中 为 了 保 证 软 件 功 能 的 正 确 执 行<br />

而 附 加 的 所 有 限 制 条 件 [6], 涉 及 编 码 、 编 译 和 运 行 等 方 面 , 是<br />

一 个 庞 杂 的 集 合 。 本 文 主 要 关 注 其 中 一 个 相 对 规 整 的 子 集 , 即<br />

关 于 代 码 成 分 及 其 之 间 的 位 置 关 系 的 约 束 。 本 节 将 对 代 码 成 分<br />

以 及 关 于 代 码 成 分 的 约 束 的 特 征 进 行 详 细 说 明 。<br />

3.1 代 码 的 成 分<br />

每 种 计 算 机 语 言 都 有 一 套 语 法 。 所 谓 代 码 的 成 分 就 是 在 语<br />

法 规 约 中 终 结 符 和 非 终 结 符 所 代 表 的 代 码 片 段 , 也 就 是 抽 象 语<br />

法 树 中 各 个 节 点 所 对 应 的 代 码 片 段 。 代 码 中 的 保 留 字 、 运 算 符 、<br />

变 量 、 常 量 、 方 法 调 用 、 方 法 声 明 、 方 法 体 、 方 法 参 数 、 语 句 、<br />

块 、 类 定 义 体 等 都 是 代 码 的 成 分 。 代 码 是 这 样 一 个 个 成 分 的 有<br />

机 合 成 。 通 过 语 法 分 析 , 可 以 从 代 码 文 本 中 解 析 出 各 个 成 分 。<br />

代 码 成 分 具 有 各 种 属 性 , 包 括 文 本 属 性 ( 即 其 对 应 的 代 码 片<br />

段 ) 和 类 别 属 性 ( 即 标 明 该 成 分 是 一 个 变 量 , 还 是 一 个 语 句 , 还 是<br />

一 个 方 法 调 用 , 等 等 ) 等 基 本 属 性 , 以 及 特 定 于 类 别 的 特 征 属 性 。<br />

不 同 类 别 的 代 码 成 分 具 有 不 同 的 特 征 属 性 , 如 变 量 有 类 型 属 性 、<br />

名 称 属 性 等 ; 方 法 声 明 有 名 称 属 性 、 返 回 值 类 型 属 性 、 参 数 列<br />

表 属 性 等 …… 代 码 成 分 是 约 束 的 骨 架 , 对 它 的 各 种 属 性 的 刻 画<br />

就 构 成 了 软 件 约 束 的 描 述 。<br />

3.2 关 于 代 码 成 分 的 约 束<br />

本 文 所 关 注 的 约 束 是 关 于 代 码 成 分 及 其 之 间 位 置 关 系 的 ,<br />

即 对 代 码 成 分 的 属 性 和 成 分 之 间 的 位 置 关 系 做 出 的 限 定 。 这 部<br />

分 约 束 比 较 规 整 , 也 就 使 得 给 出 一 种 简 洁 的 抽 象 化 描 述 方 法 成<br />

为 可 能 。<br />

这 些 约 束 至 多 涉 及 两 个 代 码 成 分 , 具 体 分 为 两 种 情 况 : 对<br />

一 个 代 码 成 分 的 存 在 情 况 以 及 属 性 的 限 定 ( 单 成 分 约 束 ); 对 两 个<br />

成 分 之 间 的 位 置 关 系 的 限 定 ( 双 成 分 约 束 )。<br />

3.2.1 单 成 分 约 束<br />

单 成 分 约 束 是 约 束 描 述 的 最 小 单 位 , 是 构 造 更 复 杂 的 约 束<br />

的 基 本 元 素 。<br />

例 如 , 以 下 都 是 单 成 分 约 束 :<br />

约 束 1) 尽 量 避 免 调 用 System.exit(int)— 因 为 这 会 关 闭 整<br />

个 Java 虚 拟 机 , 可 以 考 虑 抛 出 RuntimeException 异 常 作 为 替 代<br />

[2];<br />

约 束 2) 不 要 通 过 String.equals("") 来 判 断 该 字 符 串 是 否 为<br />

空 串 — 因 为 用 String.length()==0 更 高 效 [2]。<br />

以 上 两 个 约 束 等 价 于 如 下 表 述 :<br />

约 束 1’) 不 应 该 出 现 方 法 调 用 ( 代 码 成 分 , 下 同 )<br />

System.exit(int);<br />

约 束 2’) 方 法 调 用 String.equals(String) 的 “ 参 数 ” 不 应 该 为<br />

空 串 ""。<br />

3.2.2 双 成 分 约 束<br />

双 成 分 约 束 由 两 个 代 码 成 分 及 其 之 间 的 关 系 组 成 。 其 中 ,<br />

每 个 成 分 的 描 述 采 用 与 单 成 分 约 束 一 致 的 方 法 。 而 成 分 之 间 的<br />

关 系 分 为 可 达 、 连 通 和 覆 盖 三 种 。


可 达 和 连 通 关 系 涉 及 的 两 个 成 分 没 有 交 集 , 互 不 包 含 。 可<br />

达 关 系 是 有 序 的 , 强 调 一 个 成 分 必 须 出 现 于 另 一 个 成 分 之 后 ;<br />

而 “ 连 通 ” 是 无 序 的 , 强 调 一 个 成 分 存 在 时 另 一 个 成 分 也 必 须 存<br />

在 , 但 对 出 现 的 位 置 不 做 要 求 — 既 可 位 于 其 前 , 也 可 位 于 其 后 。<br />

覆 盖 关 系 中 一 个 成 分 是 另 一 个 成 分 的 一 部 分 , 是 一 种 隶<br />

属 、 包 含 关 系 , 强 调 整 体 与 部 分 的 相 互 制 约 , 即 包 含 成 分 作 为<br />

整 体 应 该 由 怎 样 的 被 包 含 成 分 组 成 。<br />

例 如 , 以 下 都 是 双 成 分 约 束 :<br />

约 束 3) 在 创 建 Connection( 如 DriverManager.<br />

getConnection (…)) 并 结 束 使 用 后 , 应 该 将 其 关 闭<br />

(Connection.close())— 以 释 放 资 源 [1, 2];<br />

约 束 4) 在 重 载 hashCode( ) 时 , 必 须 也 重 载 equals(Object)[1,<br />

2];<br />

约 束 5) 在 重 载 clone( ) 时 必 须 调 用 super.clone( )[1, 2]。<br />

以 上 三 个 约 束 等 价 于 如 下 表 述 :<br />

约 束 3’) 方 法 调 用 DriverManager.getConnection(…) 可 达<br />

( 关 系 , 下 同 ) 方 法 调 用 Connection.close( );<br />

约 束 4’) 方 法 声 明 hashCode( ){…} 和 方 法 声 明<br />

equals(Object) {…} 连 通 ;<br />

约 束 5’) 方 法 声 明 clone( ){…} 必 须 覆 盖 方 法 调 用<br />

super.clone( )。<br />

我 们 把 单 成 分 约 束 看 作 是 双 成 分 约 束 的 特 例 , 即 其 中 一 个<br />

代 码 成 分 及 成 分 之 间 关 系 为 空 的 双 成 分 约 束 。 本 文 后 面 的 内 容<br />

将 集 中 在 双 成 分 约 束 的 讨 论 上 。<br />

4 约 束 制 导 的 软 件 编 程 辅 助 方 法<br />

约 束 描 述 了 代 码 的 编 写 规 范 , 为 程 序 正 确 并 高 效 地 运 行 提<br />

供 了 保 证 。 直 接 从 约 束 出 发 , 用 代 码 生 成 和 编 码 提 示 的 方 式 辅<br />

助 编 程 过 程 , 不 但 能 减 少 程 序 员 的 工 作 量 , 提 高 编 程 效 率 , 更<br />

能 将 潜 在 的 缺 陷 消 弭 于 萌 芽 时 刻 , 有 效 提 高 代 码 质 量 。<br />

约 束 制 导 的 编 程 辅 助 方 法 的 设 计 如 图 1 所 示 : 在 编 码 时 刻<br />

从 当 前 输 入 代 码 中 提 取 焦 点 信 息 , 然 后 根 据 该 焦 点 信 息 激 活 约<br />

束 库 中 相 关 约 束 的 检 查 , 再 依 据 检 查 结 果 , 利 用 代 码 信 息 和 约<br />

束 信 息 给 出 提 示 信 息 和 修 正 代 码 。<br />

图 1 约 束 制 导 的 编 程 辅 助 方 法<br />

此 方 法 主 要 有 两 个 关 键 部 分 : 约 束 的 描 述 和 约 束 的 检 查 。<br />

以 下 将 详 细 介 绍 这 两 部 分 。<br />

4.1 约 束 的 描 述<br />

约 束 的 描 述 是 进 行 约 束 检 查 的 基 础 。 一 个 简 洁 有 效 的 抽 象<br />

化 描 述 方 法 是 保 证 约 束 的 检 查 具 有 良 好 的 配 置 性 和 扩 展 性 的 关<br />

键 。 我 们 虽 然 很 难 为 所 有 的 约 束 提 供 统 一 的 描 述 方 法 , 但 可 以<br />

从 中 归 纳 出 一 个 比 较 规 律 的 子 集 并 进 行 描 述 。 本 文 主 要 关 注 关<br />

于 代 码 成 分 的 约 束 的 描 述 , 即 双 成 分 约 束 的 描 述 。<br />

这 类 约 束 仅 涉 及 代 码 成 分 和 成 分 之 间 的 关 系 。 我 们 注 意<br />

到 , 约 束 中 的 两 个 代 码 成 分 所 扮 演 的 角 色 是 不 对 等 的 。 例 如 ,<br />

约 束 4) 强 调 的 是 在 存 在 方 法 声 明 hashCode( ) 的 前 提 下 , 方 法 声<br />

明 equals(Object) 也 必 须 出 现 , 而 并 没 有 要 求 当 存 在 方 法 声 明<br />

equals(Object) 时 , 方 法 声 明 hashCode( ) 必 须 出 现 。 也 就 是 说 ,<br />

约 束 4) 不 等 价 于 以 下 约 束 : 在 重 载 equals(Object) 时 , 必 须 也 重<br />

载 hashCode( )[1, 2];<br />

如 果 根 本 不 存 在 hashCode( ), 则 约 束 4) 没 有 意 义 , 因 此<br />

hashCode( ) 在 约 束 4) 中 起 主 导 地 位 , 而 equals(Object) 则 是 一 个<br />

被 动 接 受 匹 配 的 角 色 。 但 在 上 面 的 约 束 中 , 这 两 者 所 起 的 作 用<br />

则 刚 好 相 反 。 考 虑 到 上 述 特 点 , 我 们 把 约 束 中 起 主 导 作 用 的 成<br />

分 称 为 触 发 点 , 而 把 另 一 个 被 动 的 角 色 称 为 确 认 点 。<br />

形 如 “ 成 分 A— 关 系 R— 成 分 B” 的 约 束 表 述 , 并 未 明 确 A、<br />

B 所 扮 演 的 角 色 , 角 色 的 分 配 情 况 可 以 是 A— 触 发 点 、B— 确 认<br />

点 , 也 可 以 是 A— 确 认 点 、B— 触 发 点 。 为 了 简 化 约 束 的 描 述 ,<br />

我 们 将 形 如 “ 确 认 点 — 关 系 R— 触 发 点 ” 的 表 述 , 转 换 为 “ 触 发 点<br />

— 关 系 R’— 确 认 点 ”, 即 将 触 发 点 固 定 于 前 , 确 认 点 固 定 于 后 ,<br />

一 如 “ 主 - 谓 - 宾 ” 的 格 式 。 而 这 需 要 将 关 系 R 换 为 它 的 反 向 关 系<br />

R’。 因 此 , 我 们 将 成 分 的 关 系 扩 展 为 5 种 : 连 通 ( 其 反 向 关 系 仍<br />

为 自 己 )、 可 达 、 可 达 ’、 覆 盖 、 覆 盖 ’, 依 次 将 其 命 名 为 依 存 、<br />

导 向 、 追 随 、 包 含 、 组 成 。<br />

另 外 , 每 个 约 束 都 有 一 个 有 效 范 围 , 在 这 一 范 围 的 上 下 文<br />

环 境 中 才 会 出 现 约 束 提 及 的 情 形 。 如 约 束 4) 的 情 形 只 会 出 现 在<br />

某 个 类 定 义 体 内 , 它 的 作 用 范 围 即 是 类 定 义 体 。 显 然 , 约 束 的<br />

作 用 范 围 也 是 一 个 代 码 成 分 。 为 每 个 约 束 指 定 一 个 范 围 , 可 以<br />

提 高 约 束 描 述 的 精 确 性 , 进 而 改 善 约 束 检 查 的 效 率 。<br />

同 时 , 约 束 分 为 “ 肯 定 ” 和 “ 否 定 ” 两 种 情 况 。 前 者 规 定 “ 应 该<br />

出 现 何 种 情 形 ”, 后 者 规 定 “ 不 能 出 现 何 种 情 形 ”。<br />

综 合 以 上 因 素 , 我 们 为 这 类 约 束 提 出 了 以 下 描 述 方 法 (ε 表<br />

示 空 ):<br />

约 束 := 逻 辑 符 ( 范 围 : 触 发 点 , 关 系 , 确 认 点 )<br />

逻 辑 符 := ε | !<br />

关 系 := 依 存 | 导 向 | 追 随 | 包 含 | 组 成 | ε<br />

范 围 | 触 发 点 | 确 认 点 := 代 码 成 分 | ε<br />

代 码 成 分 := { 属 性 串 }<br />

属 性 串 := 属 性 串 , 属 性 | 属 性<br />

属 性 := < 属 性 名 , 属 性 值 >


其 中 , 逻 辑 符 为 ’ε’ 时 表 示 “ 肯 定 ”, 为 ’!’ 时 则 表 示 “ 否 定 ”。<br />

由 此 , 约 束 4) 可 以 描 述 为 :<br />

({ < 成 分 类 别 , 类 定 义 体 > } :<br />

{< 成 分 类 别 , 方 法 声 明 >,< 方 法 签 名 , boolean<br />

equals(Object)>}<br />

, 依 存 ,<br />

{< 成 分 类 别 , 方 法 声 明 >, < 方 法 签 名 , int hashCode( )>})<br />

4.2 约 束 的 检 查<br />

约 束 的 检 查 将 基 于 以 上 的 约 束 描 述 方 法 。 详 细 过 程 如 下 :<br />

1) 从 当 前 输 入 焦 点 得 到 当 前 代 码 所 属 的 范 围 和 当 前 代 码<br />

中 包 含 的 触 发 点 。 因 为 当 前 代 码 可 能 属 于 多 个 依 次 嵌 套 的 范 围<br />

成 分 , 其 中 也 可 能 有 多 个 触 发 点 成 分 , 所 以 得 到 的 范 围 和 触 发<br />

点 是 两 个 集 合 。<br />

2) 从 初 始 约 束 池 中 去 除 范 围 成 分 不 在 范 围 集 内 的 约 束 ;<br />

3) 从 剩 下 的 约 束 中 去 除 触 发 点 成 分 不 在 触 发 点 集 内 的 约<br />

束 , 最 终 得 到 有 效 约 束 集 ;<br />

4) 在 约 束 的 范 围 成 分 内 查 询 确 认 点 , 筛 选 出 查 询 结 果 不 符<br />

合 要 求 的 约 束 ( 即 匹 配 “ 肯 定 ” 型 约 束 时 却 不 存 在 确 认 点 , 或 匹 配<br />

“ 否 定 ” 型 约 束 时 却 存 在 确 认 点 ), 最 后 得 到 的 未 被 满 足 的 约 束 就<br />

构 成 了 缺 陷 集 。<br />

其 次 , 我 们 把 约 束 规 则 存 储 于 XML 文 件 中 。 每 个 constraint<br />

元 素 对 应 一 条 约 束 规 则 ,constraint 的 relation 属 性 表 示 约 束 的 关<br />

系 , 子 元 素 range、trigger、confirmer 分 别 对 应 于 约 束 的 范 围 、<br />

触 发 点 、 确 认 点 。 当 属 性 或 元 素 为 空 时 表 示 匹 配 任 何 情 况 。 约<br />

束 规 则 文 件 是 工 具 的 核 心 , 用 户 通 过 配 置 约 束 规 则 文 件 就 可 以<br />

动 态 地 定 制 辅 助 工 具 的 检 查 能 力 和 提 示 效 果 。 目 前 , 通 过 调 研<br />

PMD、FindBugs 以 及 缺 陷 模 式 库 [7] 的 约 束 集 合 , 并 结 合 工 具 自<br />

身 的 特 点 , 我 们 已 经 向 CoDPAss 的 约 束 集 合 中 添 加 171 条 约 束 。<br />

不 同 类 型 的 约 束 被 违 反 时 ,CoDPAss 会 触 发 不 同 的 动 作 。<br />

对 “ 肯 定 ” 型 约 束 ,CoDPAss 将 给 出 下 文 代 码 建 议 ( 对 应 于 约 束 3,<br />

在 建 立 数 据 库 连 接 后 , 工 具 会 提 示 需 要 将 其 关 闭 并 给 出 建 议 代<br />

码 con.close()), 这 样 能 在 减 少 程 序 员 编 码 量 的 同 时 , 起 到 预 防<br />

缺 陷 的 作 用 ; 对 “ 否 定 ” 型 约 束 ,CoDPAss 将 相 关 代 码 标 示 为 “ 可<br />

疑 ” 代 码 , 并 给 出 修 正 代 码 ( 对 应 于 约 束 2, 在 输 入 input.equals("")<br />

后 , 工 具 会 将 其 标 示 为 “ 可 疑 ”, 并 提 示 用 input.length()==0 替<br />

代 ), 这 样 能 帮 助 程 序 员 在 潜 在 缺 陷 产 生 的 第 一 时 间 将 其 消 除 。<br />

6 结 束 语<br />

本 文 提 出 了 一 个 代 码 约 束 描 述 方 法 , 以 及 一 个 约 束 制 导 的<br />

软 件 编 程 辅 助 方 法 , 并 实 现 了 一 个 相 应 的 编 程 辅 助 工 具 ——<br />

CoDPAss。 该 工 具 可 以 在 编 码 时 刻 及 时 进 行 约 束 检 查 , 及 早 地<br />

发 现 当 前 代 码 中 隐 藏 的 缺 陷 , 给 出 具 有 针 对 性 的 提 示 和 修 改 意<br />

见 。 该 方 法 在 减 轻 程 序 员 的 负 担 、 提 高 编 码 速 度 的 同 时 , 更 能<br />

以 较 小 的 代 价 有 效 地 提 高 代 码 的 质 量 。 与 其 它 类 似 工 作 相 比 ,<br />

我 们 的 方 法 以 约 束 规 则 为 核 心 , 具 有 良 好 的 配 置 性 和 扩 展 性 。<br />

本 文 的 工 作 将 继 续 从 如 下 几 个 方 面 做 出 完 善 :(1) 增 强 约 束<br />

描 述 模 型 的 表 达 能 力 ;(2) 开 发 可 视 化 的 约 束 配 置 工 具 以 增 强 编<br />

程 辅 助 工 具 的 易 用 性 ;(3) 完 善 CoDPAss 的 功 能 ;(4) 测 试<br />

CoDPAss 的 使 用 效 率 以 评 估 约 束 制 导 的 软 件 编 程 辅 助 方 法 的 实<br />

际 效 用 。<br />

图 2 约 束 检 查 过 程<br />

根 据 得 到 的 缺 陷 集 以 及 相 应 的 代 码 信 息 就 可 以 进 一 步 生<br />

成 提 示 信 息 和 修 正 代 码 供 程 序 员 使 用 , 实 现 辅 助 编 程 的 功 能 。<br />

由 此 可 见 , 此 编 程 辅 助 方 法 的 关 键 在 于 约 束 。 约 束 贯 穿 于<br />

整 个 过 程 当 中 。 约 束 集 合 决 定 了 辅 助 编 程 的 能 力 和 效 果 。<br />

5 CoDPAss 工 具<br />

基 于 以 上 方 法 , 我 们 实 现 了 一 个 编 程 辅 助 工 具 ——<br />

CoDPAss。 该 工 具 以 Eclipse 插 件 的 形 式 发 布 , 辅 助 Java 语 言 的<br />

编 程 过 程 。CoDPAss 的 主 要 特 点 包 括 :<br />

首 先 ,CoDPAss 使 用 抽 象 语 法 树 组 织 代 码 信 息 。 抽 象 语 法<br />

树 上 的 节 点 即 对 应 于 代 码 成 分 。 我 们 在 抽 象 语 法 树 上 运 用 访 问<br />

者 模 式 进 行 信 息 提 取 。<br />

参 考 文 献<br />

1. PMD, 2008. http://pmd.sourceforge.net/<br />

2. FindBugs, 2008. http://findbugs .sourceforge.net/<br />

3. D. Mandelin, L. Xu, R. Bodik, D. Kimelman. Jungloid Mining:<br />

Helping to Navigate the API Jungle. In Proc. PLDI, pp. 48-61,<br />

2005.<br />

4. N. Sahavechaphan, K. Claypool. XSnippet: Mining For Sample<br />

Code. In Proc. OOPSLA, pp. 413-430, 2006.<br />

5. Greg Little and Robert C. Miller. Keyword Programming in Java.<br />

ASE, pp. 84-93, 2007.<br />

6. P. Zave. Classification of Research Efforts in Requirements<br />

Engineering. In Proc. 2nd IEEE International Symposium on<br />

Requirements Engineering, York, England, 1995.<br />

7 Java 代 码 缺 陷 库 , 2008. http://cdp.seforge.org/.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!