<4D F736F F D20C8EDBCFEB9A4B3CCB5BCC2DB20D2EBB8E52E646F63>

Size: px
Start display at page:

Download "<4D6963726F736F667420576F7264202D20C8EDBCFEB9A4B3CCB5BCC2DB20D2EBB8E52E646F63>"

Transcription

1 软 件 工 程 简 明 教 程 原 著 :Pankaj Jalote 译 : 罗 飞, 邵 凌 霜 审 校 : 陈 世 鸿

2 前 言 软 件 工 程 导 论 应 包 括 大 量 的 软 件 工 程 方 面 的 概 念 原 理 技 术 和 方 法, 内 容 繁 杂, 这 在 很 大 程 度 上 决 定 了 这 门 课 程 成 为 迄 今 为 止 最 难 教 的 课 程 之 一 本 人 认 为 这 是 由 于 在 教 学 时 往 往 太 过 偏 重 于 概 念 和 原 理 等 浅 层 知 识 的 介 绍, 而 忽 略 了 这 些 知 识 的 实 际 运 用 而 造 成 的, 软 件 工 程 的 最 终 目 的 是 要 运 用 这 些 知 识 有 效 地 设 计 和 开 发 出 求 解 问 题 的 好 软 件 本 书 的 目 标 我 认 为, 软 件 工 程 入 门 课 程 的 目 标 应 该 是 : 传 授 给 学 生 一 些 知 识 和 技 能, 使 得 他 们 能 够 运 用 这 些 知 识 和 技 能 成 功 地 实 施 一 个 规 模 为 几 个 人 月 的 商 业 软 件 项 目 的 开 发 现 在 许 多 企 业 都 有 很 多 这 个 方 面 的 项 目 能 够 由 一 个 小 团 队 经 过 几 个 月 的 努 力 而 完 成 的 项 目 我 还 认 为, 在 软 件 工 程 的 知 识 海 洋 中, 如 果 对 各 个 知 识 点 进 行 细 致 认 真 地 筛 选, 能 够 在 一 个 学 期 的 时 间 里, 使 学 生 们 具 有 上 述 本 领, 而 这 正 是 这 本 书 的 目 标 本 书 的 目 标 是 对 学 生 介 绍 有 限 的 符 合 下 列 要 求 的 知 识 和 练 习 : 这 些 有 限 的 知 识 和 技 能 能 够 使 学 生 完 全 胜 任 一 个 较 小 的 商 业 软 件 项 目 的 开 发 ; 提 供 学 生 所 需 的 知 识 背 景, 使 学 生 通 过 课 程 或 自 学 可 从 事 软 件 工 程 领 域 的 高 级 研 究 本 书 的 组 织 在 本 书 中, 有 意 地 删 除 了 软 件 工 程 的 高 级 议 题, 只 是 介 绍 了 一 些 我 认 为 是 基 础 的 或 者 能 够 满 足 上 述 目 标 的 知 识 点 另 外, 软 件 项 目 的 实 施 主 要 需 要 两 个 方 面 的 技 能 工 程 学 和 项 目 管 理, 因 此, 本 书 将 重 点 讨 论 这 两 个 方 面 的 主 要 活 动 以 及 执 行 这 些 活 动 所 需 要 的 知 识 和 技 术 本 书 的 安 排 方 式 很 简 单, 它 的 每 一 章 对 应 项 目 开 发 中 的 一 个 主 要 活 动 工 程 学 方 面 的 主 要 活 动 包 括 需 求 分 析 和 需 求 规 范 体 系 结 构 设 计 模 块 设 计 编 码 和 单 元 测 试 以 及 测 试 ; 项 目 管 理 方 面 的 主 要 活 动 包 括 项 目 计 划 和 项 目 监 控 两 个 方 面, 而 这 两 个 活 动 都 安 排 在 项 目 计 划 这 一 章, 这 是 因 为 项 目 的 监 控 也 需 要 计 划 另 外, 在 这 本 书 中, 还 有 一 章 主 要 用 来 阐 明 软 件 工 程 领 域 存 在 的 问 题, 而 另 一 章 则 讨 论 了 软 件 过 程 中 把 每 个 活 动 联 系 起 来 的 中 心 观 点 本 书 的 每 一 章 都 是 以 对 本 章 的 介 绍 目 标 或 者 读 者 在 本 章 中 应 有 的 收 获 开 始 每 一 章 在 介 绍 项 目 的 开 发 活 动 时, 总 是 首 先 介 绍 有 关 概 念 和 知 识, 然 后 介 绍 该 活 动 的 结 果 或 所 具 备 的 某 些 期 望 质 量 特 性, 以 及 一 些 实 践 方 法 或 执 行 该 活 动 所 需 要 的 技 术, 最 后 通 过 一 些 实 例 说 明 这 一 章 的 有 关 知 识 点, 并 为 读 者 总 结 本 章 学 习 的 主 要 内 容, 每 一 章 的 结 尾 都 提 供 有 一 些 自 测 练 习

3 预 期 读 者 本 书 是 大 学 本 科 生 或 研 究 生 的 软 件 工 程 入 门 课 程, 所 以, 它 的 预 期 读 者 是 那 些 了 解 编 程 但 是 没 有 正 式 学 习 过 软 件 工 程 的 本 科 生 和 研 究 生 另 外, 本 书 也 可 作 为 具 有 相 似 情 况 的 专 业 人 士 ( 了 解 编 程 但 需 要 软 件 工 程 系 统 知 识 ) 参 考 教 学 支 持 和 辅 助 资 源 尽 管 这 本 书 是 独 立 的, 但 是 一 些 相 关 的 教 学 支 持 和 辅 助 资 源 可 以 通 过 下 列 网 站 得 到 该 网 站 上 的 资 源 包 括 : 每 一 章 的 ppt 格 式 的 powerpoint 演 讲 稿 项 目 开 发 过 程 中 各 阶 段 文 档 的 模 板 一 个 项 目 开 发 文 档 的 示 例 一 些 单 元 测 试 和 审 查 的 实 践 练 习 致 谢 感 谢 我 的 编 辑 Wayne Wheeler, 这 本 精 练 的 导 论 是 他 想 出 来 的, 他 给 我 提 供 了 如 此 好 的 机 会 我 还 要 感 谢 我 的 妻 子 Shikha 以 及 我 的 两 个 女 儿 Sumedha 和 Sunanda, 谢 谢 她 们 一 直 都 忍 耐 我 的 坏 脾 气 和 陪 我 度 过 了 这 段 孤 独 的 时 光 Pankaj Jalote 印 度 新 德 里 2008 年 5 月

4 目 录 1. 软 件 问 题 1.1 成 本 进 度 和 质 量 1.2 规 模 和 变 更 1.3 小 结 自 测 练 习 2. 软 件 过 程 2.1 过 程 和 项 目 2.2 软 件 过 程 的 组 成 2.3 软 件 开 发 过 程 模 型 瀑 布 模 型 原 型 模 型 迭 代 开 发 模 型 Rational 统 一 过 程 (RUP) 模 型 时 间 盒 (timeboxing) 模 型 极 限 编 程 (XP) 和 敏 感 过 程 模 型 过 程 模 型 在 项 目 中 的 应 用 2.4 项 目 管 理 过 程 2.5 小 结 自 测 练 习 3. 软 件 需 求 分 析 和 软 件 需 求 规 格 (SRS) 3.1 好 SRS 的 意 义 3.2 需 求 过 程 3.3 需 求 规 格 SRS 应 该 具 备 的 特 点 SRS 的 组 成 需 求 文 档 的 结 构 3.4 用 例 驱 动 功 能 规 格 基 础 介 绍 几 个 例 子 扩 展 构 建 用 例 3.5 其 他 分 析 方 法 数 据 流 图 (DFD) ER 图 3.6 验 证 3.7 小 结 自 测 练 习 4. 软 件 计 划 4.1 工 作 量 估 算 自 顶 向 下 估 算 法 自 底 向 上 估 算 法

5 4.2 项 目 进 度 和 人 员 配 备 4.3 质 量 计 划 4.4 风 险 管 理 计 划 风 险 管 理 的 概 念 风 险 估 计 风 险 控 制 一 个 实 用 的 风 险 管 理 计 划 方 法 4.5 项 目 监 测 计 划 项 目 的 度 量 项 目 监 测 和 跟 踪 4.6 详 细 日 程 安 排 4.7 小 结 自 测 练 习 5. 软 件 架 构 (SA) 5.1 软 件 架 构 的 角 色 5.2 架 构 视 图 5.3 构 件 和 连 接 件 (C&C) 视 图 构 件 (components) 连 接 件 (connectors) 一 个 例 子 5.4 C&C 视 图 的 架 构 模 式 管 道 过 滤 器 模 式 数 据 共 享 模 式 客 户 - 服 务 器 模 式 其 他 模 式 5.5 架 构 编 档 设 计 5.6 架 构 评 估 5.7 小 结 自 测 练 习 6. 设 计 6.1 有 关 概 念 耦 合 (coupling) 内 聚 (cohesion) 开 闭 原 则 6.2 面 向 功 能 的 设 计 结 构 图 结 构 化 设 计 方 法 一 个 例 子 6.3 面 向 对 象 (OO) 的 设 计 OO 的 概 念 统 一 建 模 语 言 (UML) 设 计 的 方 法 示 例 6.4 详 细 设 计

6 6.4.1 逻 辑 设 计 / 算 法 设 计 类 的 状 态 模 型 6.5 验 证 6.6 结 构 度 量 面 向 功 能 设 计 的 复 杂 性 度 量 面 向 对 象 设 计 的 复 杂 性 度 量 6.7 小 结 自 测 练 习 7. 编 码 和 单 元 测 试 7.1 编 码 的 原 则 和 指 南 结 构 化 编 程 信 息 隐 藏 一 些 编 程 的 实 践 编 码 标 准 7.2 增 量 编 码 增 量 编 码 方 法 测 试 驱 动 开 发 (TDD) 结 对 (pair) 编 程 7.3 代 码 演 化 管 理 源 代 码 控 制 和 编 译 代 码 重 构 (refactoring) 7.4 单 元 测 试 程 序 单 元 测 试 类 单 元 测 试 7.5 代 码 检 查 计 划 代 码 审 查 小 组 会 议 评 审 7.6 代 码 度 量 规 模 度 量 复 杂 性 度 量 7.7 小 结 自 测 练 习 8. 测 试 8.1 有 关 概 念 错 误 故 障 和 失 效 测 试 用 例 测 试 工 具 和 测 试 配 置 测 试 心 理 测 试 层 次 8.2 测 试 过 程 测 试 计 划 测 试 用 例 的 设 计 测 试 用 例 的 执 行 8.3 黑 盒 测 试

7 8.3.1 等 价 类 划 分 边 界 值 分 析 配 对 测 试 特 殊 用 例 设 计 基 于 状 态 的 测 试 8.4 白 盒 测 试 基 于 控 制 流 的 标 准 测 试 用 例 生 成 和 支 持 工 具 8.5 测 试 度 量 覆 盖 度 分 析 可 靠 性 缺 陷 恢 复 率 (DRE) 8.6 小 结 自 测 练 习 参 考 文 献 附 录

8 第 一 章 软 件 问 题 给 出 一 个 需 要 编 写 软 件 系 统 来 解 决 的 问 题, 大 多 数 学 生 认 为 需 要 编 写 约 10,000 行 ( 比 如 C 或 Java) 代 码 来 解 决, 现 在 向 一 个 有 些 编 程 经 验 的 学 生 提 问 : 如 果 让 你 全 职 工 作, 需 要 多 长 时 间 建 立 这 个 系 统? 学 生 的 回 答 一 般 为 1 至 3 个 月 考 虑 到 学 生 的 编 程 技 术 能 力, 最 有 可 能 的 情 况 是, 在 2 个 月 内 他 们 可 编 写 一 个 软 件 并 演 示 给 教 授 看 用 2 个 月 时 间 完 成 软 件, 那 么 学 生 每 个 月 的 代 码 产 出 率 约 为 5000 行 / 每 人 每 月 现 在 让 我 们 看 看 另 一 种 情 况, 当 我 们 作 为 客 户 向 从 事 软 件 开 发 业 务 的 公 司 提 出 同 一 问 题 时 虽 然 行 业 中 没 有 代 码 产 出 率 的 标 准 水 平, 而 且 针 对 解 决 不 同 问 题 的 代 码 产 出 率 也 存 在 很 大 差 异, 但 如 果 对 一 个 代 码 产 出 率 为 1000 行 / 每 人 每 月 的 程 序 员 评 价 他 的 生 产 效 率, 说 他 的 生 产 力 是 相 当 可 观 的 ( 尽 管 在 嵌 入 式 系 统 中, 产 出 率 可 以 低 至 100 行 / 每 人 每 月 ), 这 是 客 观 公 正 的 以 这 样 的 生 产 率, 那 么 软 件 公 司 的 专 业 团 队 将 需 10 个 人 月 的 投 入 才 能 建 立 这 个 软 件 系 统 为 什 么 在 这 两 种 情 况 下 代 码 产 出 率 会 存 在 差 异? 为 什 么 同 一 个 学 生, 当 他 在 学 校 时 他 的 产 出 率 可 达 几 千 行 / 每 人 每 月, 而 当 他 在 公 司 上 班 时 却 仅 仅 只 有 1000 行 / 每 人 每 月? 答 案 当 然 是 两 个 不 同 的 东 西 在 两 种 不 同 的 情 况 下 完 成 首 先, 学 生 建 立 系 统 的 主 要 目 的 是 出 于 演 示, 而 不 期 望 以 后 会 使 用 因 为 不 被 使 用, 所 以 软 件 本 身 没 有 多 大 意 义, 软 件 存 在 的 缺 陷 和 质 量 问 题 也 不 被 人 们 所 关 注 同 样, 其 他 的 质 量 问 题, 如 可 用 性 可 维 护 性 可 移 植 性 等 也 都 可 以 忽 略 另 一 方 面, 工 业 强 度 的 软 件 系 统 则 是 为 了 解 决 客 户 的 特 定 问 题 而 建 立 的, 它 用 于 客 户 处 理 某 些 业 务 若 系 统 出 现 故 障 则 会 产 生 巨 大 损 害, 如 金 融 或 商 业 损 失, 给 用 户 造 成 不 便, 甚 至 财 产 和 生 命 损 失 因 此, 软 件 系 统 应 该 保 证 性 能 健 全, 比 如 可 靠 性, 可 用 性, 便 携 性 等 性 能 这 种 满 足 最 终 用 户 高 品 质 需 要 的 软 件 在 很 大 程 度 上 会 影 响 软 件 的 开 发 方 式 和 成 本, 布 鲁 克 斯 的 经 验 法 则 给 出 建 议 说, 工 业 强 度 的 软 件 可 能 要 花 上 10 倍 学 生 软 件 的 投 入 [16] 软 件 产 业 主 要 关 注 的 是 工 业 强 度 软 件 的 开 发, 软 件 工 程 领 域 的 重 点 也 是 如 何 建 立 这 样 的 系 统 也 就 是 说, 软 件 工 程 的 问 题 域 针 对 的 是 工 业 强 度 软 件 在 本 书 的 余 下 部 分, 当 我 们 使 用 软 件 这 一 术 语 时 都 是 指 工 业 强 度 的 软 件 在 本 章 的 剩 余 部 分, 我 们 将 学 习

9 - 质 量 成 本 和 进 度 是 ( 工 业 强 度 ) 软 件 项 目 的 主 要 驱 动 力 - 如 何 定 义 项 目 的 成 本 和 生 产 效 率, 如 何 评 定 软 件 的 质 量 - 大 规 模 和 变 化 是 问 题 域 的 重 要 属 性, 及 相 应 的 解 决 办 法 P.Jalote, 软 件 工 程 简 明 教 程, 分 类 号 : / ,ç 施 普 林 格 出 版 社 有 限 公 司 2008 年 伦 敦

10 1.1 成 本 进 度 和 质 量 除 了 高 品 质 的 要 求 是 工 业 强 度 软 件 与 其 他 软 件 的 区 别, 成 本 和 进 度 也 是 这 类 软 件 的 主 要 驱 动 力 在 工 业 强 度 的 软 件 领 域, 有 三 个 基 本 的 驱 动 力 成 本 进 度 和 质 量 软 件 开 发 必 须 在 综 合 考 虑 费 用 的 合 理 性 时 间 的 合 理 性 质 量 的 良 好 性 这 三 个 前 提 下 开 发 一 个 软 件 项 目 往 往 由 这 三 个 参 数 来 驱 动 和 定 义 工 业 强 度 软 件 费 用 非 常 高, 主 要 是 基 于 这 样 的 事 实 : 软 件 开 发 是 极 度 密 集 型 的 劳 力 为 理 解 成 本 观 念, 我 们 不 妨 先 看 看 行 业 当 前 的 现 实 状 况, 在 行 业 中 交 付 代 码 行 (LOC) 或 千 行 代 码 (KLOC) 是 目 前 最 常 用 的 衡 量 软 件 规 模 的 方 法, 因 为 人 力 费 用 是 软 件 生 产 中 主 要 的 成 本, 故 软 件 开 发 成 本 通 常 以 在 开 发 过 程 中 每 人 每 月 工 作 量 来 计 算, 而 生 产 率 通 常 以 每 人 每 月 所 产 出 的 代 码 行 ( 或 KLOC) 来 衡 量 在 软 件 行 业 中, 生 产 率 幅 度 从 每 人 每 月 数 百 行 至 超 过 千 行 范 围 变 化 这 个 生 产 率 是 对 整 个 开 发 周 期 而 言 的, 而 不 仅 仅 只 是 编 码 任 务 阶 段 软 件 公 司 通 常 向 提 出 软 件 开 发 要 求 的 客 户 报 价 为 $ $ 15,000/ 每 人 每 月 的 费 用 若 生 产 率 为 1000 行 代 码 / 每 人 每 月, 这 意 味 着 交 付 的 每 一 行 代 码 要 花 费 3-15 美 元 的 成 本! 甚 至 一 个 小 项 目 也 很 容 易 达 到 五 万 行 代 码 规 模, 按 这 样 的 软 件 生 产 率, 那 么 5 万 行 代 码 的 软 件 项 目 也 将 耗 资 15 万 至 75 万 美 元! 在 许 多 项 目 中 进 度 是 另 一 个 重 要 因 素, 商 业 趋 势 要 求 产 品 尽 可 能 即 时 地 投 入 市 场, 也 就 是 说 从 概 念 到 交 付 产 品 的 周 期 要 缩 短 这 对 于 软 件 而 言, 就 是 需 要 在 指 定 的 时 间 更 快 地 开 发 出 来 不 幸 的 是, 在 软 件 的 历 史 案 例 中 不 乏 项 目 延 迟 的 例 子 显 然, 降 低 成 本 和 缩 短 软 件 开 发 周 期 是 软 件 工 程 中 心 目 标, 每 人 每 月 (KLOC) 生 产 率 可 以 充 分 反 映 对 成 本 和 进 度 的 关 注 如 果 生 产 率 较 高, 显 然 人 月 的 成 本 会 较 低 ( 同 样 的 工 作, 现 在 可 以 用 更 少 的 人 力 来 完 成 ); 同 样, 如 果 生 产 率 较 高, 在 更 短 的 时 间 内 开 发 出 软 件 的 可 能 性 会 提 高, 相 比 低 生 产 率 团 队, 一 个 相 同 规 模 的 高 生 产 率 团 队 可 以 用 更 少 的 时 间 来 完 成 一 项 工 作 ( 当 然 项 目 所 需 的 实 际 时 间 还 取 决 于 劳 力 的 分 配 数 量 ) 因 此, 追 求 更 高 生 产 率 是 软 件 工 程 背 后 的 基 本 驱 动 力, 也 是 使 用 不 同 工 具 和 技 术 的 主 要 原 因 除 了 成 本 和 进 度 外, 另 外 一 个 驱 动 软 件 工 程 的 重 要 因 素 是 质 量 质 量 是 软 件 的 主 要 问 题, 现 今 的 商 业 策 略 通 常 是 围 绕 质 量 问 题 而 制 定 的 不 幸 的 是, 已 经 出 现 了 大 量 的 软 件 不 稳 定 性 方 面 的 案 例, 软 件 通 常 没 有 做 它 应 该 做 的 或 做 了 一 些 不 应 该 做 的 事 情 显 然, 开 发 高 品 质 的 软 件 是 软 件 工 程 的 另 一 个 基 本 目 标 然 而, 成 本 一 般 很 好 理 解, 但 软 件 质 量 这 个 概 念 有 待 进 一 步 阐 述 软 件 产 品 质 量 的 国 际 标 准 [55] 表 明, 软 件 的 质 量 包 括 六 个 主 要 属 性, 如 图 1.1 所 示 这

11 些 属 性 可 以 定 义 如 下 : 图 1.1 软 件 质 量 属 性 - 功 能 (Functionality) 当 软 件 被 使 用 时 提 供 满 足 需 要 功 能 的 能 力 - 可 靠 性 (Reliability) 提 供 无 故 障 服 务 的 能 力 - 可 用 性 (Usability) 能 被 理 解 学 习 使 用 的 能 力 - 效 率 (Efficiency) 对 使 用 的 资 源 总 量 所 提 供 合 适 性 能 的 能 力 - 可 维 护 性 (Maintainability) 为 了 更 正 错 误 改 善 性 能 或 者 作 出 适 应 性 调 整 而 能 被 修 改 的 能 力 - 可 移 植 性 (Portability) 无 需 实 施 额 外 的 措 施 就 能 适 应 不 同 具 体 环 境 的 能 力 由 于 质 量 具 有 多 方 面 特 性, 不 同 的 项 目 可 能 会 强 调 不 同 属 性, 所 以 全 局 性 的 质 量 指 标 是 不 可 能 存 在 的 然 而, 尽 管 有 许 多 质 量 属 性, 但 可 靠 性 被 普 遍 认 为 是 主 要 的 质 量 标 准 软 件 不 可 靠 是 由 于 软 件 缺 陷 的 存 在, 故 质 量 好 坏 的 衡 量 是 以 每 单 位 规 模 ( 一 般 取 为 千 行 代 码, 或 KLOC) 软 件 存 在 的 缺 陷 数 作 为 主 要 的 标 准 因 而 提 高 质 量 就 是 尽 可 能 地 减 少 单 位 规 模 中 的 缺 陷 数 量 当 前 好 的 软 件 工 程 实 践 已 经 能 够 将 缺 陷 密 度 降 低 到 每 单 位 规 模 的 缺 陷 数 少 于 1 为 确 定 软 件 产 品 质 量, 我 们 需 要 确 定 已 交 付 的 软 件 中 存 在 的 缺 陷 数 量 而 这 个 数 字 显 然 在 交 付 时 是 不 知 道 的, 并 可 能 永 远 不 得 而 知 另 一 种 衡 量 质 量 的 方 法 是 在 交 付 6 个 月 ( 或 1 年 ) 的 时 间 内 记 录 发 现 的 缺 陷 数, 然 后 根 据 这 些 缺 陷 定 义 软 件 的 质 量, 这 意 味 着 已 交 付 的 软 件 的 质 量 在 6 个 月 后 才 能 确 定 而 缺 陷 密 度 也 可 用 过 去 类 似 项 目 的 数 据 来 估 计, 如 果 使 用 了 类 似 的 方 法, 那 么 可 以 预 计 目 前 的 项 目 与 过 去 的 项 目 会 有 类 似 的 缺 陷 密 度 应 该 指 出 的 是, 如 果 使 用 这 种 质 量 定 义 方 法, 那 么 什 么 是 缺 陷 就 必 须 明 确 界 定 缺 陷 可 能 是 一 些 导 致 软 件 崩 溃 的 问 题 或 是 导 致 输 出 结 果 未 能 正 确 对 齐 的 问 题 或 是 拼 错 一 些 单 词 等

12 问 题 缺 陷 的 确 切 定 义 显 然 依 赖 于 项 目 或 公 司 开 发 项 目 所 使 用 的 标 准 ( 通 常 是 后 者 ) 除 了 可 靠 性, 另 一 个 值 得 关 注 的 质 量 属 性 是 可 维 护 性 一 旦 软 件 交 付 和 使 用 后, 它 就 进 入 维 护 阶 段 软 件 没 有 随 时 间 增 长 而 损 耗 的 物 理 组 件, 那 为 什 么 还 需 要 维 护 呢? 这 是 因 为 软 件 系 统 本 身 存 在 缺 陷 普 遍 认 为, 现 在 的 工 艺 水 平 是 有 限 的, 零 缺 陷 密 度 的 软 件 开 发 是 不 可 能 的 这 些 缺 陷, 一 经 发 现 就 必 须 要 隔 离, 即 所 谓 的 矫 正 性 维 护 维 护 也 需 要 改 变 交 付 的 软 件 以 满 足 用 户 新 的 需 求 和 适 应 环 境, 即 适 应 性 维 护 在 软 件 系 统 的 整 个 生 命 周 期 中, 维 护 成 本 可 能 远 远 超 过 原 来 的 开 发 成 本 对 于 维 护 成 本 与 开 发 成 本 比 例, 不 同 的 人 有 不 同 的 看 法, 主 要 有 三 种, 即 80:20 或 70:30 或 60:40 由 于 维 护 成 本 高, 所 以 软 件 系 统 的 易 于 维 护 自 然 是 人 们 所 追 求 的 1.2 规 模 和 变 化 对 于 我 们 的 问 题 域 ( 工 业 强 度 软 件 ), 尽 管 成 本 进 度 和 质 量 是 主 要 的 驱 动 力, 也 有 一 些 问 题 域 的 其 他 特 征 会 影 响 到 所 采 用 的 解 决 方 案 请 关 注 软 件 的 另 两 个 特 点 规 模 和 变 化 大 多 数 工 业 强 度 的 软 件 系 统 往 往 是 庞 大 而 复 杂 的, 需 要 成 千 上 万 行 的 代 码 一 些 知 名 的 软 件 产 品 的 大 小 列 于 表 1.1 中 表 1.1:KLOC 大 小 的 一 些 知 名 产 品 Size (KLOC) Software Languages 980 gcc Ansic,cpp,yacc 320 Perl Perl,ansic,sh 200 Openssl Ansic,cpp,perl 100 apache Ansic,sh 65 sendmail Ansic 30,000 Red Hat Linux Ansic,cpp 40,000 Windows XP Ansic,cpp 正 如 所 预 料 的 那 样, 与 开 发 小 型 系 统 相 比, 大 型 系 统 需 要 有 不 同 的 方 法 集, 因 为 用 于 开 发 小 型 系 统 所 用 的 方 法 通 常 不 能 扩 展 到 大 型 系 统 中 下 面 举 个 例 子 说 明 这 一 点, 考 虑 计 算 一 个 房 间 内 的 人 数 与 一 个 国 家 的 人 口 普 查 问 题 两 者 本 质 上 是 计 数 问 题, 但 计 算 一 个 房 间 里 人 数 所 使 用 的 方 法 用 到 人 口 普 查 中 就 不 能 正 常 工 作 人 口 普 查 将 不 得 不 使 用 一 组 不 同 的 方 法, 除 了 计 数 外, 人 口 普 查 问 题 需 要 相 当 多 的 管 理, 组 织 和 验 证 同 样, 用 来 开 发 几 百 行 程 序 的 方 案 也 不 能 被 期 望 用 到 一 个 成 千 上 万 行 的 代 码 程 序 开 发 中, 大 型 软 件 开 发 必 须 使 用 一 组 不 同 的 方 法

13 任 何 软 件 项 目 都 会 涉 及 到 工 程 的 使 用 和 项 目 管 理 在 小 型 项 目 中, 开 发 和 管 理 都 可 以 使 用 非 正 规 方 法 但 是, 对 于 大 型 项 目, 这 二 者 都 要 严 格 得 多, 如 图 1.2 所 示 换 句 话 说, 若 要 成 功 地 执 行 该 系 统 的 工 程 项 目, 必 须 采 用 适 当 的 方 法, 项 目 的 管 理 也 必 须 严 格 以 确 保 成 本, 进 度 和 质 量 处 于 控 制 之 中 大 规 模 是 问 题 域 的 一 个 关 键 特 征, 所 以 解 决 方 案 应 采 用 有 能 力 建 设 大 型 软 件 系 统 的 工 具 和 技 术 变 化 是 问 题 域 的 另 一 个 特 征, 开 发 方 案 必 须 考 虑 变 化 由 于 系 统 的 完 整 需 求 集 合 一 般 不 知 道 ( 往 往 不 能 在 项 目 开 始 时 知 道 ) 或 者 没 有 申 明, 随 着 开 发 进 度 和 时 间 的 推 进 更 多 的 需 求 被 提 出 来, 这 就 需 要 纳 入 到 正 在 开 发 的 软 件 系 统 中 这 种 对 于 不 断 修 改 的 需 求 要 求 开 发 方 案 包 括 变 化, 并 能 高 效 地 适 应 变 化 对 于 一 个 项 目, 变 更 请 求 可 能 会 是 破 坏 性 的, 如 果 处 理 不 当, 将 会 耗 费 多 达 30% 至 40% 的 开 发 成 本 [14] 如 上 所 述, 软 件 有 时 不 得 不 做 改 变, 即 使 它 已 被 安 装 虽 然 在 维 护 过 程 中 出 现 的 变 化 可 以 与 发 生 在 开 发 过 程 中 的 变 化 加 以 区 别, 但 这 些 区 别 是 模 糊 的, 因 为 从 根 本 上 来 说, 这 两 种 情 况 下 的 变 化 是 相 似 的, 现 有 源 代 码 的 改 变 是 因 为 需 求 方 面 的 改 变 或 者 由 于 需 要 删 除 某 些 缺 陷 图 1.2 规 模 问 题 总 体 而 言, 随 着 世 界 变 化 的 加 快, 即 使 正 在 开 发 中 的 软 件 也 必 须 快 速 改 变 因 此, 需 求 变 化 是 问 题 域 的 一 个 特 点 在 当 今 世 界, 不 能 接 受 和 适 应 变 化 的 方 案 是 没 有 多 大 用 处 的, 它 们 只 能 解 决 少 数 拒 绝 变 化 的 问 题

14 1.3 小 结 - 软 件 工 程 的 问 题 域 是 面 向 工 业 强 度 级 软 件, 这 种 软 件 是 为 了 解 决 某 些 用 户 组 的 问 题, 期 望 高 质 量 - 在 这 个 问 题 域 中, 成 本 进 度 和 质 量 是 基 本 驱 动 力 因 此, 用 于 解 决 这 类 问 题 的 方 法 和 工 具 必 须 确 保 高 生 产 率 和 高 品 质 - 生 产 率 用 来 衡 量 每 单 位 投 入 资 源 的 产 出 量 在 软 件 中, 产 出 可 以 用 交 付 的 代 码 行 数 来 度 量, 人 力 是 主 要 的 资 源, 其 投 入 可 以 用 每 人 花 费 的 时 间 作 定 量 标 准 因 此, 生 产 率 可 以 按 每 人 每 月 交 付 的 代 码 行 数 来 衡 量 - 软 件 质 量 包 括 许 多 属 性, 如 功 能 性 可 靠 性 可 用 性 效 率 可 维 护 性 和 可 移 植 性 等 可 靠 性 往 往 被 视 为 主 要 的 质 量 属 性, 软 件 缺 陷 可 反 映 软 件 不 可 靠, 所 以 每 千 行 代 码 所 含 的 缺 陷 数 可 反 应 出 软 件 的 质 量 - 这 一 领 域 中 的 问 题 常 常 是 非 常 大 的, 且 客 户 需 求 变 化 也 很 快 因 此, 开 发 工 业 强 度 软 件 所 使 用 的 技 术 应 该 是 : 有 能 力 建 立 大 型 软 件 系 统, 并 有 能 力 处 理 变 化 自 测 练 习 1. 学 生 型 软 件 和 工 业 强 度 软 件 的 主 要 差 别 是 什 么? 2. 如 果 开 发 一 个 普 通 程 序 用 于 解 决 问 题 需 要 的 努 力 为 E, 可 以 估 计 为 解 决 这 一 问 题 的 工 业 强 度 软 件 将 需 要 10E 的 努 力 那 么 你 认 为 这 些 额 外 的 努 力 在 哪 些 方 面 被 消 耗 了 呢? 3. 你 会 采 取 什 么 样 的 标 准 来 衡 量 一 个 项 目 的 生 产 率? 你 又 将 如 何 从 这 些 衡 量 标 准 中 确 定 生 产 率? 4. 软 件 质 量 有 哪 些 不 同 的 属 性? 对 于 一 个 会 计 软 件, 最 关 心 的 是 它 能 确 保 计 算 不 出 任 何 错 误, 那 么 它 的 哪 一 个 质 量 属 性 是 我 们 应 该 最 关 注 的? 5. 大 型 项 目 与 小 型 项 目 相 比, 哪 些 是 项 目 管 理 任 务 该 做 的? 你 将 如 何 执 行 这 些 任 务 的 变 化? 6. 假 设 一 个 软 件 系 统 在 操 作 过 程 中 需 要 做 一 些 改 变, 为 什 么 对 系 统 作 改 变 所 需 的 成 本 比 对 源 代 码 做 修 改 所 需 的 成 本 要 多?

15 第 二 章 软 件 过 程 既 然 我 们 对 软 件 工 程 所 处 理 的 问 题 域 已 经 有 了 一 个 很 好 地 了 解, 接 下 来 将 讨 论 软 件 工 程 本 身 软 件 工 程 被 定 义 为 系 统 化 开 发 操 作 维 护 和 淘 汰 软 件 的 方 法 [52] 我 们 知 道, 除 了 提 供 软 件 之 外, 高 品 质 低 成 本 短 周 期 也 是 软 件 工 程 必 须 实 现 的 目 标 换 句 话 说, 系 统 化 方 法 必 须 帮 助 实 现 高 品 质 和 高 生 产 率 Q&P( 质 量 和 生 产 率 ) 这 两 个 目 标 在 软 件 行 业 中, 影 响 Q&P 的 主 要 有 三 个 因 素, 分 别 为 人 过 程 和 技 术 也 就 是 说, 最 终 的 质 量 交 付 和 生 产 率 取 决 于 软 件 项 目 所 涉 及 的 人 员 的 技 能, 取 决 于 人 员 执 行 任 务 时 所 采 用 的 过 程 模 型 和 所 使 用 的 工 具 由 于 最 终 是 需 要 人 去 开 发 和 交 付 软 件 ( 生 产 率 的 衡 量 也 是 以 劳 力 的 付 出 衡 量 的 ), 而 软 件 过 程 的 主 要 任 务 是 通 过 指 定 具 体 任 务 及 如 何 去 完 成 任 务 以 帮 助 人 们 实 现 高 Q&P 工 具 则 可 以 帮 助 人 们 更 有 效, 更 少 出 错 地 执 行 任 务 因 此, 为 了 符 合 高 Q&P 软 件 的 目 标, 显 然 实 施 过 程 应 该 是 核 心 所 以, 软 件 工 程 的 重 点 主 要 放 在 过 程 上, 过 程 也 就 是 上 面 所 定 义 的 系 统 化 方 法 正 是 由 于 软 件 工 程 重 点 是 强 调 过 程, 从 而 使 它 与 其 他 的 大 多 数 计 算 机 学 科 区 别 开 来 许 多 其 他 的 计 算 机 学 科 是 以 其 他 类 型 的 产 品 ( 如 操 作 系 统 数 据 库 等 ) 为 重 点, 而 软 件 工 程 的 重 点 是 生 产 产 品 的 过 程 由 于 过 程 形 成 了 软 件 工 程 的 核 心, 工 具 和 技 术 为 有 效 地 执 行 过 程 提 供 支 持, 故 本 书 的 重 点 放 在 过 程 在 这 一 章 中, 将 讨 论 : - 过 程 的 作 用 及 项 目 中 所 用 的 过 程 模 型 - 软 件 过 程 的 各 个 组 成 部 分, 以 及 开 发 过 程 和 项 目 管 理 过 程 的 关 键 作 用 - 各 种 开 发 过 程 模 型 瀑 布 模 型, 原 型 模 型, 迭 代 模 型,RUP 模 型, 时 间 盒 模 型 和 XP 模 型 - 项 目 管 理 过 程 的 总 体 结 构 及 其 关 键 阶 段

16 2.1 过 程 和 项 目 过 程 是 为 一 个 给 定 的 目 的 而 部 署 的 一 组 顺 序 执 行 的 步 骤 [52] 前 面 已 经 提 过, 开 发 ( 工 业 强 度 ) 软 件 的 目 的 是 为 满 足 某 些 用 户 或 客 户 的 需 求, 如 图 2.1 所 示 软 件 项 目 是 此 类 问 题 的 一 个 实 例, 开 发 过 程 被 用 来 实 现 这 一 目 的 图 2.1 基 本 问 题 对 于 一 个 项 目, 开 发 过 程 起 着 关 键 作 用 按 照 过 程 中 的 步 骤 一 步 步 执 行 任 务, 最 后 也 就 实 现 了 交 付 软 件 所 期 望 的 目 的 然 而, 如 前 所 述, 仅 仅 只 是 完 成 所 需 的 软 件 是 不 够 的, 我 们 还 希 望 完 成 的 项 目 是 低 成 本 短 周 期 高 质 量 由 于 这 些 额 外 的 目 标, 过 程 的 作 用 就 更 加 显 著 虽 然 许 多 过 程 模 型 已 能 完 成 图 2.1 所 示 的 软 件 开 发 的 基 本 目 标, 但 为 了 实 现 高 P&Q, 则 需 要 一 些 最 佳 的 过 程 正 是 这 个 目 标, 使 得 设 计 过 程 成 为 一 种 挑 战 我 们 必 须 把 过 程 本 身 与 过 程 的 规 范 或 说 明 区 别 开 来, 过 程 是 一 个 动 态 的 实 体, 它 是 一 组 要 被 执 行 的 操 作 过 程 规 范 则 是 对 一 个 过 程 的 描 述, 即 在 项 目 中 需 要 遵 循 的 过 程 规 范 和 规 则 在 一 个 项 目 中, 过 程 规 范 可 作 为 该 项 目 的 过 程 计 划, 实 际 的 过 程 则 是 项 目 所 要 完 成 的 任 务 注 意, 实 际 的 过 程 可 以 与 过 程 计 划 不 同 然 而, 在 本 书 中, 我 们 将 假 设 过 程 计 划 和 实 际 过 程 是 相 同 的 而 不 加 以 区 分, 并 用 过 程 这 个 词 来 指 代 二 者 过 程 模 型 使 得 一 般 的 过 程 变 得 具 体, 它 是 解 决 某 一 类 项 目 的 最 佳 过 程 也 就 是 说, 在 该 模 型 适 用 的 情 况 下, 使 用 该 模 型 作 为 项 目 的 过 程 可 以 达 到 开 发 出 高 Q&P 软 件 的 目 的 一 个 过 程 模 型 在 本 质 上 是 将 各 种 最 好 的 项 目 实 施 做 法 编 制 成 一 个 处 方, 以 便 开 发 出 成 功 的 项 目 换 言 之, 过 程 是 实 现 高 品 质, 低 成 本, 短 周 期 软 件 这 一 目 标 的 方 法, 而 过 程 模 型 则 提 供 了 一 个 适 合 某 一 类 项 目 的 过 程 框 架 过 程 通 常 是 在 一 个 高 层 次 上 指 定 的 阶 段 序 列, 而 每 个 阶 段 的 步 骤 序 列 构 成 了 该 阶 段 的 过 程, 通 常 被 称 为 过 程 的 子 过 程

17 2.2 软 件 过 程 的 组 成 按 上 述 定 义, 过 程 是 为 实 现 某 一 目 标 而 被 执 行 的 步 骤 序 列 在 软 件 开 发 时, 由 于 要 实 现 许 多 不 同 的 目 标, 故 多 个 过 程 是 必 要 的 很 多 过 程 并 不 关 心 软 件 工 程, 尽 管 它 们 会 影 响 软 件 的 开 发 这 可 被 视 为 无 软 件 过 程 的 比 如, 业 务 流 程 社 会 过 程 和 培 训 进 程 这 些 过 程 都 会 影 响 到 软 件 开 发 活 动, 但 都 超 越 了 软 件 工 程 的 职 权 范 围 与 软 件 开 发 有 关 的 技 术 和 管 理 问 题 称 为 软 件 过 程 作 为 一 个 软 件 项 目, 它 必 须 设 计 一 个 解 决 方 案 并 妥 善 管 理 该 项 目, 故 软 件 过 程 必 须 具 备 两 个 主 要 成 分 开 发 过 程 和 项 目 管 理 流 程 开 发 过 程 指 定 了 所 有 需 被 执 行 的 工 程 活 动, 而 管 理 流 程 则 指 定 如 何 规 划 和 控 制 这 些 活 动, 以 使 成 本 进 度 质 量 和 其 他 目 标 均 能 实 现 开 发 出 来 的 软 件 能 否 实 现 既 满 足 用 户 需 求, 同 时 确 保 高 生 产 率 和 高 质 量 的 目 标, 有 效 的 开 发 过 程 和 项 目 管 理 流 程 起 着 关 键 作 用 项 目 过 程 中 生 产 出 的 产 品 由 许 多 项 组 成 ( 例 如, 最 终 的 源 代 码 可 能 由 许 多 源 文 件 组 成 ), 随 着 项 目 的 进 展 这 些 项 不 断 演 变 发 展, 创 造 出 多 个 版 本 而 开 发 过 程 一 般 不 处 理 这 些 发 展 和 变 化, 常 用 来 处 理 它 们 的 是 一 个 被 称 为 软 件 配 置 控 制 过 程, 这 个 过 程 主 要 处 理 管 理 方 面 的 变 化 因 此, 尽 管 产 品 会 发 生 变 化, 但 并 没 有 违 反 其 完 整 性 这 三 个 重 要 过 程 的 重 点 服 务 目 标 是 项 目 和 产 品, 也 可 认 为 为 产 品 工 程 过 程, 因 为 它 们 主 要 目 标 是 生 产 所 需 的 产 品 如 果 软 件 过 程 被 看 作 是 一 个 静 态 的 实 体, 那 么 这 三 个 组 成 过 程 就 足 够 了 然 而, 软 件 过 程 本 身 就 是 一 个 动 态 的 实 体, 因 为 它 必 须 改 变 以 适 应 我 们 对 软 件 开 发 的 理 解 和 新 技 术 新 工 具 的 使 用 基 于 这 一 点, 一 个 管 理 软 件 过 程 的 过 程 也 是 必 要 的 过 程 管 理 过 程 的 基 本 目 标 是 改 善 软 件 过 程 因 为 通 过 不 断 改 善,( 软 件 ) 过 程 控 制 生 产 出 高 质 量 低 成 本 软 件 的 能 力 得 以 提 高, 为 此 研 究 目 前 的 软 件 过 程, 频 繁 地 分 析 那 些 采 用 过 程 模 型 而 完 成 的 项 目 从 了 解 当 前 过 程, 分 析 其 特 性, 决 定 如 何 改 进, 到 最 后 的 改 善, 这 一 完 整 过 程 都 是 由 过 程 管 理 来 处 理 的 主 要 过 程 的 组 成 及 其 之 间 的 关 系 如 图 2.2 所 示, 它 们 不 仅 在 所 执 行 的 活 动 类 别 上 有 区 别, 更 典 型 地 是 在 执 行 过 程 中 参 与 活 动 的 人 员 不 同 在 一 个 典 型 的 项 目 中, 开 发 活 动 由 程 序 员 设 计 师 测 试 人 员 等 来 完 成 ; 项 目 管 理 流 程 活 动 由 项 目 管 理 人 员 执 行 ; 配 置 控 制 流 程 则 是 由 一 组 被 普 遍 称 为 配 置 控 制 器 的 人 员 来 完 成 ; 过 程 管 理 活 动 则 是 由 软 件 工 程 过 程 组 (SEPG) 执 行

18 软 件 过 程 生 产 工 程 过 程 过 程 管 理 过 程 开 发 过 程 工 程 管 理 过 程 软 件 配 置 管 理 过 程 图 2.2 软 件 过 程 在 本 书 中, 将 主 要 集 中 在 与 产 品 工 程 相 关 的 过 程 上, 特 别 是 开 发 过 程 和 项 目 管 理 过 程 本 书 大 部 分 内 容 将 讨 论 开 发 过 程 的 不 同 阶 段 和 子 过 程, 或 执 行 这 些 阶 段 任 务 所 用 的 方 法 学 对 于 书 中 剩 下 的 内 容, 将 使 用 软 件 过 程 这 一 术 语 来 指 代 产 品 工 程 过 程, 除 非 另 有 说 明 2.3 软 件 开 发 过 程 模 型 对 于 软 件 开 发 过 程, 我 们 的 目 标 是 生 产 出 高 品 质 的 软 件 产 品 因 此, 关 注 这 些 活 动 就 直 接 关 系 到 软 件 的 生 产, 例 如, 设 计 编 码 和 测 试 由 于 开 发 过 程 指 定 了 项 目 中 需 要 执 行 的 主 要 开 发 活 动 和 质 量 控 制 活 动, 因 此 它 构 成 了 软 件 过 程 的 核 心, 而 管 理 过 程 的 决 策 往 往 是 以 开 发 过 程 为 基 础 一 个 项 目 的 开 发 过 程 定 义 了 项 目 应 执 行 的 任 务 和 它 们 的 执 行 顺 序 通 过 指 定 必 须 执 行 何 种 类 型 的 活 动 及 以 何 种 顺 序 执 行, 过 程 限 制 了 项 目 的 自 由 度 这 样, 从 源 于 用 户 要 求 到 终 止 于 软 件 满 足 某 些 需 求 的 最 短 ( 或 最 有 效 的 ) 路 径 就 可 以 得 到 该 过 程 驱 动 了 项 目 的 开 发, 并 严 重 影 响 项 目 的 结 果 如 前 所 述, 一 个 过 程 模 型 将 一 般 过 程 具 体 化 如 一 个 项 目 应 该 被 划 分 为 几 个 阶 段, 这 些 阶 段 应 该 以 何 种 顺 序 执 行, 以 及 执 行 阶 段 中 的 有 关 限 制 和 条 件 过 程 模 型 背 后 的 基 本 前 提 是, 哪 种 情 况 下 该 模 型 是 适 用 的, 哪 种 情 况 下 使 用 该 模 型 作 为 项 目 的 过 程 将 导 致 低 成 本 高 品 质 短 周 期, 或 提 供 其 他 好 处 换 句 话 说, 过 程 模 型 为 项 目 寻 找 一 个 合 适 的 过 程 提 供 了 通 用 准 则 由 于 开 发 过 程 的 重 要 性, 目 前 已 提 出 了 各 种 不 同 的 模 型 在 本 节 中, 我 们 将 讨 论 几 个 主 要 模 型 瀑 布 模 型 最 简 单 的 过 程 模 型 是 瀑 布 模 型, 它 以 线 性 的 顺 序 组 织 各 个 阶 段 活 动 该 模 型 最 初 是 由

19 Royce [74] 提 出 的, 但 基 于 各 活 动 的 性 质 及 活 动 之 间 的 控 制 流, 该 模 型 已 发 展 演 化 出 许 多 不 同 的 版 本 在 此 模 型 中, 一 个 项 目 由 可 行 性 分 析 开 始, 在 成 功 说 明 一 个 项 目 可 行 后, 需 求 分 析 和 项 目 计 划 才 开 始 需 求 分 析 完 成 后 才 开 始 设 计 工 作, 设 计 完 成 后 开 始 编 码 当 编 码 完 成 后, 就 要 做 代 码 集 成 和 测 试, 测 试 成 功 后 安 装 该 系 统 在 此 之 后, 进 入 正 常 运 行 和 系 统 维 护 阶 段 该 模 型 如 图 2.3 所 示 系 统 可 行 性 验 证 可 行 性 报 告 需 求 分 析 与 项 目 计 划 验 证 需 求 文 档 和 项 目 计 划 系 统 设 计 核 实 系 统 设 计 文 档 详 细 设 计 核 实 细 节 设 计 文 档 编 码 核 实 程 序 测 试 与 集 成 测 试 计 划, 测 试 报 告 和 手 册 安 装 安 装 报 告 运 行 与 维 护 图 2.3 瀑 布 模 型 该 模 型 的 基 本 思 想 是 分 阶 段 关 注, 即 每 阶 段 处 理 一 组 不 同 的 独 立 的 事 件 这 样 做 将 构 建 软 件 这 一 大 而 复 杂 任 务 分 解 成 很 多 小 的 任 务 ( 小 任 务 本 身 还 是 很 复 杂 ), 如 确 定 需 求 设 计 等 分 阶 段 关 注 和 有 选 择 的 重 点 关 注 为 工 程 师 和 处 理 复 杂 问 题 的 管 理 人 员 提 供 了 更 好 的 处 理 方 法 需 求 分 析 阶 段 也 被 说 成 是 分 析 与 计 划 计 划 是 软 件 开 发 中 的 关 键 活 动, 一 个 好 的 计 划 是 基 于 系 统 需 求 的, 它 应 该 在 后 续 阶 段 开 始 前 完 成 然 而, 在 实 践 中, 需 求 细 节 是 没 有 必 要 对 其 做 计 划 的 因 此, 计 划 通 常 与 需 求 分 析 重 叠 进 行, 计 划 工 作 完 成 后, 后 期 阶 段 的 工 作 才 开 始 对 所 有 后 期 阶 段, 计 划 是 一 种 额 外 的 输 入

20 线 性 顺 序 的 活 动 会 带 来 一 些 重 要 的 结 果 首 先, 必 须 明 确 识 别 一 个 阶 段 的 结 束 和 下 一 个 阶 段 的 开 始, 必 须 在 每 个 阶 段 结 束 时 运 用 某 些 认 证 机 制 这 通 常 由 一 些 验 证 和 验 证 手 段 来 完 成, 从 而 确 保 一 个 阶 段 的 输 出 与 输 入 ( 这 是 上 一 阶 段 的 输 出 ) 一 致, 而 该 阶 段 的 输 出 应 与 系 统 的 整 体 要 求 一 致 认 证 需 要 的 结 果 是, 每 个 阶 段 必 须 有 一 些 明 确 的 输 出 用 于 评 估 和 认 证 也 就 是 说, 当 一 个 阶 段 的 活 动 完 成 后, 应 该 有 该 阶 段 生 产 的 产 品 较 早 阶 段 的 输 出 通 常 被 称 为 工 作 产 品, 而 且 通 常 是 诸 如 需 求 文 档 或 设 计 文 档 之 类 的 文 档 对 于 编 码 阶 段, 输 出 则 是 代 码 虽 然 一 个 项 目 中 产 生 的 文 档 集 是 依 赖 于 过 程 的 实 施 方 式, 但 下 列 文 档 通 常 形 成 一 个 合 理 的 文 档 集, 在 每 个 项 目 中 都 应 该 包 含 该 文 档 集 : - 需 求 文 档 - 项 目 计 划 书 - 设 计 文 档 ( 体 系 结 构, 系 统, 详 细 设 计 ) - 测 试 计 划 和 测 试 报 告 - 最 终 的 代 码 - 软 件 手 册 ( 例 如, 用 户 手 册, 安 装 手 册 等 ) 瀑 布 模 型 的 主 要 优 点 之 一 是 它 的 简 单 性, 概 念 直 截 了 当, 并 将 构 建 软 件 系 统 这 一 大 任 务 划 分 成 一 系 列 简 明 阶 段, 每 个 阶 段 处 理 一 个 单 独 的 逻 辑 事 件 这 也 使 得 合 同 计 划 的 执 行 变 得 容 易, 因 为 每 当 一 个 阶 段 的 工 作 完 成 生 产 出 产 品 后, 客 户 就 该 给 开 发 组 织 相 应 费 用 虽 然 瀑 布 模 型 被 广 泛 使 用, 但 存 在 一 些 大 的 局 限 性 主 要 限 制 包 括 : 1. 它 假 定 在 设 计 开 始 之 前 一 个 系 统 的 需 求 可 固 定 ( 如, 基 线 ) 这 对 将 已 有 的 人 工 系 统 转 变 为 自 动 化 系 统 是 可 能 的, 但 是 对 于 新 系 统 确 定 需 求 是 很 困 难 的, 因 为 甚 至 用 户 也 不 清 楚 系 统 全 部 的 需 求 所 以, 对 这 类 项 目 来 说, 需 求 不 变 是 不 现 实 的 2. 确 定 的 需 求 通 常 需 要 选 择 硬 件 ( 因 为 它 形 成 了 需 求 规 范 的 一 部 分 ) 一 个 大 项 目 可 能 需 要 几 年 才 能 完 成, 如 果 硬 件 在 早 期 选 定, 由 于 硬 件 技 术 更 新 的 速 度, 很 可 能 最 终 的 软 件 将 使 用 一 个 处 于 过 时 边 缘 的 硬 件 技 术, 这 对 昂 贵 的 软 件 系 统 来 说 显 然 是 不 理 想 的 3. 它 遵 循 大 爆 炸 的 方 式 即 最 后 整 个 软 件 是 一 次 交 付 这 存 在 很 大 的 风 险, 因 为 用 户 直 到 最 后 才 能 知 道 他 们 得 到 的 软 件 性 能 及 质 量 等 此 外, 如 果 在 项 目 的 开 发 中 途 就 耗 尽 了 全 部 的 费 用, 那 么 该 项 目 就 不 可 能 被 开 发 出 来 也 就 是 说, 它 具 有 全 有 或 全 无 的 价 值 命 题 4. 鼓 励 需 求 膨 胀 由 于 所 有 的 需 求 必 须 在 开 始 时 就 指 定, 而 且 只 有 被 指 定 的 需 求 才 会 被 实 现, 所 以 这 就 会 使 用 户 和 其 他 权 益 拥 有 者 加 入 那 些 他 们 认 为 可 能 需 要 的 特 征 ( 但 最 终 可 能 不 会 被 使 用 ) 5. 这 是 一 种 文 档 驱 动 过 程, 需 要 在 每 一 个 阶 段 的 结 束 都 提 交 正 式 文 档

21 尽 管 有 这 些 限 制, 瀑 布 模 型 一 直 是 使 用 最 广 泛 的 过 程 模 型, 它 非 常 适 合 于 那 些 需 求 明 确 的 常 规 类 型 的 项 目 也 就 是 说, 如 果 开 发 组 织 对 问 题 域 相 当 熟 悉, 且 也 很 清 楚 软 件 的 需 求, 那 么 瀑 布 模 型 会 发 挥 良 好 的 效 果, 甚 至 可 能 是 最 有 效 的 过 程 原 型 模 型 以 原 型 模 型 为 基 础 的 开 发 过 程 其 目 的 是 克 服 瀑 布 模 型 的 第 一 限 制, 基 本 思 路 是 不 需 先 固 定 需 求, 设 计 或 编 码 工 作 也 可 以 进 行, 然 后 建 立 一 个 快 速 原 型 模 型 以 帮 助 理 解 需 求 原 型 的 开 发 是 基 于 当 前 已 知 的 需 求, 显 然, 原 型 模 型 的 开 发 经 历 设 计, 编 码 和 测 试 阶 段, 但 每 一 个 阶 段 都 没 有 做 得 很 正 式 或 非 常 彻 底 通 过 该 原 型 可 以 向 用 户 展 示 待 开 发 软 件 的 全 部 或 部 分 功 能 和 性 能, 以 便 客 户 更 好 地 了 解 所 需 系 统 的 需 求, 这 就 导 致 更 为 稳 定 的 需 求, 因 为 变 化 总 不 会 那 么 频 繁 原 型 模 型 对 一 个 复 杂 的 大 系 统 来 说 是 很 有 吸 引 力 的, 因 为 复 杂 的 大 系 统 没 有 手 工 过 程 或 已 有 的 系 统 帮 助 确 定 需 求 在 这 种 情 况 下, 让 客 户 玩 原 型 可 提 供 宝 贵 的 和 无 形 的 投 入, 以 帮 助 确 定 该 系 统 的 需 求 这 也 是 验 证 某 种 技 术 是 否 可 行 的 有 效 方 法, 这 在 新 系 统 中 可 能 是 需 要 的, 因 为 约 束 可 否 被 满 足 或 能 否 开 发 出 实 现 需 求 的 算 法 尚 不 清 楚, 在 这 两 种 情 况 下, 使 用 原 型 模 型 会 使 与 项 目 相 关 的 风 险 减 少, 原 型 模 型 过 程 如 图 2.4 所 示 图 2.4 原 型 模 型 采 用 丢 弃 式 原 型 模 型 的 开 发 过 程 活 动 的 推 进 次 序 如 [40] 所 述, 该 模 型 的 开 发 通 常 开 始 于 初 步 需 求 规 范 文 档 完 成 之 后, 在 这 个 阶 段, 对 系 统 及 其 需 求 会 达 到 一 个 理 性 的 理 解, 哪 些 需 求 是 不 明 确 的 或 者 可 能 会 发 生 变 化 的 也 会 变 得 明 确 原 型 开 发 出 来 之 后, 由 最 终 的 用 户 和 客 户 来 使 用 和 探 索 根 据 他 们 的 经 验, 向 开 发 商 提 供 有 关 原 型 的 反 馈 信 息 : 什 么 是 正 确 的 哪 些 需 要 修 改 缺 少 什 么 什 么 是 不 需 要 的 等 等 在 反 馈 的 基 础 上, 原 型 被 修 改 以 便 纳 入 客 户 提 出 的 容 易 做 的, 然 后 用 户 和 客 户 被 再 次 获 准 使 用 该 系 统 此 过 程 循 环 重 复, 直 到 原 型 开 发 者 和 分 析 师 判 断 认 为, 从 进 一 步 更 改 系 统 和 获 取 反 馈 信 息 所 获 得 的 利 益 超 过 了 更 改 系 统 和 获 取 反 馈 所 花 的 成 本 和 时 间 为 止 在 反 馈 的 基 础 上, 最 初 的 需 求 被 修 改 得 到 最 后 的 需 求 规 范,

22 该 需 求 规 范 用 于 开 发 生 产 质 量 体 系 对 于 原 型 模 型, 要 达 到 需 求 分 析 可 行 的 目 的, 其 成 本 必 须 保 持 在 较 低 水 平 因 此, 只 有 那 些 包 含 在 原 型 里 的 功 能, 才 会 从 用 户 的 经 验 得 到 有 价 值 的 返 回 异 常 处 理, 恢 复 和 符 合 某 些 标 准 与 格 式 的 一 致 性 等 特 性, 通 常 不 包 括 在 原 型 中 原 型 模 型 中, 随 着 模 型 的 丢 弃, 那 些 已 经 得 到 很 好 理 解 的 需 求 的 实 现 变 得 毫 无 意 义 因 此, 开 发 的 重 点 是 包 括 那 些 没 有 得 到 正 确 理 解 的 功 能 由 于 强 调 的 是 快 速 开 发 而 非 质 量, 故 采 用 快 而 脏 的 开 发 方 法 因 为 原 型 会 被 扔 掉, 只 有 很 少 的 文 档 需 要 在 原 型 中 产 生 例 如, 设 计 文 档, 测 试 计 划, 测 试 用 例 等 在 原 型 开 发 过 程 中 都 不 需 要 另 一 个 重 要 的 成 本 削 减 措 施 是 减 少 测 试, 由 于 在 通 常 的 软 件 开 发 中 测 试 过 程 消 耗 了 开 发 经 费 的 主 要 部 分, 所 以 减 少 测 试 对 于 降 低 成 本 有 相 当 大 的 影 响 通 过 使 用 这 种 削 减 成 本 的 方 法, 可 以 保 持 原 型 开 发 成 本 低 于 总 开 发 成 本 但 是 这 些 额 外 成 本 的 回 报 收 益 是 相 当 高 的 首 先, 开 发 原 型 的 经 验 将 降 低 实 际 的 软 件 开 发 成 本 ; 第 二, 由 于 有 来 自 原 型 的 反 馈, 系 统 需 求 将 更 加 稳 定, 即 需 求 方 面 的 变 化 会 较 少 因 此 由 于 需 求 变 化 所 导 致 的 成 本 将 大 幅 减 少 ; 第 三, 最 终 软 件 的 质 量 很 可 能 很 优 越, 因 为 作 为 经 验 丰 富 的 工 程 师, 他 们 在 开 发 原 型 时 能 创 造 一 个 更 好 的 设 计, 编 写 出 更 好 的 代 码, 做 更 好 的 测 试 ; 最 后, 开 发 出 一 个 原 型 能 缓 解 许 多 由 于 需 求 不 明 确 而 存 在 于 项 目 中 的 风 险 总 的 来 说, 原 型 是 非 常 适 用 于 需 求 很 难 确 定, 同 时 对 规 定 的 需 求 信 心 不 足 的 项 目 这 种 初 起 系 统 需 求 不 能 得 到 很 好 理 解 的 项 目, 使 用 原 型 过 程 模 型 是 最 有 效 的 软 件 开 发 方 法, 这 也 是 减 少 与 项 目 相 关 风 险 的 优 秀 技 术 迭 代 开 发 模 型 迭 代 开 发 模 型 克 服 了 瀑 布 模 型 的 第 三 项 及 第 四 项 限 制, 并 尝 试 结 合 原 型 模 型 与 瀑 布 模 型 这 两 者 的 优 点 其 基 本 思 路 是 : 软 件 以 增 量 式 的 方 式 开 发, 每 一 次 迭 代 向 系 统 增 加 一 些 功 能 性 能, 直 到 系 统 被 完 全 实 现 迭 代 增 强 模 型 [4] 是 这 种 方 法 的 一 个 实 例, 这 种 模 式 的 第 一 步 是 开 发 出 系 统 的 一 个 初 始 子 集 这 个 子 集 包 含 问 题 ( 易 于 理 解 和 落 实, 构 成 一 个 有 用 的 系 统 ) 的 一 些 关 键 方 面 构 建 一 个 项 目 控 制 列 表, 它 包 含 为 达 到 最 终 实 现 而 必 须 执 行 的 所 有 任 务 从 该 项 目 控 制 列 表 可 以 看 出 给 定 的 阶 段 距 最 终 完 成 项 目 还 有 多 少 的 工 作 量 需 要 做 每 一 个 步 骤 包 括 从 列 表 中 删 除 下 一 个 任 务, 为 选 定 的 任 务 设 计 实 现 方 案, 编 码 和 测 试, 分 析 执 行 此 步 骤 后 得 到 的 部 分 系 统, 并 更 新 结 果 列 表 这 三 个 阶 段 是 所 谓 的 设 计 阶 段, 实 施 阶 段, 分 析 阶 段 这 个 过 程 是 迭 代 进 行 的, 直 到 该 项 目 控 制 列 表 为 空, 此 时 系 统 将 最 终 可 用 迭 代 增 强 模 型 如 图 2.5 所 示

23 图 2.5 迭 代 增 强 模 型 该 项 目 控 制 列 表 指 导 迭 代 步 骤 和 跟 踪 记 录 所 有 必 须 完 成 的 任 务 在 分 析 的 基 础 上, 列 表 中 的 任 务 可 以 包 括 有 缺 陷 部 分 的 重 新 设 计 或 整 个 系 统 的 重 新 设 计, 但 是 系 统 的 重 新 设 计 一 般 只 出 现 在 最 初 的 步 骤 在 以 后 的 步 骤 中, 设 计 会 稳 定 下 来, 重 新 设 计 的 机 会 也 会 很 少 列 表 中 加 入 的 每 个 条 目 是 一 个 应 该 在 迭 代 加 强 过 程 中 执 行 的 任 务, 且 应 该 足 够 简 单 以 被 完 全 理 解 以 这 种 方 式 选 择 任 务 能 将 错 误 的 发 生 率 及 重 新 设 计 的 可 能 性 降 到 最 小, 每 一 个 步 骤 的 设 计 和 实 施 阶 段 都 可 以 采 用 自 顶 向 下 的 方 式 或 使 用 一 些 其 他 技 术 尽 管 采 用 迭 代 开 发 方 式 会 带 来 好 处, 特 别 是 在 允 许 需 求 变 更 的 时 候, 因 为 不 存 在 全 有 或 全 无 的 风 险 等, 但 是 也 会 发 生 与 迭 代 式 开 发 相 关 的 一 些 费 用 例 如, 由 于 将 来 迭 代 的 需 求 不 明 确, 一 个 系 统 的 设 计 可 能 不 会 太 健 壮 又 如, 有 时 为 了 适 应 将 来 迭 代 的 需 求, 不 得 不 对 已 存 在 的 系 统 做 一 些 更 改, 导 致 额 外 返 工 或 丢 弃 原 先 所 做 的 工 作 总 体 而 言, 它 可 能 无 法 提 供 最 好 的 技 术 解 决 方 案, 但 在 许 多 项 目 中 收 益 可 能 会 超 过 所 花 费 的 成 本 迭 代 模 式 的 另 一 种 常 用 的 方 法 是 以 标 准 的 瀑 布 模 型 或 原 型 模 型 方 法 来 做 需 求 与 结 构 设 计, 而 采 用 迭 代 方 式 交 付 软 件 也 就 是 说, 构 建 系 统 采 用 迭 代 方 式 做 ( 这 是 最 耗 时 耗 力 的 任 务 ) 虽 然 大 多 数 的 需 求 已 在 前 期 指 定, 也 可 以 把 这 种 方 法 看 成 是 一 次 迭 代 交 付 需 求 和 架 构 计 划, 然 后 在 每 个 增 量 阶 段 进 一 步 迭 代 交 付 软 件 在 每 个 迭 代 交 付 的 开 始 决 定 哪 些 需 求 将 在 此 阶 段 实 施, 然 后 加 强 设 计, 编 写 代 码 来 实 现 需 求, 一 次 迭 代 过 程 要 完 成 一 个 提 供 给 最 终 用 户 某 些 价 值 的 系 统 为 一 个 迭 代 过 程 选 择 需 求 主 要 是 以 需 求 提 供 给 最 终 用 户 的 价 值 以 及 它 们 支 持 其 他 需 求 的 关 键 程 度 为 基 础, 方 法 如 图 2.6 所 示

24 图 2.6 迭 代 交 付 方 法 这 种 方 法 的 优 点 是, 由 于 大 多 需 求 在 前 期 已 知, 故 这 个 系 统 的 总 体 架 构 图 是 可 得 到 的, 且 可 设 计 出 一 个 保 持 相 对 稳 定 的 架 构 有 了 这 个, 开 发 迭 代 过 程 出 现 返 工 的 概 率 将 会 减 小 与 此 同 时, 以 迭 代 方 式 交 付 给 最 终 客 户 的 软 件 也 不 会 存 在 全 有 或 全 无 的 风 险 此 外, 交 货 是 以 增 量 的 方 式 逐 步 完 成 的, 每 个 迭 代 阶 段 的 规 划 和 执 行 是 分 别 进 行 的, 一 个 迭 代 过 程 的 反 馈 信 息 可 纳 入 到 下 一 次 迭 代, 也 可 以 被 包 含 未 被 涉 及 的 新 需 求 因 此, 这 种 迭 代 开 发 模 式 还 提 供 了 以 上 所 讨 论 的 模 型 优 点 尽 管 用 的 过 程 中 会 出 现 一 些 困 难, 迭 代 方 法 正 变 得 日 益 流 行 之 所 以 日 益 流 行, 原 因 如 下 : 首 先, 现 在 的 用 户 不 想 在 没 有 看 到 回 报 之 前 投 资 太 多, 当 今 企 业 都 认 为 从 所 投 资 的 项 目 中 看 到 持 续 不 断 的 回 报 是 更 可 取 的, 迭 代 模 型 就 保 证 了 这 一 点 每 一 迭 代 阶 段 结 束 后 就 可 以 交 付 一 些 工 作 软 件, 从 而 客 户 承 担 的 风 险 也 被 限 制 了 ; 其 次, 因 为 企 业 正 在 迅 速 改 变, 他 们 也 不 知 道 完 整 的 软 件 要 求, 但 又 必 须 向 软 件 不 断 添 加 新 功 能 以 适 应 企 业 不 断 变 化 的 情 况, 而 迭 代 过 程 刚 好 允 许 这 一 点 ; 另 外, 每 个 迭 代 为 工 作 体 系 提 供 反 馈, 这 样 可 以 为 下 一 阶 段 的 迭 代 在 开 发 稳 定 需 求 方 面 提 供 帮 助 下 面 将 描 述 一 些 其 他 过 程 模 型, 所 有 的 这 些 模 型 都 会 使 用 到 迭 代 的 方 法 Rational 统 一 过 程 (RUP) 模 型 统 一 软 件 过 程 (RUP)[51,63] 是 另 一 种 迭 代 过 程 模 型, 该 模 型 由 Rational 公 司 设 计,

25 现 在 是 IBM 的 一 部 分 虽 然 这 是 一 个 一 般 过 程 模 型, 它 是 为 面 向 对 象 的 软 件 开 发 而 设 计 的, 使 用 统 一 建 模 语 言 UML(UML 将 在 后 面 的 章 节 进 一 步 讨 论 ) RUP 建 议 将 软 件 开 发 分 割 成 多 个 周 期, 每 个 周 期 交 付 一 个 全 面 的 工 作 体 系 一 般 来 说, 每 个 周 期 作 为 一 个 单 独 的 项 目 来 执 行, 其 目 标 是 提 供 一 些 额 外 的 功 能 到 现 有 的 系 统 ( 由 前 一 周 期 构 建 的 ) 因 此, 对 于 一 个 项 目, 周 期 过 程 形 成 了 整 个 过 程 每 个 周 期 本 身 被 分 成 四 个 连 续 阶 段 : - 开 始 阶 段 - 细 化 阶 段 - 开 发 阶 段 - 发 布 阶 段 每 个 阶 段 都 有 不 同 的 目 的, 每 个 阶 段 完 成 后 产 生 的 明 确 输 出 都 是 项 目 中 定 义 好 的 里 程 碑 初 始 阶 段 的 目 标 是 建 立 项 目 的 目 的 和 范 围, 这 一 阶 段 的 完 成 是 生 命 周 期 目 标 的 里 程 碑 这 一 里 程 碑 应 指 定 最 终 系 统 的 概 貌 和 高 层 次 能 力, 预 期 提 供 的 商 业 利 益, 系 统 的 关 键 用 例 说 明, 该 项 目 的 主 要 风 险, 以 及 与 成 本 和 进 度 相 关 的 项 目 的 基 本 计 划 基 于 这 一 阶 段 的 输 出, 可 能 做 出 继 续 / 停 止 的 决 定 如 果 该 项 目 继 续 进 行, 那 么 这 个 里 程 碑 表 明 权 益 拥 有 者 之 间 有 一 个 共 同 的 意 向, 说 明 他 们 同 意 项 目 及 其 概 貌 效 益 成 本 使 用 等 等 在 细 化 阶 段, 基 于 细 节 需 求 分 析 设 计 该 系 统 的 体 系 结 构 这 个 阶 段 的 完 成 是 生 命 周 期 构 建 的 里 程 碑 这 个 阶 段 结 束 时, 期 望 大 部 分 的 需 求 已 被 确 定 并 细 化, 系 统 的 架 构 也 被 设 计 ( 和 规 定 ) 好, 它 应 该 以 处 理 在 早 期 阶 段 确 定 的 技 术 风 险 方 式 来 设 计 此 外, 一 个 项 目 的 高 层 ( 抽 象 层 ) 计 划 已 被 准 备 好, 并 由 此 用 来 展 示 剩 余 阶 段 和 这 些 阶 段 中 的 迭 代, 以 及 当 前 对 风 险 的 看 法 在 本 阶 段 结 束 时, 与 技 术 选 择 相 关 的 关 键 工 程 决 策, 体 系 结 构 等 工 作 已 完 成, 并 得 到 了 对 该 项 目 的 详 细 了 解 本 阶 段 里 程 碑 的 输 出 允 许 对 提 出 的 解 决 方 案 进 行 技 术 评 估, 以 及 对 项 目 做 出 关 于 成 本 与 效 益 分 析 的 明 智 决 定 在 开 发 阶 段, 建 立 实 现 和 测 试 软 件 这 一 阶 段 带 来 软 件 产 品 的 交 付, 以 及 相 关 的 用 户 手 册 和 其 他 说 明 书, 成 功 地 完 成 这 一 阶 段 工 作 意 味 着 初 始 操 作 能 力 里 程 碑 的 实 现 发 布 阶 段 的 目 的 是 将 软 件 从 开 发 环 境 移 植 到 客 户 的 环 境 中, 这 是 一 项 复 杂 的 任 务, 因 为 它 可 能 需 要 额 外 的 测 试 数 据 转 换 ( 以 便 软 件 能 正 常 工 作 ) 人 员 培 训 等 这 个 阶 段 的 成 功 执 行 导 致 产 品 发 布 这 一 里 程 碑 的 实 现 RUP 中 不 同 阶 段 和 里 程 碑 如 图 2.7 所 示

26 图 2.7 RUP 模 型 虽 然 这 些 阶 段 是 连 续 的, 每 个 阶 段 本 身 可 能 有 多 次 迭 代, 每 次 迭 代 交 付 给 内 部 或 外 部 客 户 一 些 良 好 定 义 的 输 出, 这 些 输 出 往 往 是 所 在 阶 段 的 里 程 碑 的 最 后 交 付 的 一 部 分 通 常 情 况 下, 将 开 发 阶 段 分 割 成 多 次 迭 代, 每 个 阶 段 的 每 次 迭 代 产 生 一 个 可 用 于 反 馈 评 价 β- 测 试 等 的 工 作 系 统 在 开 发 阶 段 中 迭 代 经 常 发 生, 一 个 阶 段 中 的 一 次 迭 代 应 该 交 付 什 么 也 很 明 确, 迭 代 对 于 其 他 阶 段 也 可 能 有 意 义 例 如, 在 细 化 阶 段, 第 一 次 迭 代 可 能 只 是 指 定 整 体 架 构 和 高 层 次 的 需 求, 而 第 二 次 迭 代 可 能 研 究 解 决 细 节 另 外 一 个 例 子, 可 能 有 多 次 迭 代 发 布 已 开 发 的 软 件, 而 每 次 迭 代 只 是 支 持 已 开 发 软 件 的 某 一 部 分 功 能 或 软 件 的 某 些 特 性 RUP 精 心 挑 选 每 个 阶 段 的 名 称, 以 免 与 项 目 中 要 完 成 的 工 程 任 务 相 混 淆, 因 为 在 RUP 中 工 程 任 务 和 阶 段 是 分 开 的 不 同 的 工 程 活 动 也 可 在 一 个 阶 段 中 执 行, 以 实 现 该 阶 段 的 目 标 RUP 将 活 动 划 分 到 多 个 不 同 的 子 过 程, 子 过 程 称 之 为 核 心 过 程 工 作 流 这 些 子 过 程 对 应 于 需 求 分 析 设 计 实 现 设 计 测 试 项 目 管 理 等, 表 2.1 列 出 了 某 些 子 过 程 RUP 与 其 他 模 型 的 关 键 区 别 在 于 它 将 阶 段 与 任 务 分 离, 并 允 许 一 个 功 能 的 多 个 子 过 程 在 一 个 阶 段 中 完 成 在 瀑 布 模 型 ( 或 瀑 布 的 迭 代 模 型 ) 中, 一 个 阶 段 内 的 一 个 过 程 是 与 一 个 特 定 任 务 ( 由 一 些 诸 如 需 求 设 计 等 之 类 的 过 程 执 行 ) 相 联 系 的 在 RUP 中 这 些 任 务 是 与 阶 段 分 开 的, 例 如 它 允 许 在 开 发 阶 段, 执 行 需 求 过 程 也 就 是 说, 它 允 许 需 求 活 动 的 某 些 部 分 放 到 开 发 阶 段 来 做, 而 在 瀑 布 模 型 中 这 是 不 容 许 的 因 此, 一 个 项 目 如 果 希 望 这 样, 在 细 化 阶 段 为 了 某 些 功 能 可 以 做 详 细 需 求, 在 开 发 过 程 进 行 时 可 以 对 其 他 需 求 做 细 化 ( 也 许 是 第 一 次 迭 代 ) 这 不 仅 可 以 让 项 目 在 规 划 方 面 有 更 大 程 度 的 灵 活 性 ( 当 不 同 的 任 务 应 该 完 成 时 ), 而 且 它 也 抓 住 了 现 实 的 状 况, 即 往 往 不 可 能 在 开 始 时 就 指 定 所 有 的 需 求, 因 此 最 好 在 指 定 一 部 分 需 求 的 情 况 下 先 启 动 项 目, 到 后 期 再 制 定 出 详 细 内 容 虽 然 一 个 子 过 程 可 能 在 许 多 阶 段 都 很 活 跃, 但 子 过 程 所 花 费 的 工 作 量 或 努 力 将 随 阶 段 不 同 而 不 同, 这 可 以 预 期 例 如, 在 细 化 阶 段 可 以 期 望 在 需 求 子 过 程 上 多 花 一 点 的 努 力, 而 在 开 发 阶 段 应 少 一 点, 用 于 发 布 阶 段 的 则 更 应 该 少 ( 如 果 发 布 阶 段 需 要 的 话 ) 同 样, 在 该 模 型 中, 开 发 过 程 在 细 化 阶 段 很 积 极, 这 使 得 项 目 在 细 化 阶 段 构 建 一 个 原 型, 以 帮 助 其 需 求 活 动, 但 是, 大 部 分 的 实 现 工 作 并 没 有 在 开 发 阶 段 实 施 当 然, 不 同 阶 段 子 进 程 所 花 的 努 力 取

27 决 于 该 项 目, 然 而, 一 般 模 式 如 表 2.1 所 示, 该 表 列 出 了 各 阶 段 各 活 动 所 花 精 力 的 大 小 : 高, 中, 低 等 表 2.1 :RUP 中 不 同 阶 段 的 子 过 程 的 活 动 水 平 开 始 细 化 开 发 发 布 需 求 分 析 与 设 计 实 现 测 试 安 装 工 程 管 理 高 高 低 零 低 高 中 零 零 低 高 低 零 低 高 中 零 零 中 高 中 中 中 中 总 体 而 言,RUP 提 供 了 一 个 灵 活 的 过 程 模 型, 它 遵 循 的 迭 代 做 法 不 仅 在 顶 层 ( 整 个 周 期 ), 而 且 还 鼓 励 迭 代 方 法 用 于 一 个 周 期 过 程 内 的 各 个 阶 段 而 在 各 个 阶 段 中, 它 允 许 按 照 项 目 的 需 要 完 成 不 同 的 任 务 时 间 盒 (timeboxing) 模 型 为 加 快 发 展, 可 以 采 用 各 迭 代 过 程 并 行 进 行 的 方 法 也 就 是 说, 在 当 前 迭 代 发 布 一 个 系 统 之 前 就 启 动 下 一 个 迭 代, 从 而, 当 前 版 本 的 开 发 与 新 版 本 的 开 发 并 行 发 生 在 当 前 迭 代 完 成 之 前 启 动 下 一 个 迭 代 可 以 缩 短 迭 代 的 平 均 交 付 时 间 但 是, 为 了 支 持 并 行 执 行, 每 一 个 迭 代 都 必 须 有 合 理 的 结 构, 开 发 团 队 也 必 须 组 织 有 序 合 理 时 间 盒 模 型 为 这 些 问 题 提 出 了 一 种 解 决 方 案 [59,60] 在 时 间 盒 模 型 中, 开 发 的 基 本 单 位 是 时 间 盒, 它 的 工 期 是 固 定 的 由 于 工 期 是 固 定 的, 在 选 择 需 求 或 时 间 盒 内 完 成 的 功 能 方 面, 关 键 因 素 是 把 什 么 放 进 时 间 盒 内 是 合 理 的 常 规 的 迭 代 方 法 是 先 选 择 功 能, 然 后 才 能 决 定 交 付 时 间, 这 与 并 行 迭 代 形 成 鲜 明 对 比 时 间 盒 模 型 改 变 了 人 们 对 开 发 的 理 解 方 式, 使 得 进 度 变 成 一 个 不 可 忽 略 和 高 度 优 先 的 事 每 个 时 间 盒 被 划 分 成 几 个 阶 段 序 列, 如 同 瀑 布 模 型 一 样, 每 个 阶 段 完 成 迭 代 中 明 确 定 义 好 的 任 务, 并 产 生 一 个 明 确 的 输 出 该 模 型 要 求 每 个 阶 段 持 续 的 时 间 ( 用 来 完 成 此 阶 段 的 任 务 的 时 间 ) 大 约 是 相 同 的 此 外, 还 要 求 每 个 阶 段 都 应 有 一 个 专 门 的 开 发 团 队, 也 就 是 说, 一 个 团 队 仅 执 行 本 阶 段 的 任 务, 其 他 阶 段 的 任 务 则 由 其 他 团 队 各 自 去 执 行, 这 与 其 他 迭 代 模 型 假 定 一 个 项 目 的 所 有 任 务 均 有 同 一 团 队 来 执 行 是 完 全 不 同 的 阶 段 工 期 相 同 与 每 个 阶 段 都 有 专 门 团 队 开 发 的 特 点 使 得 时 间 盒 迭 代 呈 现 出 迭 代 流 水 线 的 状 态 ( 流 水 线 概 念 来 源 于 硬 件 领 域, 不 同 的 指 令 并 行 执 行, 一 旦 当 前 指 令 的 第 一 阶 段 完 成, 立 即 启 动 执 行 下 一 条 指 令 )

28 为 了 说 明 这 一 模 型 的 使 用, 考 虑 一 个 时 间 盒 由 三 阶 段 组 成 : 需 求 规 格, 实 现, 安 装 需 求 阶 段 由 分 析 师 队 伍 执 行, 本 阶 段 结 束 后, 将 产 生 一 个 需 求 的 优 先 列 表 和 一 个 高 层 次 设 计 实 现 团 队 则 开 发 代 码 以 实 现 需 求, 并 完 成 测 试 工 作 把 被 测 试 过 的 代 码 交 给 安 装 团 队 进 行 安 装 前 测 试, 然 后 安 装 系 统 使 之 投 入 到 生 产 中 使 用 迭 代 的 三 个 阶 段 按 这 种 分 工 使 它 们 在 大 约 相 同 的 时 间 内 完 成 各 自 的 任 务 按 照 时 间 盒 的 三 个 阶 段, 项 目 进 展 如 下 : 当 需 求 团 队 在 时 间 盒 -1 完 成 需 求 后, 需 求 交 给 开 发 团 队 用 来 实 现 软 件 ; 然 后 需 求 团 队 继 续 一 个 新 的 工 作, 开 始 为 时 间 盒 -2 准 备 需 求 ; 当 时 间 盒 -1 的 实 现 工 作 完 成 后 交 给 安 装 团 队 ; 而 后 实 现 团 队 继 续 一 个 新 的 实 现 工 作, 即 根 据 时 间 盒 -2 的 需 求 开 始 编 写 代 码, 同 时 需 求 团 队 则 开 始 时 间 盒 -3 的 需 求 工 作 时 间 盒 模 型 的 执 行 流 水 线 如 图 2.8 所 示 软 件 TB1 需 求 实 现 安 装 TB2 需 求 实 现 安 装 TB3 需 求 实 现 安 装 TB4 需 求 构 建 安 装 图 2.8 时 间 盒 模 型 的 流 水 线 执 行 过 程 在 三 阶 段 流 水 线 的 时 间 盒 中, 最 多 可 以 同 时 进 行 三 个 迭 代 如 果 时 间 盒 的 大 小 为 T 天, 那 么 第 一 个 软 件 的 交 付 将 发 生 在 T 天 后 但 是, 随 后 的 交 付 将 每 T/3 天 发 生 一 次 例 如, 若 时 间 盒 的 工 期 T 为 9 周 ( 每 个 阶 段 的 持 续 时 间 为 3 周 ), 启 动 项 目 后 第 一 次 交 货 发 生 在 9 周 后, 第 二 次 交 货 发 生 在 12 周 后, 第 三 次 在 15 周 后, 以 此 类 推 相 比 线 性 迭 代 过 程, 则 首 次 交 付 将 于 9 周 后 发 生, 第 二 次 在 18 周, 第 三 次 27 周 后, 依 此 类 推 在 时 间 盒 模 型 中 要 求 有 三 个 专 门 团 队 为 项 目 工 作, 分 别 为 : 需 求 团 队, 实 现 团 队 及 安 装 团 队 以 上 讨 论 的 三 阶 段 流 水 线 团 队 活 动 如 图 2.9 所 示 [59]

29 需 求 团 队 TB1 的 需 求 分 析 TB2 的 需 求 分 析 TB3 的 需 求 分 析 TB4 的 需 求 分 析 实 现 团 队 TB1 的 实 现 TB2 的 实 现 TB3 的 实 现 TB4 的 实 现 安 装 团 队 TB1 的 安 装 TB2 的 安 装 TB3 的 安 装 TB4 的 安 装 图 2.9 不 同 团 队 的 任 务 应 该 明 确 的 是, 每 个 迭 代 的 工 期 并 没 有 缩 短 时 间 盒 模 型 中, 总 的 工 作 量 和 所 花 的 精 力 也 仍 与 线 性 迭 代 相 同 既 然 每 个 迭 代 所 花 的 精 力 和 时 间 没 有 缩 短, 那 么 缩 短 交 付 时 间 是 以 什 么 为 代 价 实 现 的 呢? 该 模 型 是 以 所 需 的 资 源 为 代 价 实 现 的 时 间 盒 模 型 中, 不 同 阶 段 有 不 同 的 专 门 团 队 为 其 工 作, 项 目 中 总 的 团 队 规 模 是 各 阶 段 团 队 的 总 和 线 性 迭 代 与 时 间 盒 迭 代 的 主 要 差 别 是, 前 者 以 单 一 团 队 执 行 所 有 阶 段 的 任 务, 而 后 者 整 个 团 队 仅 执 行 一 个 阶 段 任 务 因 此, 时 间 盒 模 型 为 利 用 额 外 的 人 力 来 缩 短 交 付 时 间 提 供 了 一 种 方 法 众 所 周 知, 以 标 准 方 法 执 行 项 目, 通 过 增 加 人 力 一 般 不 可 能 实 质 性 地 压 缩 项 目 的 周 期 然 而, 通 过 时 间 盒 模 型, 以 此 种 方 式 ( 并 行 执 行 不 同 阶 段 的 任 务 ) 使 用 更 多 的 人 力, 可 以 更 快 地 交 付 软 件 换 句 话 说, 通 过 利 用 额 外 的 人 力 提 供 了 一 种 缩 短 交 付 时 间 的 方 法 时 间 盒 模 型 特 别 适 用 于 在 固 定 的 框 架 内 使 用 稳 定 的 技 术, 短 时 期 开 发 出 拥 有 大 量 功 能 的 项 目 这 些 功 能 应 该 具 备 的 特 点 是 : 在 分 组 时 应 该 具 备 一 定 的 灵 活 性, 把 这 些 功 能 分 组 到 单 个 迭 代 阶 段 中 开 发, 然 后 构 成 一 个 有 意 义 的 系 统 因 为 同 时 展 开 多 个 开 发 过 程, 该 模 型 的 主 要 成 本 消 耗 在 项 目 管 理 的 日 益 复 杂 性 上 此 外, 迭 代 中 出 现 的 异 常 情 况 的 影 响 可 能 是 相 当 混 乱 的, 关 于 该 模 型 的 进 一 步 详 情 及 作 为 在 一 个 实 际 项 目 中 应 用 模 型 的 例 子, 请 参 阅 [59,60] 极 限 编 程 和 敏 感 过 程 模 型 敏 捷 开 发 方 法 始 于 20 世 纪 90 年 代, 针 对 瀑 布 模 型 文 档 化 和 机 械 性 的 过 程, 敏 捷 方 法 是 以 一 些 共 同 的 原 则 为 基 础, 其 中 某 些 原 则 为 [ - 工 作 软 件 是 项 目 进 展 的 关 键 度 量 方 法 - 对 于 一 个 项 目 的 进 展, 软 件 的 开 发 和 交 付 应 该 在 小 增 量 内 快 速 完 成 - 后 期 的 需 求 变 更, 也 应 当 受 理 ( 小 增 量 的 开 展 模 式 可 以 帮 助 适 应 这 种 要 求 ) - 面 对 面 的 沟 通 应 优 先 于 文 档 - 连 续 反 馈 和 客 户 的 参 与 对 开 发 高 质 量 的 软 件 是 很 必 要 的 - 简 单 的 设 计, 随 时 间 演 变 和 提 高 是 一 个 更 好 的 办 法, 而 不 是 一 开 始 就 为 处 理 所 有 可 能 发 生 的 情 况 而 精 心 设 计

30 - 交 货 日 期 由 有 能 力 的 团 队 ( 而 且 不 是 支 配 ) 决 定 已 提 出 多 种 详 细 的 敏 捷 方 法, 其 中 有 些 现 在 已 被 广 泛 使 用 在 众 多 敏 捷 方 法 之 中, 极 限 编 程 XP(Extreme Programming) 是 最 流 行 的 和 众 所 周 知 的 方 法 之 一 与 其 他 的 敏 捷 方 法 一 样, 它 认 为 变 化 是 不 可 避 免 的, 而 不 是 不 可 取 的, 发 展 过 程 中 应 该 包 括 变 化 为 了 适 应 变 化, 开 发 过 程 应 轻 巧 并 迅 速 地 做 出 反 应 为 此, 以 迭 代 方 式 开 发 软 件, 避 免 依 赖 详 细 的 多 种 文 档, 因 为 文 档 很 难 维 护 相 反, 它 依 赖 于 面 对 面 的 沟 通 简 单 反 馈 快, 以 确 保 所 需 的 变 化 快 速 正 确 地 反 映 在 程 序 中 这 里, 作 为 敏 捷 过 程 的 一 个 代 表, 我 们 简 要 讨 论 XP 开 发 过 程 一 个 极 限 编 程 项 目 开 始 于 用 户 的 小 故 事, 它 是 一 个 关 于 客 户 和 用 户 希 望 系 统 支 持 故 事 情 景 的 简 单 ( 几 句 话 ) 说 明 与 传 统 需 求 规 格 的 主 要 不 同 在 于 细 节, 用 户 故 事 不 包 含 详 细 需 求, 仅 当 故 事 被 执 行 时 才 涉 及 细 节, 因 此, 让 细 节 尽 可 能 晚 地 决 定 每 个 故 事 写 在 一 张 单 独 的 卡 片 上, 这 样 他 们 就 可 以 灵 活 组 合 受 权 的 开 发 团 队 估 算 落 实 一 个 用 户 故 事 需 多 长 时 间, 这 个 估 计 是 粗 略 的, 一 般 规 定 在 几 周 内 使 用 这 些 估 计 和 故 事 可 以 完 成 发 布 计 划, 它 定 义 哪 些 故 事 在 哪 个 系 统 发 布 内 实 现, 以 及 发 布 的 日 期 鼓 励 频 繁 地 小 的 发 布, 对 于 小 系 统 的 发 布 一 般 采 用 迭 代 开 发 模 式 验 收 测 试 也 属 于 故 事 的 实 现, 在 软 件 发 布 前 进 行 测 试 验 收 测 试 过 程 中 发 现 的 错 误 可 以 形 成 下 一 个 迭 代 的 工 作 项 目, 整 个 过 程 如 图 2.10 所 示 图 2.10 XP 全 过 程 迭 代 开 发, 每 次 迭 代 持 续 时 间 最 多 为 几 个 星 期 迭 代 开 始 于 迭 代 计 划, 该 计 划 选 择 了 在 该 阶 段 需 实 现 的 故 事, 高 价 值 高 风 险 的 故 事 会 被 赋 予 较 高 的 优 先 权, 在 前 期 的 迭 代 中 被 实 现 前 一 次 的 迭 代 中 失 败 的 验 收 测 试 也 要 在 本 次 迭 代 中 处 理, 故 事 的 细 节 也 被 包 含 在 迭 代 中 以 便 开 发 之 用 各 个 迭 代 中 用 到 的 开 发 方 法 会 有 一 些 独 特 的 实 例 第 一, 它 设 想 开 发 是 由 一 组 程 序 员 ( 称 为 组 编 程, 我 们 将 在 第 七 章 进 一 步 讨 论 ) 完 成, 而 非 个 别 程 序 员 ; 第 二, 它 表 明 为 实 现 一 个 代 码 单 元, 须 先 编 写 一 个 自 动 测 试 程 序, 代 码 单 元 应 能 通 过 测 试 单 元 的 测 试, 这 种 方 法 也 称 为 测 试 驱 动 开 发 与 常 规 的 代 码 第 一 开 发 方 法 ( 先 编 写 程 序 代 码, 然 后 考 虑 如 何 测 试 ) 形 成 对 比 ( 我 们 将 在 第 七 章 进 一 步 讨 论 测 试 驱 动 开 发 ), 随 着 单 元 代 码 功 能 的 增 加, 测 试 单

31 元 须 先 增 强, 然 后 增 强 的 代 码 单 元 以 通 过 一 组 新 的 测 试 单 元 ; 第 三, 因 为 它 鼓 励 改 变 和 简 单 的 解 决 方 案, 故 早 期 设 计 的 方 案 可 能 会 在 某 一 时 期 变 得 不 再 适 合 项 目 的 进 一 步 开 发 为 了 解 决 这 个 问 题, 建 议 做 重 构 工 作 以 改 善 设 计, 然 后 用 重 构 的 代 码 进 一 步 开 发 重 构 期 间 所 做 的 工 作 仅 仅 是 对 已 存 在 的 程 序 做 设 计 上 的 改 善, 并 不 添 加 新 的 功 能 ( 重 构 将 在 第 七 章 进 一 步 讨 论 ); 第 四, 它 鼓 励 频 繁 地 整 合 不 同 代 码 单 元 为 了 避 免 在 基 础 代 码 中 太 多 的 改 变 一 起 发 生, 故 一 次 只 允 许 一 个 单 元 释 放 其 改 变, 然 后 整 合 到 通 用 代 码 库 一 个 迭 代 阶 段 内 的 过 程 如 图 2.11 所 示 图 2.11 XP 中 的 一 个 迭 代 过 程 这 是 一 个 非 常 简 化 的 XP 的 描 述 XP 中 还 有 与 下 列 问 题 相 关 的 其 他 许 多 规 则, 如 : 程 序 员 与 客 户 的 权 利 团 队 成 员 之 间 的 交 流 及 隐 喻 的 使 用 对 所 有 厉 害 关 系 方 的 信 任 与 可 见 性 集 体 所 有 制 代 码 ( 团 队 中 的 任 何 人 都 可 以 修 改 代 码 中 的 任 何 地 方 ) 团 队 管 理 建 立 快 速 的 解 决 方 案 以 解 决 技 术 难 点 和 架 构 问 题, 或 是 探 索 一 些 新 方 法 如 何 处 理 错 误 如 何 从 上 一 次 迭 代 过 程 所 获 得 的 进 展 中 估 计 本 次 迭 代 需 要 做 的 事 情 如 何 召 开 协 商 会 议 如 何 开 始 一 天 的 开 发 工 作 等 等 网 站 就 上 述 问 题 提 供 了 一 些 很 好 的 资 源 以 及 其 他 XP 方 面 的 资 料 XP 和 其 他 敏 捷 方 法 适 用 于 需 求 变 化 在 数 量 和 频 率 方 面 都 较 高, 需 求 风 险 也 很 大 的 情 况 因 为 它 依 赖 于 团 队 所 有 成 员 之 间 的 强 大 交 流, 所 以 当 团 队 搭 配 合 适, 规 模 适 度 ( 一 般 最 多 20 个 人 ) 时,XP 会 表 现 出 很 高 的 效 率 此 外, 由 于 它 设 想 用 户 在 开 发 过 程 中 及 交 付 日 期 的 计 划 方 面 能 大 量 参 与, 故 当 用 户 愿 意 参 与 整 个 开 发 过 程 并 成 为 其 中 的 一 名 开 发 成 员 时,XP 可 以 良 好 地 运 作 过 程 模 型 在 项 目 中 的 应 用 我 们 已 经 了 解 了 很 多 不 同 的 过 程 开 发 模 型, 那 么 需 要 模 型 干 什 么 呢? 如 前 所 述, 开 发 ( 工 业 强 度 ) 软 件 的 目 的 不 仅 是 满 足 一 些 用 户 或 客 户 需 求 的 软 件, 还 希 望 以 低 成 本 短 周 期 完 成 项 目, 并 交 付 高 品 质 的 软 件 此 外, 在 一 个 项 目 中 可 能 还 有 其 他 的 限 定 因 素 需 要 项 目 去 满 足 因 此, 在 给 定 项 目 的 限 制 条 件 下, 采 用 一 种 过 程 模 型, 可 以 使 得 交 付 软 件 的 可 能 性 最 大 化, 并 实 现 高 Q&P 所 以, 为 一 个 项 目 选 择 一 个 合 适 的 开 发 过 程 模 型 是 项 目 经 理 不 得 不 做 的 关

32 键 决 定, 下 面 通 过 几 个 例 子 来 说 明 假 设 一 个 小 的 开 发 团 队 已 被 委 托 任 务, 建 立 一 个 本 地 大 学 的 小 拍 卖 网 站 大 学 的 行 政 部 门 在 一 开 始 愿 意 花 一 些 时 间 帮 助 开 发 系 统 的 需 求, 但 可 以 预 计 他 们 的 这 种 帮 助 能 力 在 后 期 将 受 到 限 制 如 果 该 团 队 被 限 定 在 4 个 月 内 完 成 该 项 目, 而 延 长 期 限 似 乎 是 非 常 不 可 能 的 拍 卖 网 站 中 有 一 些 功 能 是 必 不 可 少 的, 也 有 一 些 功 能 是 可 选 的, 但 没 有 该 功 能 系 统 照 样 能 运 作 得 相 当 好 有 了 这 些 限 制, 显 然, 对 于 这 个 项 目 瀑 布 模 型 是 不 适 合 的, 因 为 系 统 不 可 变 的 是 最 后 期 限, 所 以 若 使 用 瀑 布 模 型 会 存 在 全 有 或 全 无 的 风 险, 这 是 不 能 接 受 的 迭 代 增 强 模 型 也 不 适 合, 因 为 每 次 迭 代 都 是 一 次 完 整 的 瀑 布 模 型 过 程, 在 每 次 迭 代 中 都 需 要 做 需 求 分 析, 且 需 要 用 户 和 客 户 在 后 期 帮 助 做 需 求 分 析 然 而, 这 样 一 种 迭 代 交 付 方 法 似 乎 很 适 合, 即 全 部 的 需 求 在 第 一 次 迭 代 中 完 成, 而 交 付 工 作 在 后 期 的 两 个 ( 或 三 个 ) 迭 代 ( 由 于 时 间 短 ) 中 完 成 依 据 需 求, 项 目 团 队 可 以 决 定 哪 些 功 能 必 须 包 含 在 工 作 系 统 中, 并 把 它 放 到 第 一 次 迭 代 中, 其 他 的 可 选 功 能 可 以 在 第 二 次 迭 代 中 计 划 使 用 这 种 方 法, 在 最 后 期 限 前 完 成 第 一 次 迭 代 的 机 会 增 加 了 也 就 是 说, 采 用 这 种 RUP 模 型, 交 付 一 个 工 作 系 统 的 机 会 增 加 了 因 为 它 允 许 各 个 阶 段 采 用 迭 代 过 程, 故 也 是 一 个 合 适 的 模 型 考 虑 另 一 个 例 子, 即 客 户 处 在 激 烈 的 竞 争 环 境 中, 而 需 求 取 决 于 正 进 行 何 种 竞 争, 此 时 定 期 提 供 功 能 是 非 常 可 取 的 此 外, 为 了 减 少 成 本, 客 户 希 望 尽 可 能 多 地 将 项 目 外 包 给 另 一 个 国 家 的 其 他 工 作 队 对 于 这 个 项 目, 显 然 瀑 布 模 型 是 不 适 合 的, 因 为 要 求 甚 至 在 一 开 始 就 不 清 楚 迭 代 增 强 模 型 也 可 能 无 法 工 作, 因 为 它 可 能 不 能 够 迅 速 地 交 付 软 件 XP 也 将 难 以 应 用, 因 为 它 要 求 整 个 团 队 ( 包 括 客 户 ) 相 互 协 调 工 作 对 于 这 个 项 目, 时 间 盒 模 型 似 乎 最 适 合, 整 个 项 目 可 以 聘 用 三 个 团 队, 分 析 师 团 队 与 客 户 一 同 确 定 需 求, 另 一 团 队 做 开 发 ( 可 以 选 在 一 些 低 成 本 地 区 开 发 ), 第 三 个 团 队 在 安 装 该 网 站 的 地 点 做 安 装 工 作 通 过 适 当 配 备 人 员 队 伍, 四 个 阶 段 ( 分 析, 设 计, 实 现 和 安 装 ) 的 持 续 时 间 可 大 致 相 等, 这 就 可 以 应 用 时 间 盒 模 型 了 考 虑 另 一 个 项 目, 一 所 大 学 需 要 一 个 自 动 注 册 过 程, 它 已 经 拥 有 一 个 包 含 课 程 和 先 决 条 件 的 数 据 库 及 一 个 学 生 记 录 数 据 库 在 这 个 项 目 中, 由 于 已 透 彻 理 解 了 需 求 ( 因 为 注 册 是 每 年 都 必 定 会 发 生 的 事 情 ), 所 以 瀑 布 模 型 似 乎 是 最 合 适 的 2.4 项 目 管 理 过 程 虽 然 开 发 过 程 的 选 择 决 定 了 阶 段 和 要 做 的 任 务, 但 它 不 指 定 以 下 事 情, 如 每 个 阶 段 应 该 持 续 多 长 时 间, 或 每 个 阶 段 应 分 配 多 少 资 源, 或 者 应 如 何 监 测 一 个 阶 段 一 个 项 目 的 质 量 和

33 生 产 率 也 取 决 于 这 些 决 定 为 了 满 足 成 本 质 量 和 进 度 方 面 的 目 标, 资 源 必 须 妥 善 分 配 给 每 个 项 目 活 动, 还 应 监 督 不 同 活 动 的 进 展 情 况, 并 在 需 要 的 时 候 采 取 纠 正 行 动 所 有 这 些 活 动 都 是 项 目 管 理 过 程 的 一 部 分 因 此, 项 目 管 理 过 程 是 要 确 保 工 程 过 程 在 满 足 现 实 世 界 的 目 标 ( 成 本 进 度 和 质 量 ) 的 条 件 下 结 束 项 目 管 理 过 程 通 过 项 目 管 理 指 定 所 有 需 要 完 成 的 活 动, 以 确 保 成 本 和 质 量 目 标 得 到 满 足 它 的 基 本 任 务 是 : 在 选 择 了 一 个 开 发 过 程 后 确 保 以 最 佳 方 式 实 现 项 目, 也 就 是 说, 基 本 任 务 是 为 特 定 项 目 计 划 各 过 程 的 详 细 实 施 方 略, 然 后 确 保 该 计 划 得 到 正 确 执 行 对 于 一 个 大 项 目, 适 当 的 管 理 过 程 是 成 功 的 关 键 项 目 管 理 过 程 中 的 活 动 可 大 致 分 为 三 个 阶 段 : 计 划 监 测 和 控 制 终 止 和 分 析 项 目 管 理 始 于 计 划, 这 或 许 是 最 关 键 的 项 目 管 理 活 动 这 个 阶 段 的 目 标 是 为 软 件 开 发 制 定 计 划, 按 照 计 划 可 以 成 功 而 有 效 地 实 现 项 目 的 目 的 一 个 软 件 计 划 通 常 是 在 初 始 活 动 开 始 之 前 就 制 定 出 来, 并 随 着 开 发 的 进 展 和 项 目 进 展 的 数 据 变 得 可 用 而 不 断 更 新 在 计 划 期 间, 主 要 的 活 动 是 成 本 估 算 进 度 和 里 程 碑 的 确 定 项 目 人 员 配 备 质 量 控 制 计 划 控 制 和 监 测 计 划 项 目 计 划 无 疑 是 最 重 要 的 管 理 活 动, 它 构 成 了 监 测 和 控 制 的 基 础 将 在 书 中 后 面 以 一 整 章 来 讨 论 项 目 计 划 项 目 监 测 和 管 理 过 程 的 控 制 在 时 间 上 是 最 长 的, 它 涵 盖 了 大 多 数 的 开 发 过 程 包 括 开 发 过 程 进 行 时, 项 目 管 理 必 须 执 行 的 所 有 活 动, 以 确 保 项 目 目 标 的 实 现 及 开 发 过 程 按 照 开 发 计 划 实 施 ( 如 果 需 要 的 话 需 更 新 计 划 ) 由 于 成 本 进 度 和 质 量 是 主 要 驱 动 力, 这 个 阶 段 的 大 多 数 活 动 都 围 绕 着 影 响 这 些 指 标 的 因 素 监 测 对 于 一 个 项 目, 监 测 潜 在 的 风 险 是 这 个 阶 段 的 另 一 个 重 要 活 动, 它 可 能 使 得 项 目 不 能 实 现 目 标 如 果 通 过 监 测 获 得 的 信 息 表 明 目 标 可 能 无 法 满 足, 则 在 这 个 阶 段 需 采 取 必 要 的 行 动 ( 通 过 向 开 发 活 动 施 加 合 适 的 控 制 ) 监 测 一 个 开 发 过 程 需 要 有 关 项 目 的 正 确 信 息, 这 些 信 息 通 常 是 由 管 理 过 程 从 开 发 进 程 中 所 获 得 因 此, 一 个 开 发 过 程 模 型 的 实 施 应 确 保 开 发 过 程 中 的 每 一 步 骤 都 能 产 生 管 理 过 程 在 该 阶 段 所 需 的 信 息, 也 就 是 说, 开 发 过 程 提 供 管 理 过 程 需 要 的 信 息 然 而, 信 息 的 解 释 则 属 于 监 测 和 控 制 部 分 尽 管 监 测 和 控 制 持 续 于 整 个 项 目 工 期, 但 管 理 过 程 中 的 最 后 一 个 阶 段 终 止 性 分 析 却 是 在 当 开 发 过 程 结 束 后 才 执 行 的 执 行 终 止 性 分 析 的 根 本 原 因 是 获 得 有 关 开 发 过 程 的 信 息, 并 从 项 目 中 学 习 以 改 善 过 程, 这 个 阶 段 往 往 也 是 所 谓 事 后 分 析 在 迭 代 开 发 中, 这 种 分 析 可 以 在 每 次 迭 代 完 成 后 就 做, 提 供 反 馈 意 见 以 改 善 下 一 步 迭 代 的 执 行 我 们 不 在 本 书 中 对 此 做 进 一 步 讨 论, 但 读 者 可 以 参 阅 [57], 一 个 事 后 分 析 报 告 的 例 子 管 理 过 程 和 开 发 过 程 之 间 的 时 间 关 系 如 图 2.12 所 示 这 是 一 个 理 想 化 的 关 系, 它 显 示

34 计 划 是 在 开 发 工 作 开 始 之 前 完 成 的, 开 发 结 束 后 执 行 终 止 性 分 析 如 图 所 示, 在 开 发 过 程 中, 定 量 的 信 息 流 从 开 发 过 程 的 各 个 阶 段 流 向 管 理 过 程 的 监 测 和 控 制 阶 段, 管 理 过 程 分 析 这 些 信 息 以 发 挥 其 对 开 发 过 程 的 控 制 作 用 我 们 在 后 面 的 章 节 中 详 尽 讨 论 了 项 目 计 划 阶 段 这 里 将 不 单 独 讨 论 监 测 计 划, 而 是 将 其 作 为 计 划 活 动 的 一 部 分 一 起 讨 论 图 2.12 开 发 过 程 和 管 理 过 程 的 时 空 关 系 2.5 小 结 - 在 软 件 项 目 中, 质 量 和 生 产 力 目 标 的 实 现 取 决 于 该 项 目 开 发 过 程 中 使 用 的 过 程 基 于 这 个 原 因, 过 程 形 成 了 软 件 工 程 的 核 心 - 过 程 是 一 组 按 照 某 种 顺 序 执 行 的 活 动, 以 使 预 期 的 结 果 得 到 实 现 过 程 模 型 是 一 个 通 用 的 过 程 规 范, 已 被 认 证 为 在 某 些 情 况 下 是 最 适 合 的 - 一 种 软 件 过 程 包 含 许 多 不 同 的 组 成 过 程, 最 重 要 的 是 开 发 过 程 和 项 目 管 理 过 程 - 开 发 过 程 的 重 点 是 如 何 策 划 软 件 现 在 存 在 许 多 不 同 的 过 程 模 型, 每 种 过 程 模 型 适 合 某 些 类 型 的 问 题 - 瀑 布 模 型 是 概 念 上 最 简 单 的 软 件 开 发 模 式, 其 需 求 设 计 编 码 和 测 试 阶 段 是 线 性 开 展 的 它 已 被 广 泛 使 用, 适 合 于 已 被 充 分 理 解 了 的 问 题 - 原 型 模 型 原 型 是 在 构 建 最 终 系 统 前 开 发 的, 用 它 来 进 一 步 理 解 需 求, 从 而 导 致 更 多 的 稳 定 的 需 求, 这 对 于 需 求 不 明 确 的 项 目 是 非 常 有 用 的 - 迭 代 开 发 模 式 是 软 件 以 迭 代 的 方 式 开 发, 每 次 迭 代 都 产 生 一 个 可 工 作 的 软 件 系 统 这 种 模 式 不 要 求 在 一 开 始 就 掌 握 所 有 的 需 求, 它 允 许 早 期 的 迭 代 反 馈 信 息 给 后 面 的 迭 代 过 程, 可 降 低 风 险, 因 为 它 随 项 目 的 进 展 按 期 提 供 有 价 值 的 软 件 - 在 RUP 中, 一 个 项 目 分 四 个 阶 段 执 行 : 开 始 阶 段, 细 化 阶 段, 开 发 阶 段 和 发 布 阶 段, 每 一 阶 段 都 以 定 义 的 里 程 碑 结 束 每 一 阶 段 自 身 也 可 能 按 迭 代 方 式 工 作, 需 求 设 计 编 码 测 试 等 这 些 子 过 程 被 认 为 在 整 个 项 目 期 间 都 是 活 跃 的, 尽 管 它 们 的 活

35 跃 强 度 依 所 处 的 阶 段 不 同 而 各 不 相 同 RUP 是 一 个 灵 活 的 框 架, 它 允 许 一 个 项 目 按 照 传 统 的 瀑 布 模 型 执 行 ( 如 果 希 望 的 话 ), 或 允 许 按 照 原 型 模 型 执 行 ( 若 愿 意 的 话 ) - 在 时 间 盒 模 型 中, 不 同 的 迭 代 阶 段 都 拥 有 平 等 的 时 间 期 限, 并 分 为 长 度 相 等 的 阶 段 每 一 个 迭 代 阶 段 有 一 个 专 门 的 团 队 然 后 不 同 的 迭 代 以 流 水 线 方 式 并 行 执 行, 针 对 不 同 的 迭 代 每 个 专 门 团 队 只 承 担 一 个 迭 代 的 工 作 由 于 多 个 迭 代 同 时 活 动, 该 模 式 缩 短 了 每 个 迭 代 的 平 均 交 付 时 间, 因 此 它 在 要 求 短 周 期 时 间 的 情 况 下 是 非 常 有 用 的 - 敏 捷 开 发 方 法 是 基 于 以 一 些 关 键 原 则 为 基 础 的, 如 以 小 的 迭 代 阶 段 进 行 软 件 开 发, 以 工 作 系 统 作 为 进 展 的 衡 量, 在 任 何 时 间 都 允 许 发 生 变 化 极 限 编 程 (XP) 方 法 源 于 一 个 用 户 的 简 短 故 事, 细 节 在 迭 代 实 施 时 才 涉 及 在 一 个 迭 代 中, 测 试 驱 动 的 开 发 实 例 完 成 后 程 序 员 组 再 进 行 开 发 工 作, 然 后 频 繁 的 集 成, 设 计 简 单 的 方 案, 当 需 要 的 时 候 可 以 对 简 单 方 案 进 行 重 构 - 项 目 管 理 过 程 的 重 点 是 开 发 计 划 的 制 定 和 开 发 过 程 的 控 制, 它 包 括 三 个 主 要 阶 段 : 计 划, 监 测 和 控 制, 终 止 性 分 析 大 部 分 项 目 管 理 围 绕 项 目 计 划 进 行, 它 是 在 计 划 阶 段 产 生 的 自 测 练 习 1. 一 个 项 目 中, 过 程 模 型 过 程 规 范 过 程 三 者 之 间 有 什 么 联 系? 2. 采 用 迭 代 开 发 模 型 的 项 目, 其 迭 代 过 程 中 的 关 键 产 出 是 什 么? 3. 本 章 所 讨 论 的 开 发 过 程 模 式, 在 如 下 的 项 目 中 你 会 选 用 哪 一 种? a) 一 个 简 单 的 数 据 加 工 项 目 b) 面 向 办 事 处 工 作 人 员 的 数 据 输 入 系 统, 他 们 以 前 从 未 使 用 过 电 脑, 用 户 界 面 和 界 面 友 好 是 非 常 重 要 的 c) 电 子 表 格 系 统, 该 系 统 应 拥 有 一 些 基 本 功 能 和 许 多 使 用 这 些 基 本 功 能 导 出 的 其 他 可 取 功 能 d) 一 个 基 于 网 络 的 面 向 一 种 新 型 业 务 的 系 统, 该 业 务 的 需 求 变 化 快 速, 并 拥 有 一 个 内 部 开 发 团 队 可 用 于 项 目 各 方 面 的 开 发 e) 一 个 在 线 商 店 的 网 站, 它 有 一 串 长 长 的 要 添 加 的 功 能 清 单, 并 希 望 频 繁 地 发 布 具 有 新 功 能 的 新 版 本 4. 一 个 项 目 使 用 时 间 盒 过 程 模 型, 每 次 时 间 盒 分 为 三 阶 段, 但 每 阶 段 时 间 长 度 不 等 假 设 需 求 规 范 阶 段 需 要 一 个 2 人 团 队 2 周 的 时 间, 构 建 阶 段 为 4 人 团 队 3 周 的 时 间, 安 装 阶 段 为 2 人 团 队 1 周 的 时 间, 为 该 项 目 设 计 一 个 过 程 使 得 资 源 利 用 率 最 大 假 设 每 个 资 源

36 可 以 承 担 任 何 任 务 ( 提 示, 探 索 的 事 实 是 : 第 一 和 第 三 阶 段 的 持 续 时 间 的 总 和 等 于 第 二 期 阶 段 的 时 间 ) 5. 项 目 监 测 活 动 可 能 会 对 开 发 过 程 产 生 什 么 样 的 影 响?

37 第 三 章 软 件 需 求 分 析 和 软 件 需 求 规 格 IEEE 把 软 件 需 求 定 义 为 :(1) 用 户 为 了 解 决 某 一 问 题 或 者 达 到 某 一 目 标 而 需 要 的 功 能 和 条 件 ;(2) 这 些 条 件 和 功 能 要 求 必 须 要 被 系 统 所 满 足, 同 时 要 满 足 相 关 的 合 同 契 约 标 准 规 范, 或 者 其 他 一 些 正 式 强 制 性 文 件 需 要 指 出 的 是, 所 需 处 理 的 软 件 需 求 是 动 态 的, 也 就 是 系 统 的 性 能 是 不 断 发 展 的 正 如 我 们 所 看 到 的, 所 有 的 开 发 模 型 都 要 求 有 明 确 的 需 求 若 使 用 敏 捷 技 术 就 需 要 高 层 需 求 说 明 书, 详 细 需 求 通 过 与 客 户 反 复 交 换 意 见 得 到, 并 且 直 接 反 映 在 软 件 中 另 一 方 面 是 需 求 描 述 要 精 准, 需 求 活 动 的 目 的 就 是 要 得 到 软 件 需 求 规 格 说 明 书 SRS(Software Requirement Specification), 它 描 述 了 软 件 需 要 做 什 么, 而 不 描 述 怎 么 做 这 一 章 中 要 讨 论 : - SRS 在 工 程 中 的 作 用, 以 及 一 个 好 的 SRS 会 带 来 的 价 值 - 在 产 生 所 需 要 的 SRS 的 过 程 中 的 一 些 不 同 的 活 动 - SRS 文 档 要 求 的 特 性, 结 构 以 及 它 的 关 键 部 分 - 用 例 分 析 方 法 和 功 能 需 求 的 指 定 以 及 怎 样 开 发 用 例 - 其 他 一 些 需 求 分 析 的 方 法, 如 数 据 流 图 (data flow diagram) 分 析 法 - 怎 样 验 证 需 求 3.1 好 SRS 的 意 义 多 数 软 件 系 统 起 源 于 某 些 客 户 的 需 要, 软 件 系 统 本 身 由 某 些 开 发 者 生 产, 最 终 完 成 的 系 统 由 用 户 使 用 然 而, 在 一 个 新 的 系 统 中 有 我 们 感 兴 趣 的 三 个 主 要 部 分, 它 们 是 : 客 户 开 发 者 和 用 户, 那 些 客 户 所 要 求 的 以 及 用 户 关 心 的 需 求 必 须 要 与 开 发 者 交 换 意 见 问 题 是 客 户 往 往 不 懂 软 件 和 软 件 的 开 发 过 程, 同 时 开 发 者 也 往 往 不 理 解 客 户 的 问 题 和 应 用 领 域 这 就 造 成 在 项 目 的 开 发 过 程 中, 各 方 交 流 的 空 隙 SRS 最 基 本 的 目 的 就 是 要 填 补 这 个 交 流 空 隙, 开 发 出 一 个 拥 有 共 同 视 图 的 软 件 所 以 一 个 优 秀 的 SRS 的 主 要 优 点 是 : - SRS 使 得 客 户 与 开 发 者 之 间 在 软 件 究 竟 要 做 些 什 么 上 达 成 一 致 客 户 与 开 发 者 会 频 繁 的 把 这 些 一 致 做 成 具 有 法 律 效 力 的 契 约, 所 以 通 过 SRS, 客 户 清 楚 地 描 述 它 期 望 从 开 发 者 那 得 到 什 么, 开 发 者 也 清 楚 地 理 解 构 造 的 该 软 件 将 具 备 什 么 功 能 一 个 相 关 但 重 要 的 优 点 是 : - SRS 对 最 终 产 品 的 验 证 提 供 一 个 参 考

38 也 就 是 说,SRS 帮 助 客 户 确 定 一 个 软 件 是 否 满 足 需 求, 没 有 合 适 的 SRS, 客 户 就 没 有 办 法 去 决 定 软 件 是 否 按 照 所 要 求 的 那 样 去 做, 同 时 开 发 者 也 没 有 办 法 向 客 户 表 明 那 些 需 求 已 经 全 都 满 足 就 以 上 所 言 已 有 足 够 的 理 由 使 客 户 与 开 发 者 需 严 肃 处 理 这 个 需 求 说 明, 但 是 对 一 个 优 秀 的 SRS 还 有 更 加 实 际 的 原 因 研 究 表 明 需 求 阶 段 存 在 着 许 多 错 误, 并 且 SRS 中 的 错 误 在 最 后 的 软 件 实 现 中 肯 定 将 是 个 错 误 显 然, 若 我 们 想 要 得 到 一 个 高 质 量 的 最 终 产 品, 而 且 几 乎 没 有 错 误, 那 就 必 须 从 做 高 质 量 的 SRS 开 始 换 句 话 说, 可 以 归 纳 为 : - 高 质 量 的 SRS 是 高 质 量 软 件 的 前 提 高 质 量 的 SRS 可 以 减 少 工 程 费 用, 我 们 知 道 SRS 可 能 存 在 错 误, 同 样 也 知 道 随 着 工 程 的 进 展, 弥 补 一 个 错 误 所 需 的 花 费 是 呈 指 数 增 长 的 所 以, 通 过 提 高 SRS 的 质 量 可 以 为 将 来 节 省 一 大 笔 检 测 开 销 或 者 说, - 高 质 量 的 SRS 可 以 减 少 开 发 费 用 3.2 需 求 过 程 需 求 分 析 过 程 就 是 做 需 求 分 析 时 的 一 系 列 活 动 的 顺 序, 最 终 以 形 成 高 质 量 的 SRS 文 档 为 终 点 典 型 的 需 求 分 析 过 程 包 括 三 个 基 本 任 务 : 问 题 或 需 求 分 析 需 求 说 明 以 及 需 求 验 证 问 题 分 析 通 常 由 一 个 高 层 的 问 题 陈 述 开 始, 在 问 题 分 析 期, 为 问 题 域 和 环 境 建 模, 这 对 理 解 系 统 的 行 为 约 束 以 及 输 入 输 出 等 是 很 有 效 的, 这 项 活 动 的 基 本 目 标 就 是 彻 底 地 弄 懂 所 开 发 的 软 件 究 竟 要 提 供 些 什 么 在 分 析 过 程 中, 分 析 者 往 往 会 与 客 户 和 终 端 用 户 召 开 一 系 列 的 会 议 在 早 期 的 会 议 中, 客 户 和 终 端 用 户 会 向 分 析 者 解 释 他 们 的 工 作 和 工 作 环 境, 还 有 他 们 的 一 些 期 望 在 这 个 过 程 中 都 会 提 供 任 何 有 关 描 述 工 作 和 组 织 的 文 档, 在 这 些 早 期 会 议 中, 分 析 者 主 要 是 作 为 听 众, 掌 握 他 们 所 提 供 的 信 息 一 旦 分 析 者 对 所 要 开 发 的 系 统 了 解 到 一 定 程 度 时, 他 会 在 接 下 来 的 几 次 会 议 上 澄 清 那 些 他 所 不 懂 或 不 清 楚 的 部 分, 也 可 能 会 把 这 些 信 息 文 档 化 或 建 成 模 型, 他 也 有 可 能 进 行 头 脑 风 暴 或 者 想 象 一 下 这 个 系 统 将 要 做 什 么 在 最 后 的 几 次 会 议 上, 分 析 者 会 向 客 户 解 释 对 系 统 要 做 什 么 的 理 解, 同 时 也 会 利 用 这 几 次 会 核 实 他 对 系 统 的 理 解 是 否 和 客 户 的 目 标 一 致 由 问 题 分 析 中 得 来 的 信 息 会 形 成 一 个 最 基 本 的 需 求 说 明 书, 在 这 份 说 明 书 中, 主 要 是 清 楚 地 记 载 需 求 在 这 个 活 动 中 事 实 的 陈 述, 说 明 语 言 和 工 具 等 都 会 确 定 下 来 同 时 把 繁 琐 的

39 信 息 和 知 识 进 行 合 理 的 整 理 并 除 去 冗 余 信 息, 这 也 是 这 个 阶 段 的 重 要 目 标 需 求 验 证 把 重 点 放 在 保 证 那 些 在 SRS 中 所 说 明 的 一 定 是 软 件 所 需 要 的, 同 时 保 证 产 生 高 质 量 的 SRS 需 求 分 析 过 程 在 对 SRS 验 证 后 就 结 束 了, 我 们 会 在 本 章 后 面 更 详 细 的 介 绍 图 3.1 需 求 过 程 必 须 指 出 的 是, 在 需 求 分 析 过 程 中, 这 三 个 活 动 不 会 是 线 性 的 顺 序, 考 虑 他 们 之 间 会 有 重 叠 和 互 相 反 馈, 在 图 3.1 中 展 示 了 整 个 需 求 分 析 过 程 正 像 图 中 所 展 示 的 那 样, 从 产 品 描 述 阶 段 可 能 要 返 回 到 问 题 分 析 阶 段 当 问 题 的 一 部 分 已 经 被 分 析 和 说 明 而 另 外 一 部 分 却 未 得 到 分 析 和 说 明 时, 这 种 情 况 会 经 常 发 生 而 且, 在 描 述 一 个 问 题 时 会 经 常 出 现 一 些 缺 陷, 因 此 有 必 要 做 进 一 步 的 分 析 一 旦 一 个 问 题 描 述 已 经 完 成, 就 会 到 达 需 求 验 证 阶 段 这 个 阶 段 可 能 会 显 现 出 说 明 书 本 身 的 一 些 问 题, 或 者 显 现 出 对 问 题 理 解 上 的 一 些 偏 差, 这 样 就 需 要 重 新 回 到 说 明 描 述 阶 段, 甚 至 返 回 到 问 题 分 析 阶 段 3.3 需 求 规 格 最 终 输 出 的 是 SRS 文 档 因 为 分 析 阶 段 是 在 规 格 说 明 书 之 前, 引 起 的 第 一 个 问 题 是 : 如 果 在 分 析 阶 段 产 生 了 正 式 的 模 型, 为 什 么 这 个 模 型 的 输 出 不 是 SRS 呢? 主 要 原 因 是 模 型 主 要 关 注 的 是 问 题 的 结 构, 而 不 是 它 的 外 部 行 为 然 而, 外 部 行 为 像 用 户 界 面 一 样 很 少 被 模 型 化, 而 却 经 常 成 为 SRS 主 要 组 成 部 分 同 样, 为 了 减 轻 建 模 的 难 度, 一 些 次 要 的 事 件, 如 出 现 错 误 的 情 形 ( 如 输 出 错 误 ) 很 少 被 合 适 的 建 模, 而 在 SRS 中, 面 对 此 情 形 下 的 行 为 要 有 明 确 说 明 另 外, 模 型 中 一 般 不 包 括 性 能 约 束 设 计 约 束 以 及 遵 从 标 准 恢 复 等, 但

40 是 这 些 在 SRS 必 须 被 明 确 定 义, 因 为 设 计 者 必 须 知 道 这 些 才 能 精 确 的 设 计 系 统, 所 以 模 型 的 输 出 文 档 很 显 然 不 能 成 为 我 们 想 要 得 到 的 SRS 不 能 从 分 析 结 果 直 接 生 成 规 范 说 明 书, 即 使 在 分 析 中 有 一 部 分 是 正 式 的 模 型 一 个 优 秀 的 SRS 需 要 说 明 许 多 事, 其 中 有 一 些 很 难 在 分 析 阶 段 处 理, 其 实 本 质 上 那 些 能 从 分 析 阶 段 直 接 传 到 说 明 阶 段 的 东 西 就 是 系 统 所 需 要 的 东 西 建 模 是 一 个 很 好 的 工 具, 它 能 帮 助 我 们 完 整 地 获 得 系 统 所 需 要 的 东 西 SRS 就 是 基 于 从 分 析 中 获 得 的 知 识 写 成 的, 因 为 不 能 把 知 识 直 截 了 当 地 转 换 成 有 结 构 的 文 档, 所 以 规 范 说 明 书 本 身 就 是 项 重 要 的 独 立 任 务 SRS 应 该 具 备 的 特 点 为 了 很 好 的 满 足 这 些 基 本 要 求, 一 个 SRS 必 须 有 一 些 特 定 的 属 性 和 一 些 不 同 类 型 的 需 求 其 中 一 些 SRS 特 性 如 下 所 述 : 1. 正 确 性 2. 完 整 性 3. 明 确 性 4. 可 核 实 性 5. 一 致 性 6. 重 要 性 或 稳 定 性 的 等 级 如 果 SRS 中 包 括 的 内 容 都 是 最 后 系 统 所 需 要 的, 那 么 这 个 SRS 是 正 确 的 如 果 软 件 所 期 待 要 做 的 所 有 事 和 该 软 件 对 任 何 的 输 入 的 响 应 都 被 写 进 了 SRS, 那 么 该 SRS 已 经 完 成 如 果 所 有 的 需 求 都 仅 有 一 种 解 释, 那 么 它 是 明 确 的, 没 有 歧 义 的 如 果 需 求 是 用 自 然 语 言 书 写 的, 那 么 SRS 的 作 者 必 须 非 常 小 心 以 保 证 不 存 在 二 义 性 如 果 每 一 个 确 定 的 需 求 是 可 核 实 的, 那 么 这 个 SRS 是 可 核 实 的 需 求 的 可 核 实 性 取 决 于 是 否 存 在 一 个 有 效 的 过 程, 这 个 过 程 能 检 查 最 后 的 软 件 是 否 满 足 需 求 专 业 术 语 会 造 成 前 后 的 不 一 致 ; 比 如, 对 于 同 一 对 象, 不 同 的 需 求 文 档 可 能 用 不 同 的 术 语 来 阐 述 在 这 些 不 一 致 中, 也 有 可 能 是 些 逻 辑 上 或 暂 时 的 冲 突 造 成 的 如 果 SRS 中 包 括 两 份 或 更 多 的 需 求 文 档, 这 些 合 起 来 的 文 档 的 逻 辑 性 或 是 特 性 暂 时 不 能 被 软 件 系 统 所 满 足, 那 么 上 面 提 到 的 状 况 就 会 发 生 比 如, 假 设 需 求 表 明 e 事 件 发 生 在 另 一 事 件 f 之 前, 但 是 另 一 些 需 求 文 档 表 明 ( 直 接 的 或 间 接 ) 事 件 f 必 须 发 生 在 事 件 e 之 前,SRS 中 的 不 一 致 可 能 涉 及 一 些 主 要 问 题 一 般 来 讲, 对 于 软 件 的 所 有 需 求 不 是 同 等 重 要 的 一 些 是 关 键 的, 而 另 一 些 很 重 要 但 不 一 定 是 关 键 的 ; 还 有 一 些 是 期 望 得 到 的 但 它 并 不 很 重 要 ; 类 似 的, 有 些 需 求 是 核 心 要 求 并 不 依 赖 于 时 间, 它 不 随 时 间 的 推 移 而 发 生 改 变, 而 有 一 些 更 依 赖 于 时 间 ; 有 些 需 求 对 用 户 而 言 比 其 他 需 求 更 有 价 值 如 果 需 求 的 重 要 性 或 稳 定 性 是 知 道 的, 那 么 可 以 按 重 要 性 或 稳 定 性 来

41 分 级 需 求 的 稳 定 性 反 映 它 将 来 的 变 化 性, 可 以 用 期 待 变 化 量 来 反 映 理 解 每 个 需 求 文 档 的 价 值 对 下 一 步 的 开 发 至 关 重 要, 因 为 重 复 性 的 选 择 需 求 正 是 基 于 需 求 价 值 的 在 所 有 的 特 性 中, 完 整 性 可 能 是 最 重 要 的, 同 时 它 也 是 最 难 建 立 的 在 需 求 规 格 说 明 书 中 最 常 见 的 缺 陷 就 是 缺 乏 完 整 性 需 求 缺 陷 迫 使 在 后 面 的 开 发 过 程 中 对 需 求 进 行 增 加 和 修 改, 这 些 增 加 和 修 改 很 难 和 之 前 的 需 求 合 并 客 户 与 开 发 者 之 间 的 不 一 致 主 要 是 由 这 些 不 完 整 性 产 生 的 然 而, 一 些 人 认 为 不 是 所 有 的 细 节 中 完 整 性 都 是 渴 望 得 到 的 对 完 整 性 的 追 求 可 以 使 细 节 更 明 确, 可 以 更 好 的 理 解 一 些 设 想 ( 如, 明 确 什 么 是 增 加 记 录 操 作 的 细 节 ) 明 确 这 些 细 节 导 致 生 成 大 量 的 需 求 文 档, 这 些 文 档 自 身 也 会 产 生 问 题, 比 如 使 得 后 面 的 验 证 更 困 难 但 另 一 方 面, 如 果 给 出 的 细 节 太 少, 开 发 者 对 此 的 理 解 就 会 很 困 难, 这 又 导 致 以 后 软 件 中 的 缺 陷 因 为 完 整 性, 在 即 将 开 展 的 工 程 中 得 到 足 够 多 的 细 节 是 个 合 理 的 目 标 例 如, 如 果 工 程 是 按 瀑 布 模 型 来 开 发, 那 么 最 好 得 到 详 细 的 需 求 说 明, 以 至 于 后 面 尽 可 能 少 的 修 改 另 外, 如 果 是 迭 代 模 型, 由 于 在 反 馈 过 程 中 总 是 有 机 会 修 改 需 求, 那 么 需 求 说 明 书 可 以 粗 糙 些 如 果 采 用 敏 捷 方 法, 那 么 只 需 在 顶 层 的 需 求 上 寻 找 完 整 性, 而 不 必 写 细 节, 因 在 具 体 需 求 实 现 时 会 引 出 相 关 细 节 性 能 需 求 接 口 需 求 以 及 设 计 约 束 需 求 统 称 为 非 功 能 需 求 SRS 的 组 成 需 求 说 明 中 的 完 整 性 是 很 难 得 到 的, 而 且 更 难 得 到 核 实 但 是 SRS 中 究 竟 要 做 哪 些 事 有 些 指 导 原 则, 那 么 这 些 原 则 对 完 成 需 求 说 明 将 有 很 大 的 帮 助 下 面 是 SRS 的 基 本 论 点 : - 功 能 - 性 能 - 影 响 实 现 的 设 计 约 束 - 外 部 接 口 功 能 需 求 必 须 指 明 系 统 的 什 么 行 为 是 所 期 待 的, 这 些 行 为 就 是 在 给 定 输 入 时, 产 生 什 么 输 出, 它 描 述 了 系 统 中 输 入 与 输 出 之 间 的 关 系 对 每 一 个 功 能 需 求, 需 详 细 描 述 所 有 输 入 以 及 它 们 的 源 度 量 单 位 有 效 输 入 范 围 等 都 必 须 明 确 所 有 为 了 得 到 输 出 而 在 输 入 数 据 上 做 的 相 关 操 作 都 必 须 明 确, 包 括 输 入 输 出 数 据 和 那 些 受 到 操 作 影 响 的 参 数 的 合 法 性 检 查 等 式 或 用 于 把 输 入 转 换 成 相 应 输 出 的 逻 辑 操 作 例 如, 如 果 有 一 个 计 算 输 出 的 公 式, 这 个 公 式 必 须 要 明 确 描 述

42 需 求 规 格 说 明 书 中 的 一 个 重 要 部 分 就 是 描 述 系 统 在 异 常 情 况 下 的 行 为, 如 非 法 输 入 ( 有 多 种 情 况 出 现 ) 或 者 计 算 中 的 错 误, 功 能 需 求 必 须 清 楚 地 说 明 当 系 统 发 生 这 种 情 形 时 应 该 怎 样 做 特 别 是 当 系 统 出 现 非 法 输 入 和 输 出 时 此 外, 当 出 现 输 入 正 确, 但 正 常 的 操 作 却 不 能 执 行 的 情 形 时, 功 能 需 求 要 详 细 说 明 应 对 行 为 预 定 系 统 就 是 这 种 情 况 的 一 个 例 子, 如 果 没 有 实 用 性, 即 使 一 个 有 效 的 请 求 预 定 功 能 也 做 不 了 总 之, 对 于 那 些 可 以 预 见 的 输 入 和 系 统 状 态, 系 统 相 应 的 行 为 都 必 须 明 确 SRS 中 的 性 能 需 求 是 对 软 件 系 统 中 相 关 性 能 的 约 束, 所 有 与 系 统 性 能 相 关 的 需 求 都 要 明 确 有 两 种 性 能 需 求 : 静 态 和 动 态 静 态 需 求 是 那 些 不 会 对 系 统 执 行 特 性 有 要 求 的 性 能 需 求 如 支 持 终 端 用 户 数 和 用 户 并 发 数 ; 系 统 处 理 文 件 数 以 及 这 个 文 件 的 大 小 等 需 求, 这 些 也 称 为 系 统 的 容 量 ; 动 态 需 求 指 明 了 系 统 执 行 行 为 上 的 约 束, 典 型 有 系 统 的 响 应 时 间 和 吞 吐 量 约 束 响 应 时 间 就 是 在 特 定 的 环 境 下 一 操 作 完 成 的 期 待 时 间, 吞 吐 量 就 是 在 单 位 时 间 内 期 待 可 执 行 的 操 作 数 量 例 如,SRS 可 能 会 规 定 在 每 一 单 位 时 间 上 执 行 事 务 的 数 量 或 者 是 特 定 命 令 的 响 应 时 间 同 时 也 要 确 定 对 不 同 性 能 参 数 的 可 接 受 范 围, 以 及 在 平 时 或 工 作 负 载 峰 值 时 的 性 能 可 接 受 值 所 有 的 这 些 需 求 都 必 须 是 可 量 化 的, 类 似 响 应 时 间 很 短 于 或 者 系 统 处 理 任 何 事 务 都 很 快 这 样 的 描 述 是 不 可 接 受 的, 因 为 这 种 描 述 不 精 确 且 不 可 验 证 相 反, 如 命 令 X 的 响 应 时 间 必 须 在 90% 的 次 数 中 小 于 一 秒, 或 者 在 98% 情 况 下, 一 个 事 务 可 以 在 一 秒 以 内 处 理 完, 这 样 的 描 述 通 常 被 需 求 说 明 所 采 用 在 客 户 的 环 境 下, 有 许 多 因 素 可 能 会 约 束 设 计 者 的 选 择, 这 就 导 致 了 设 计 约 束 比 如 必 须 遵 循 的 某 些 资 源 限 制 操 作 环 境 可 靠 性 和 安 全 性 需 求, 以 及 与 系 统 设 计 相 冲 突 的 政 策 等 SRS 必 须 标 识 和 明 确 这 些 约 束 下 面 是 一 些 例 子 : 标 准 的 服 从 : 系 统 需 求 要 服 从 的 标 准 必 须 明 确, 可 能 包 括 的 标 准 有 报 告 格 式 和 结 账 流 程, 也 可 能 有 些 审 计 需 求, 它 要 求 操 作 记 录 硬 件 限 制 : 软 件 必 须 运 行 在 现 在 已 有 的 或 预 先 确 定 的 硬 件 上, 而 这 些 硬 件 会 对 软 件 产 生 设 计 约 束 硬 件 限 制 包 括 使 用 机 器 的 类 型 系 统 上 的 操 作 系 统 和 支 持 语 言, 以 及 主 存 和 辅 存 的 限 制 可 靠 性 和 容 错 性 : 容 错 需 求 在 如 何 设 计 系 统 上 增 加 了 约 束, 因 为 它 使 得 系 统 更 加 复 杂 和 昂 贵 系 统 的 恢 复 性 需 求 通 常 以 整 体 性 确 保 特 定 的 属 性, 它 详 细 描 述 了 当 一 些 错 误 发 生 时 系 统 应 该 怎 么 做 安 全 性 : 安 全 性 需 求 变 得 越 来 越 重 要, 这 类 需 求 在 使 用 某 些 命 令 上 加 以 限 制, 约 束 特 定

43 数 据 的 存 取, 提 供 了 对 不 同 人 的 不 同 访 问 需 求, 要 求 使 用 密 码 和 加 密 技 术, 以 及 记 载 系 统 活 动 的 日 志 它 也 要 求 适 合 对 安 全 的 评 估, 合 理 的 编 程 技 术 和 使 用 相 应 工 具 探 测 像 缓 冲 区 溢 出 等 的 错 误 在 外 部 接 口 说 明 部 分, 所 有 软 件 与 人 硬 件 和 其 他 软 件 的 交 互 都 得 明 确 描 述 对 用 户 接 口, 软 件 产 品 的 每 一 个 特 性 都 要 明 确 用 户 接 口 变 得 越 来 越 重 要, 必 须 投 入 更 多 的 注 意 力 一 些 初 始 的 用 户 操 作 有 用 户 命 令 屏 幕 显 示 格 式 系 统 如 何 呈 现 给 用 户 的 解 释 反 馈 和 错 误 消 息 等, 都 必 须 要 说 明 像 其 他 的 说 明 一 样, 这 些 需 求 说 明 也 要 具 备 精 准 性 和 可 核 实 性 所 以 像 系 统 对 用 户 必 须 友 好 类 的 句 子 必 须 避 免, 像 命 令 长 度 不 超 过 六 个 字 符 或 者 命 令 的 名 称 必 须 反 映 它 所 执 行 的 功 能 这 样 的 句 子 则 可 以 使 用 关 于 硬 件 接 口 需 求,SRS 必 须 明 确 软 件 产 品 和 硬 件 组 件 之 间 的 每 个 接 口 的 逻 辑 属 性 如 果 软 件 是 运 行 在 已 有 的 或 预 先 确 定 的 硬 件 上, 那 么 包 括 内 存 约 束 在 内 的 所 有 硬 件 特 性 都 必 须 明 确 另 外, 必 须 给 出 当 前 使 用 和 加 载 的 硬 件 特 性 接 口 需 求 也 必 须 明 确 那 些 将 要 在 系 统 中 使 用 的 其 他 软 件 的 接 口, 包 括 操 作 系 统 和 其 他 应 用 软 件, 每 个 接 口 的 消 息 内 容 和 格 式 都 必 须 明 确 规 定 需 求 文 档 的 结 构 需 求 是 用 某 种 描 述 语 言 来 描 述 的, 在 说 明 文 档 时, 尽 管 在 描 述 系 统 属 性 时 存 在 专 业 术 语, 但 是 自 然 语 言 还 是 用 的 最 多 当 采 用 格 式 语 言 时, 这 类 语 言 一 般 是 用 来 描 述 系 统 的 特 定 属 性 对 于 一 个 系 统 的 所 有 需 求, 不 管 是 用 格 式 语 言 还 是 自 然 语 言 描 述, 文 档 都 应 该 清 楚 和 简 明 为 此, 合 理 地 组 织 需 求 文 档 是 必 须 的, 这 里 基 于 IEEE 对 软 件 需 求 说 明 的 指 导 原 则 讨 论 需 求 说 明 的 结 构 IEEE 标 准 认 定 这 样 一 个 事 实, 不 同 工 程 它 们 的 需 求 文 档 可 以 有 不 同 的 结 构 组 织, 也 就 是 对 所 有 工 程 来 说, 没 有 一 个 固 定 的 方 法 IEEE 提 供 一 些 不 同 的 SRS 结 构,SRS 的 前 两 部 分 对 所 有 工 程 来 说 是 一 样 的 图 3.2 给 出 了 SRS 的 一 个 大 概 的 结 构

44 1 简 介 1.1 目 的 1.2 范 围 1.3 定 义 首 字 符 缩 写 和 缩 略 1.4 参 考 文 献 1.5 概 述 2 总 体 描 述 2.1 产 品 视 图 2.2 产 品 功 能 2.3 用 户 特 征 2.4 一 般 约 束 2.5 假 设 与 依 赖 3 详 细 需 求 图 3.2 SRS 的 一 般 结 构 简 介 部 分 包 括 需 求 目 的 范 围 概 述 等, 这 里 的 重 点 是 阐 明 这 个 工 程 的 动 机 和 商 业 目 标 及 工 程 的 范 围 ; 第 二 部 分 给 出 系 统 的 综 合 视 图, 什 么 样 的 大 系 统 合 适, 以 及 对 系 统 所 有 的 需 求 的 概 述, 此 部 分 不 会 涉 及 详 细 的 需 求 说 明, 产 品 视 图 本 质 上 就 是 它 与 其 他 产 品 的 关 系 定 义 该 产 品 是 独 立 的, 还 是 其 他 产 品 的 一 部 分, 以 及 什 么 是 产 品 的 主 要 接 口 同 时 必 须 给 出 产 品 功 能 的 一 个 大 概 描 述, 用 图 表 大 概 地 展 示 各 功 能 以 及 它 们 之 间 的 关 系 是 很 有 用 的 类 似 的, 也 必 须 给 出 一 些 典 型 的 终 端 用 户 特 征 和 约 束 说 明 如 果 采 用 敏 捷 方 法, 有 这 个 初 始 层 面 的 需 求 就 足 够 了, 因 为 当 需 求 文 档 实 现 时, 会 做 更 多 的 细 节 详 细 需 求 说 明 部 分 描 述 需 求 的 细 节, 这 些 细 节 是 开 发 者 在 设 计 与 开 发 系 统 时 必 须 知 道 的 这 也 是 文 档 中 最 重 要 和 占 份 额 最 多 的 部 分, 对 于 这 一 部 分 不 同 组 织 已 提 出 了 相 应 标 准 这 类 需 求 可 用 操 作 模 型 用 户 类 对 象 特 征 激 活 方 式 或 分 层 功 能 模 型 等 组 成 组 织 具 体 文 档 时, 首 先 确 定 外 部 接 口, 这 个 接 口 是 由 之 前 的 功 能 需 求 性 能 需 求 设 计 约 束 和 系 统 属 性 所 决 定 的, 图 3.3 展 示 了 这 个 结 构

45 3 详 细 需 求 3.1 扩 展 的 接 口 需 求 用 户 接 口 硬 件 接 口 软 件 接 口 通 信 接 口 3.2 功 能 需 求 模 块 功 能 需 求 1.1 : n 功 能 需 求 1.n : 3.2.m 模 块 m 3.2.m.1 功 能 需 求 m.1 : 3.2.m.n 功 能 需 求 m.n 3.3 性 能 需 求 3.4 设 计 约 束 3.5 属 性 3.6 其 他 需 求 图 3.3 详 细 需 求 外 部 接 口 需 求 部 分 明 确 了 软 件 接 口 : 包 括 与 用 户 其 他 软 件 硬 件 和 其 他 系 统 的 接 口 用 户 接 口 是 一 个 很 重 要 的 组 件, 它 明 确 了 系 统 所 要 面 对 每 个 用 户 的 接 口, 包 括 屏 幕 帮 助 信 息 菜 单 内 容 和 命 令 结 构 在 硬 件 接 口 中, 提 供 软 件 运 行 的 硬 件 硬 软 件 之 间 的 逻 辑 关 系 必 须 明 确 本 质 上, 任 何 软 件 对 硬 件 的 假 设 都 应 在 此 列 出, 在 软 件 接 口 中, 此 软 件 所 需 的 其 他 软 件 连 同 接 口 必 须 明 确 如 果 软 件 需 要 与 机 器 上 的 其 他 实 体 通 信 时, 那 么 必 须 明 确 通 信 接 口 功 能 需 求 部 分 描 述 系 统 的 功 能, 在 这 一 部 分, 给 出 软 件 的 所 有 操 作 功 能 的 描 述 对 于 功 能 需 求, 需 要 的 输 入 输 出 和 处 理 过 程 都 要 明 确 定 义 对 输 入 输 入 源 度 量 单 位 有 效 范 围 精 度 等 必 须 明 确 在 处 理 过 程 说 明 时, 所 有 需 要 在 输 入 数 据 上 的 操 作 以 及 产 生 何 种 临 时 数 据 必 须 明 确 包 括 在 输 入 上 的 有 效 性 检 查 操 作 顺 序 异 常 情 况 的 响 应, 以 及 将 输 入 转 换 成 相 应 输 出 的 方 法 说 明 性 能 部 分 需 要 说 明 静 态 的 和 动 态 的 性 能 需 求 在 性 能 限 制 说 明 部 分 必 须 确 定 所 有 影 响 系 统 的 因 素 属 性 部 分 描 述 了 一 些 系 统 本 应 有 的 综 合 属 性, 所 有 没 有 在 此 被 囊 括 的 需 求 必 须 在 其 他 需 求 文 档 中 说 明, 设 计 约 束 要 说 明 那 些 由 于 设 计 引 起 的 约 束 当 有 用 例 时, 用 例 说 明 就 会 代 替 功 能 需 求 说 明 SRS 中 的 产 品 视 图 部 分 可 以 提 供 对 用 例 的 一 个 概 括 和 总 结

46 3.4 用 例 驱 动 功 能 规 格 功 能 需 求 说 明 通 常 是 需 求 文 档 的 核 心, 传 统 的 功 能 说 明 要 明 确 系 统 必 须 提 供 的 功 能 通 过 用 例 来 说 明 系 统 功 能 是 要 明 确 系 统 行 为, 这 些 行 为 是 在 用 户 与 系 统 交 互 中 捕 获 得 到 的 用 例 也 可 以 用 于 描 述 商 务 流 程 或 软 件 组 织, 或 者 只 是 描 述 软 件 系 统 的 行 为, 我 们 把 描 述 重 点 放 在 即 将 开 发 的 软 件 行 为 上 尽 管 用 例 通 常 是 指 定 软 件 行 为 的, 但 是 它 也 可 以 用 于 效 率 分 析 后 面 当 讨 论 怎 样 开 发 用 例 时, 我 们 将 讨 论 怎 样 采 用 用 例 引 出 需 求 Jacobson[56] 建 议 把 用 例 作 为 面 向 对 象 模 型 已 引 起 大 家 的 关 注, 正 由 于 与 面 向 对 象 方 法 关 联, 所 以 用 例 通 常 被 看 作 面 向 对 象 软 件 开 发 模 型 的 一 部 分 然 而, 它 一 般 是 描 述 系 统 交 互 的 一 种 方 法 ( 即 使 不 是 IT 系 统 ), 这 里 关 于 用 例 的 讨 论 是 基 于 [24] 中 的 概 念 基 础 知 识 一 个 软 件 系 统 可 能 被 许 多 用 户 或 其 他 系 统 使 用, 我 们 用 于 揭 示 需 求 在 用 例 术 语 中 角 色 是 一 个 人 或 系 统, 它 用 系 统 而 达 到 一 个 目 标 注 意 角 色 与 系 统 交 互 而 达 到 一 些 目 标, 那 么 角 色 是 逻 辑 实 体, 它 代 表 着 一 群 有 相 同 行 为 的 用 户 ( 人 或 系 统 ) 不 同 的 角 色 因 为 不 同 的 目 标 代 表 着 不 同 的 群 体, 所 以 对 系 统 发 送 某 些 消 息 而 由 另 外 用 户 接 受 消 息 的 普 通 使 用 者, 采 用 接 受 者 和 发 送 者 来 称 谓 比 较 好 主 角 色 是 使 用 用 例 (UC) 来 达 到 某 个 目 标 的 主 要 角 色, 而 满 足 这 一 目 的 是 该 用 例 的 主 要 目 标 主 角 色 是 逻 辑 概 念, 尽 管 我 们 假 设 主 角 色 执 行 用 例, 但 是 一 些 代 理 可 能 会 真 正 执 行 主 角 色 用 例 中 的 行 为 例 如, 用 区 域 用 例 获 得 销 售 增 长 报 告 的 VP 可 以 是 主 角 色, 尽 管 真 正 执 行 的 是 秘 书 我 们 把 主 角 色 认 为 是 那 个 真 正 使 用 用 例 结 果 的 人, 以 及 目 标 中 的 主 要 消 费 者 时 间 驱 动 触 发 器 是 关 于 主 角 色 怎 样 执 行 用 例 ( 在 这 种 情 形 下, 有 时 报 告 是 自 动 生 成 的 ) 的 另 一 个 例 子 注 意, 虽 然 主 角 色 的 目 标 是 用 例 的 驱 动 力, 但 是 用 例 也 需 要 满 足 其 他 相 关 者 的 目 标 那 就 是 说, 尽 管 用 例 可 由 主 角 色 的 目 标 来 驱 动, 但 是 用 例 的 目 的 是 描 述 系 统 满 足 所 有 用 户 的 目 标 行 为 例 如, 一 个 从 ATM 机 上 取 款 的 用 例, 它 的 客 户 是 主 角 色, 将 正 常 地 描 述 客 户 与 ATM 之 间 的 全 部 交 互 然 而, 银 行 也 是 ATM 系 统 相 关 者, 它 的 目 标 包 括 记 录 所 有 的 步 骤 当 账 户 里 有 足 够 资 金 时 钱 才 被 取 出 一 次 取 款 不 能 超 过 多 少 限 额 等 ATM 取 款 用 例 中 要 满 足 所 有 这 些 目 标

47 为 了 描 述 交 互 行 为, 用 例 采 用 情 景 情 景 描 述 了 在 某 些 特 定 条 件 下 为 达 到 某 一 目 标 而 执 行 的 活 动 集 活 动 集 通 常 描 述 为 明 确 的 顺 序, 尽 管 有 些 操 作 的 执 行 以 并 行 或 其 他 次 序, 情 景 中 的 每 一 步 都 是 由 系 统 或 角 色 执 行 的 一 个 逻 辑 上 完 整 的 活 动, 通 常 是 角 色 的 某 个 行 为, 每 一 逻 辑 步 骤 是 系 统 为 达 到 某 目 标 的 向 前 发 展, 或 者 是 为 了 满 足 某 些 目 标 而 改 变 一 些 中 间 状 态 用 例 总 是 有 一 个 成 功 情 景, 该 情 景 描 述 了 在 交 互 时 若 没 有 任 何 失 败, 那 么 所 有 的 步 骤 将 全 部 成 功 完 成 可 能 会 有 几 个 成 功 情 景, 尽 管 用 例 标 准 是 为 了 达 到 这 些 目 的, 但 是 当 系 统 和 角 色 在 进 行 一 些 不 能 使 系 统 完 全 地 达 到 目 的 的 交 互 时, 就 会 发 生 许 多 不 同 情 况 有 时 被 称 为 例 外 情 景, 用 例 就 是 一 个 包 括 所 有 与 目 标 有 关 的 成 功 情 景 和 它 的 例 外 情 景 表 3.1 中 是 有 关 用 例 术 语 的 总 结 术 语 角 色 主 角 色 情 景 主 情 景 例 外 情 景 表 3.1 用 例 术 语 定 义 使 用 系 统 完 成 某 一 目 标 的 人 或 系 统 主 角 色 初 始 化 用 例 且 使 用 用 例 的 主 要 目 的 是 满 足 他 的 目 标 在 一 定 条 件 下 为 实 现 某 一 目 标 而 被 执 行 的 一 组 操 作 描 述 交 互, 如 果 每 一 步 骤 都 成 功 执 行 描 述 系 统 行 为, 如 果 某 些 步 骤 在 主 情 景 中 没 有 完 全 成 功 为 了 达 到 期 望 的 目 标, 系 统 可 被 分 成 几 个 子 目 标 其 中 某 些 子 目 标 可 由 系 统 自 身 完 成, 也 可 以 由 另 外 系 统 所 支 持 角 色 的 用 例 所 执 行 例 如, 假 设 核 实 一 个 ATM 取 款 用 例 中 的 用 户 是 否 使 用 了 认 证 服 务, 与 这 个 服 务 的 交 互 可 作 为 一 个 单 独 的 用 例 因 此 情 景 中 的 用 例 为 了 完 成 一 些 任 务 而 借 用 其 他 的 用 例 换 句 话 说, 用 例 允 许 按 层 次 组 织 用 例 预 想 的 最 基 本 系 统 模 型 是, 系 统 对 角 色 使 用 时 所 需 求 的 最 基 本 的 响 应, 这 是 显 然 的 在 描 述 了 角 色 与 系 统 的 交 互 之 后, 系 统 的 行 为 就 可 以 确 定 了, 通 过 行 为 它 的 功 能 也 就 确 定 了 这 种 方 法 的 一 个 关 键 优 势 在 于 用 例 只 关 注 外 部 行 为, 因 此 可 以 避 免 需 求 期 间 的 内 部 设 计, 尽 管 期 望 某 些 事 情, 但 是 用 多 种 模 型 的 方 法 不 容 易 做 到 用 例 通 常 用 文 本 描 述, 它 代 表 着 系 统 行 为 性 的 需 求, 这 些 行 为 说 明 可 以 覆 盖 系 统 中 的 大 部 分 功 能 需 求 虽 然 用 例 不 能 形 成 完 整 的 SRS, 但 是 可 以 成 为 其 中 的 一 部 分 如 我 们 所 见, 完 整 的 SRS 需 要 捕 获 其 他 一 些 需 求, 如 性 能 和 设 计 约 束 等 尽 管 用 文 本 可 详 细 描 述 用 例, 但 是 图 表 可 以 作 为 文 本 描 述 的 辅 助 工 具 例 如,UML 的

48 用 例 图 可 以 展 现 系 统 中 的 用 例 和 角 色, 以 及 它 们 的 依 赖 性, UML 用 例 图 通 常 用 椭 圆 表 示 系 统 中 的 用 例, 用 线 连 接 用 例 与 主 要 角 色, 然 后 展 示 出 用 例 的 依 赖 性 也 可 以 表 示 用 例 中 的 一 些 其 他 关 系, 然 而 用 例 本 质 上 是 自 然 语 言 的 文 本 描 述, 在 开 发 过 程 或 用 例 说 明 中 图 表 描 述 有 限, 在 此 不 进 一 步 讨 论 用 例 图 表 表 示 几 个 例 子 让 我 们 用 少 许 用 例 说 明 这 些 概 念, 这 些 用 例 也 将 用 来 解 释 一 些 与 用 例 相 关 的 概 念 考 虑 一 个 大 学 社 团 建 立 的 在 线 小 型 拍 卖 系 统 UAS, 通 过 这 个 系 统, 大 学 中 的 不 同 人 可 以 买 卖 物 品 我 们 假 设 有 一 个 单 独 的 金 融 子 系 统, 每 个 买 家 和 卖 家 在 子 系 统 中 都 有 一 个 帐 号, 可 以 通 过 该 子 系 统 买 卖 东 西 在 这 个 系 统 中, 尽 管 这 里 有 相 同 的 买 和 卖 的 人, 但 是 仍 把 买 者 和 卖 者 按 不 同 的 目 标 分 成 不 同 的 逻 辑 角 色 除 了 这 些 之 外, 拍 卖 系 统 本 身 也 是 个 相 关 者 和 角 色, 金 融 系 统 也 是 首 先 考 虑 该 系 统 的 主 要 用 例, 拍 卖 物 品 喊 价 和 完 成 一 次 拍 卖 图 3.4 中 给 出 了 这 些 用 例

49 : 卖 家 : 卖 家 已 经 登 录 : 1. 卖 家 为 一 个 物 品 张 贴 一 个 拍 卖 公 告 ( 物 品 的 类 目 描 述 图 等 ) 2. 系 统 向 卖 家 展 示 与 该 物 品 类 似 的 物 品 的 历 史 价 格 3. 卖 家 指 定 最 低 竞 标 价 格 和 拍 卖 截 止 日 期 4. 系 统 接 受 该 物 品 并 公 布 告 示 : -2 a) 历 史 中 没 有 此 类 的 物 品 系 统 告 诉 卖 家 这 种 情 况 : 买 家 : 买 家 已 登 录 ; 1. 买 家 搜 索 或 浏 览, 然 后 选 择 某 项 物 品 2. 系 统 显 示 卖 方 的 等 级 最 低 出 价 当 前 的 竞 价 最 高 的 投 标, 然 后 要 求 买 方 去 竞 标 3. 买 家 出 价 4. 系 统 接 受 出 价 并 从 投 标 者 的 账 户 划 钱 5. 系 统 更 改 最 高 竞 标 价 并 通 知 其 他 用 户, 更 新 记 录 : -3 a) 投 标 价 低 于 当 前 最 高 竞 标 价 系 统 通 知 投 标 者 并 要 求 其 重 新 竞 价 -4 a) 投 标 者 的 账 户 没 有 足 够 的 钱 系 统 取 消 竞 价 并 提 醒 卖 家 充 值 账 户 ; 拍 卖 系 统 : 拍 卖 截 止 日 期 还 没 到 景 ; 1. 选 择 最 高 的 竞 价 者, 给 选 中 的 竞 价 者 和 卖 家 发 邮 件 通 知 最 后 的 拍 卖 价 格, 同 时 也 给 其 他 竞 价 者 发 邮 件 2. 从 竞 价 者 的 账 户 划 钱 并 向 卖 家 的 帐 户 付 款 3. 解 冻 其 他 竞 价 者 的 账 户 4. 从 卖 家 的 账 户 转 移 销 售 物 品 的 佣 金 到 组 织 的 账 户 5. 从 网 站 上 移 除 此 物 品, 更 新 记 录 : 无 图 3.4 拍 卖 系 统 中 的 主 用 例 用 例 是 自 我 解 释 的, 这 是 用 例 的 最 大 价 值 所 在, 它 们 很 自 然, 像 故 事 一 样, 这 样 使 得 不 管 是 分 析 人 员 还 是 外 行 都 很 容 易 理 解 因 此, 用 例 很 大 程 度 上 帮 助 缩 小 了 开 发 者 与 项 目 相 关 者 之 间 的 理 解 偏 差 在 用 例 中 有 很 多 地 方 值 得 讨 论 为 了 便 于 参 考 引 用, 用 例 一 般 都 加 以 编 号 用 例 的 名 字 指 明 了 主 要 角 色 的 目 标 ( 因 此 没 有 单 独 的 语 句 说 明 目 标 ) 对 于 UC1 和 UC2 来 说 主 要 角 色 可 以 是 人 或 系 统, 但 是 对 于 UC3 来 说 主 要 角 色 可 能 是 一 个 系 统, 主 要 角 色 也 可 能 是 一 个 请 求 服 务 的 软 件 用 例 的 先 决 条 件 是 明 确 系 统 在 用 例 使 用 之 前 需 要 确 保 的 事 情, 通 常 的 先 决 条 件 是 用 户 已 经 登 录, 输 入 数 据 已 经 在 文 件 中 或 其 它 数 据 结 构 中 等 对 于 像 删 除 这 类 操 作 假 定 系 统 删 除 项 已 存 在, 或 者 跟 踪 用 例 则 假 定 所 跟 踪 的 序 号 是 有 效 的 如 果 在 用 例 的 描 述 清 单 中 包 括 那 些 与 主 要 角 色 的 目 标 不 是 必 须 相 关 的 动 作, 则 这 是 毫 无 意 义 的 例 如,UC2 中 的 最 后 一 步 是 更 新 其 他 竞 价 者 的 报 价, 这 个 动 作 对 于 当 前 竞 价 者 的 目 标 不 是 必 须 的 但 是 如 果 系 统 和 其 他 竞 价 者 对 于 这 个 用 例 来 说 是 有 关 联 的, 所 以 用 例 必 须

50 保 证 满 足 他 们 的 目 标,UC1 的 最 后 一 项 也 是 一 样 的 异 常 情 形 也 需 要 非 常 清 楚, 我 们 已 经 列 出 了 那 些 明 显 的 情 形 依 据 具 体 组 织 目 标 可 能 会 有 更 多 的 情 形 例 如, 可 能 存 在 用 户 没 有 完 成 整 个 事 务, 该 失 败 情 形 可 以 发 生 在 任 何 地 方, 怎 样 处 理 这 种 情 形 将 在 下 面 进 一 步 讨 论 一 个 用 例 可 以 采 用 其 他 用 例 执 行 它 的 某 些 工 作, 例 如, 在 UC2 活 动 中, 像 冻 结 必 要 的 资 金 或 者 从 竞 价 者 的 账 户 划 钱 并 向 卖 家 的 帐 户 付 款 是 对 用 例 成 功 执 行 所 必 要 的 动 作 然 而, 他 们 并 不 在 这 个 用 例 中 执 行, 而 是 当 作 用 例 自 身 部 分, 在 其 他 地 方 描 述 如 果 这 些 用 例 也 是 正 在 实 施 系 统 的 一 部 分, 则 必 须 在 需 求 文 档 中 说 明 如 果 他 们 属 于 某 个 其 他 系 统, 则 必 须 获 得 他 们 的 规 范 说 明 与 资 金 财 务 有 关 的 行 为 可 能 很 容 易 超 出 拍 卖 系 统 的 范 围, 因 此 不 在 SRS 描 述 但 是 类 似 于 搜 索 和 浏 览 类 的 行 为 很 可 能 是 系 统 的 一 部 分, 所 以 在 SRS 中 必 须 描 述 这 就 允 许 用 例 以 层 次 化 的 方 式 组 织, 细 化 的 方 法 可 以 用 来 将 一 个 较 低 的 服 务 定 义 更 高 层 次 的 用 例, 然 后 定 义 较 低 层 次 的 服 务 但 是 这 些 较 低 层 次 的 用 例 就 是 那 些 与 主 要 角 色 和 主 要 情 形 相 关 的 用 例, 主 要 角 色 往 往 是 更 高 级 别 用 例 的 主 要 角 色 例 如, 在 用 例 发 现 物 品 中 的 主 要 角 色 是 买 家 这 也 意 味 着 在 列 举 情 景 时, 新 的 用 例 和 新 的 角 色 可 能 出 现 在 需 求 文 档 中, 所 有 在 文 档 中 提 到 的 用 例 将 需 要 明 确 它 们 是 否 是 正 在 实 现 的 系 统 的 一 部 分 扩 展 除 了 明 确 主 角 色 目 标 成 功 和 异 常 场 景 外, 一 个 用 例 也 能 指 定 一 个 范 围 如 果 正 在 构 建 的 系 统 有 许 多 子 系 统 ( 这 是 常 有 的 情 况 ), 有 时 系 统 用 例 实 际 上 获 得 的 是 一 些 子 系 统 的 行 为 在 这 种 情 况 下, 最 好 指 定 作 为 子 系 统 用 例 的 范 围 例 如, 一 个 系 统 的 登 录 用 例, 尽 管 这 是 系 统 的 一 部 分, 在 该 用 例 中 描 述 的 系 统 与 用 户 的 交 互 仅 限 于 与 登 录 和 身 份 验 证 子 系 统 的 相 互 作 用 如 果 登 录 和 身 份 认 证 已 作 为 一 个 子 系 统 或 组 成 部 分, 那 么 最 好 是 指 定 它 的 范 围 一 般 来 说, 一 个 商 业 用 例 有 企 业 或 组 织 作 为 范 围 ; 一 个 系 统 用 例 有 正 在 实 现 的 系 统 作 为 范 围 ; 而 组 成 部 分 的 用 例 范 围 是 一 个 子 系 统 UC 的 范 围 是 企 业, 它 往 往 可 以 运 行 较 长 时 间 ( 例 如, 处 理 一 个 准 候 选 人 申 请 ), 这 些 用 例 在 UC 完 成 之 前 可 能 需 要 许 多 不 同 的 系 统 来 执 行 不 同 的 任 务 ( 例 如 :HR 部 门 为 了 处 理 申 请 必 须 做 一 些 事 情, 旅 行 部 门 必 须 安 排 旅 行 和 住 宿, 而 技 术 部 门 引 导 会 见 ) 系 统 及 子 系 统 用 例 普 遍 认 为 是 可 以 在 以 相 对 短 的 时 间 内 完 成, 以 上 这 三 个 用 例 都 是 系 统 用 例 如 前 所 述, 我 们 将 重 点 放 在 描 述 实 现 系 统 中 感 兴 趣 的 软 件 行 为 上 但 是, 企 业 级 的 UC 会 提 供 系 统 操 作 的 上 下 文, 因 此, 有 时 可 以 描 述 一 些 关 键 的 商 业 过 程 作 为 总 结 层 的 用 例, 这 对 所 建 系 统 的 上 下 文 是 有 用 的

51 例 如, 让 我 们 描 述 执 行 一 次 拍 卖 活 动 的 总 体 使 用 情 况, 一 个 可 能 的 用 例 在 图 3.5 中 给 出 这 个 用 例 不 是 模 拟 的 用 例 而 是 一 个 真 正 的 业 务 过 程, 它 为 早 期 用 例 提 供 了 上 下 文 虽 然 这 个 用 例 主 要 由 系 统 完 成, 并 且 可 能 是 正 在 兴 建 系 统 的 一 部 分 通 常 像 这 样 的 用 例 可 能 不 完 全 是 系 统 软 件 的 一 部 分 而 且 可 以 包 括 许 多 人 工 环 节 例 如, 在 拍 卖 物 品 的 用 例 中, 如 果 该 已 被 拍 卖 的 物 品 的 交 付 是 由 拍 卖 网 站 负 责 的, 那 么 交 付 将 会 在 用 例 有 一 个 环 节, 并 且 将 是 一 个 人 工 环 节 图 3.5 一 个 概 要 级 用 例 用 例 也 可 以 为 主 成 功 情 景 指 定 后 置 条 件, 或 者 提 供 全 部 条 件 中 的 某 些 最 起 码 的 保 障 例 如, 在 一 些 用 例 中, 原 子 性 可 能 是 最 小 的 保 障 也 就 是 说, 不 管 发 生 什 么 异 常 要 么 整 个 事 务 和 目 标 都 完 成 要 么 系 统 处 于 什 么 也 没 做 的 状 态 由 于 原 子 性 的 保 障, 将 不 会 有 局 部 的 结 果, 并 且 任 何 局 部 改 变 就 将 会 回 滚 构 建 用 例 UC 不 只 是 需 求 文 档, 因 为 它 们 的 形 式 像 是 讲 故 事 和 用 文 本 描 述, 这 两 者 对 于 不 同 项 目 相 关 者 都 是 轻 松 和 自 然 的, 它 们 也 是 一 种 讨 论 和 头 脑 风 暴 的 良 好 媒 介 所 以 UC 也 可 以 用 于 需 求 获 取 和 分 析 问 题 当 构 建 用 例 时, 虽 然 没 有 要 求 也 可 以 构 造 非 形 式 或 形 式 的 模 型 UC 可 以 逐 步 构 建 完 善, 在 每 个 步 骤 中 加 入 更 多 的 细 节, 这 种 方 法 允 许 UC 针 对 不 同 层 次 抽 象 尽 管 任 何 层 的 抽 象 都 是 可 以 的, 但 一 般 是 以 下 四 个 层 次 : - 角 色 和 目 标 在 角 色 目 标 清 单 中 列 举 用 例, 并 指 明 每 个 目 标 的 角 色 ( 该 用 例 的 名 称 为 一 般 目 标 ), 此 表 可 以 通 过 给 每 个 用 例 加 上 一 个 简 短 的 说 明 进 行 扩 展 在 这 个 层 面 上, 所 有 这 些 用 例 共 同 规 定 该 系 统 的 范 围, 并 对 它 究 竟 做 什 么 有 个 总 体 见 解, 复 查 这 些 用 例 可 以 清 楚 地 评 估 系 统 的 完 整 功 能 - 主 要 成 功 情 景 会 涉 及 每 个 用 例 的 主 要 成 功 情 景 在 主 要 情 景 中, 确 定 每 个 用 例 的 系 统 行 为 审 查 相 应 说 明 以 确 保 所 有 的 项 目 相 关 者 关 心 的 事 得 到 满 足, 同 时 用 例 提 供 所 需 要 的 行 为

52 - 失 败 条 件 一 旦 列 出 成 功 情 景, 则 可 以 识 别 所 有 可 能 的 失 败 条 件 在 这 一 层 面 上, 对 于 成 功 情 景 下 的 每 一 步, 有 不 同 的 途 径, 因 为 失 败 条 件 导 致 这 一 步 失 败 在 决 定 这 些 失 败 条 件 下 应 该 做 什 么 之 前 ( 在 下 一 层 次 该 做 什 么 ), 最 好 是 枚 举 出 失 败 条 件 并 检 查 完 整 性 - 失 败 处 理 这 也 许 是 编 写 用 例 时 最 棘 手 和 困 难 的 部 分, 通 常 情 况 下, 重 点 大 多 放 在 主 要 功 能 上, 人 们 对 失 败 应 该 如 何 处 理 很 少 注 意 在 确 定 不 同 的 失 败 情 况 下, 什 么 行 为 该 发 生 往 往 会 确 定 新 的 业 务 规 则 或 新 的 角 色 不 同 层 次 的 抽 象 可 用 于 不 同 的 目 的 为 了 讨 论 系 统 的 整 体 功 能 和 性 能, 对 角 色 和 目 标 的 层 次 描 述 是 非 常 有 用 的 另 一 方 面, 失 败 条 件 在 理 解 和 挖 掘 特 定 用 例 中 的 一 些 细 节 需 求 和 业 务 规 则 时, 也 是 非 常 有 用 的 这 四 个 层 次 的 抽 象 也 可 以 指 导 分 析 活 动 下 面 是 一 个 采 用 用 例 的 逐 步 分 析 方 法 : 第 1 步, 确 定 角 色 和 目 标, 并 与 目 标 有 关 的 项 目 相 关 者 达 成 一 致 角 色 - 目 标 列 表 可 以 清 楚 地 界 定 该 系 统 的 范 围, 并 提 供 系 统 能 力 的 整 体 见 解 第 2 步, 理 解 并 明 确 每 个 UC 的 主 要 成 功 情 景, 并 给 出 该 系 统 主 要 功 能 的 更 多 细 节 如 果 需 要, 尽 管 可 能 已 构 造 模 型, 但 是 交 互 和 讨 论 是 揭 示 这 些 情 况 的 主 要 手 段 在 这 一 步 中, 分 析 师 可 能 会 发 现 要 完 成 一 些 用 例 还 需 要 其 他 的 用 例, 这 种 情 况 下, 将 会 扩 大 用 例 的 列 表 第 3 步, 当 一 个 用 例 的 主 要 成 功 情 景 与 上 层 一 致, 并 指 定 其 执 行 的 主 要 步 骤, 那 么 就 可 以 对 失 败 条 件 进 行 检 查 列 举 失 败 条 件 是 揭 示 由 系 统 处 理 时 可 能 出 现 特 殊 情 况 的 好 方 法 第 4 步, 明 确 在 这 些 失 败 条 件 下 应 该 做 什 么 因 为 处 理 失 败 的 细 节 需 要 许 多 的 努 力 和 讨 论, 所 以 最 好 是 先 列 举 不 同 的 失 败 情 况, 然 后 获 得 这 些 情 景 的 细 节 很 多 时 候, 当 确 定 失 败 情 景 以 后, 会 呈 现 许 多 关 于 如 何 处 理 这 些 情 况 的 新 的 业 务 规 则 虽 然 在 用 例 构 建 中 解 释 了 一 些 最 基 本 的 步 骤, 但 基 本 步 骤 的 每 一 步 分 析 都 可 能 要 追 溯 到 早 先 步 骤 具 体 分 析 中, 这 时 可 能 就 会 发 现 新 的 角 色 新 目 标 和 新 用 例 也 就 是 说, 使 用 用 例 分 析 也 是 一 个 互 动 的 工 作 用 例 的 细 节 应 该 放 在 哪 个 层 次 呢? 这 样 的 问 题 是 没 有 准 确 答 案 的, 其 实 真 正 的 答 案 总 是 依 赖 于 具 体 的 项 目 和 情 形, 所 以 这 个 答 案 与 用 例 有 关 当 有 足 够 的 细 节 描 述 而 不 完 全, 但 足 以 满 足 构 建 系 统 和 合 适 的 质 量 目 标 时, 一 般 来 说 这 是 好 事 例 如, 如 果 有 一 个 小 团 队 来 构 建 系 统, 列 出 主 要 的 异 常 条 件 与 满 足 情 景 的 关 键 步 骤 就 足 够 了 另 一 方 面, 对 于 分 包 给 其 他 组 织 的 项 目, 这 时 最 好 是 有 更 详 细 的 用 例 描 述 编 写 用 例, 可 以 用 一 般 编 写 技 术 规 则 使 用 简 单 的 语 法, 清 楚 明 确 规 定 谁 去 执 行 这 个 步

53 骤, 并 保 持 总 体 方 案 尽 可 能 简 单 另 外, 当 编 写 步 骤 时, 为 简 单 起 见, 若 能 清 楚 表 达 意 思 时 最 好 是 把 一 些 步 骤 合 并 成 逻 辑 上 的 一 个 步 骤 例 如, 用 户 输 入 他 的 名 字, 用 户 输 入 他 的 SSN 和 用 户 输 入 他 的 地 址 等 步 骤, 可 以 很 容 易 地 合 并 成 一 个 用 户 输 入 个 人 信 息 步 骤 3.5 其 他 分 析 方 法 问 题 分 析 的 基 本 目 的 是 为 了 获 得 对 客 户 和 用 户 需 求 的 一 个 清 晰 认 识, 从 软 件 中 期 望 得 到 的 是 什 么 和 在 解 决 方 案 上 有 什 么 约 束 很 多 情 况 下, 客 户 和 用 户 并 不 理 解 或 不 知 道 他 们 的 需 求, 因 为 潜 在 新 的 系 统 往 往 并 不 能 被 他 们 完 全 理 解 分 析 师 必 须 确 保 发 现 客 户 和 用 户 的 实 际 需 求, 即 使 他 们 对 此 不 是 很 清 楚 也 就 是 说, 分 析 师 们 不 仅 收 集 和 整 理 客 户 组 织 及 过 程 的 有 关 信 息, 而 且 在 帮 助 客 户 和 用 户 确 定 他 们 的 需 求 时 充 当 顾 问 在 分 析 中 所 采 用 的 基 本 原 理 在 任 何 复 杂 任 务 中 都 相 同 : 分 而 治 之 法 也 就 是 说, 把 问 题 分 割 成 子 问 题, 然 后 为 了 了 解 总 的 问 题 试 着 去 了 解 每 个 子 问 题 和 它 们 的 关 系 有 时 状 态 和 投 影 概 念 也 会 有 效 地 在 划 分 过 程 中 使 用 一 个 系 统 的 状 态 表 示 了 有 关 系 统 的 一 些 条 件 通 常, 当 使 用 状 态 时, 动 作 首 先 被 视 为 在 几 个 可 能 的 状 态 中 之 一, 然 后 执 行 每 一 个 状 态 的 详 细 分 析, 这 种 方 法 有 时 用 于 实 时 软 件 或 过 程 控 制 软 件 投 影 概 念 中, 一 个 系 统 从 多 个 视 角 定 义 当 利 用 投 影 时, 按 多 个 视 角 定 义 系 统, 然 后 分 析 这 些 不 同 的 视 图, 获 得 的 不 同 投 影 组 合 成 一 个 完 整 的 系 统 分 析 视 图 从 不 同 的 视 角 分 析 系 统 往 往 更 容 易, 因 为 它 限 定 研 究 的 范 围 并 着 重 关 注 研 究 范 围 在 本 节 的 剩 余 部 分, 我 们 将 讨 论 其 他 两 个 问 题 分 析 方 法 因 为 分 析 的 目 的 是 为 了 理 解 问 题 域, 分 析 师 必 须 熟 悉 不 同 的 分 析 方 法, 并 选 择 他 认 为 是 最 适 合 手 头 上 问 题 的 方 法 数 据 流 图 数 据 流 图 DFD (Data Flow Diagrams) 常 用 于 问 题 分 析 DFD 的 应 用 是 相 当 普 遍 的, 不 仅 限 于 软 件 需 求 问 题 的 分 析,DFD 早 在 软 件 工 程 学 科 开 始 前 就 已 经 使 用 DFD 理 解 一 个 系 统 时 非 常 有 用, 而 且 也 能 有 效 地 用 于 分 析 过 程 一 个 DFD 展 现 的 是 经 过 系 统 的 数 据 流, 它 把 系 统 视 为 函 数, 即 为 将 输 入 转 换 成 所 需 输 出 的 函 数 任 何 复 杂 系 统 都 不 会 把 一 个 转 变 作 为 单 一 的 一 步, 数 据 通 常 会 经 过 一 系 列 转 换 才 会 变 为 所 需 要 的 输 出 DFD 旨 在 捕 捉 到 系 统 内 对 输 入 数 据 的 转 换, 以 便 最 终 产 生 输 出 数 据 把 数 据 从 一 个 状 态 转 换 到 另 一 个 状 态 的 处 理 称 为 一 个 处 理 过 程 ( 或 称 为 加 工 ) 因 此, 通 过 系

54 统 中 不 同 的 转 换 或 系 统 处 理 过 程, 数 据 流 图 显 示 出 数 据 的 移 动 过 程 用 命 名 的 圆 圈 表 示, 数 据 流 用 进 入 和 离 开 加 工 的 带 箭 头 的 具 有 名 称 的 线 表 示, 矩 形 代 表 一 个 源 或 目 的 地 并 是 一 个 网 状 的 发 起 端 或 一 个 数 据 的 消 费 者, 典 型 情 况 是 源 或 目 的 地 在 系 统 之 外 图 3.6 所 示 的 是 职 工 工 资 系 统 的 数 据 流 图 实 例 职 工 记 录 加 班 费 率 公 司 记 录 取 得 职 工 文 件 工 资 率 * * 支 付 总 支 付 周 薪 加 班 费 扣 税 * 实 付 工 资 发 放 支 票 职 工 工 号 正 常 工 作 小 时 加 班 时 间 检 查 周 时 表 职 工 税 率 职 工 图 3.6 支 付 工 人 薪 水 的 DFD 该 DFD 中 有 一 个 基 本 的 输 入 数 据 流 是 周 时 数, 这 张 表 源 于 周 时 工, 基 本 输 出 是 该 职 工 的 薪 水, 最 终 流 入 也 是 职 工 在 这 个 系 统 中, 首 先, 使 用 职 工 ID 取 到 职 工 记 录, ID 包 括 在 该 周 时 表 中 从 职 工 记 录 中 可 以 获 得 正 常 薪 金 和 加 班 费 由 加 班 费 加 班 时 间 和 正 常 上 班 时 间 ( 从 时 间 表 ) 计 算 总 薪 酬 确 定 薪 金 总 额 后, 依 据 税 收 文 件 计 算 税 金, 税 金 会 被 记 录 在 职 工 和 公 司 的 记 录 中 最 后, 发 出 净 薪 水, 支 付 的 金 额 会 被 记 录 在 公 司 记 录 中 在 完 成 DFD 时 有 一 些 约 定 应 当 解 释 一 下 所 有 的 外 部 文 件 如 职 工 记 录, 公 司 记 录 和 显 示 税 率 等 文 件, 用 一 个 带 标 记 直 线 连 接 ; 当 一 个 过 程 需 要 多 个 数 据 流 时, 数 据 流 之 间 用 一 个 * 号 表 示, 这 个 符 号 代 表 与 关 系 例 如, 如 果 在 一 过 程 中 的 两 个 输 入 数 据 流 A B 之 间 有 一 个 *, 它 意 味 着 A 和 B 都 是 这 个 过 程 需 要 的 在 图 3.6 的 数 据 流 图 中, 在 周 薪 过 程 的 数 据 流 中 时 间 和 工 资 标 准 都 是 需 要 的 ; 同 样, 数 据 流 之 间 的 OR 关 系 用 一 个 + 代 表 图 3.6 的 DFD 是 系 统 处 理 职 工 薪 金 过 程 的 一 个 抽 象 描 述, 系 统 是 否 是 自 动 或 手 工 的 都 没 有 关 系 此 图 可 能 对 手 工 系 统 很 好, 这 个 系 统 中 的 计 算 可 由 计 算 器 完 成, 记 录 是 记 载 在 物 理 文 件 中 本 DFD 没 有 显 示 那 些 细 节 和 次 要 数 据 例 如, 在 每 周 的 时 间 表 里, 如 果 有 错 误 会 发 生 什 么? 这 类 信 息 是 不 会 显 示 在 此 DFD 中, 这 是 为 了 避 免 构 建 整 个 系 统 的 DFD 时, 陷 入 过 多 细 节 造 成 的 困 境 如 果 有 需 要 更 多 的 细 节 时,DFD 可 以 进 一 步 完 善

55 应 当 指 出,DFD 不 是 一 个 流 程 图 DFD 代 表 着 数 据 流, 而 流 程 图 显 示 的 是 控 制 流 一 个 DFD 不 代 表 过 程 信 息 因 此, 当 绘 制 数 据 流 图 时, 不 必 涉 及 程 序 细 节, 避 免 程 序 式 的 思 考 例 如, 忽 略 循 环 和 判 断 的 考 虑 在 绘 制 数 据 流 图 时, 设 计 者 必 须 明 确 从 输 入 到 输 出 数 据 流 的 重 大 转 变 路 径, 在 画 数 据 流 图 时 不 必 考 虑 如 何 执 行 这 些 变 换 许 多 系 统 因 为 过 大, 一 般 很 难 用 一 个 简 单 的 DFD 把 数 据 流 描 述 清 楚 在 这 种 系 统 中 使 用 必 要 的 抽 象 机 制 是 需 要 的 DFD 可 以 有 层 次 地 组 织, 采 用 逐 步 分 层 的 方 法 分 析 大 型 系 统, 多 层 次 的 DFD 称 为 层 次 DFD 集 [28] 一 个 层 次 DFD 集 有 一 个 开 始 的 DFD, 这 是 一 个 很 抽 象 的 系 统 代 表, 在 系 统 中 识 别 主 要 输 入 和 输 出 的 处 理 过 程 通 常, 在 最 初 的 数 据 流 图 之 前, 上 下 文 图 (context diagram) 绘 制 中, 可 以 把 整 个 系 统 作 为 一 个 单 一 的 过 程, 标 明 其 所 有 输 入 输 出 去 向 和 来 源 然 后 再 完 善 每 一 个 过 程, 并 对 每 一 过 程 绘 制 DFD 换 句 话 说, 在 细 化 DFD 期 间, 是 对 DFD 的 加 工 扩 充 为 一 个 DFD 实 现 的 对 层 次 结 构 图 来 说 必 须 保 持 一 致 性, 对 于 一 个 过 程 的 DFD 输 入 和 输 出 要 与 较 高 层 次 的 DFD 过 程 的 输 入 输 出 保 持 一 致 是 非 常 重 要 的 如 果 每 个 加 工 被 认 为 是 原 子 时, 细 化 过 程 就 停 止, 在 这 种 情 况 下 每 个 加 工 很 明 确 或 容 易 被 理 解 应 当 指 出, 在 细 化 过 程 中, 虽 然 保 存 输 入 和 输 出, 但 对 数 据 的 细 化 也 可 能 发 生 也 就 是 说, 当 对 一 过 程 引 入 更 详 细 的 DFD 时, 一 个 单 元 的 数 据 就 会 被 分 解 为 几 个 小 的 部 分 因 此 随 着 过 程 分 解, 数 据 分 解 也 会 发 生 在 数 据 流 图 中, 数 据 流 有 唯 一 确 定 的 名 称, 名 称 选 择 传 达 了 其 表 示 的 是 什 么 数 据 然 而, 为 了 指 明 数 据 流 的 精 确 结 构, 常 用 到 数 据 字 典 在 DFD 中 的 数 据 字 典 精 确 的 表 明 了 数 据 流 结 构, 为 了 定 义 数 据 结 构, 可 以 使 用 正 则 表 达 式 类 型 的 符 号 在 明 确 数 据 项 结 构 时, 序 列 或 组 合 结 构 经 常 用 + 代 表, 选 择 用 来 代 表 ( 表 示 一 个 或 其 他 ), 以 * 表 示 重 复 ER 图 采 用 实 体 关 系 图 ERD(Entity Relationship Diagrams) 建 模 一 个 系 统 的 数 据 关 系 已 使 用 多 年 ERD 可 用 于 建 模 该 系 统 的 数 据 以 及 它 们 的 相 互 关 系, 但 不 包 括 数 据 是 如 何 处 理 或 在 系 统 中 实 际 是 如 何 操 作 和 更 改 的 数 据 库 设 计 人 员 经 常 使 用 它, 并 用 来 表 示 数 据 库 的 结 构, 它 是 数 据 库 系 统 有 用 的 分 析 工 具 ER 模 型 形 成 逻 辑 数 据 库 设 计, 对 于 关 系 数 据 库 来 说 它 们 很 容 易 转 换 成 初 始 表 结 构 ER 图 有 两 个 主 要 概 念 和 符 号 实 体 和 关 系 实 体 是 一 个 系 统 中 主 要 信 息 持 有 人 或 概 念 实 体 可 以 被 看 作 是 某 些 具 有 共 同 属 性 的 类 在 ER 图 中 实 体 可 以 用 方 框 来 表 示, 这 个 方 框 代 表 所 有 实 例 中 的 概 念 或 类 型 的 实 体 一 个 实 体 基 本 上 相 当 于 数 据 库 中 的 表 或 电 子 表 格 中 的 一 张 表, 实 体 可 以 有 表 示 概 念 的 属 性, 属 性 可 以 被 看 作 是 数 据 库 中 的 列, 并 用 椭 圆 表 示

56 为 了 避 免 图 的 复 杂 性, 属 性 有 时 不 显 示 在 ER 图 被 识 别 的 所 有 的 实 体 在 图 中 都 有 一 个 有 标 记 的 方 框, 每 个 方 框 代 表 一 个 实 体 当 然 实 体 并 不 是 孤 立 存 在 的, 他 们 之 间 有 关 系, 这 也 是 他 们 在 同 一 个 系 统 中 存 在 的 原 因 两 个 实 体 之 间 的 关 系 用 代 表 着 实 体 的 方 框 之 间 的 连 线 表 示, 两 个 方 框 之 间 的 连 线 表 示 一 个 实 体 的 元 素 与 另 一 个 实 体 元 素 相 联 系, 反 之 亦 然 这 种 关 系 也 可 以 通 过 在 线 上 给 一 个 标 签 来 命 名 在 一 些 符 号 中, 这 种 关 系 的 名 字 被 放 在 一 个 菱 形 框 中 一 些 关 系 的 例 子 是 : 学 习 (studies in)( 学 生 与 学 院 之 间 ) 雇 佣 关 系 ( 员 工 和 公 司 之 间 ) 拥 有 关 系 ( 人 与 车 之 间 ) 需 要 注 意 是 关 系 不 一 定 是 不 同 实 体 之 间 的, 在 同 类 实 体 之 间 的 元 素 也 存 在 关 系 例 如, 对 于 员 工 实 体, 可 以 有 一 个 员 工 管 理 员 工 的 关 系, 这 是 员 工 实 体 元 素 之 间 的 一 种 关 系 ER 图 也 能 明 确 关 系 的 一 些 性 质 特 别 是, 它 可 以 明 确 关 系 是 否 可 选 ( 或 需 要 ) 和 有 多 少 元 素 与 该 实 体 的 元 素 有 关 这 导 致 多 种 形 式 的 关 系, 如 一 对 一 ( 实 体 的 一 个 元 素 只 与 另 一 实 体 的 一 元 素 相 对 应 ) 一 对 多 或 多 对 一 ( 即 实 体 的 一 元 素 与 另 一 实 体 多 个 元 素 相 关, 或 一 个 实 体 的 多 个 元 素 涉 及 到 另 一 实 体 的 一 个 元 素 ), 以 及 多 对 多 ( 即 实 体 A 中 的 多 个 元 素 对 应 实 体 B 中 的 多 个 元 素 ) 关 系 有 各 种 符 号 来 表 达 这 种 关 系, 一 般 是 在 两 边 的 关 系 线 上 写 上 0 和 1, 或 N 来 代 表 这 种 关 系 的 基 数 因 此, 对 于 一 个 一 对 多 的 关 系, 1 将 放 在 一 端 而 N 放 在 该 线 的 另 一 端 关 系 反 映 了 问 题 域 的 一 些 性 质 例 如, 一 门 课 程 有 多 个 学 生 学 习 和 一 个 学 生 选 择 多 门 课 程, 这 就 导 致 课 程 和 学 生 之 间 的 多 对 多 关 系 但 是, 学 生 只 在 一 个 大 学 里 学 习, 一 个 大 学 有 许 多 学 生, 这 导 致 学 生 和 大 学 之 间 的 多 对 一 关 系 大 学 里 一 个 系 只 有 一 个 系 主 任, 只 有 一 个 人 是 一 个 系 的 主 任, 这 导 致 了 一 对 一 的 关 系 让 我 们 为 大 学 拍 卖 系 统 画 一 个 ER 图, 其 中 一 些 用 例 在 前 面 已 讨 论 过 从 用 例 描 述 中, 可 以 很 容 易 识 别 一 些 实 体 用 户 类 别 物 品 及 出 价 他 们 之 间 的 关 系 也 很 清 楚 用 户 可 以 卖 许 多 物 品, 但 每 个 物 品 只 属 于 一 个 卖 家, 所 以 在 用 户 和 物 品 之 间 有 一 个 一 对 多 关 系 卖 同 样, 在 物 品 和 出 价 者 之 间, 用 户 和 出 价 之 间 以 及 类 别 和 物 品 之 间 存 在 一 对 多 关 系 如 图 3.7 的 描 述 图 3.7 拍 卖 系 统 的 ER 图

57 从 ER 图 中 可 以 很 容 易 地 确 定 初 始 表 的 逻 辑 结 构, 每 个 实 体 代 表 一 张 表, 并 确 定 了 支 持 这 张 表 的 域, 这 个 域 包 含 相 关 属 性 例 如, 从 拍 卖 系 统 的 ER 图, 将 有 四 个 表 用 户 表 类 别 表 物 品 表 出 价 表 因 为 用 户 是 与 物 品 存 在 一 对 多 的 关 系, 所 以 该 物 品 表 应 有 一 个 唯 一 用 户 ID 标 识 字 段, 以 表 示 是 谁 卖 的 物 品 同 样, 出 价 表 必 须 有 一 个 用 户 ID 来 识 别 谁 给 的 出 价, 每 个 物 品 的 ID 确 定 为 其 出 价 已 取 得 物 品 正 如 我 们 所 看 到 的,ER 图 是 与 像 用 例 这 样 的 方 法 相 辅 相 成 的 然 而 用 例 关 注 的 是 交 互 和 功 能, ER 则 关 注 用 例 中 使 用 的 实 体 结 构 由 于 他 们 的 互 补 性, 在 分 析 系 统 的 需 求 时, 用 例 和 ER 图 都 可 以 使 用, 同 样 SRS 中 也 可 以 包 括 这 两 者 3.6 验 证 软 件 开 发 开 始 于 需 求 文 档, 需 求 文 档 也 用 于 确 定 最 终 交 付 的 软 件 系 统 是 否 可 接 受 因 此 需 求 规 格 不 应 包 含 错 误, 并 正 确 的 指 明 客 户 的 需 求, 这 是 非 常 重 要 的 此 外, 一 个 错 误 越 晚 被 发 现, 那 么 纠 正 这 个 错 误 所 花 费 的 费 用 越 大, 所 以 在 软 件 设 计 之 前 要 尽 可 能 的 发 现 错 误 由 于 需 求 规 格 的 性 质, 存 在 许 多 误 解 和 犯 错 误 的 情 况, 这 些 需 求 规 格 很 可 能 不 能 准 确 地 反 映 客 户 的 需 求 需 求 验 证 的 基 本 目 标 是 确 保 SRS 准 确 和 清 楚 的 反 映 实 际 需 求, 一 个 相 关 的 目 标 就 是 检 查 SRS 的 文 件 本 身 是 否 有 很 好 的 质 量 在 讨 论 验 证 之 前, 让 我 们 考 虑 一 下 错 误 的 类 型, 这 些 错 误 通 常 发 生 在 SRS 中 可 能 出 现 许 多 不 同 类 型 的 错 误, 但 最 常 见 的 错 误 可 分 为 四 种 类 型 : 遗 漏 不 一 致 不 正 确 的 事 实 和 模 糊 性 遗 漏 是 需 求 规 格 中 一 种 常 见 错 误, 在 这 种 类 型 的 错 误 中, 一 些 用 户 的 要 求 未 能 包 括 在 SRS 中, 被 遗 漏 的 需 求 可 能 会 涉 及 到 系 统 的 行 为 性 能 约 束 或 任 何 其 他 因 素 遗 漏 直 接 影 响 到 SRS 的 外 部 完 整 性 ; 在 需 求 中 另 一 个 常 见 的 错 误 的 形 式 是 不 一 致 不 一 致 性 可 能 是 由 于 需 求 的 内 部 矛 盾, 或 现 有 的 需 求 与 客 户 的 需 求 或 与 当 前 要 操 作 的 系 统 环 境 不 兼 容 ; 第 三 个 常 见 的 需 求 错 误 是 不 正 确 的 事 实 这 种 类 型 的 错 误 发 生 在 当 前 SRS 记 录 的 一 些 事 实 是 不 正 确 的 ; 第 四 种 常 见 的 错 误 类 型 是 模 糊 性 这 种 类 型 的 错 误 发 生 时, 导 致 一 些 需 求 有 多 种 含 义, 也 就 是 说, 他 们 的 解 释 是 不 唯 一 的 文 献 [27] 中 报 道 了 一 些 在 数 据 处 理 应 用 程 序 的 需 求 中, 检 测 需 求 错 误 的 方 法 和 工 具 的 效 率 平 均 下 来, 检 测 到 250 多 个 不 同 类 型 错 误, 错 误 类 型 百 分 比 是 : 遗 漏 不 正 确 的 事 实 不 一 致 模 糊 性 26% 10% 38% 26% 在 文 献 [5] 中 报 告 了 在 A 7 项 目 的 需 求 说 明 检 测 到 的 错 误 ( 处 理 实 时 飞 行 控 制 软 件 ),

58 一 共 检 测 出 约 80 个 错 误, 其 中 约 23% 是 由 文 员 造 成 的 错 误 类 型 的 分 布 为 : 遗 漏 不 正 确 的 事 实 不 一 致 模 糊 性 32% 49% 13% 5% 虽 然 在 这 两 个 案 例 中 错 误 分 布 有 点 不 同, 反 映 在 应 用 领 域 和 使 用 错 误 检 测 方 法 的 不 同, 他 们 暗 示 ( 除 了 笔 误 ) 主 要 问 题 是 遗 漏 不 正 确 事 实 上 不 一 致 不 明 确 如 果 把 两 个 数 据 表 平 均 一 下, 结 果 表 明, 所 有 四 类 型 的 错 误 是 非 常 显 著 的, 大 部 分 的 错 误 都 属 于 这 些 类 型 这 意 味 着, 除 了 改 善 SRS 本 身 ( 如 没 有 笔 误 ) 的 质 量, 验 证 应 集 中 在 揭 露 这 些 类 型 的 错 误 由 于 需 求 文 档 一 般 是 文 本, 是 不 能 被 执 行 的 文 件, 所 以 检 查 和 评 论 是 适 合 需 求 验 证 的 因 此,SRS 的 检 查 通 常 称 为 需 求 审 查, 这 是 最 常 见 的 验 证 方 法 由 于 需 求 规 格 正 式 指 定 的 东 西 原 本 存 在 于 人 们 的 头 脑 中, 所 以 需 求 验 证 必 须 包 括 客 户 和 用 户 因 此, 要 求 审 查 小 组 一 般 都 包 括 客 户 以 及 用 户 代 表 需 求 审 查 是 由 一 组 人 审 查, 找 出 错 误 和 指 出 问 题, 以 及 一 个 系 统 的 需 求 规 格 所 关 注 的 其 他 事 项 审 查 小 组 应 包 括 需 求 文 档 的 作 者, 以 及 了 解 客 户 需 求 的 人, 设 计 团 队 的 人, 负 责 维 护 需 求 文 档 的 人 包 括 那 些 与 产 品 开 发 没 有 直 接 关 系 的 人, 这 也 是 很 好 的 做 法, 如 一 个 软 件 质 量 工 程 师 虽 然 审 查 过 程 的 主 要 目 标 是 揭 示 文 档 中 的 任 何 错 误, 如 前 面 讨 论 的 那 样, 审 查 过 程 也 可 以 用 来 考 虑 诸 如 哪 些 影 响 可 测 性 和 可 读 性 的 因 素 在 审 查 过 程 中, 评 审 员 的 工 作 之 一 就 是 揭 露 错 误 的 要 求, 这 个 是 有 点 主 观 的, 难 以 界 定 的 测 试, 需 求 的 标 准 在 审 查 期 间, 审 查 小 组 必 须 浏 览 每 个 文 档, 如 果 有 任 何 错 误, 那 么 他 们 讨 论 并 在 处 理 错 误 上 达 成 一 致 可 以 使 用 一 详 细 的 检 查 过 程 ( 我 们 将 在 后 面 的 第 七 章 中 讨 论 这 样 的 过 程 ) 需 求 的 审 查 很 可 能 是 检 测 需 求 错 误 的 最 有 效 的 方 法 [5] 中 有 关 A - 7 项 目 的 数 据 显 示, 约 33% 需 求 错 误 是 由 审 查 过 程 中 发 现 的, 约 45% 的 需 求 错 误 是 当 需 求 文 档 用 来 作 为 设 计 依 据 时 被 发 现 的 这 显 然 表 明, 如 果 进 行 需 求 审 查, 不 仅 一 大 部 分 错 误 可 被 发 现, 而 且 余 下 的 绝 大 多 数 错 误 在 此 后 不 久 的 设 计 活 动 中 会 被 发 现 虽 然 需 求 审 查 仍 然 是 需 求 验 证 最 常 用 的 和 可 行 的 手 段, 但 是 采 用 一 些 建 模 和 分 析 特 定 目 的 的 工 具 的 可 能 性 正 在 增 加 例 如, 如 果 需 求 是 采 用 正 式 的 规 范 语 言 或 专 门 为 机 器 处 理 而 设 计 的 语 言, 那 么 它 就 有 可 能 有 一 些 工 具 来 验 证 文 档 的 一 些 属 性 这 些 工 具 将 着 重 于 内 部 一 致 性 和 完 整 性 检 查, 有 时 也 会 有 外 部 完 整 性 检 查 但 是, 这 些 工 具 不 能 直 接 用 于 外 部 完 整 性 检 查 ( 毕 竟, 工 具 怎 么 会 知 道 一 些 需 求 已 完 全 遗 漏?) 出 于 这 个 原 因, 即 便 是 需 求 通 过 指 定 一 个 工 具 来 检 查, 需 求 审 查 还 是 需 要 的

59 3.7 小 结 - 需 求 过 程 的 主 要 目 标 是 生 成 软 件 的 需 求 规 格 (SRS), 它 准 确 地 捕 捉 客 户 的 需 求 并 形 成 了 软 件 开 发 和 验 证 的 基 础 - 在 需 求 处 理 过 程 中 有 三 种 基 本 活 动 问 题 分 析, 规 格 和 验 证 分 析 的 目 的 是 了 解 问 题 的 不 同 方 面, 它 的 上 下 文 以 及 它 如 何 适 应 客 户 端 的 组 织 需 求 规 格 是 对 已 经 理 解 的 问 题 以 书 面 形 式 表 达 出 来, 并 生 成 SRS 需 求 验 证 是 为 了 确 保 在 SRS 中 规 定 的 需 求 是 正 确 的, 并 且 是 所 需 要 的 - 一 个 SRS 的 关 键 特 点 是 : 正 确 性 完 整 性 一 致 性 无 二 义 性 可 验 证 性 及 根 据 重 要 性 分 级 - 一 个 好 SRS 应 明 确 软 件 需 要 支 持 的 所 有 功 能 性 能 要 求 存 在 的 设 计 约 束 和 所 有 的 外 部 接 口 - 用 例 是 一 个 用 于 明 确 功 能 需 求 的 流 行 方 法 - 每 个 用 例 明 确 了 与 主 系 统 的 交 互, 这 个 过 程 是 通 过 一 个 主 要 角 色, 它 为 了 达 到 一 些 目 的 使 用 用 例 - 一 个 用 例 有 一 个 前 提, 一 个 正 常 的 情 况, 以 及 许 多 异 常 情 景, 从 而 提 供 完 整 的 系 统 行 为 - 对 构 建 的 用 例, 首 先 角 色 和 目 标 必 须 确 定, 然 后 主 要 的 成 功 情 景 失 败 情 景 最 后 是 失 败 处 理 - 通 过 数 据 流 图, 从 一 个 系 统 的 角 度 分 析 数 据 是 如 何 通 过 系 统 的 在 处 理 过 程 中 一 个 DFD 包 括 处 理 过 程, 数 据 流 程 - 遗 漏 不 正 确 的 事 实 不 一 致 模 糊 性 是 SRS 中 最 常 见 的 错 误 为 了 验 证, 最 常 用 的 方 法 是 组 成 一 个 有 结 构 的 小 组 审 查 需 求 文 档 自 测 练 习 1. 需 求 活 动 的 基 本 要 求 目 标 是 获 得 一 个 SRS, 它 具 有 一 些 我 们 想 要 的 特 性 在 建 模 过 程 中,SRS 扮 演 什 么 角 色? 2. 一 个 SRS 有 哪 些 主 要 组 成 部 分? 评 价 一 个 SRS 质 量 的 主 要 标 准 是 什 么? 3. 需 求 中 的 主 要 错 误 类 型 是 什 么? 4. 你 选 择 一 个 在 线 社 交 网 站 列 出 该 系 统 的 主 要 用 例 以 及 目 标 先 决 条 件 和 异 常 情 景 5. 做 同 样 练 习, 做 一 个 会 议 管 理 网 站, 它 可 让 作 者 们 提 交 论 文 ; 程 序 委 员 会 主 席 为 论 文 指 定 评 审 人, 并 根 据 评 审 选 择 论 文 ; 评 审 人 进 入 网 站 进 行 审 查 6. 你 认 为 需 求 审 查 小 组 应 该 包 括 哪 些 人?

60 第 四 章 软 件 计 划 软 件 计 划 是 最 重 要 的 项 目 管 理 活 动 它 有 两 个 基 本 目 标, 为 项 目 建 立 合 理 的 成 本, 进 度 和 质 量 目 标 ; 制 订 一 项 计 划 以 实 现 这 些 目 标, 一 个 项 目 符 合 其 成 本 进 度 和 质 量 目 标 才 算 是 成 功 的 没 有 项 目 的 相 应 目 标, 就 无 法 判 断 一 个 项 目 是 否 成 功 如 果 没 有 详 细 计 划, 也 无 法 真 正 的 监 督 或 控 制 项 目 很 多 情 况 下, 许 多 项 目 并 没 有 精 心 认 真 制 定 计 划, 就 急 于 实 现 这 会 导 致 在 项 目 后 期, 任 何 技 术 的 努 力 都 无 法 补 偿, 因 缺 少 详 细 的 计 划 而 带 来 的 损 失, 缺 乏 适 当 的 计 划 无 疑 是 导 致 大 型 软 件 项 目 失 败 的 原 因 之 一 出 于 这 个 原 因, 我 们 把 项 目 的 计 划 作 为 一 个 独 立 章 请 注 意, 我 们 把 项 目 管 理 过 程 的 监 控 阶 段 作 为 计 划 的 一 部 分, 同 时 把 如 何 监 控 项 目 也 作 为 计 划 编 制 阶 段 的 一 部 分 计 划 活 动 的 输 入 是 需 求 规 格 以 及 系 统 结 构 描 述 虽 然 制 定 项 目 计 划 并 不 需 要 非 常 详 细 的 需 求 规 格 书, 但 对 于 一 个 好 的 项 目 计 划 来 说, 必 须 知 道 所 有 重 要 的 需 求, 最 好 能 有 关 键 架 构 的 描 述 计 划 活 动 通 常 有 两 种 主 要 的 输 出 : 一 个 是 总 体 项 目 管 理 计 划 的 文 档, 确 定 成 本 进 度 和 质 量 等 方 面 的 项 目 目 标, 并 确 定 风 险 管 理 的 计 划 监 测 项 目 等 ; 另 外 一 个 是 详 细 的 实 施 计 划, 通 常 指 项 目 详 细 进 度, 描 述 为 了 达 到 目 标 必 须 完 成 的 任 务, 实 施 任 务 的 人 员 安 排 和 进 度 详 细 计 划 在 总 体 计 划 的 指 导 下 完 成, 它 将 成 为 执 行 项 目 监 控 的 主 要 指 导 文 档 本 章 中, 将 讨 论 - 如 何 估 算 实 现 项 目 目 标 和 里 程 碑 的 工 作 量 和 时 间 表, 并 确 定 执 行 项 目 所 需 团 队 的 规 模 - 如 何 建 立 项 目 质 量 目 标 并 准 备 质 量 计 划 - 如 何 确 认 可 能 威 胁 到 项 目 成 功 的 高 优 先 级 的 风 险, 制 定 化 解 风 险 的 计 划 - 如 何 使 用 量 化 方 法 制 定 项 目 的 监 控 计 划, 以 检 查 项 目 是 否 在 按 照 预 期 的 计 划 进 行 - 如 何 从 整 体 的 估 计 制 定 详 细 的 任 务 日 程 表, 以 及 其 他 的 计 划 任 务 如 果 这 些 任 务 能 够 完 成, 将 会 实 现 该 项 目 的 总 体 目 标

61 4.1 工 作 量 估 算 对 于 一 个 软 件 开 发 项 目, 整 体 工 作 量 与 进 度 估 算 是 项 目 计 划 的 重 要 先 决 条 件 在 项 目 开 发 之 前 就 需 要 这 些 估 算, 因 为 它 们 确 定 了 项 目 的 成 本 和 进 度 目 标 没 有 这 些 估 算, 一 些 问 题 甚 至 非 常 简 单 的 问 题 都 无 法 回 答, 如 项 目 是 否 滞 后 了? 有 没 有 超 支? 以 及 项 目 什 么 时 候 才 可 能 完 成? 这 些 估 算 一 个 更 实 际 的 用 途 是 用 于 软 件 项 目 招 标, 作 为 开 发 合 同 的 一 部 分, 成 本 和 进 度 估 算 必 须 交 付 给 潜 在 的 客 户 ( 因 为 软 件 开 发 的 大 部 分 费 用 是 劳 务 费, 因 此 通 过 恰 当 的 估 算 每 人 每 月 的 费 用, 就 可 以 很 容 易 的 确 定 总 体 成 本 ) 在 项 目 的 不 同 阶 段, 确 定 人 员 的 安 排, 详 细 计 划 的 制 定 以 及 项 目 监 控 都 需 要 工 作 量 和 进 度 的 估 算 工 作 量 估 算 的 准 确 性 取 决 于 可 获 得 的 项 目 信 息 量 的 水 平, 信 息 越 详 细, 估 算 越 准 确 当 然, 即 使 获 得 了 所 有 的 信 息, 估 算 的 精 确 度 还 取 决 于 估 算 程 序 或 者 模 型 的 有 效 性 精 确 性 如 果 按 照 需 求 规 格 书, 在 三 分 之 二 的 实 际 工 作 量 情 况 下, 其 估 算 误 差 在 20% 范 围 以 内, 那 么 该 估 算 方 法 可 以 认 为 是 良 好 的 下 面 我 们 讨 论 两 种 常 用 的 方 法 自 顶 向 下 估 算 方 法 虽 然 一 个 项 目 的 工 作 量 是 一 个 多 参 数 的 函 数, 但 一 般 一 致 认 为, 决 定 工 作 量 的 首 要 因 素 是 项 目 的 规 模 也 就 是 说, 项 目 越 大, 工 作 量 越 大 自 顶 向 下 方 法 利 用 这 一 特 征, 并 认 为 工 作 量 是 项 目 大 小 的 函 数 请 注 意, 要 使 用 这 种 方 法, 首 先 需 要 确 定 函 数 的 性 质, 然 后 应 用 该 函 数 估 算 项 目 的 大 小 如 果 已 知 类 似 项 目 的 生 产 率, 那 么 可 以 用 它 作 为 估 计 函 数, 并 通 过 大 小 来 确 定 工 作 量 如 果 生 产 率 为 KLOC /PM, 则 该 项 目 工 作 量 的 估 算 值 是 SIZE/ P 每 人 月 请 注 意, 生 产 率 本 身 也 取 决 于 项 目 规 模 的 大 小 ( 较 大 的 项 目 的 生 产 率 往 往 较 低 ), 只 有 当 项 目 的 规 模 和 类 型 相 似 的 情 况 下, 这 种 方 法 才 适 用 ( 在 新 项 目 中, 类 似 的 生 产 率 可 以 通 过 以 往 项 目 中 使 用 过 的 方 法 获 得 ) 一 个 经 常 使 用 的 确 定 工 作 量 的 一 般 函 数 形 式 为 : EFFORT = a SIZE b, 其 中 a 和 b 是 常 数 [2], 项 目 规 模 的 计 量 单 位 一 般 使 用 KLOC( 也 可 以 使 用 叫 做 功 能 点 的 计 量 单 位, 它 可 以 从 需 求 中 确 定 ) 一 个 企 业 可 以 通 过 对 已 完 成 项 目 的 数 据 进 行 回 归 分 析 来 确 定 公 式 中 常 量 的 值, 这 与 过 去 执 行 的 项 目 所 应 用 的 数 据 有 关 例 如,Watson 和 Felix[81] 分 析 了 IBM 联 邦 系 统 部 门 完 成 的 60 多 个 项 目 的 数 据, 这 些 项 目 交 付 的 源 代 码 大 小 从 4000 到 467,000 行 不 等 他 们 发 现, 如 果 用 千 行 源 代 码 (KLOC) 作 为 规 模 大 小 的 单 位, 那 么 以 人 月 (PM)

62 为 单 位 的 总 工 作 量 E 可 以 通 过 公 式 E=5.2(SIZE) 0.91 来 计 算 在 建 设 性 成 本 模 型 (COCOMO) [12,13] 中, 一 个 基 本 项 目 的 初 步 估 算 方 程 ( 也 称 为 名 义 估 算 ) 为 E = 3.9(SIZE) 0.91 虽 然 规 模 大 小 是 影 响 成 本 的 主 要 因 素, 其 他 因 素 也 有 一 些 影 响 在 COCOMO 模 型 中, 确 定 初 步 估 算 后, 将 结 合 其 他 一 些 因 素 以 获 得 最 后 的 估 算 为 做 到 这 一 点,COCOMO 模 型 采 用 了 15 个 不 同 的 项 目 属 性 值, 称 为 成 本 动 因 属 性 这 些 属 性 的 例 子 有 所 需 的 软 件 可 靠 性 产 品 复 杂 性 分 析 师 的 能 力 应 用 经 验 对 现 代 工 具 的 使 用 以 及 所 需 的 开 发 进 度 表 等 每 个 成 本 来 源 有 一 个 排 序 等 级, 每 种 排 序 等 级 都 有 相 应 的 权 重 因 子 例 如, 对 于 可 靠 性, 排 序 等 级 包 括 非 常 低 低 普 通 高 和 非 常 高, 这 些 等 级 的 权 重 因 子 分 别 是 0.75,0.88,1.00,1.15, 和 1.40 因 此, 如 果 项 目 的 可 靠 性 需 求 被 判 定 为 低, 则 权 重 因 子 是 0.88, 而 如 果 它 被 认 为 是 非 常 高 的, 因 子 为 1.40 不 同 排 序 属 性 及 其 权 重 因 子 见 表 4.1 [12,13] 表 4.1: 不 同 的 成 本 因 素 权 值 所 有 15 个 成 本 因 素 权 重 因 子 的 乘 积 就 是 工 作 量 调 整 因 子 (EAF), 将 初 始 估 算 乘 以 EAF 就 会 得 到 最 后 的 工 作 量 估 算 值 E 换 句 话 说, 使 用 15 种 不 同 因 素 的 排 序 权 重 对 基 于 规 模 估 算 值 进 行 调 整 作 为 一 个 例 子, 考 虑 开 发 在 大 学 校 园 拍 卖 系 统 ( 一 些 用 例 在 以 前 的 章 节 中 讨 论 过 ), 从 用 例 和 其 他 的 要 求 中 可 以 确 定 该 系 统 是 由 几 个 不 同 的 模 块 组 成 这 些 模 块 及 其 预 期 大 小 为 :

63 Login 登 录 200 LOC Payment 支 付 200 LOC Administrator interface 管 理 员 界 面 600 LOC Seller functions 卖 家 功 能 200 LOC Buyer functions 买 家 功 能 500 LOC View and bookkeeping 浏 览 与 预 定 300 LOC TOTAL 总 规 模 2000 LOC 这 个 软 件 的 总 体 规 模 大 小 估 计 为 2 KLOC 如 果 想 使 用 COCOMO 模 型 估 算, 则 应 该 估 计 不 同 的 成 本 因 素 的 值 假 设 我 们 预 期 该 系 统 的 复 杂 性 高, 程 序 员 编 程 能 力 低, 以 及 团 队 的 应 用 经 验 低 所 有 其 他 因 素 的 等 级 都 是 普 通 基 于 上 述 假 设, 工 作 量 调 整 因 子 (EAF) 是 EAF= = 1.52 该 项 目 的 工 作 量 初 步 估 算 值 可 以 通 过 相 关 的 方 程 得 到, 则 有 E i = = 7.3PM 使 用 EAF, 调 整 后 的 工 作 量 估 算 值 为 E = = 11.1PM 利 用 总 体 估 算, 也 可 以 获 得 项 目 不 同 阶 段 的 工 作 量 估 算 这 通 常 是 通 过 各 阶 段 的 工 作 量 分 配 来 实 现 不 同 类 型 的 项 目 和 规 模, 各 阶 段 工 作 量 的 比 例 也 不 尽 相 同, 具 体 值 可 以 通 过 以 往 类 似 项 目 中 的 数 据 获 得 不 同 阶 段 工 作 量 的 一 般 分 配 已 在 前 面 的 章 节 中 讨 论 过, 表 4.2 给 出 了 COCOMO 推 荐 的 软 件 系 统 工 作 量 分 配 比 例 表 4.2: Phasewise 工 作 量 分 配 阶 段 规 模 小 型 中 等 中 等 大 型 2 KLOC 8 KLOC 32 KLOC 128 KLOC 产 品 设 计 详 细 设 计 编 码 和 单 元 测 试 集 成 和 测 试 应 当 指 出 的 是 在 使 用 自 上 而 下 方 法 估 算 时, 尽 管 有 一 个 合 适 的 函 数, 仍 需 要 估 算 项 目 的 规 模 换 言 之, 我 们 将 工 作 量 的 估 算 转 化 为 项 目 规 模 的 估 算, 有 人 可 能 会 问, 为 什 么 不 直 接 对 工 作 量 进 行 估 算? 答 案 是 规 模 估 计 通 常 比 工 作 量 估 算 更 容 易 这 主 要 是 因 为 通 过 估 算 系 统

64 各 部 分 的 规 模 ( 通 常 是 容 易 做 到 ), 计 算 其 和 就 可 以 获 得 整 个 系 统 的 规 模 工 作 量 的 估 算 并 不 具 备 类 似 的 性 质, 因 为 开 发 一 个 系 统 的 工 作 量 并 不 是 系 统 各 个 部 分 工 作 量 之 和 ( 如 整 合 以 及 使 用 开 发 好 的 部 件 构 建 系 统 等 工 作 需 要 额 外 的 工 作 量 ) 显 然, 为 了 高 效 的 利 用 自 顶 而 下 的 估 算 方 法, 较 好 获 取 软 件 规 模 的 估 算 值 是 至 关 重 要 的 目 前 没 有 一 个 相 对 简 单 的 方 法 以 准 确 的 估 算 软 件 规 模, 当 估 算 软 件 规 模 时, 最 好 的 方 式 是 尽 可 能 多 的 获 取 软 件 的 细 节, 并 且 在 估 计 不 同 部 分 的 规 模 时 对 偏 见 有 清 醒 的 认 识 通 过 获 得 的 细 节 并 利 用 它 们 对 规 模 的 估 算, 得 到 的 估 算 值 通 常 与 最 终 的 软 件 实 际 规 模 很 接 近 自 底 向 上 估 算 方 法 估 算 工 作 量 另 外 一 种 略 有 不 同 的 方 法 是 自 底 向 上 的 方 法 在 这 种 方 法 中, 项 目 首 先 划 分 为 不 同 的 任 务, 然 后 获 取 各 任 务 的 估 算 值 通 过 估 算 不 同 的 任 务 估 算 总 工 作 量 也 就 是 说, 项 目 的 总 体 估 算 来 自 它 的 各 部 分 的 估 算, 这 种 类 型 的 方 法 也 称 为 基 于 活 动 的 估 算 从 本 质 上 讲, 在 这 种 方 法 中, 项 目 的 规 模 和 复 杂 度 是 通 过 项 目 必 须 完 成 的 任 务 集 合 而 获 得 自 底 向 上 的 方 式 是 依 靠 对 工 作 量 的 直 接 估 算, 一 旦 项 目 被 划 分 成 更 小 的 任 务, 特 别 是 任 务 比 较 小 的 话, 就 可 以 直 接 估 算 它 所 需 要 的 工 作 量 这 种 方 法 的 困 难 之 一 是 为 了 获 取 整 体 的 估 算, 所 有 的 任 务 都 必 须 枚 举, 自 底 向 上 方 法 的 一 个 风 险 是 可 能 会 忽 略 一 些 活 动 此 外, 直 接 对 贯 穿 整 个 项 目 的 工 作 任 务 的 直 接 估 算 是 很 困 难 的, 如 项 目 管 理 如 果 已 开 发 建 成 系 统 架 构, 并 且 已 经 知 道 在 不 同 阶 段 分 配 工 作 量 的 信 息, 那 么 自 底 向 上 的 方 法 不 必 完 全 列 出 所 有 的 任 务, 使 这 种 方 法 变 得 不 那 么 繁 琐 这 里, 我 们 描 述 一 个 在 商 业 公 司 中 使 用 的 做 法 [58] 在 这 种 方 法 中, 首 先 确 定 待 开 发 软 件 的 主 要 程 序 ( 单 元 或 模 块 ), 然 后 将 每 个 程 序 单 元 根 据 某 种 标 准 按 照 简 单 中 等 或 复 杂 进 行 分 类 对 每 一 类 单 元, 确 定 它 的 编 码 ( 含 单 元 测 试 ) 的 平 均 工 作 量 编 码 的 平 均 工 作 量 的 估 算 可 以 根 据 过 去 的 类 似 项 目 的 数 据 一 些 指 导 原 则 或 个 人 的 经 验 一 旦 知 道 了 三 类 不 同 复 杂 度 的 单 元 数 量, 确 定 了 每 个 程 序 的 编 码 工 作 量 估 算 值, 就 可 以 得 到 整 体 的 编 码 工 作 量 根 据 总 体 编 码 工 作 量, 通 过 百 分 比 来 确 定 其 他 阶 段 和 任 务 的 工 作 量 为 此, 利 用 过 去 的 过 程 实 施 信 息, 可 以 确 定 项 目 不 同 阶 段 的 可 能 工 作 量 分 配 基 于 编 码 工 作 量 的 估 算, 该 分 配 可 以 用 于 确 定 其 他 阶 段 和 活 动 的 工 作 量, 并 从 编 码 工 作 量 估 计 活 动 通 过 这 些 估 算, 就 可 以 获 取 该 项 目 的 总 工 作 量 这 种 方 法 依 靠 对 经 验 和 数 据 的 合 理 结 合, 如 果 没 有 合 适 的 先 验 数 据 ( 例 如, 启 动 一 种 新

65 型 项 目 ), 在 不 同 类 型 单 元 的 性 质 被 详 细 说 明 之 后, 也 可 以 依 靠 经 验 估 算 编 码 工 作 量 有 了 这 个 估 计, 就 可 以 通 过 合 理 的 或 标 准 的 工 作 量 分 配 得 到 其 他 活 动 的 估 算 这 个 策 略 可 以 很 容 易 地 估 算 那 些 早 期 无 法 枚 举, 但 又 确 实 消 耗 工 作 量 的 活 动 该 估 算 的 过 程 可 概 括 为 以 下 步 骤 : 1. 识 别 系 统 的 模 块 并 把 它 们 归 类 为 简 单 中 等 或 复 杂 2. 确 定 简 单 / 中 等 / 复 杂 模 块 的 平 均 编 码 工 作 量 3. 使 用 不 同 类 型 模 块 的 编 码 工 作 量 和 模 块 数 量 获 得 总 编 码 工 作 量 4. 使 用 类 似 项 目 的 工 作 量 分 配, 估 算 其 他 任 务 和 总 体 的 工 作 量 5. 基 于 项 目 具 体 因 素 精 化 估 算 过 程 此 过 程 需 要 合 理 的 结 合 现 有 数 据 ( 以 工 作 量 分 配 的 形 式 ) 和 程 序 员 的 经 验, 这 种 方 法 比 较 简 单, 与 我 们 当 中 大 部 分 人 做 过 的 项 目 规 划 类 似 因 此, 对 于 小 的 项 目, 许 多 人 感 到 这 种 方 法 自 然 和 贴 切 注 意 这 种 方 法 将 程 序 划 分 为 几 个 不 同 的 类 别, 每 种 类 别 有 一 个 平 均 编 码 工 作 量, 它 仅 仅 适 用 于 工 作 量 的 估 算 在 详 细 日 程 安 排 中, 当 一 个 项 目 经 理 将 各 个 单 元 分 配 给 团 队 的 成 员 并 且 估 算 每 项 任 务 的 工 作 时 间 时, 需 要 考 虑 单 元 的 实 际 特 点 以 增 减 调 整 平 均 工 作 时 间 4.2 项 目 进 度 和 人 员 配 备 经 过 前 面 为 工 作 量 建 立 一 个 目 标 后, 需 要 建 立 目 标 的 交 付 时 间 表 利 用 工 作 量 的 估 算 ( 按 人 / 每 月 ), 选 择 任 何 方 便 的 项 目 工 期, 调 整 团 队 规 模, 确 保 总 体 工 作 量 符 合 估 算 是 一 个 诱 人 的 想 法 然 而, 众 所 周 知, 现 在 的 人 和 月 在 一 个 软 件 项 目 中 是 不 可 完 全 互 换 的, 只 有 当 项 目 中 所 有 的 任 务 可 以 并 行 执 行, 并 且 开 发 人 员 之 间 不 需 要 沟 通 时, 人 与 月 才 可 任 意 互 换 但 软 件 项 目 中 的 实 际 情 况 并 非 如 此, 因 为 不 同 任 务 间 有 依 赖 关 系 ( 如 测 试 只 有 在 编 码 完 成 后 才 能 进 行 ), 执 行 某 种 任 务 的 人 员 需 要 和 执 行 其 他 任 务 的 人 员 沟 通 正 如 Brooks 所 指 出 [16],... 人 和 月 的 可 互 换 性 只 适 合 人 员 之 间 不 需 要 沟 通 的 活 动, 如 播 种, 收 割 小 麦 或 棉 花 这 种 情 况 对 于 软 件 是 不 成 立 的, 甚 至 不 具 备 一 点 相 似 性... 但 是, 对 于 一 个 估 算 过 工 作 量 的 项 目, 需 要 多 个 日 程 安 排 ( 或 项 目 期 限 ) 确 实 是 可 能 的 例 如, 对 于 一 个 项 目, 其 工 作 量 估 计 是 56 个 人 月,7 个 人 安 排 8 个 月 是 合 适 的,8 个 人 7 个 月 的 安 排 也 是 合 适 的, 或 者 近 似 的 6 个 人 9 个 月 ( 但 1 个 人 56 个 月 是 不 可 能 的 同 样, 没 有 人 会 安 排 只 2 个 人 在 28 个 月 内 完 成 该 项 目 ) 换 言 之, 一 旦 工 作 量 是 固 定 的, 就 可 以 通 过 近 似 的 人 员 配 备 灵 活 的 安 排 项 目 日 程, 但 这 种 灵 活 性 并 非 是 无 限 制 的 经 验 数 据 也 表 明, 没 有 一 个 简 单 的 等 式 关 系 使 工 作 量 和 日 程 之 间 具 有 很 好 的 吻 合 度 [72]

66 最 终 目 的 是 确 定 一 个 可 以 实 现 的 合 理 的 时 间 表 ( 如 果 有 一 个 合 适 的 资 源 分 配 ) 一 种 确 定 整 体 进 度 的 方 法 是 将 进 度 作 为 工 作 量 的 函 数, 该 函 数 可 以 通 过 统 计 已 完 成 项 目 的 数 据 获 得 如 对 过 去 项 目 的 工 作 量 和 进 度 的 散 点 图 进 行 曲 线 拟 合, 这 条 曲 线 是 非 线 性 的, 因 为 一 般 的 时 间 进 度 并 不 随 着 工 作 量 线 性 增 长 许 多 模 型 采 用 了 这 种 方 法 [2,12] IBM 的 联 邦 系 统 部 门 发 现 若 总 工 期 为 M, 则 人 月 数 可 由 M = 4.1E 0.36 估 计 在 COCOMO 模 型 中, 简 单 软 件 的 进 度 方 程 是 人 月 数 M = 2.5E 0.38, 因 为 进 度 不 仅 仅 是 工 作 量 的 函 数, 以 这 种 方 式 确 定 的 日 程 表 基 本 上 是 一 个 指 导 大 纲 另 一 种 检 查 大 中 型 项 目 进 度 表 的 方 法 是 经 验 法, 称 为 平 方 根 检 查 [58] 该 检 查 方 法 表 明, 拟 议 的 进 度 时 间 可 以 设 定 在 以 人 月 为 单 位 的 总 工 作 量 的 平 方 根 附 近 如 果 给 这 个 项 目 分 配 了 合 适 的 资 源, 这 个 进 度 表 可 以 如 期 实 现 例 如, 如 果 总 工 作 量 估 计 为 50 人 月, 进 度 时 间 约 安 排 为 7 至 8 个 月 是 合 适 的 从 进 度 的 宏 观 估 计 出 发, 我 们 可 以 确 定 项 目 中 主 要 里 程 碑 的 进 度 表 为 了 确 定 里 程 碑, 必 须 先 了 解 在 项 目 中 经 常 发 生 的 人 力 资 源 的 上 升 或 下 降 曲 线 在 一 个 软 件 项 目 中 利 用 效 率 最 高 的 人 员 数 往 往 遵 循 Raylcigh 曲 线 [71,72] 也 就 是 说, 在 项 目 的 开 始 和 结 束, 项 目 需 要 的 人 数 比 较 少 ; 团 队 规 模 的 高 峰 (PTS) 出 现 在 项 目 中 期 附 近, 在 此 之 后 所 需 要 的 人 员 又 开 始 变 少 这 是 因 为 在 需 求 分 析 和 设 计 的 初 始 阶 段 只 需 要 利 用 少 数 的 人 员, 在 编 码 和 单 元 测 试, 系 统 测 试 和 集 成 期 间 是 人 力 资 源 的 需 求 高 峰, 随 后 人 员 需 求 变 少 通 常, 项 目 的 人 员 编 制 不 是 连 续 变 化 的, 而 是 使 用 近 似 于 Rayleigh 曲 线 来 表 示 : 在 开 始 阶 段 分 配 较 少 的 人, 在 编 码 阶 段 使 团 队 达 到 高 峰, 然 后 留 几 个 人 进 行 集 成 和 系 统 测 试 如 果 把 设 计 和 分 析, 开 发 和 测 试 视 为 三 个 主 要 阶 段, 典 型 的 项 目 人 力 资 源 分 布 曲 线 类 似 于 图 4.1 [58] 所 示 的 函 数 图 4.1 一 个 项 目 人 力 资 源 的 典 型 波 动

67 为 了 便 于 调 度, 特 别 是 对 于 较 小 的 项 目, 往 往 是 在 项 目 的 初 始 阶 段 就 同 时 分 配 了 所 需 的 所 有 人 员 这 种 方 法 可 能 导 致 一 些 人 在 开 始 和 结 束 阶 段 比 较 空 闲, 这 些 空 闲 时 间 通 常 用 于 项 目 的 辅 助 活 动, 如 培 训 和 编 写 文 档 在 估 算 了 一 个 阶 段 的 工 作 量 之 后, 如 果 我 们 知 道 了 人 力 资 源 曲 线 的 变 化, 就 可 以 确 定 这 个 阶 段 的 持 续 时 间 在 这 三 个 主 要 阶 段 中, 开 发 阶 段 所 消 耗 的 进 度 时 间 百 分 比 要 小 于 其 工 作 量 的 百 分 比, 因 为 这 个 阶 段 中 投 入 了 更 多 的 员 工 类 似 的, 设 计 和 测 试 阶 段 的 日 程 时 间 百 分 比 要 高 于 他 们 的 工 作 量 百 分 比 确 切 的 进 度 表 取 决 于 计 划 的 人 力 变 动, 以 及 在 项 目 的 一 个 阶 段 中 有 多 少 资 源 可 以 有 效 地 利 用 一 般 来 说, 设 计 阶 段 的 时 间 大 约 占 总 进 度 的 四 分 之 一, 开 发 阶 段 消 耗 约 一 半 的 时 间, 集 成 和 系 统 测 试 消 耗 剩 下 的 四 分 之 一 COCOMO 模 型 给 出 的 时 间 分 配 是 : 设 计 占 19% 编 程 ( 含 测 试 占 62% 整 合 约 为 18% 4.3 质 量 计 划 设 定 好 成 本 和 进 度 的 目 标 后, 需 要 定 义 项 目 的 第 三 个 重 要 目 标 质 量 然 而, 与 进 度 和 成 本 不 同 的 是, 为 一 个 项 目 设 定 量 化 的 质 量 目 标 并 做 规 划 以 实 现 该 目 标 比 前 两 者 难 多 了 对 于 成 本 和 进 度 目 标, 可 以 很 容 易 地 检 查 一 个 详 细 计 划 是 否 符 合 这 些 目 标 ( 例 如, 通 过 察 看 最 后 一 个 任 务 的 目 标 是 否 在 预 定 的 期 限 内 完 成, 所 有 任 务 的 成 本 的 总 和 是 否 少 于 总 成 本 ) 对 于 质 量, 即 使 我 们 设 定 关 于 预 期 交 付 方 面 的 缺 陷 密 度 的 目 标, 它 也 不 易 计 划 或 检 查 一 个 计 划 是 否 能 满 足 这 些 目 标 因 此, 通 常 情 况 下, 质 量 目 标 被 规 定 为 验 收 标 准 条 款, 最 后 交 付 的 软 件 应 该 适 用 于 验 收 标 准 中 的 所 有 的 情 况 和 测 试 案 例 此 外, 甚 至 可 能 有 一 个 关 于 缺 陷 数 目 ( 在 测 试 期 间 发 现 的 ) 的 标 准 条 款 例 如, 通 过 验 收 测 试 被 查 获 的 缺 陷 数 目 不 超 过 n 质 量 计 划 是 一 组 与 质 量 相 关 的 项 目 筹 划 要 做 的 活 动, 从 而 完 成 质 量 目 标 要 做 质 量 规 划, 先 必 须 了 解 注 入 缺 陷 和 循 环 清 除, 因 为 缺 陷 最 终 影 响 交 付 软 件 的 质 量 软 件 开 发 是 一 个 高 度 以 人 为 中 心 的 活 动, 因 此, 很 容 易 出 现 错 误 在 一 个 软 件 项 目 中, 软 件 以 无 缺 陷 启 动 ( 软 件 没 有 缺 陷 ), 在 构 建 的 软 件 的 不 同 阶 段, 缺 陷 被 注 入 也 就 是 说, 在 从 用 户 需 求 到 ( 满 足 这 些 需 求 的 ) 软 件 的 转 换 过 程 中, 注 入 缺 陷 注 入 错 误 的 阶 段 主 要 是 需 求 分 析 概 要 设 计 详 细 设 计 和 编 码 为 了 确 保 交 付 高 质 量 的 软 件, 这 些 缺 陷 通 过 质 量 控 制 QC(Quality Control) 活 动 发 现 并 删 除 删 除 缺 陷 的 QC 活 动 包 括 需 求 评 审 设 计 审 查 代 码 审 查 单 元 测 试 集 成 测 试 系 统 测 试 验 收 测 试 等, 图 4.2 展 示 了 缺 陷 的 注 入 和 删 除 过 程

68 缺 陷 注 入 开 发 过 程 需 求 分 析 R 设 计 R 编 码 R UT IT/ST AT R- 消 除 UT- 单 元 测 试 IT- 集 成 测 试 ST- 系 统 测 试 AT- 验 收 测 试 缺 陷 消 除 图 4.2 缺 陷 注 入 和 循 环 清 除 提 供 低 缺 陷 密 度 的 软 件 是 软 件 开 发 的 最 终 目 标, 确 保 软 件 质 量 围 绕 两 个 主 题 : 减 少 被 注 入 的 缺 陷, 并 增 加 缺 陷 的 删 除 首 先 通 常 是 按 照 标 准 方 法, 遵 循 良 好 的 工 作 流 程 等 来 实 施, 这 有 助 于 减 少 项 目 人 员 出 错 的 机 会 ( 对 于 缺 陷 预 防 有 具 体 的 技 术 ) 因 此, 质 量 计 划 的 重 点 主 要 是 为 消 除 缺 陷 规 划 合 适 的 质 量 控 制 活 动 审 查 和 测 试 是 两 个 在 项 目 中 最 常 使 用 的 质 量 控 制 活 动, 审 查 是 结 构 化 的 以 人 为 中 心 的 过 程 ; 测 试 是 一 个 软 件 ( 或 部 分 ) 的 执 行 过 程, 以 试 图 找 出 其 中 的 缺 陷 为 目 标 在 一 个 项 目 中, 最 常 用 的 质 量 策 划 方 法 是 指 定 质 量 控 制 活 动, 并 有 适 当 的 指 引 用 于 执 行 每 一 个 QC 任 务, 这 样 实 现 质 量 这 一 目 标 的 机 会 就 会 很 高 在 项 目 执 行 期 间, 这 些 活 动 按 照 规 定 的 程 序 开 展 当 使 用 这 种 方 式 确 保 质 量 时, 定 量 评 估 变 得 十 分 困 难 对 于 质 量 过 程 的 定 量 评 估, 指 标 为 基 础 的 分 析 是 必 要 的 然 而, 这 是 一 个 高 级 主 题, 超 越 本 书 ( 实 际 上 是 许 多 组 织 ) 的 范 围 因 此, 为 了 保 证 质 量, 主 要 依 赖 于 在 这 个 过 程 的 适 当 的 地 方 应 用 合 适 的 质 量 控 制 技 术, 依 据 经 验 确 保 有 足 够 的 质 量 控 制 活 动 来 完 成 这 个 项 目 因 此, 项 目 的 质 量 计 划 实 际 上 是 一 个 规 范, 规 定 哪 些 质 量 控 制 任 务 要 完 成, 及 何 时 完 成, 执 行 质 量 控 制 活 动 时 该 使 用 哪 些 过 程 和 规 则 如 何 选 择 取 决 于 项 目 的 目 标 性 质 和 限 制 通 常, 质 量 控 制 任 务 是 以 调 度 任 务 出 现 在 该 项 目 的 详 细 时 间 表 上 例 如, 它 会 指 定 什 么 文 件 将 被 检 查, 哪 一 部 分 代 码 被 检 查, 以 及 以 何 种 类 别 的 测 试 执 行 如 果 指 定 了 期 望 发 现 缺 陷 的 类 别 ( 预 计 可 被 不 同 的 质 量 控 制 任 务 发 现 ), 则 该 规 划 的 作 用 能 大 大 加 强, 这 些 可 以 随 着 项 目 的 进 展 帮 助 监 测 质 量

69 4.4 风 险 管 理 计 划 软 件 生 产 是 一 个 复 杂 的 工 程, 不 可 预 见 的 事 件 可 能 会 对 一 个 工 程 满 足 成 本 进 度 或 质 量 的 目 标 能 力 产 生 不 利 影 响 风 险 管 理 是 一 个 尽 量 减 少 由 意 外 事 件 造 成 失 败 机 会 的 尝 试, 风 险 管 理 的 目 标 不 是 避 免 工 程 陷 入 风 险, 而 是 最 小 化 工 程 风 险 的 影 响 风 险 是 一 个 概 率 事 件 可 能 发 生 也 可 能 不 发 生 因 此, 我 们 通 常 有 一 个 乐 观 的 倾 向, 简 单 的 无 视 风 险 或 者 希 望 它 们 不 会 发 生 社 会 和 组 织 因 素 也 可 能 轻 视 风 险 及 阻 碍 对 他 们 清 晰 地 认 识 这 种 态 度 可 能 在 风 险 出 现 时 使 工 程 陷 入 困 境, 风 险 很 有 可 能 发 生 在 一 个 大 型 软 件 工 程 中 那 么, 毫 不 奇 怪, 在 管 理 大 型 软 件 的 最 佳 实 践 中 风 险 管 理 会 被 最 先 考 虑 风 险 管 理 最 早 随 着 贝 姆 的 风 险 管 理 教 程 被 推 上 前 台 从 那 以 后, 出 现 了 几 本 针 对 软 件 风 险 管 理 的 书 籍 风 险 管 理 的 观 念 风 险 被 定 义 为 暴 发 伤 害 或 损 失 的 可 能 性 也 就 是 说, 风 险 暗 示 着 一 种 可 能 性, 即 消 极 的 事 情 可 能 会 发 生 在 软 件 项 目 中, 消 极 事 件 意 味 着 对 成 本 质 量 或 进 度 产 生 不 良 影 响 的 事 件 风 险 管 理 是 试 图 确 保 成 本 质 量 和 进 度 方 面 的 风 险 最 小 化 风 险 管 理 可 以 被 视 为 一 种 处 理 工 作, 处 理 不 常 见 或 很 少 预 期 发 生 的 事 件 发 生 率, 也 就 是 说, 它 们 是 概 率 事 件, 普 遍 预 期 的 事 件 ( 如 人 休 假 或 一 些 需 求 的 变 化 ) 由 正 常 的 项 目 管 理 处 理 因 此, 从 某 种 意 义 上 说, 风 险 管 理 开 始 于 正 常 项 目 管 理 结 束 后, 它 涉 及 的 事 件 是 很 少 发 生 的, 有 点 超 出 该 项 目 管 理 控 制, 而 且 能 够 对 该 项 目 产 生 重 大 影 响 的 事 件 大 多 数 项 目 都 有 风 险, 风 险 管 理 的 理 念 是 最 大 限 度 地 减 少 风 险 物 化 的 可 能 性, 或 尽 量 减 少 物 化 风 险 对 项 目 产 生 的 影 响 例 如, 当 建 造 建 筑 物, 就 存 在 因 地 震 倒 塌 的 风 险, 也 就 是 说, 地 震 发 生 的 可 能 性 就 是 一 种 风 险 如 果 建 筑 物 是 一 项 复 杂 的 大 型 住 宅, 那 么 地 震 物 化 的 情 况 导 致 的 潜 在 损 失 是 巨 大 的 这 种 风 险 可 以 通 过 将 建 筑 物 转 移 到 一 个 地 震 少 发 的 区 域 而 减 少 另 外, 如 果 不 能 接 受 转 移, 那 么 就 应 该 通 过 选 择 合 适 的 建 筑 方 法 合 适 的 结 构 使 得 这 个 风 险 的 发 生 对 建 筑 物 产 生 的 影 响 最 小 化 ( 日 本 和 加 利 福 尼 亚 州 就 是 采 用 这 种 方 法 ) 同 时, 如 果 是 建 造 一 个 小 垃 圾 场, 就 无 需 考 虑 这 些 了, 因 为 地 震 对 这 类 建 筑 物 所 产 生 的 财 产 损 失 及 其 他 方 面 的 影 响 是 如 此 之 低, 以 至 于 不 值 得 采 取 特 别 措 施 应 该 明 确 的 是, 风 险 管 理 是 处 理 可 能 发 生 的 不 良 事 件, 其 发 生 的 概 率, 及 其 实 际 发 生 后 带 来 的 损 失 一 旦 这 些 是 已 知 的, 就 可 以 制 定 战 略 减 少 风 险 发 生 的 可 能 性 或 减 少 风 险 物 化 带 来 的 影 响 因 此, 风 险 管 理 以 风 险 评 估 和 风 险 控 制 为 中 心

70 4.4.2 风 险 评 估 风 险 评 估 的 目 标 是 优 先 考 虑 风 险, 使 注 意 力 和 资 源 可 以 集 中 在 风 险 较 高 的 项 目 上 风 险 识 别 是 风 险 评 估 的 第 一 步, 它 确 定 了 一 个 特 定 的 项 目 的 所 有 不 同 的 风 险 这 些 风 险 是 项 目 依 赖 的, 设 想 它 们 在 哪 些 工 作 方 面 可 能 出 错 可 以 帮 助 风 险 识 别 的 方 法 包 括 可 能 的 风 险 清 单 调 查 会 议 和 集 思 广 益 审 核 计 划 过 程 和 工 作 产 品 [45] 频 繁 发 生 的 风 险 清 单 可 能 是 最 常 用 的 风 险 识 别 工 具, 大 多 数 组 织 从 以 往 项 目 的 调 查 中 为 项 目 编 制 经 常 可 能 发 生 的 风 险, 这 样 的 清 单 构 成 了 当 前 项 目 风 险 识 别 的 起 点 在 调 查 了 经 验 丰 富 的 项 目 经 理 的 基 础 上,Boehm [11] 提 出 了 一 个 十 大 可 能 损 害 软 件 项 目 成 功 的 风 险 清 单 图 4.3 列 出 了 这 些 风 险 及 管 理 层 首 选 的 用 于 处 理 这 些 风 险 的 技 术, 商 业 软 件 组 织 中 的 顶 级 风 险 可 以 在 [58] 中 找 到 图 4.3 最 高 风 险 项 及 对 应 的 处 理 技 术 排 名 第 一 的 风 险 项 是 人 才 短 缺, 这 涉 及 到 人 员 数 量 不 能 满 足 需 要 或 没 有 特 殊 技 能 的 人 员 ( 项 目 可 能 需 要 ) 有 几 种 方 法 可 以 克 服 这 个 风 险, 比 如 通 过 得 到 一 些 可 能 的 顶 尖 人 才 以 满 足 项 目 对 人 才 的 需 求 ; 适 当 的 培 训 为 项 目 的 关 键 领 域 配 备 关 键 人 员, 这 也 可 以 减 少 这 种 风 险 排 名 第 二 的 风 险 项 是 不 切 实 际 的 时 间 表 和 预 算, 由 于 业 务 等 原 因 它 经 常 会 发 生 通 常 高 层 次 管 理 为 一 个 软 件 项 目 规 定 的 时 间 表 不 是 以 该 项 目 的 特 征 为 基 础, 也 是 不 切 实 际 的 由 于

71 缺 乏 经 验 或 乐 观, 也 可 能 导 致 低 估 的 发 生 接 下 来 的 几 个 风 险 项 是 与 需 求 相 关 的, 如 果 需 求 分 析 没 有 做 好 或 开 发 工 作 开 始 的 太 早, 项 目 会 蕴 含 开 发 错 误 软 件 的 风 险 同 样 的, 通 常 可 能 会 开 发 出 不 正 确 的 用 户 界 面 这 导 致 后 期 需 要 对 用 户 界 面 做 大 量 的 返 工, 或 由 于 用 户 不 愿 意 使 用 而 导 致 得 不 到 软 件 的 利 益 镀 金 是 指 在 软 件 中 添 加 一 些 用 处 不 大 的 功 能, 这 增 加 了 不 必 要 的 风 险, 因 为 镀 金 消 耗 了 资 源 和 时 间 而 得 不 到 回 报 风 险 识 别 只 是 标 识 在 项 目 期 间 可 能 发 生 的 不 良 事 件, 即 枚 举 可 能 发 生 的 意 外 事 件 它 没 有 具 体 说 明 这 些 风 险 物 化 的 可 能 性, 也 没 有 说 明 风 险 物 化 后 对 项 目 的 影 响 因 此, 接 下 来 的 任 务 是 风 险 分 析 和 优 先 次 序 在 风 险 分 析 中, 必 须 估 计 风 险 发 生 的 概 率 及 风 险 发 生 后 将 导 致 的 损 失 这 通 常 是 通 过 讨 论, 利 用 经 验 和 了 解 的 情 况 来 完 成 的, 哪 怕 使 用 结 构 化 方 法 也 会 存 在 风 险 一 旦 不 同 风 险 的 物 化 可 能 性 和 损 失 分 析 完 后, 应 该 对 它 们 进 行 优 先 排 序 一 种 确 定 优 先 级 的 方 法 是 风 险 暴 露 概 念 RE(Risk Exposure)[11], 有 时 也 被 称 为 风 险 影 响 RE 的 定 义 是 : RE=Prob(UO)*Loss(UO) 其 中 Prob(UO) 是 物 化 风 险 的 概 率 ( 即 不 良 结 果 ),Loss(UO) 是 不 满 意 结 果 导 致 的 总 损 失 这 种 损 失 不 仅 包 括 可 能 发 生 的 直 接 经 济 损 失, 而 且 包 括 信 誉 未 来 业 务 财 产 或 生 命 等 多 方 面 的 损 失 RE 是 由 于 特 定 的 风 险 导 致 损 失 的 预 期 值, 如 果 用 RE 来 划 分 风 险 优 先 级, 则 RE 值 越 高, 风 险 项 的 优 先 级 越 高 风 险 控 制 风 险 管 理 的 主 要 目 的 是 确 定 前 几 名 的 风 险 项, 然 后 集 中 注 意 在 风 险 优 先 级 高 的 项 上 一 旦 项 目 经 理 确 定 并 排 定 风 险 的 优 先 级, 最 大 风 险 可 以 很 容 易 识 别 那 么 问 题 就 变 成 该 怎 么 处 理 风 险 只 有 当 你 能 准 备 一 个 计 划 处 理 风 险, 使 得 其 带 来 的 影 响 最 小 化 时, 知 道 风 险 才 是 有 价 值 的, 这 也 是 风 险 管 理 的 基 本 目 的 一 个 显 而 易 见 的 策 略 是 避 免 风 险, 这 需 要 采 取 相 应 的 活 动 以 完 全 避 免 风 险, 如 前 面 的 例 子, 将 一 个 建 筑 物 转 移 到 地 震 少 发 的 区 域 但 对 于 某 些 风 险, 避 免 是 不 可 能 的 对 于 大 多 数 的 风 险, 对 应 的 策 略 是 采 取 行 动 减 小 风 险 物 化 的 概 率 或 减 小 风 险 发 生 所 带 来 的 损 失, 这 些 被 称 为 风 险 缓 解 措 施 要 决 定 采 取 什 么 缓 解 步 骤, 一 个 常 用 的 各 种 风 险 缓 解 步 骤 清 单 是 非 常 有 用 的 对 于 图 4.3 中 提 到 的 风 险, 已 给 出 了 适 当 的 风 险 缓 解 步 骤 值 得 特 别 注 意 的 是 风 险 缓 解 与 风 险 评 估 ( 它 在 很 大 程 度 上 是 分 析 工 作 ), 风 险 缓 解 必 须 包 括 被 执 行 以 尽 量 减 少 风 险 带 来 影 响 的 积 极 的 措 施 换 言 之, 选 择 风 险 缓 解 步 骤 不 只 是 一 个

72 智 力 活 动, 而 且 必 须 执 行 风 险 缓 解 步 骤 ( 和 监 测 ), 为 确 保 正 确 执 行 所 需 的 行 动 必 须 纳 入 到 详 细 的 项 目 时 间 表 中 风 险 优 先 级 和 随 之 而 来 的 规 划 是 基 于 风 险 分 析 时 所 得 到 的 对 风 险 的 看 法, 由 于 风 险 是 频 繁 依 赖 于 外 部 因 素 的 概 率 事 件, 所 以 当 外 部 因 素 改 变 时, 风 险 导 致 的 威 胁 可 能 随 时 间 改 变 很 明 显, 对 风 险 的 看 法 也 可 能 随 着 时 间 的 推 移 而 改 变 此 外, 风 险 缓 解 步 骤 的 执 行 也 可 能 会 影 响 对 风 险 的 看 法 这 种 动 态 性 意 味 着 项 目 中 的 风 险 不 应 被 视 为 静 态 的, 必 须 定 期 进 行 监 测 和 重 新 评 估 因 此, 除 了 监 测 风 险 缓 解 措 施 的 进 展, 必 须 定 期 地 重 新 认 知 项 目 风 险 和 修 改 风 险 缓 解 计 划 如 果 需 要 的 话, 风 险 监 测 是 一 项 监 测 各 种 风 险 状 态 和 它 们 的 控 制 活 动 风 险 监 控 的 一 个 简 单 方 法 是 在 每 个 主 要 里 程 碑 重 新 分 析 风 险, 并 随 需 要 改 变 计 划 一 个 实 用 的 风 险 管 理 计 划 方 法 虽 然 风 险 概 念 的 内 涵 是 丰 富 的, 风 险 规 划 的 一 个 简 单 实 用 的 方 法 是, 简 单 地 归 类 风 险 和 分 层 次 的 风 险 影 响, 然 后 使 用 它 确 定 优 先 顺 序, 这 种 方 法 已 在 许 多 组 织 中 使 用 在 这 里, 我 们 讨 论 一 个 在 组 织 [58] 中 使 用 的 简 单 方 法 在 该 方 法 中, 风 险 发 生 的 概 率 被 归 类 为 低 中 高 三 级 风 险 影 响 也 可 以 分 为 低, 中, 高 三 类 有 了 这 些 分 类 与 级 别, 指 定 风 险 优 先 级 的 简 单 方 法 如 下 : 1. 对 每 一 个 风 险, 其 发 生 概 率 可 以 分 为 低, 中, 高 三 个 级 别 2. 对 每 一 个 风 险, 对 其 影 响 的 评 估 可 分 为 低, 中, 高 三 种 级 别 3. 按 风 险 发 生 的 概 率 和 其 对 项 目 产 生 的 影 响, 归 类 风 险 例 如, 一 个 高 概 率 高 影 响 的 风 险 项 的 级 别 高 于 一 个 具 有 中 等 概 率 和 高 影 响 的 风 险 项 在 发 生 冲 突 时, 使 用 其 进 行 判 断 4. 选 择 前 几 名 的 风 险 项 执 行 缓 解 措 施 和 跟 踪 这 种 方 法 的 一 个 例 子 在 表 4.3 中 给 出, 它 显 示 了 各 种 级 别 与 风 险 缓 解 步 骤 [58] 我 们 可 以 看 到, 风 险 管 理 计 划 ( 实 际 上 是 本 表 ) 可 以 很 简 短, 重 点 突 出 关 于 监 测 风 险, 一 个 办 法 是 在 里 程 碑 处 重 做 风 险 管 理 规 划, 对 项 目 计 划 中 列 出 的 风 险 给 予 更 多 的 关 注 在 里 程 碑 处 的 风 险 监 控 期 间, 可 能 会 出 现 重 新 排 列 优 先 秩 序 或 更 改 缓 解 计 划, 因 为 根 据 目 前 的 情 况 和 早 期 采 取 的 缓 解 措 施 所 发 挥 的 影 响, 该 项 目 的 其 余 部 分 可 能 会 改 变

73 1 表 4.3 项 目 风 险 管 理 计 划 风 险 问 题 影 响 经 验 值 缓 解 计 划 未 能 达 到 高 性 能 高 高 高 研 究 学 习 白 皮 书 和 性 能 指 导 方 针 培 训 团 队 的 技 能 更 新 审 核 报 告 以 查 看 性 能 缺 陷 在 系 统 测 试 时 测 试 性 能 的 应 用 2 缺 少 合 适 技 能 的 人 员 中 中 中 培 训 人 员 同 顾 客 一 起 检 查 原 型 开 发 代 码 实 例 3 复 杂 的 应 用 程 序 中 中 中 确 保 不 间 断 地 转 换 知 识 开 发 人 员 在 某 一 领 域 具 有 充 足 的 经 验 4 人 力 资 本 中 中 中 培 训 一 个 四 人 组 的 核 心 团 队 任 务 轮 流 分 配 给 不 同 的 人 备 份 每 个 关 键 任 务 5 不 清 楚 需 求 中 中 中 检 查 原 型 实 施 中 期 检 查 4.5 项 目 监 测 计 划 项 目 管 理 规 划 就 是 一 个 能 够 指 导 项 目 开 发 的 文 档 即 使 一 个 很 好 的 计 划, 如 果 没 有 恰 当 的 执 行, 那 也 是 惘 然 的 规 划 也 不 能 很 好 的 引 导 出 恰 当 的 执 行 力, 除 非 规 划 伴 随 着 细 致 的 监 控 准 确 的 表 现 跟 踪 监 测 要 求 制 定 一 些 可 以 评 估 项 目 状 况 的 措 施, 如 果 这 些 措 施 用 在 项 目 实 施 过 程 中, 我 们 必 须 仔 细 考 虑, 评 估 的 是 什 么 什 么 时 候 去 评 估 以 及 如 何 去 评 估 因 此, 衡 量 标 准 的 规 划 是 项 目 规 划 的 关 键 元 素 此 外, 如 何 分 析 和 报 告 测 验 数 据 也 必 须 规 划 好, 以 免 出 现 收 集 到 的 数 据 却 不 知 道 如 何 使 用 这 些 数 据 的 情 况 没 有 仔 细 做 出 关 于 数 据 收 集 和 分 析 的 规 划, 那 么 衡 量 标 准 和 项 目 同 步 问 题 都 不 可 能 完 成 项 目 的 度 量 项 目 度 量 措 施 的 最 基 本 目 的 就 是 为 项 目 管 理 过 程 标 识 提 供 当 前 状 态 的 标 志 数 据, 由 此, 管 理 者 就 可 以 有 效 的 监 视 和 控 制 项 目, 并 且 确 保 项 目 能 够 达 到 预 期 的 目 标 一 个 项 目 的 目 标 主 要 涉 及 到 生 成 一 个 可 以 发 布 的 软 件, 预 算 时 间 进 度 和 质 量 监 视 工 程 的 状 态 规 模 功 能 进 度 以 及 健 壮 性 是 基 本 要 求 的 衡 量 标 准 进 度 是 最 重 要 的 一 个 元 素, 因 为 大 部 分 项 目 都 是 由 时 间 进 度 和 截 止 日 期 所 驱 动 只 有 通 过 监 视 具 体 的 进 度 表, 才 可 能 评 估 工 程 是 否 能 按 时 完 成 或 者 是 延 期 当 然, 这 个 过 程 还 是 比 较 容 易 控 制 的, 因 为 在 所 有 的 计 划 中 都 引 进 了 日 历 时 间 表 勤 奋 是 软 件 项 目 过 程 中 最 主 要 的 资 源 消 耗, 因 此, 在 监 测 期 间 伴 随 努 力 是 关 键 活 动,

74 评 估 工 程 的 实 施 过 程 是 否 超 出 预 算 是 很 有 必 要 的 为 得 到 有 效 数 据, 一 些 用 于 填 写 个 人 在 工 程 上 所 花 费 的 时 间 表 格 是 必 须 的 为 了 能 够 更 好 的 监 视 项 目 进 度, 不 同 任 务 的 物 力 应 当 分 别 记 录 一 般 而 言, 资 源 可 以 通 过 一 些 在 线 系 统 ( 如 [57] 中 给 出 的 每 周 活 动 报 告 ) 来 记 录, 这 样 就 可 以 记 录 个 人 活 动 的 时 间 消 耗 了, 因 此, 可 以 统 计 花 费 在 一 个 活 动 上 的 资 源 消 耗 因 为 缺 陷 对 软 件 的 质 量 有 直 接 关 系, 跟 踪 缺 陷 对 有 效 保 证 质 量 是 至 关 重 要 的, 一 个 大 型 的 软 件 项 目 也 许 包 括 被 不 同 的 人 和 时 间 段 发 现 的 成 千 上 万 个 缺 陷 为 了 能 够 发 现 缺 陷 并 且 解 决 问 题, 所 有 缺 陷 应 当 记 录 在 案 如 果 记 录 了 问 题, 监 视 过 程 就 可 以 关 注 目 前 有 多 少 个 问 题 被 发 现, 以 及 按 比 例 计 算 的 话, 还 有 多 少 的 隐 患 和 其 他 问 题, 问 题 的 跟 踪 被 认 为 是 工 程 管 理 中 最 好 的 实 践 规 模 是 另 一 个 基 本 的 测 量, 因 为 它 代 表 了 距 离 工 程 预 期 功 能 的 进 度 而 且, 许 多 数 据 是 以 规 模 规 格 化 的 ( 例 如, 缺 陷 密 度 ) 软 件 提 供 的 规 模 可 以 通 过 LOC( 该 值 可 以 由 正 式 的 编 辑 文 档 和 行 数 确 定 ) 度 量 或 者 功 能 点 来 度 量, 如 果 是 概 要 阶 段 的 话, 也 可 以 仅 通 过 模 块 数 和 特 征 数 量 描 述 就 足 够 了 为 了 能 够 有 效 的 监 控, 上 面 的 这 些 度 量 措 施 就 必 须 纳 入 到 项 目 的 规 划 中 通 常 情 况 下, 团 队 都 会 提 出 一 些 工 具 和 方 针 以 收 集 这 些 基 本 数 据, 这 就 使 项 目 管 理 人 员 能 够 有 效 的 监 控 工 程 进 度 项 目 监 测 和 跟 踪 工 程 管 理 者 监 测 项 目 的 主 要 目 标 就 是 掌 握 工 程 的 实 施 过 程, 因 此, 为 确 保 工 程 能 够 赶 上 预 期 目 标, 他 们 知 道 应 当 采 取 什 么 行 动 工 程 的 目 标 是 人 力 工 程 进 度 表 和 质 量, 因 此, 项 目 监 测 主 要 关 注 的 就 是 这 些 方 面 不 同 工 程 采 用 不 同 级 别 的 监 测 三 个 主 要 级 别 的 监 测 是 : 活 动 图 级 状 态 报 告 级 里 程 碑 分 析, 多 种 衡 量 措 施 都 可 运 用 到 项 目 监 测 中 活 动 图 级 监 测 确 保 每 一 个 详 细 时 间 进 度 表 上 的 活 动 都 在 规 定 的 时 间 内 完 成, 这 种 监 测 就 是 指 在 每 日 小 组 会 议 上 做, 或 由 项 目 管 理 者 查 阅 时 间 进 度 表, 检 查 安 排 的 当 日 任 务 完 成 情 况 完 成 了 的 任 务 经 常 在 详 细 时 间 进 度 表 中 记 为 100%, 如 同 微 软 的 Project 工 具, 用 来 跟 踪 整 个 项 目 或 更 高 级 别 的 任 务 完 成 的 百 分 比 这 种 监 测 是 确 保 该 项 目 继 续 按 计 划 安 排 进 行 状 态 报 告 用 于 确 定 一 周 发 生 了 什 么, 或 者 还 需 要 做 什 么 的 一 种 监 测 模 型 通 常 状 态 包 含 自 上 次 报 告 后 成 功 地 完 成 了 的 活 动 情 况 任 何 活 动 已 被 推 迟 该 项 目 需 要 注 意 的 问 题 以 及 下 周 所 要 做 的 所 有 工 作 同 样, 这 样 做 的 目 的 是 确 保 该 项 目 是 按 计 划 执 行 的 里 程 碑 分 析 是 在 每 个 里 程 碑 或 每 隔 几 个 星 期 做 一 次, 如 果 里 程 碑 节 点 太 远, 就 应 当 更

75 加 精 心 设 计 的 工 作 量 和 进 度 的 实 际 情 况 与 估 计 分 析 通 常 包 含 在 里 程 碑 分 析 中, 如 果 偏 差 明 显, 意 味 着 该 项 目 可 能 会 遇 到 麻 烦, 而 无 法 实 现 其 目 标 这 种 情 况 要 求 项 目 经 理 要 了 解 该 变 化 的 原 因, 如 果 有 必 要 的 话, 就 需 要 采 取 纠 正 和 预 防 措 施 也 需 要 报 告 按 不 同 质 量 控 制 任 务 所 发 现 的 缺 陷, 以 及 缺 陷 修 复 的 数 量 该 报 告 用 于 监 测 项 目 过 程 中 的 所 有 目 标 4.6 详 细 日 程 安 排 到 目 前 为 止, 所 讨 论 过 的 活 动 其 结 果 是 制 定 了 一 个 项 目 管 理 计 划 的 文 档, 为 工 作 量 进 度 和 质 量 建 立 了 项 目 目 标, 并 且 为 风 险 管 理, 确 保 质 量 和 监 测 工 程 定 义 了 方 法 现 在, 整 体 计 划 必 须 转 变 成 详 细 行 动 计 划, 并 在 项 目 中 执 行 这 个 计 划, 如 果 按 此 计 划 执 行 将 会 导 致 一 个 成 功 的 工 程 即, 我 们 需 要 制 定 做 什 么, 何 时 做 的 详 细 计 划 和 日 程 安 排 遵 照 这 个 计 划 将 会 得 到 预 期 质 量 成 本 和 日 程 安 排 不 超 过 预 期 的 软 件 然 而 整 体 计 划 文 档 通 常 在 工 程 的 开 始 时 准 备, 并 且 是 相 对 不 变 的 细 节 计 划 是 一 个 动 态 文 档, 它 反 映 的 是 当 前 工 程 的 计 划, 详 细 计 划 是 为 团 队 中 的 每 个 成 员 制 定 工 作 项 目 对 于 详 细 日 程 安 排, 通 常 由 于 工 作 量 和 进 度 估 计 确 定 主 要 阶 段, 并 以 层 次 化 方 法 划 分 成 小 的 进 度 活 动 例 如, 在 详 细 设 计 阶 段, 为 每 个 模 块 开 发 细 节 设 计 划 分 任 务, 检 查 每 个 详 细 设 计, 定 位 发 现 的 错 误 等 等 对 每 个 详 细 任 务, 项 目 管 理 组 估 计 完 成 它 所 需 的 时 间, 并 分 配 适 当 的 资 源 以 满 足 整 体 规 划, 而 符 合 整 体 努 力 此 外, 工 程 的 任 务 是 开 发 流 程 的 结 果,QC 任 务 在 质 量 计 划 中 定 义, 监 管 行 为 在 监 管 计 划 中 定 义, 并 且 也 必 须 安 排 风 险 减 轻 行 为 在 精 化 的 每 个 级 别, 项 目 经 理 根 据 详 细 进 度 计 划 确 定 所 有 任 务 的 工 作 量, 并 且 检 查 与 所 估 计 工 作 量 的 差 异 假 如 详 细 日 程 安 排 和 整 体 日 程 安 排 以 及 结 果 评 估 不 一 致, 就 必 须 修 改 详 细 日 程 安 排 假 如 发 现 最 好 的 日 程 安 排 与 里 程 碑 和 进 度 不 匹 配, 这 时 就 必 须 修 改 较 早 的 评 估 因 此, 日 程 安 排 是 一 个 不 断 反 复 的 过 程 通 常, 项 目 经 理 精 化 一 个 任 务 到 这 样 一 个 层 次, 即 最 低 层 的 活 动 所 占 用 的 单 一 资 源 不 超 过 几 天 涉 及 项 目 管 理 协 调, 数 据 库 管 理 和 配 置 管 理 等 任 务 的 活 动, 也 可 能 列 到 进 度 计 划 之 中, 尽 管 这 些 行 为 的 进 度 决 定 没 有 大 的 直 接 影 响, 因 为 它 们 是 运 行 任 务 而 不 是 计 划 行 为 然 而, 它 们 所 消 耗 得 资 源 经 常 包 含 在 项 目 规 划 中 很 少 有 项 目 经 理 一 开 始 就 完 善 整 个 项 目 的 详 细 日 程 安 排, 一 旦 确 定 了 整 体 进 度 安 排, 阶 段 的 细 节 也 许 只 在 该 阶 段 开 始 时 处 理 使 用 如 微 软 的 Project 或 电 子 数 据 表 这 样 的 工 具 做 详 细 进 度 安 排 是 非 常 有 用 的, 对 每 一 个 低 层 的 行 为, 项 目 经 理 规 定 工 作 量 持 续 时 间 开 始 时 间 结 束 时 间 和 资 源 也 要 规 定 活 动 之 间 的 依 赖 ( 继 承 依 赖 或 是 资 源 依 赖 ) 利 用 这 些 工 具, 能 够 制 定 高 水 平 全 部 任 务 的 尝 试 和 进 度 安 排

76 详 细 工 程 项 目 从 来 就 不 是 静 止 的, 变 化 是 必 须 的, 因 为 过 程 的 发 展 也 许 与 计 划 不 同, 由 于 增 加 更 新 的 任 务, 相 应 的 需 求 发 生 了 改 变, 或 者 因 为 其 它 不 可 预 测 的 情 况, 当 出 现 新 的 需 求 变 化 就 会 发 生 通 常 使 用 一 些 配 套 工 具 管 理 最 终 进 度 计 划, 最 活 的 工 程 计 划 是 文 档 项 目 执 行 期 间, 如 果 必 须 改 变 计 划 和 增 加 实 施 活 动, 这 些 改 变 必 须 体 现 在 详 细 日 程 安 排 表 中, 反 映 实 际 计 划 任 务 的 执 行 因 此, 详 细 日 程 安 排 成 为 追 踪 活 动 和 日 程 安 排 的 主 要 文 档 必 须 注 意 在 整 个 项 目 计 划 期 间, 只 需 确 定 资 源 的 数 目 然 而, 只 有 实 际 地 指 派 人 员 完 成 任 务 之 后, 详 细 进 度 计 划 才 能 有 效 地 完 成, 同 样 任 务 分 配 需 要 团 队 成 员 的 能 力 信 息 在 以 上 的 讨 论 中, 我 们 隐 含 地 假 设 是 : 项 目 团 队 由 项 目 经 理 领 导, 他 制 定 计 划 和 分 配 任 务 所 采 用 的 团 队 组 织 层 次 形 式 十 分 普 通, 即 早 期 被 称 为 主 程 序 员 团 队. 作 为 一 个 例 子, 考 虑 来 自 [58] 项 目 的 例 子, 这 个 项 目 的 全 部 工 作 量 估 算 为 501 人 天,, 或 大 约 24 人 月 顾 客 要 求 5.5 个 月 完 成 这 个 项 目, 由 于 顾 客 要 求 的 时 间 远 超 过 工 作 月 的 平 方 根, 所 以 可 以 接 受 日 常 进 度 因 此, 这 就 确 定 了 项 目 的 工 作 量 和 进 度 计 划 的 目 标 通 过 使 用 阶 段 评 估 结 果 和 可 用 资 源 数 目 来 确 定 里 程 碑 表 4.4 显 示 了 高 层 的 项 目 进 度 计 划 这 个 项 目 使 用 了 RUP 流 程, 在 该 流 程 中, 最 初 的 需 求 和 设 计 有 两 次 反 复, 开 发 有 三 次 反 复 在 整 体 项 目 中, 里 程 碑 持 续 了 140 天 表 4.4 项 目 的 高 层 规 划 高 层 的 进 度 计 划 是 整 个 项 目 计 划 的 安 排, 不 适 合 资 源 分 配 和 详 细 计 划

77 模 块 任 务 工 作 量 ( 天 ) 表 4.5: 详 细 进 度 比 开 始 日 期 截 止 日 期 完 成 情 况 (%) 资 源 - 需 求 /10 7/ bb,bj - 设 计 审 查 0.9 7/11 7/ bb,bj,sb - 返 工 0.8 7/12 7/ bj,sb 历 史 编 码 /10 7/ hp 历 史 审 查 UC /14 7/ bj,dd 历 史 审 查 UC /14 7/ bj,dd 历 史 返 工 /17 7/ dd,sb,hp 历 史 测 试 UC /18 7/ sb 历 史 测 试 UC /18 7/ hp 历 史 返 工 /18 7/ bj,sb,hp 配 置 协 调 /19 7/ bj,sb,hp 管 理 跟 踪 /10 7/ bb 质 量 分 析 /19 7/ bb 对 于 详 细 日 程 安 排, 任 务 被 划 分 成 可 执 行 的 活 动 在 这 种 方 式 中, 进 度 计 划 表 也 变 成 了 项 目 任 务 的 清 单 正 如 以 上 所 提 到 的, 最 高 层 活 动 的 增 加 并 不 是 一 开 始 就 全 部 完 成 而 是 在 项 目 期 间 替 换 许 多 次 表 4.5 显 示 了 项 目 建 设 中 反 复 一 次 后 的 详 细 进 度 的 一 部 分, 表 格 中 是 通 过 短 名 字 指 定 每 个 活 动, 完 成 的 多 少 列 在 完 成 列 中 用 % 表 示, 这 些 信 息 用 于 追 踪 活 动 详 细 进 度 计 划 也 为 所 分 配 的 任 务 指 定 资 源, 有 时, 也 要 指 定 活 动 的 前 提, 这 些 信 息 帮 助 决 定 重 要 路 径 和 重 要 资 源, 该 项 目 最 终 共 有 大 约 325 项 可 安 排 的 任 务 4.7 小 结 - 项 目 计 划 提 供 两 个 用 途 : 设 定 整 体 目 标 或 项 目 期 望 和 管 理 项 目 的 整 体 方 法, 并 安 排 满 足 目 标 的 任 务 在 整 体 计 划 中, 工 作 量 和 进 度 的 估 计 为 项 目 成 本 进 度 计 划 和 里 程 碑 建 立 了 目 标 为 了 达 到 质 量 目 标 和 确 保 项 目 能 成 功 应 对 风 险, 建 立 工 程 质 量 计 划 和 风 险 管 理 计 划 在 详 细 进 度 计 划 中, 为 了 达 到 设 定 的 每 个 里 程 碑, 以 此 确 定 任 务 并 按 照 进 度 指 定 团 队 成 员 执 行 - 由 顶 到 下 的 方 法 用 于 项 目 工 作 量 评 估, 估 算 结 果 是 项 目 的 规 模, 当 然 也 可 以 通 过 工 程 的 其 它 特 性 来 完 善 从 整 体 工 作 量 上 分 配 工 作 量 数 据, 决 定 了 不 同 阶 段 的 工 作 量 COCOMO 是 一 个 使 用 这 种 方 法 的 模 型, 在 由 底 向 上 的 评 估 方 法 中, 首 先 建 立 模 型, 并 用 平 均 工 作 量 作 为 模 块 的 编 码 工 作 量, 这 样 整 体 的 编 码 工 作 量 就 确 定 了 使 用 工 作 量 分 配 的 方 法, 从 编 码 工 作 量 到 其 它 阶 段 和 整 个 项 目 的 工 作 量 都 可 确 定 - 在 制 定 项 目 计 划 目 标 中 存 在 一 些 灵 活 的 方 法, 项 目 总 体 进 度 计 划 可 作 为 一 个 工 作 量 函 数 来 确 定, 并 且 满 足 项 目 的 需 求 和 限 制 条 件 而 调 整, 一 旦 选 择 了 合 理 的 计 划, 用 项 目 的 工

78 作 量 来 确 定 人 员 的 需 求 从 评 估 工 作 量 和 不 同 阶 段 有 效 团 队 规 模, 确 定 里 程 碑 的 进 度 - 设 定 一 个 合 适 的 项 目 质 量 目 标 是 最 难 的, 质 量 目 标 能 在 执 行 期 间 制 定, 质 量 计 划 由 质 量 控 制 任 务 组 成, 在 项 目 中 必 须 被 执 行 以 达 到 质 量 目 标 - 项 目 具 有 风 险, 并 且 在 存 在 风 险 下 满 足 项 目 目 标 需 要 适 当 的 风 险 管 理 在 这 些 事 件 中 的 风 险 也 许 会 也 许 不 会 发 生, 但 如 果 他 们 发 生, 将 会 对 项 目 有 消 极 影 响 基 于 在 风 险 中 期 待 的 损 失, 风 险 可 被 划 分 优 先 级, 它 是 风 险 发 生 的 可 能 性 与 风 险 成 为 现 实 总 的 可 能 损 失 的 结 合 对 高 优 先 级 风 险, 在 正 常 的 项 目 执 行 期 间, 必 须 计 划 风 险 防 范 活 动, 以 使 假 如 风 险 成 为 现 实, 使 其 产 生 的 影 响 最 小 - 需 要 时, 用 适 当 的 量 度 可 以 纠 正 相 关 活 动 以 对 项 目 进 展 实 施 监 督 通 常 是 监 管 项 目 的 进 度 工 作 量 消 耗 发 现 的 缺 陷 和 产 品 的 规 模 在 工 作 量 进 度 活 动 中 的 过 失, 已 发 现 的 错 误 和 风 险 的 事 实 与 估 计 上 的 状 态 及 里 程 碑 报 告 等, 可 有 效 地 按 照 项 目 计 划 监 测 整 个 项 目 的 情 况 - 整 体 项 目 管 理 计 划 文 档 包 含 工 作 量 进 度 安 排 和 质 量 目 标 以 及 质 量 计 划, 监 控 和 风 险 管 理, 整 体 环 境 设 定 等 - 关 于 执 行 整 体 的 进 度 计 划 被 分 成 任 务 的 详 细 日 程 安 排 来 完 成, 以 便 满 足 目 标 和 限 制 这 些 任 务 被 分 配 给 特 定 的 团 队, 告 诉 他 们 开 始 和 结 束 日 期 进 度 计 划 必 须 使 整 体 进 度 和 评 估 结 果 一 致 对 质 量 监 管 和 风 险 管 理 的 任 务 也 需 列 在 详 细 进 度 计 划 中 为 了 获 得 项 目 目 标, 必 须 遵 守 位 于 项 目 路 径 上 的 详 细 进 度 详 细 进 度 表 是 最 有 灵 活 的 项 目 计 划 文 档, 并 且 项 目 计 划 中 的 任 何 变 化 都 必 须 在 详 细 进 度 中 有 适 当 的 反 映 自 测 练 习 1. 在 项 目 中 什 么 是 工 作 量 评 估, 并 且 为 什 么 它 在 早 期 评 估 中 很 重 要? 2. 如 果 提 议 系 统 的 架 构 设 计 已 经 完 成, 并 指 定 了 系 统 中 的 大 部 分 成 份, 并 且 在 你 的 组 织 库 中, 拥 有 类 似 成 份 的 可 用 源 码 资 源, 为 了 评 估 你 将 使 用 何 种 方 法 呢? 3. 假 设 一 个 组 织 计 划 使 用 COCOMO 来 做 工 作 量 评 估, 但 它 只 想 使 用 三 项 : 人 的 费 用 产 品 复 杂 性 程 序 员 能 力 和 开 发 日 程 在 这 种 情 况, 最 终 评 估 与 最 初 评 估 有 多 少 差 距? 4. 为 什 么 所 有 人 和 月 的 组 合 与 结 果 评 估 保 持 一 致 是 不 可 行 的? 5. 一 个 顾 客 让 你 完 成 一 项 项 目, 他 的 结 果 评 估 是 E, 要 求 完 成 的 时 间 是 T, 你 如 何 决 定 是 否 接 受 这 个 日 程 安 排? 6. 对 一 组 学 生 在 一 学 期 要 完 成 的 项 目, 列 出 这 个 象 征 性 项 目 将 要 临 的 主 要 风 险 和 针 对 高 优 先 级 风 险 的 风 险 减 缓 策 略 7. 假 定 你 为 你 的 项 目 制 定 了 一 个 详 细 日 程 安 排, 在 项 目 计 划 中, 针 对 各 种 不 同 重 大 事 件 的 结 果 和 日 程 安 排 评 估 都 已 经 完 成 你 是 怎 样 检 查 详 细 日 程 安 排 和 整 体 计 划 的 一 致 性? 如 果 不 一 致 你 要 做 什 么?

79 第 五 章 软 件 体 系 结 构 任 何 复 杂 的 系 统 都 是 由 子 系 统 组 成 的, 这 些 子 系 统 在 系 统 的 控 制 下 相 互 作 用, 从 而 执 行 系 统 预 期 的 行 为 当 设 计 这 类 系 统 的 时 候, 合 理 的 方 法 就 是 确 认 构 成 系 统 的 子 系 统 的 接 口, 以 及 子 系 统 间 相 互 作 用 的 原 则, 这 也 是 软 件 体 系 结 构 的 目 标 软 件 体 系 结 构 是 一 个 相 对 新 的 领 域, 由 于 软 件 系 统 的 分 布 性 和 复 杂 性 越 来 越 大, 软 件 体 系 结 构 成 为 创 建 系 统 至 关 重 要 的 一 步 现 在 由 于 配 置 和 连 接 系 统 的 选 择 很 多, 仔 细 设 计 软 件 体 系 结 构 变 得 很 重 要 在 体 系 结 构 设 计 时 需 要 选 择 使 用 中 间 件 后 台 数 据 库 服 务 器 类 型 安 全 构 件 类 型 等 系 统 可 靠 性 性 能 等 关 键 属 性 的 评 估, 也 是 首 先 在 体 系 结 构 设 计 中 进 行 的 这 一 章 将 讨 论 : - 体 系 结 构 描 述 在 软 件 项 目 中 起 到 的 关 键 作 用 - 用 于 标 识 系 统 的 不 同 方 面 的 各 种 体 系 结 构 视 图 - 系 统 体 系 结 构 中 的 构 件 和 连 接 件, 及 其 如 何 表 示 - 构 件 和 连 接 件 视 图 下, 用 于 设 计 体 系 结 构 的 不 同 风 格 - 如 何 评 估 体 系 结 构 5.1 软 件 体 系 结 构 中 的 作 用 什 么 是 体 系 结 构? 一 般 来 说, 系 统 体 系 结 构 提 供 了 该 系 统 各 部 分 的 高 层 视 图, 以 及 它 们, 与 整 个 系 统 的 关 系 也 就 是 说, 体 系 结 构 把 系 统 划 分 成 不 同 的 逻 辑 部 分, 每 个 部 分 可 以 单 独 理 解 在 描 述 系 统 时, 则 只 需 描 述 这 些 不 同 部 分 及 部 分 之 间 的 关 系 任 何 复 杂 的 系 统 都 可 以 用 不 同 的 方 式 划 分, 每 种 方 式 都 有 不 同 类 型 的 逻 辑 部 件, 并 提 供 了 有 用 的 视 角 对 于 软 件 系 统 也 是 一 样 系 统 体 系 结 构 的 描 述 并 非 只 有 一 个 方 式 ; 还 可 能 的 结 构 有 许 多 由 于 体 系 结 构 可 能 的 结 构 很 多, 其 中 一 种 最 被 广 泛 接 受 的 定 义 是 : 系 统 的 软 件 体 系 结 构 是 系 统 的 结 构 或 结 构 组, 其 中 包 括 软 件 元 素, 元 素 的 外 部 可 见 属 性 以 及 它 们 之 间 的 关 系 [6] 这 个 定 义 意 味 着, 对 于 体 系 结 构 内 的 元 素, 我 们 只 关 心 元 素 的 抽 象 信 息 和 属 性, 使 得 其 他 元 素 可 以 假 设 这 些 属 性 信 息 的 存 在, 并 描 述 元 素 之 间 的 关 系 在 体 系 结 构 层, 不 需 考 虑 如 何 支 持 系 统 属 性 的 细 节 用 一 个 简 洁 的 容 易 理 解 的 方 式 描 述 很 复 杂 的 系 统, 这 是 体 系 结 构 的 一 个 重 要 能 力 系 统 的 体 系 结 构 描 述 用 于 描 述 不 同 的 系 统 结 构 那 么 一 个 自 然 的 问 题 是, 为 什 么 用 户 会 需 要 创 建 和 记 录 软 件 系 统 的 结 构 呢? 软 件 体 系 结 构 描 述 的 重 要 作 用 有 ( 以 下 方 面 )[6,23, 51]: 1: 理 解 与 交 流 (Understanding and Communication.) 体 系 结 构 是 权 益 拥 有 者 的 主 要 沟 通 渠 道 权 益 拥 有 者 包 括 系 统 的 使 用 用 户 委 托 开 发 系 统 的 客 户 系 统 的 开 发 者 以 及 架 构 师 通 过 体 系 结 构 描 述, 权 益 拥 有 者 能 够 理 解 系 统 的 宏 观 属 性, 以 及 系 统 如 何 满 足 功 能 和

80 质 量 需 求 体 系 结 构 描 述 为 权 益 拥 有 者 提 供 了 共 同 的 语 言, 也 为 可 能 在 利 益 上 有 冲 突 的 相 关 人 员, 提 供 了 商 讨 与 达 成 协 议 的 媒 介 2: 复 用 (Reuse) 软 件 工 程 的 研 究 长 期 致 力 于 一 个 理 想 : 开 发 者 们 开 发 不 同 的 软 件 部 件, 其 他 开 发 者 们 可 以 使 用 这 些 部 件, 并 通 过 组 装 部 件 的 形 式 开 发 新 的 系 统 如 果 人 们 开 发 软 件 时 希 望 复 用 已 有 的 构 件, 那 么 体 系 结 构 至 关 重 要, 因 为 体 系 结 构 在 较 高 的 抽 象 层 次 上 支 持 了 复 用 体 系 结 构 对 构 件 的 选 择 方 式 是, 一 部 分 构 件 直 接 复 用, 这 些 构 件 将 与 准 备 开 发 的 新 构 件 协 同 起 来 体 系 结 构 对 于 相 似 产 品 间 的 复 用 也 能 提 供 支 持, 这 些 不 同 但 相 似 的 产 品 可 以 形 成 产 品 家 族, 对 公 用 部 分 进 行 复 用 体 系 结 构 指 明 了 这 些 产 品 中 哪 些 部 分 是 固 定 的, 哪 些 可 能 是 变 化 的, 并 能 帮 助 最 小 化 可 变 因 素, 保 证 不 同 产 品 可 以 最 大 化 的 共 享 同 样, 在 细 节 层 面, 处 理 这 些 问 题 是 很 困 难 的 3: 构 建 与 演 化 (Construction and Evolution) 体 系 结 构 能 将 系 统 划 分 为 不 同 的 部 分, 这 种 划 分 可 以 直 接 为 系 统 开 发 所 用, 因 为 构 建 系 统 时 同 样 需 要 将 系 统 划 分 为 不 同 的 模 块, 以 分 配 给 不 同 的 团 体 ( 或 个 人 ) 进 行 开 发 一 个 合 适 的 划 分 可 以 使 开 发 者 们 分 别 开 发 不 同 的 部 分, 然 后 组 装 成 一 个 系 统 从 定 义 来 看, 体 系 结 构 中 指 定 的 部 分 是 相 对 独 立 的 ( 仅 通 过 它 们 的 关 系 产 生 依 赖 ), 因 此 这 些 部 分 可 以 独 立 地 构 建 4: 分 析 (Analysis) 系 统 在 还 未 创 建 前, 非 常 需 要 对 系 统 行 为 的 重 要 性 质 进 行 判 定 这 帮 助 设 计 者 考 虑 替 代 方 案, 并 选 择 最 符 合 需 求 的 方 案 很 多 工 程 规 则 使 用 模 型 分 析 产 品 的 代 价 可 靠 性 性 能 等 体 系 结 构 也 为 分 析 软 件 的 重 要 性 质 提 供 了 可 能 性 通 过 体 系 结 构 分 析 和 预 测 系 统 的 重 要 属 性 是 可 能 的 ( 尽 管 分 析 方 法 并 未 完 全 成 熟 或 形 成 标 准 ) 这 些 方 法 包 括 分 析 系 统 的 可 靠 性 或 性 能 这 种 分 析 可 以 帮 助 判 断 系 统 是 否 符 合 质 量 和 性 能 要 求, 如 果 不 符 合, 帮 助 我 们 判 定 如 何 解 决 这 些 问 题 举 例 而 言, 如 果 需 要 构 建 一 个 购 物 网 站, 在 给 定 一 些 硬 件 和 请 求 负 载 的 条 件 下, 可 以 对 体 系 结 构 分 析 响 应 时 间 或 吞 吐 量 这 样 我 们 能 知 道 性 能 是 否 满 足 要 求, 如 果 不 满 足, 那 么 系 统 需 要 如 何 增 强 ( 如 采 用 不 同 的 体 系 结 构 或 在 后 台 采 用 更 快 的 服 务 器 ) 一 个 项 目 中, 并 非 所 有 上 述 作 用 都 很 明 显, 哪 些 能 产 生 作 用 取 决 于 项 目 的 性 质 在 一 些 项 目 中, 沟 通 非 常 重 要, 但 细 致 的 性 能 分 析 可 能 不 必 要 ( 因 为 系 统 太 小 或 用 户 数 很 少 ) 在 其 他 系 统 中, 性 能 分 析 可 能 是 体 系 结 构 的 主 要 用 途 5.2 体 系 结 构 视 图 系 统 的 体 系 结 构 视 图 并 非 唯 一, 这 是 个 普 遍 接 受 的 观 点 本 文 所 采 用 的 体 系 结 构 定 义 也 充 分 表 明 了 这 点 因 此, 系 统 的 体 系 结 构 图 也 并 非 唯 一 的 在 这 一 点 上 软 件 与 土 木 建 筑 相 似, 也 就 是 最 早 使 用 体 系 结 构 概 念 的 领 域 如 果 你 想 看 一 个 建 筑 的 平 面 图, 你 得 看 一 系 列 的 图 纸 ; 如 果 电 气 工 程 师, 想 知 道 电 力 配 置 的 规 划 情 况, 展 现 在 你 面 前 的 将 是 另 外 的 一 些 图 纸 ; 如 果 对 安 全 防 护 与 消 防 感 兴 趣 的 话, 又 会 使 用 另 外 一 些 图 纸 这 些 图 纸 并 不 是 独 立 的 -- 它 们 都 关 于 同 一 个 建 筑 然 而, 每 个 图 纸 都 提 供 了 对 这 个 建 筑 不 同 的 视 角, 这 种 视 角 解 释 建 筑 的

81 某 一 特 定 方 面, 并 尝 试 将 它 诠 释 得 最 好, 同 时 不 涉 及 其 它 内 容 任 何 单 一 设 计 图 都 不 能 表 达 所 有 的 视 角, 否 者 设 计 图 将 会 非 常 复 杂, 软 件 的 体 系 结 构 也 是 如 此 在 软 件 设 计 时, 这 些 不 同 的 图 纸 被 称 作 视 图 视 图 将 系 统 展 示 为 元 素 (element) 及 其 关 系 (relationships) 的 组 合 视 图 希 望 凸 显 哪 些 方 面, 就 采 用 哪 些 元 素 不 同 的 视 图 揭 示 不 同 的 属 性, 允 许 项 目 负 责 人 与 分 析 人 员 对 属 性 进 行 正 确 的 评 估 通 过 聚 焦 于 系 统 的 某 一 方 面 而 进 行 研 究, 降 低 了 读 者 在 同 一 时 间 处 理 不 同 问 题 的 复 杂 性, 因 此 有 助 于 系 统 的 理 解 与 分 析 视 图 描 述 了 系 统 的 一 个 结 构, 我 们 将 会 可 交 替 使 用 视 图 与 结 构 这 两 个 概 念, 也 会 使 用 术 语 体 系 结 构 视 图 (architectural view) 来 指 代 视 图 现 有 研 究 提 出 了 许 多 类 型 的 视 图, 这 些 视 图 绝 大 部 分 属 于 下 面 三 种 类 型 中 的 一 种 [6, 23] 模 块 构 件 和 连 接 件 配 置 在 模 块 视 图 中, 系 统 被 看 作 代 码 段 的 集 合, 每 段 代 码 执 行 系 统 功 能 的 一 部 分 也 就 是 说, 模 块 是 模 块 视 图 中 的 主 要 成 分 这 些 视 图 是 基 于 代 码 的, 并 且 没 有 明 确 表 达 任 何 系 统 运 行 时 结 构 包 类 过 程 方 法 一 组 函 数 以 及 一 组 类 都 是 模 块 的 实 例 模 块 之 间 的 关 系 同 样 是 以 代 码 为 基 础 的, 并 依 赖 于 模 块 代 码 之 间 如 何 交 互 这 些 关 系 包 括 属 于 ( 即, 模 块 B 是 模 块 A 的 一 部 分 ), 使 用 或 依 赖 于 ( 模 块 A 执 行 某 功 能 时 使 用 模 块 B 的 一 些 服 务, 或 者 模 块 A 的 正 确 性 依 赖 于 B 的 正 确 性 ), 泛 化 或 特 殊 化 ( 模 块 B 是 模 块 A 的 一 般 化 ) 从 构 件 和 连 接 件 视 图 C&C(Component and Connector) 来 看, 系 统 视 作 运 行 态 实 体 的 集 合, 这 些 实 体 叫 做 构 件 也 就 是 说, 构 件 是 系 统 中 具 有 标 识 的 单 元 对 象 ( 而 不 是 类 ) 对 象 的 集 合, 进 程 都 是 构 件 的 例 子 运 行 时, 构 件 相 互 作 用 以 支 持 系 统 服 务 连 接 件 对 构 件 交 互 提 供 支 持 管 道 与 Socket 都 是 连 接 件 共 享 的 数 据 同 样 也 能 作 为 连 接 件 如 果 构 件 使 用 中 间 件 进 行 通 信 与 协 同, 那 么 中 间 件 也 就 成 为 了 连 接 件 因 此, 这 个 视 图 的 基 础 元 素 就 是 构 件 与 连 接 件 配 置 视 图 关 注 于 软 件 单 元 是 如 何 配 置 资 源, 这 些 资 源 包 括 硬 件 文 件 系 统 和 人 也 就 是 说, 配 置 视 图 指 明 了 系 统 执 行 时 软 件 元 素 与 环 境 元 素 之 间 的 关 系 这 个 视 图 揭 示 了 系 统 的 结 构 性 属 性, 比 如 进 程 运 行 在 哪 个 处 理 器 上, 文 件 系 统 中 的 系 统 文 件 如 何 组 织 一 个 体 系 结 构 描 述 是 由 许 多 不 同 类 型 的 视 图 组 成, 每 个 视 图 揭 示 某 一 方 面 的 系 统 结 构 模 块 视 图 展 现 了 软 件 如 何 作 为 实 现 单 元 构 成 ;C&C 视 图 展 现 了 软 件 作 为 相 互 作 用 的 执 行 元 素 时 如 何 组 织 ; 配 置 视 图 则 展 示 软 件 与 非 软 件 结 构 如 何 联 系 同 一 系 统 的 这 三 类 视 图 构 成 了 软 件 的 体 系 结 构 但 请 注 意 视 图 是 有 关 联 的, 它 们 描 述 的 是 同 一 个 系 统 因 此, 不 同 视 图 的 元 素 之 间 是 有 关 联 的 这 些 关 联 也 许 简 单, 也 许 复 杂 举 例 来 说, 模 块 与 构 件 之 间 的 关 系 可 能 是 一 对 一 的, 也 就 是 一 个 模 块 实 现 一 个 构 件 另 一 方 面, 也 许 对 应 关 系 非 常 复 杂, 比 如 一 个 模 块 被 多 个 构 件 使 用, 或 者 一 个 构 件 使 用 多 个 模 块 当 创 建 不 同 的 视 图 时, 设 计 者 应 该 注 意 这 些 联 系

82 另 一 个 问 题 是, 什 么 是 描 述 系 统 体 系 结 构 时 的 标 准 视 图? 对 这 个 问 题, 我 们 再 次 类 比 建 筑 如 果 建 造 简 单 的 小 房 子, 那 么 没 有 必 要 为 应 急 设 施 或 防 火 系 统 单 独 创 建 一 个 视 图 同 样, 如 果 建 筑 没 有 空 调, 也 就 没 必 要 创 建 空 调 的 视 图 另 一 方 面, 一 个 办 公 建 筑 除 了 描 述 水 管 设 施 空 调 电 线 等 视 图 外, 也 许 会 对 上 述 两 种 视 图 都 有 需 求 然 而, 尽 管 对 于 建 筑 有 多 种 不 同 制 图 视 角, 但 有 一 个 视 角 是 最 重 要 的, 那 就 是 建 筑 的 物 理 结 构 这 种 视 图 是 其 他 视 图 的 基 础, 除 非 这 一 视 图 完 成, 其 他 视 图 不 可 能 真 正 完 成 建 筑 是 否 需 要 其 他 视 图, 取 决 于 建 筑 的 性 质 因 此, 从 某 种 意 义, 描 述 建 筑 结 构 的 视 图 应 该 被 视 为 主 视 图, 因 为 其 他 视 图 都 是 使 用 该 视 图, 并 显 著 依 赖 于 它 在 早 期 阶 段, 这 个 视 图 还 有 益 于 获 取 并 分 析 建 筑 最 重 要 的 属 性, 即 建 筑 的 空 间 组 织 对 于 软 件 体 系 结 构 有 些 相 似 正 如 前 文 所 诉, 根 据 软 件 的 特 征 不 同, 软 件 体 系 结 构 需 要 的 视 图 也 不 同 然 而, 在 这 些 视 图 中,C&C 视 图 是 最 为 主 要 的, 在 构 建 体 系 结 构 时 几 乎 总 是 会 创 建 这 个 视 图 ( 一 些 定 义 中, 甚 至 仅 仅 从 C&C 视 图 的 角 度 定 义 体 系 结 构 ), 本 章 将 主 要 关 注 于 C&C 视 图 体 系 结 构 与 设 计 的 关 系 是 值 得 注 意 的 随 着 系 统 被 分 割 成 各 个 部 分, 从 这 些 部 分 组 装 为 系 统, 也 同 样 是 设 计 的 目 标 一 个 自 然 的 问 题 是, 为 什 么 设 计 和 体 系 结 构 的 目 标 相 同, 并 同 样 使 用 分 而 治 的 原 则? 首 先, 应 该 明 确 的 是, 体 系 结 构 也 是 一 种 设 计, 它 同 样 属 于 解 决 方 案 的 一 部 分, 并 且 主 要 关 注 系 统 的 结 构 此 外, 体 系 结 构 视 图 为 系 统 描 绘 高 层 视 图, 用 抽 象 的 方 式 传 递 信 息, 这 方 面 与 设 计 一 样 因 此, 构 建 体 系 结 构 就 是 设 计 我 们 可 以 将 体 系 结 构 建 模 视 为 一 个 高 抽 象 层 次 的 设 计, 仅 聚 焦 于 系 统 的 主 要 组 成 部 分, 同 时 也 是 设 计 的 第 一 步 我 们 所 说 的 设 计, 是 关 于 最 终 会 实 现 为 代 码 的 模 块 的 也 就 是 说, 它 们 表 现 的 是 更 具 体 的 实 现 ( 尽 管 在 设 计 时 还 不 是 实 现 ) 因 此, 设 计 必 须 解 决 较 低 层 的 问 题, 比 如 数 据 结 构 文 件 和 数 据 源, 但 这 些 一 般 不 是 在 体 系 结 构 层 面 解 决 的 问 题 当 然, 我 们 也 可 以 认 为, 设 计 可 以 视 为 提 供 了 系 统 体 系 结 构 的 模 块 视 图 体 系 结 构 建 模 与 概 要 设 计 之 间 的 界 限 并 不 明 显 随 着 概 念 的 演 变, 可 以 认 为 体 系 结 构 和 设 计 的 界 限 是 可 以 由 设 计 师 或 架 构 师 决 定 的 在 体 系 结 构 层 面, 架 构 师 们 只 需 描 述 那 些 需 要 进 行 评 估 的 组 成 部 分, 组 成 部 分 的 内 部 结 构 并 不 重 要 另 一 方 面, 系 统 的 结 构 设 计 是 一 项 关 键 任 务, 它 指 导 各 组 成 部 分 的 开 发 然 而, 对 系 统 组 成 部 分 细 节 的 检 查 和 展 现, 哪 些 应 放 在 体 系 结 构 建 模 中 进 行, 哪 些 应 放 在 设 计 过 程 中 进 行, 都 是 可 选 的 一 般 而 言, 在 体 系 结 构 建 模 分 析 时 不 需 要 的 细 节, 都 应 放 在 设 计 部 分 完 成 5.3 构 件 和 连 接 件 视 图 系 统 的 C&C 视 图 有 两 个 主 要 元 素 构 件 和 连 接 件 构 件 通 常 是 系 统 执 行 期 间 需 要 的 计 算 元 素 或 数 据 存 储 元 素 连 接 件 定 义 了 构 件 的 交 互 方 式 C&C 视 图 定 义 了 构 件, 以 及 构 件 通 过 哪 个 连 接 件 与 另 一 个 构 件 相 连 接 C&C 视 图 描 述 了 系 统 运 行 时 的 结 构 系 统 执 行 时 存 在 的 构 件 和 他 们 的 交 互 方 式 C&C 结 构 本 质 上 是 一 个 构 件 为 点, 连 接 件 为 边 的 图

83 C&C 视 图 可 能 是 最 普 遍 使 用 的 系 统 结 构 视 图, 大 多 数 使 用 方 框 线 条 (box-and-line) 方 式 描 述 系 统 通 常 人 们 谈 论 的 体 系 结 构, 都 是 指 的 C&C 视 图, 大 多 数 体 系 结 构 描 述 语 言 也 用 于 描 述 C&C 视 图 构 件 在 系 统 中 构 件 通 常 是 计 算 和 数 据 存 储 单 元 一 个 构 件 有 一 个 名 称, 一 般 代 表 该 构 件 的 角 色 或 功 能 这 个 名 字 还 为 构 件 提 供 了 一 个 必 要 的 唯 一 标 识, 由 于 在 C&C 视 图 中 只 显 示 该 构 件 名 称, 在 描 述 构 件 细 节 的 文 档 中 将 同 样 使 用 此 名 称 一 个 构 件 是 一 个 构 件 类 型, 这 个 类 型 代 表 着 一 个 泛 性 的 构 件, 定 义 了 构 件 具 备 的 通 用 计 算 功 能 及 其 接 口 请 注 意, 虽 然 一 个 构 件 有 一 个 类 型, 但 在 C&C 体 系 结 构 视 图 中, 我 们 需 要 构 件 ( 如, 实 例 ), 而 不 是 类 型 这 种 类 型 例 如 客 户 端 服 务 器 过 滤 器 等 不 同 的 领 域 也 可 能 有 其 他 的 通 用 类 型, 譬 如 控 制 器 执 行 器 和 传 感 器 ( 用 于 控 制 系 统 领 域 ) 在 系 统 的 C&C 体 系 结 构 视 图 中, 不 同 构 件 类 型 最 好 有 不 同 的 表 示 形 式, 这 样 较 为 直 观 线 框 图 中, 通 常 所 有 构 件 都 表 示 为 矩 形 框 这 种 做 法 需 要 分 别 描 述 不 同 的 构 件 类 型, 读 者 必 须 阅 读 说 明 以 了 解 构 件 的 类 型, 但 这 比 不 同 构 件 类 型 使 用 不 同 符 号 要 更 清 晰 一 些 常 见 的 用 于 表 示 构 件 类 型 的 符 号 如 图 5.1 为 了 确 保 不 同 符 号 的 含 义 对 读 者 而 言 是 清 晰 的, 最 好 不 同 符 号 有 一 个 关 键 词, 描 述 符 号 表 示 的 构 件 类 型 图 5.1 构 件 举 例 客 户 端 服 务 器 数 据 库 应 用 程 序 连 接 件 在 系 统 操 作 时, 不 同 的 构 件 可 能 需 要 交 互, 以 提 供 系 统 预 期 的 服 务 毕 竟, 构 件 的 作 用 是 为 系 统 提 供 服 务 和 作 用, 而 且 必 须 通 过 组 合 覆 盖 系 统 的 全 部 功 能 对 于 由 构 件 组 成 的 系 统, 构 件 之 间 的 信 息 交 互 是 必 要 的 构 件 交 互 的 方 式 可 能 很 简 单, 执 行 操 作 系 统 支 持 的 底 层 进 程 即 可 完 成 例 如, 构 件 可 能 与 另 一 个 构 件 使 用 过 程 调 用 ( 连 接 件 ) 进 行 交 互, 这 种 机 制 由 编 程 语 言 的 运 行 时 环 境 产 生 但 是, 交 互 机 制 可 能 更 复 杂 例 如 远 程 过 程 调 用 TCP/IP 的 端 口 和 类 似 HTTP 的 协 议 这 些 机 制 需 要 相 当 多 的 底 层 运 行 时 基 础 设 施, 并 且 为 了 使 用 这 些 基 础 设 施, 构 件 必 须 进 行 特 殊 的 针 对 性 编 程 因 此, 标 识 和 显 式 表 示 这 些 连 接 件 极 为 重 要 连 接 件 将 帮 助 体 系 结 构 确 定 适 当 的 基 础 设 施, 以 及 阐 明 构 件 的 编 程 需 求 请 注 意, 连 接 件 不 一 定 是 二 进 制 文 件 形 式, 并 且 一 个 连 接 件 可 以 同 时 为 多 个 构 件 提 供 n 路 的 通 信 例 如, 一 个 广 播 总 线 可 作 为 连 接 件, 允 许 构 件 广 播 其 消 息 常 见 的 用 来 表 示 连

84 接 件 类 型 的 符 号 如 图 5.2 总 线 类 型 连 接 器 数 据 库 存 取 请 求 回 应 管 道 远 程 过 程 调 用 图 5.2 连 接 件 类 型 连 接 件 名 称 也 应 能 说 明 其 支 持 的 交 互 性 质 连 接 件 也 具 有 通 用 的 交 互 类 型 描 述, 用 来 指 定 其 属 性, 比 如 连 接 件 是 二 进 制 的 或 是 支 持 n 种 方 式 交 互 的 等 等 如 果 一 个 协 议 作 为 连 接 件 类 型, 它 应 该 有 明 确 说 明 值 得 指 出 的 是, 连 接 件 的 实 现 可 能 相 当 复 杂 如 果 连 接 件 由 底 层 系 统 提 供, 那 么 就 只 需 确 保 按 照 规 范 使 用 但 如 果 底 层 系 统 没 有 提 供 体 系 结 构 所 需 的 连 接 件, 则 如 上 所 述, 连 接 件 将 作 为 构 建 系 统 时 需 要 实 现 的 一 部 分 也 就 是 说, 开 发 时 不 仅 需 要 开 发 构 件, 也 需 要 为 连 接 件 开 发 分 配 人 员 ( 开 发 特 定 系 统 时 可 能 碰 到 这 种 情 况, 可 能 需 要 针 对 特 定 问 题 域 的 专 门 连 接 件 ) 通 常, 创 建 体 系 结 构, 架 构 师 较 为 明 智 的 选 择 是, 使 用 将 要 部 署 软 件 的 系 统 已 经 提 供 的 连 接 件

85 5.3.3 举 例 假 设 我 们 要 设 计 和 创 建 一 个 简 单 的 系 统 用 于 校 园 学 生 的 在 线 调 查 系 统 将 向 学 生 提 供 一 套 选 择 题 的 调 查 表, 学 生 可 以 在 线 填 写 和 提 交 当 用 户 提 交 调 查 表 时, 他 / 她 能 看 到 当 前 的 调 查 结 果, 也 就 是 说, 目 前 为 止 选 择 不 同 问 题 选 项 的 学 生 百 分 比 该 系 统 的 最 好 使 用 网 站 方 式 构 建 ; 这 是 任 何 开 发 人 员 可 能 的 选 择 对 于 这 个 简 单 的 系 统, 建 议 使 用 传 统 的 3 层 体 系 结 构 它 包 括 一 个 客 户 端 窗 口, 用 于 显 示 学 生 用 来 完 成 提 交 以 及 显 示 结 果 ; 第 二 个 构 件 是 处 理 学 生 提 交 数 据 的 服 务 器, 并 可 以 保 存 在 作 为 第 三 个 构 件 的 数 据 库 中 服 务 器 也 能 查 询 数 据 库 以 获 取 统 计 调 查 的 结 果, 并 将 结 果 以 适 当 的 格 式 (HTML) 发 送 回 客 户 端, 然 后 客 户 端 显 示 结 果,C&C 图 如 图 5.3 所 示 客 户 端 服 务 器 http http JDBC Access 数 据 库 图 5.3 调 查 系 统 的 体 系 结 构 请 注 意 客 户 端 服 务 器 和 数 据 库 都 是 不 同 的 构 件 类 型, 因 此 用 不 同 符 号 表 示 此 外 需 要 注 意 的 是, 这 些 构 件 之 间 的 连 接 件 类 型 也 不 同 该 图 中 不 同 类 型 区 分 很 清 晰, 图 也 变 得 独 立 和 易 于 理 解 请 注 意 在 体 系 结 构 级, 不 讨 论 主 机 的 详 细 信 息 如 何 设 置 调 查 的 URL? 建 立 这 些 构 件 的 模 块 是 什 么 和 用 什 么 语 言 编 写? 这 些 都 是 细 节 问 题 另 外, 客 户 端 和 服 务 器 之 间 的 连 接 件 明 确 说 明 会 用 到 http, 关 系 图 中 也 说 它 是 一 个 Web 客 户 端 这 意 味 着 当 学 生 填 写 调 查 表 时, 会 有 浏 览 器 在 运 行 把 http 作 为 连 接 件 还 意 味 着 适 当 的 http 服 务 器 在 运 行, 系 统 服 务 器 将 适 当 地 链 接 到 连 接 件 上, 使 得 客 户 端 可 以 访 问 换 言 之, 浏 览 器 和 http 服 务 器 是 基 础 设 施, 主 要 作 为 客 户 端 和 服 务 器 ( 以 及 客 户 端 运 行 应 用 程 序 的 虚 拟 机 ) 之 间 的 连 接 件 有 时 连 接 件 的 选 择 会 对 构 件 产 生 影 响, 客 户 端 将 不 得 不 用 一 种 方 式 编 写 使 得 它 可 以 用 http 发 送 请 求 ( 这 就 意 味 着 使 用 某 些 类 型 的 脚 本 语 言 或 HTML 格 式 ) 同 样, 服 务 器 需 要 用 指 定 的 http 协 议 格 式 从 服 务 器 接 受 请 求 此 外, 服 务 器 需 要 用 HTML 格 式 将 其 结 果 发 送 回 客 户 端, 这 些 都 是 使 用 这 种 体 系 结 构 的 约 束 因 此, 当 讨 论 并 最 后 通 过 这 种 体 系 结 构 时, 它 对 基 础 设 施 和 实 现 可 能 产 生 的 影 响 应 充 分 理 解 并 采 取 措 施, 以 确 保 这 些 假 设 是 有 效 的 上 述 体 系 结 构 并 不 安 全, 因 为 学 生 可 以 任 意 次 的 参 与 调 查 此 外, 甚 至 一 个 并 不 存 在 的 学 生 也 能 参 与 调 查 现 在 假 设 院 长 希 望 此 系 统 只 对 已 注 册 的 学 生 开 放, 最 多 只 允 许 每 个 学 生 进 行 一 次 调 查 而 要 识 别 一 名 学 生 比 较 简 单, 因 为 每 个 学 生 都 有 一 个 账 户, 而 且 他 们 的 账 户 信 息 可 以 从 学 院 的 主 服 务 器 上 查 到

86 现 在, 系 统 结 构 将 变 得 完 全 不 同 新 的 体 系 结 构 有 单 独 的 用 户 登 录 窗, 以 及 单 独 用 于 验 证 的 服 务 器 为 了 验 证, 请 求 被 转 到 验 证 服 务 器 去 检 查 登 录 名 和 密 码 是 否 有 效 如 果 有 效, 服 务 器 将 返 回 一 个 cookie 给 客 户 端 ( 用 cookie 协 议 保 存 ) 当 学 生 完 成 调 查 表 后,cookie 信 息 将 对 用 户 进 行 验 证, 然 后 服 务 器 检 查 这 个 学 生 是 否 已 参 加 过 这 项 统 计 调 查, 新 的 体 系 结 构 如 图 5.4 所 示 客 户 端 http http 服 务 器 JDBC Access 数 据 库 http http 验 证 服 务 器 图 5.4 带 验 证 的 调 查 系 统 体 系 结 构 请 注 意, 即 使 客 户 端 和 服 务 器 的 连 接 件 是 http, 这 和 先 前 体 系 结 构 中 的 连 接 件 还 是 有 所 不 同 在 前 一 个 体 系 结 构 中, 最 简 单 的 http 就 足 够 了 而 在 当 前 体 系 结 构 中,cookie 也 是 必 须 的, 所 以 连 接 件 已 经 是 http+cookie 了 如 果 用 户 禁 用 cookie, 那 么 连 接 件 将 不 可 用, 这 种 体 系 结 构 也 将 无 法 工 作 现 在 假 设 希 望 以 不 同 的 方 式 扩 展 系 统 我 们 发 现 数 据 库 服 务 器 有 点 不 可 靠, 且 经 常 死 机 此 外 当 学 生 提 交 调 查 表 并 得 到 调 查 结 果 时, 稍 微 过 期 点 的 数 据 是 可 以 接 受 的, 因 为 对 于 调 查 结 果 而 言, 只 要 是 真 实 的 即 可, 稍 微 有 点 不 准 确 也 没 有 关 系 我 们 假 设 调 查 结 果 可 以 有 5 个 数 据 点 的 误 差 ( 即 它 可 以 少 包 含 5 次 调 查 ) 院 长 所 希 望 的 是 该 系 统 更 加 可 靠, 即 使 数 据 库 出 现 故 障 也 能 完 成 这 项 统 计 为 保 证 系 统 更 加 可 靠, 提 出 了 以 下 方 案 当 学 生 们 提 交 了 调 查 表, 与 从 前 一 样, 服 务 器 与 数 据 库 进 行 交 互 而 调 查 结 果, 将 被 存 放 于 一 个 服 务 器 的 缓 存 中 如 果 数 据 库 故 障 或 无 法 访 问 了, 调 查 数 据 会 存 放 在 本 地 的 一 个 缓 存 构 件 中, 并 且 存 放 于 缓 存 的 调 查 结 果 将 会 返 回 给 学 生 ( 此 操 作 可 以 进 行 5 次, 这 之 后 调 查 将 无 法 继 续 进 行 ) 这 样, 我 们 将 会 在 服 务 器 中 加 入 一 个 缓 存 管 理 器 构 件 服 务 器 与 这 个 构 件 之 间 存 在 连 接, 并 且 这 个 新 构 件 是 调 用 / 返 回 类 型 的 这 个 体 系 结 构 如 图 5.5 所 示

87 高 速 缓 存 管 理 http http 客 户 端 http http 服 务 器 JDBC 数 据 库 http http 验 证 服 务 器 图 5.5 拥 有 高 速 缓 存 的 调 查 系 统 体 系 结 构 需 要 指 出 的 是, 通 过 使 用 缓 存, 系 统 可 用 性 得 到 改 善, 但 高 速 缓 存 对 性 能 也 会 有 影 响 这 些 扩 展 说 明, 体 系 结 构 如 何 同 时 对 可 用 性 和 性 能 都 产 生 影 响, 以 及 如 何 正 确 选 择 体 系 结 构 帮 助 达 到 质 量 目 标 ( 或 仅 提 高 系 统 质 量 当 然, 细 节 层 次 的 决 策, 比 如 如 何 实 现 一 个 模 块, 一 样 影 响 性 能, 但 这 些 决 策 与 体 系 结 构 决 策 是 截 然 不 同 的, 并 且 是 正 交 的 ) 我 们 后 面 会 对 这 些 不 同 的 体 系 结 构 进 行 形 式 化 的 评 估, 看 看 体 系 结 构 决 策 如 何 影 响 系 统 的 质 量 属 性 5.4 C&C 视 图 的 体 系 结 构 风 格 不 同 的 系 统 会 有 不 同 的 体 系 结 构 在 大 量 的 系 统 实 践 中, 出 现 了 很 多 通 用 的 体 系 结 构, 一 定 程 度 上 可 以 解 决 一 类 通 用 的 问 题 这 种 通 用 的 解 决 方 案, 被 称 为 体 系 结 构 风 格 (architectural styles), 一 个 风 格 定 义 了 一 系 列 满 足 该 风 格 [6,23,76] 的 体 系 结 构 这 一 节 将 针 对 C&C 视 图 来 讨 论, 用 于 解 决 一 些 常 见 问 题 的 风 格 [23,76] 这 些 风 格 可 以 为 解 决 实 际 问 题 的 体 系 结 构 视 图 提 供 参 考 此 外, 也 可 以 将 不 同 的 风 格 进 行 合 并, 以 形 成 更 为 多 样 的 风 格 类 型

88 5.4.1 管 道 过 滤 器 管 道 - 过 滤 器 风 格 的 体 系 结 构 非 常 适 合 于 解 决 数 据 转 换 的 问 题, 即 系 统 收 到 一 些 输 入 数 据, 通 过 对 输 入 数 据 适 当 的 转 换, 达 到 产 生 输 出 数 据 的 目 标 使 用 管 道 和 过 滤 器 体 系 结 构 的 系 统 通 过 对 较 小 的 转 换 网 络 的 组 装, 以 达 到 整 体 数 据 转 换 的 目 标 管 道 - 过 滤 器 风 格 中 只 有 一 个 构 件 类 型, 称 作 过 滤 器 同 时 有 一 个 连 接 件 类 型, 称 作 管 道 过 滤 器 执 行 数 据 的 转 换, 并 将 转 换 后 的 数 据 发 送 到 其 他 的 过 滤 器, 以 便 进 行 进 一 步 的 处 理 从 另 一 方 面 来 说, 一 个 过 滤 器 从 其 预 定 义 好 的 管 道 获 取 数 据 进 行 数 据 转 换 并 将 输 出 数 据 发 送 到 指 定 的 管 道, 由 此 管 道 输 送 给 另 一 个 过 滤 器 一 个 过 滤 器 可 能 有 多 于 1 个 的 输 入 或 输 出 过 滤 器 可 以 是 独 立 和 异 步 的 实 体, 由 于 过 滤 器 仅 考 虑 从 管 道 传 输 来 的 数 据, 一 个 过 滤 器 不 需 要 知 道 哪 些 过 滤 器 生 成 了 这 些 数 据, 也 不 用 考 虑 哪 些 过 滤 器 会 使 用 自 己 产 生 的 数 据 管 道 - 过 滤 器 是 一 个 单 向 的 通 道, 数 据 流 从 一 端 传 输 到 另 一 端 管 道 不 会 以 任 何 方 式 改 变 数 据, 只 会 改 变 最 后 接 收 器 上 过 滤 器 得 到 的 数 据 元 素 的 顺 序 过 滤 器 可 以 是 异 步 的, 需 要 在 不 知 道 生 产 者 或 消 费 者 身 份 情 况 下 工 作, 缓 存 和 同 步 需 要 确 保 用 管 道 连 接 的 两 个 过 滤 器 体 现 了 生 产 者 与 消 费 者 关 系, 这 些 机 制 由 管 道 保 证, 过 滤 器 只 是 消 耗 和 生 产 数 据 这 个 风 格 需 要 有 一 些 限 制 : 首 先, 如 上 所 述, 过 滤 器 是 不 知 道 数 据 消 费 者 或 生 产 者 的 具 体 标 识 ( 译 注 : 也 就 是 说 过 滤 器 的 处 理 独 立 于 具 体 的 数 据 所 有 者 ), 过 滤 器 只 考 虑 所 需 的 数 据 元 素 其 次, 管 道 是 一 个 双 向 连 接 器, 它 必 须 连 接 一 个 过 滤 器 的 输 出 端 和 另 一 个 过 滤 器 的 输 入 端 纯 粹 的 管 道 - 过 滤 器 结 构 一 般 也 会 有 一 个 约 束, 即 过 滤 器 有 独 立 的 控 制 和 处 理 数 据 的 线 程 实 现 这 个 机 制 需 要 适 当 的 底 层 设 施 的 支 持, 帮 助 管 道 缓 冲 数 据 和 进 行 必 须 的 同 步 ( 比 如, 缓 冲 区 满 时 阻 止 生 产 者 继 续 写 入 缓 冲 区 空 时 阻 止 消 费 者 继 续 读 取 ) 在 使 用 一 个 管 道 时, 过 滤 器 的 开 发 人 员 必 须 充 分 意 识 到 管 道 的 性 质, 特 别 是 管 道 关 于 缓 冲 和 同 步 输 入 和 输 出 的 机 制 以 及 数 据 结 尾 符 号 的 规 定 有 时 对 过 滤 器 的 一 些 限 制 可 能 不 需 要, 比 如 约 束 过 滤 器 必 须 在 数 据 到 达 时 马 上 处 理 数 据 如 果 系 统 没 有 此 约 束, 管 道 和 过 滤 器 风 格 视 图 中 可 能 会 有 一 些 过 滤 器, 他 们 只 在 完 整 的 生 产 了 数 据 之 后 进 行 传 送, 或 者 确 认 输 入 完 整 之 后 才 开 始 处 理 在 这 样 的 系 统 中, 过 滤 器 不 能 并 发 的 进 行 处 理, 类 似 于 批 处 理 系 统, 这 种 情 况 下 可 以 考 虑 对 管 道 机 制 进 行 简 化 例 如, 假 设 系 统 需 要 统 计 文 件 中 不 同 单 词 出 现 的 频 率 一 种 使 用 管 道 和 过 滤 器 风 格 实 现 的 体 系 结 构 如 图 5.6 所 示

89 单 词 序 已 排 序 单 序 列 生 成 器 排 序 器 计 数 器 单 词 频 率 图 5.6 管 道 和 筛 选 器 举 例 这 种 体 系 结 构 要 求 首 先 由 Sequencer 构 件 进 行 处 理, 把 输 入 数 据 通 过 拆 分 转 化 为 词 组 的 序 列 然 后 单 词 序 列 由 排 序 构 件 进 行 排 序, 将 排 序 结 果 传 递 到 计 算 不 同 单 词 数 目 的 过 滤 器 在 此 体 系 结 构 中 加 入 排 序 构 件 的 原 因 是, 排 序 好 的 单 词 序 列 会 帮 助 较 快 的 计 算 词 频, 即 使 多 了 一 个 排 序 操 作 图 5.6 的 体 系 结 构 可 以 实 现 我 们 所 要 求 的 功 能, 本 章 后 面 将 进 一 步 讨 论 一 些 与 该 体 系 结 构 有 关 的 实 现 问 题 由 这 个 例 子 可 以 看 出, 管 道 - 过 滤 器 风 格 适 用 于 数 据 处 理 和 转 换 因 此, 文 字 处 理 应 用 中 可 以 使 用 这 种 风 格 对 信 号 处 理 的 应 用 程 序 而 言, 在 执 行 编 码 纠 错 以 及 其 它 数 据 转 换 方 面, 这 种 风 格 也 很 有 用 根 据 此 风 格 的 约 定, 管 道 - 过 滤 器 风 格 允 许 通 过 将 小 的 转 换 系 统 组 装 大 的 转 换 系 统 从 另 一 方 面 来 看, 期 望 的 转 换 系 统 可 以 分 解 为 更 小 粒 度 的 转 换 系 统, 然 后 为 更 小 的 转 换 建 立 过 滤 器 也 就 是 说, 这 种 风 格 允 许 函 数 式 的 的 组 装 和 分 解, 这 就 是 数 学 的 魅 力 所 在 共 享 数 据 风 格 在 这 种 风 格 中, 有 两 种 构 件 类 型 数 据 存 储 库 和 数 据 访 问 器 数 据 存 储 库 型 构 件 是 系 统 存 储 共 享 数 据 的 地 方 可 以 是 文 件 系 统 或 数 据 库 这 些 构 件 提 供 了 一 个 可 靠 和 永 久 的 存 储, 同 时 考 虑 并 发 访 问 时 同 步 需 要, 并 提 供 数 据 访 问 支 持 数 据 访 问 器 构 件 从 存 储 库 访 问 数 据, 然 后 对 获 得 的 数 据 进 行 计 算 如 果 构 件 间 需 要 共 享 计 算 结 果, 访 问 器 构 件 就 把 结 果 返 回 存 储 库 换 言 之, 访 问 器 是 从 存 储 库 接 受 数 据, 并 把 数 据 保 存 在 存 储 库 的 计 算 单 元 访 问 器 构 件 间 不 能 直 接 相 互 通 信 数 据 存 储 库 构 件 是 它 们 之 间 进 行 通 信 和 数 据 传 输 的 方 式 这 种 风 格 可 能 有 两 种 形 式 在 黑 板 风 格 中, 如 果 一 些 数 据 已 发 布 在 存 储 库 中, 所 有 相 关 访 问 器 构 件 都 会 被 通 知 到 换 言 之, 共 享 的 存 储 库 是 一 个 活 动 的 代 理, 它 会 通 知 构 件 接 受 最 新 的 消 息, 也 会 要 求 构 件 对 新 的 数 据 进 行 处 理 在 数 据 库 系 统 中, 这 种 风 格 常 通 过 触 发 器

90 机 制 来 支 持 另 一 种 风 格 是 数 据 存 储 库, 只 作 为 一 个 提 供 数 据 永 久 存 储 和 访 问 相 关 的 被 动 存 储 设 施, 构 件 能 随 时 访 问 存 储 库 可 以 想 象, 许 多 数 据 库 应 用 使 用 这 种 体 系 结 构 风 格 数 据 库 虽 然 一 开 始 更 像 存 储 库, 由 于 提 供 了 触 发 器 等 机 制, 现 在 同 时 执 行 黑 板 和 存 储 器 风 格 的 职 能, 同 时 提 供 有 效 的 数 据 存 储 机 制 很 多 Web 系 统 经 常 在 后 台 使 用 这 种 方 式 响 应 用 户 请 求, 不 同 脚 本 ( 数 据 访 问 器 ) 访 问 和 更 新 共 享 数 据 很 多 编 程 环 境 也 使 用 这 种 风 格 : 编 程 工 具 的 通 用 形 式 存 储 在 后 台 的 库 中, 当 访 问 它 时, 存 储 库 根 据 需 求 进 行 转 换 或 者 获 得 信 息 ( 若 干 年 前, 便 于 不 同 工 具 的 整 合, 曾 经 有 一 个 通 用 库 的 标 准 定 义 ) 以 大 学 学 生 注 册 系 统 作 为 使 用 这 种 体 系 结 构 风 格 的 例 子 显 然 系 统 有 一 个 中 心 存 储 库, 其 中 包 含 有 关 课 程 学 生 前 提 条 件 等 ; 管 理 员 构 件 配 置 存 储 库, 规 定 不 同 人 的 权 限 等 ; 注 册 构 件 允 许 学 生 注 册 和 更 新 学 生 与 课 程 的 信 息 ; 认 证 构 件 用 来 认 证 那 些 需 要 老 师 批 准 的 课 程 ; 报 告 构 件 在 登 记 完 成 后 生 成 学 生 注 册 课 程 的 报 告 ; 课 程 反 馈 构 件 用 于 学 生 在 课 程 结 束 后 反 馈 信 息 这 种 体 系 结 构 如 图 5.7 所 示 管 理 员 进 程 反 馈 批 准 存 储 库 注 册 报 告 图 5.7 共 享 数 据 举 例 请 注 意, 不 同 计 算 构 件 之 间 不 需 要 通 信, 甚 至 不 需 要 知 道 彼 此 是 否 存 在 如 果 系 统 要 求 课 程 安 排 自 动 由 注 册 信 息 得 到 ( 包 括 教 室 的 其 他 信 息 等 ), 那 么 另 一 个 称 作 排 课 (Scheduling) 的 构 件 可 以 简 单 的 添 加 到 系 统, 现 有 系 统 构 件 不 需 要 更 改 或 了 解 系 统 添 加 的 新 构 件 ( 本 例 子 基 于 作 者 所 在 大 学 实 际 使 用 的 系 统 )

91 这 种 风 格 中, 只 有 一 个 过 滤 器 类 型 读 / 写 但 是, 请 注 意, 在 更 为 精 化 的 体 系 结 构 中, 这 种 一 般 的 连 接 模 式 可 以 定 义 得 更 为 精 确 例 如, 尽 管 很 多 时 候 数 据 库 可 以 被 看 成 一 个 支 持 读 取 和 更 新 的 过 滤 器, 有 时 为 了 便 于 程 序 与 数 据 库 交 互, 数 据 库 系 统 可 能 需 要 提 供 事 务 服 务 使 用 此 事 务 服 务 的 连 接 机 制 可 进 行 完 整 的 事 务 支 持 ( 这 可 能 涉 及 多 个 读 取 写 入 保 存 等 原 子 性 操 作 ) 注 意 在 很 多 其 他 情 况 下, 连 接 件 与 大 量 的 基 础 设 施 相 关 例 如, 文 件 系 统 的 读 写 涉 及 大 量 文 件 系 统 提 供 的 支 持, 如 目 录 缓 冲 锁 定 和 同 步 同 样, 数 据 库 软 件 中 集 成 了 大 量 软 件 以 支 持 各 种 连 接 类 型, 包 括 查 询 更 新 和 交 换 之 后 的 案 例 中, 我 们 会 看 到 这 种 风 格 的 其 他 用 途 客 户 端 服 务 器 风 格 客 户 端 - 服 务 器 风 格 又 是 一 种 常 见 风 格 客 户 端 - 服 务 器 风 格 是 分 布 式 计 算 的 基 本 形 式 之 一, 并 且 这 种 体 系 结 构 风 格 即 来 源 于 此 形 式 在 这 个 风 格 中, 有 两 种 构 件 : 客 户 端 和 服 务 器 这 种 风 格 的 一 个 限 制 就 是 一 个 客 户 端 只 能 连 接 一 个 服 务 器, 并 且 无 法 连 接 其 他 客 户 端 这 种 客 户 端 和 服 务 器 之 间 的 连 接 由 客 户 端 引 发, 由 客 户 端 首 先 按 照 约 定 向 服 务 器 发 送 服 务 请 求 服 务 器 在 固 定 端 口 接 收 到 请 求 后, 返 回 一 个 计 算 结 果 给 发 起 请 求 的 客 户 端 在 这 种 客 户 端 - 服 务 器 风 格 中 只 有 一 个 连 接 件 类 型, 即 请 求 / 应 答 类 型 连 接 件 的 一 端 连 接 客 户 端 另 一 端 连 接 服 务 器 这 种 连 接 件 类 型 不 是 对 称 的 : 客 户 端 只 能 发 送 请 求 ( 并 且 接 收 应 答 ), 而 服 务 器 端 只 能 在 通 过 连 接 件 获 得 请 求 并 发 送 应 答 这 种 通 讯 常 常 是 同 步 的 : 客 户 端 在 运 行 之 前 等 待 服 务 器 返 回 结 果 也 就 是 说, 客 户 端 在 请 求 中 是 阻 塞 的, 直 到 其 收 到 答 复 这 种 风 格 的 一 般 形 式 是 多 层 结 构 在 这 种 风 格 中, 客 户 端 发 送 请 求 给 服 务 器, 但 是 服 务 器 为 了 满 足 这 个 请 求, 会 发 送 一 些 请 求 给 其 他 服 务 器 也 就 是 说, 在 下 一 个 层 次 中 服 务 器 也 会 扮 演 一 个 客 户 端 此 层 次 结 构 可 以 延 展 成 多 级 系 统 一 个 普 遍 例 子 是 三 层 结 构 在 这 种 风 格 中, 请 求 并 接 受 最 终 结 果 的 客 户 端 属 于 客 户 层 ; 中 间 层 次, 叫 做 商 业 层, 包 含 处 理 客 户 提 交 的 数 据 和 按 商 业 规 则 进 行 处 理 的 构 件 ; 第 三 层 是 存 储 层, 商 业 层 会 访 问 存 储 层 以 获 取 数 据, 并 与 存 储 库 层 相 互 影 响 这 种 结 构 中 更 常 见 的 是 客 户 端 和 服 务 器 分 属 于 不 同 的 机 器, 即 使 他 们 实 际 运 行 于 一 台 机 器, 在 设 计 上 他 们 也 会 被 设 计 成 可 存 在 于 不 同 机 器 的 形 式 因 此, 人 们 期 待 客 户 端 与 服 务 器 之 间 的 连 接 件 能 支 持 不 同 机 器 间 不 同 类 型 的 请 求 / 应 答 所 以, 连 接 件 在 内 部 高 度 混 合 并 且 支 持 不 同 的 网 络 许 多 客 户 端 - 服 务 器 风 格 系 统 的 连 接 件 使 用 TCP 端 口,Web 应 用 连 接 件 一 般 使 用 HTTP 阶 梯 结 构 是 与 多 层 结 构 有 区 别 的 另 一 种 结 构 这 种 构 件 - 连 接 件 的 体 系 结 构 视 图 的 特 点

92 是 : 每 一 层 是 一 个 构 件, 构 件 通 过 预 定 义 的 协 议 与 其 邻 近 的 构 件 进 行 通 讯 多 层 结 构 是 一 个 模 块 化 的 视 图, 规 定 构 件 如 何 组 织 和 交 互 在 这 种 结 构 中, 上 一 层 的 构 件 仅 能 被 其 下 层 所 调 用 所 以, 多 层 和 阶 梯 代 表 了 两 种 不 同 的 视 角 我 们 能 够 构 建 一 个 n 层 结 构, 其 中 一 些 层 的 内 部 是 阶 梯 结 构 比 如, 在 一 个 客 户 端 - 服 务 器 风 格 的 结 构 中, 服 务 器 拥 有 多 层 结 构, 也 就 是 说, 组 成 服 务 器 的 模 块 是 多 层 风 格 的 其 他 风 格 发 布 - 订 阅 风 格 这 种 风 格 中 有 两 种 构 件 其 中 一 种 构 件 订 阅 一 组 已 确 定 的 事 件 ; 另 一 组 构 件 生 成 这 些 被 订 阅 的 事 件 为 了 对 事 件 进 行 应 答, 那 些 订 阅 事 件 的 构 件 会 被 激 活 并 进 行 处 理 这 种 风 格 在 用 户 界 面 程 序 开 发 中 很 常 见, 像 鼠 标 单 击 这 样 的 事 件 被 预 先 定 义, 用 于 处 理 这 些 事 件 的 构 件 也 被 预 先 定 义 好 当 事 件 触 发 时, 构 件 开 始 执 行 像 大 多 数 连 接 件 一 样, 运 行 时 的 基 础 设 施 保 证 这 种 连 接 件 能 成 功 支 持 这 种 机 制 除 了 数 据 库 系 统 中 一 般 不 使 用 这 种 风 格 外, 这 种 风 格 可 以 被 看 成 是 一 种 特 殊 类 型 的 黑 板 风 格 点 对 点 风 格 或 面 向 对 象 风 格 如 果 客 户 机 / 服 务 器 模 式 中 的 构 件 既 能 作 为 客 户 机 也 能 作 为 服 务 器, 那 么 我 们 就 可 以 称 它 为 点 对 点 在 这 种 风 格 下, 构 件 就 是 那 些 点, 任 何 的 构 件 都 可 以 要 求 其 它 的 构 件 进 行 服 务 面 向 对 象 计 算 模 型 很 好 的 诠 释 了 这 种 模 式, 如 果 我 们 把 构 件 作 为 对 象, 接 口 作 为 方 法 调 用, 那 么 我 们 就 得 到 了 这 种 风 格 这 种 风 格 从 根 本 上 是 由 中 间 件 提 供 连 接 支 持 的, 就 像 CORBA 或 者.NET 进 程 通 讯 风 格 或 许 最 古 老 的 分 布 式 计 算 模 型 就 是 进 程 通 信 了, 进 程 通 信 风 格 即 延 伸 于 此 这 种 风 格 下 的 构 件 是 进 程 或 线 程, 相 互 通 过 信 息 传 递, 或 者 共 享 内 存 来 进 行 通 信, 这 种 风 格 常 用 在 那 些 有 着 多 进 程 或 线 程 的 复 杂 系 统 中 5.5 体 系 结 构 设 计 的 文 档 化 目 前 为 止, 我 们 的 重 点 都 是 通 过 图 来 描 述 体 系 结 构 视 图 在 设 计 阶 段, 图 确 实 是 一 个 不 错 的 方 法, 它 可 以 用 于 探 索 问 题 的 不 同 选 择, 并 且 在 体 系 结 构 决 策 时 可 以 鼓 励 做 出 决 断 和 头 脑 风 暴 但 是, 当 设 计 完 成 后, 体 系 结 构 必 须 正 确 传 给 所 有 的 利 益 相 关 者 用 于 谈 判 和 达 成 协 议 这 就 需 要 用 足 够 的 信 息 来 准 确 地 编 制 体 系 结 构 文 档 如 果 体 系 结 构 没 有 一 个 合 理 的 描 述 文 档, 那 么 它 就 不 可 能 使 读 者 达 成 共 识 因 此, 合 理 制 作 体 系 结 构 文 档 是 和 构 建 体 系 结 构 同 样 重 要 的 问 题 在 这 一 小 节 中, 会 讨 论 体 系 结 构 文 档 需 要 包 含 的 内 容, 其 中 很 多 基 于 文 献 [6, 23,54] 的 建 议

93 就 像 不 同 的 项 目 需 要 不 同 的 视 图, 不 同 的 工 程 也 需 要 不 同 详 细 级 别 的 体 系 结 构 文 档 但 是, 通 常 一 个 描 述 体 系 结 构 的 文 档 应 该 包 含 以 下 的 内 容 系 统 和 体 系 结 构 的 上 下 文 体 系 结 构 视 图 的 描 述 跨 视 图 文 档 我 们 知 道 系 统 体 系 结 构 是 由 系 统 目 标 驱 动 的, 并 且 需 要 相 关 责 任 人 的 参 与 因 此, 体 系 结 构 文 档 首 先 要 涵 盖 的 是 相 关 责 任 人 将 会 评 估 和 关 心 的 内 容 这 部 分 应 给 出 系 统 的 概 览, 不 同 的 责 任 人 所 需 要 评 估 的 系 统 属 性 同 样 有 用 的 还 有 上 下 文 图 表, 它 包 括 系 统 的 范 围 边 界 与 系 统 交 互 的 关 键 行 为 和 数 据 源 上 下 文 图 表 被 频 繁 的 展 示, 它 以 系 统 为 核 心, 展 示 系 统 与 其 相 关 的 人 和 系 统, 包 括 数 据 的 来 源 和 汇 聚 随 着 上 下 文 的 定 义, 文 档 可 以 开 始 描 述 不 同 的 结 构 或 者 视 图 正 如 前 文 所 述, 可 能 会 需 要 不 同 类 型 的 多 个 视 图, 并 且 选 择 哪 个 视 图 依 赖 于 这 个 项 目 的 特 点 和 利 益 相 关 人 的 需 要 体 系 结 构 文 档 中 的 视 图 描 述 几 乎 总 会 包 含 视 图 的 图 形 表 示, 通 常 这 也 就 是 主 视 图 如 前 所 述, 在 任 何 一 个 视 图 中, 都 会 希 望 对 不 同 的 元 素 类 型 使 用 不 同 的 标 识, 并 且 可 以 为 不 同 的 类 型 提 供 不 同 的 关 键 词, 使 读 者 清 晰 辨 识 这 些 不 同 类 型 的 构 件 ( 一 般 通 过 使 用 象 征 标 志 来 代 表 ) 当 然, 保 持 图 表 简 单 有 序 也 很 重 要 如 果 必 要, 保 持 视 图 的 复 杂 性 可 控 ( 利 用 层 次 方 法 实 现 ) 也 可 使 得 主 视 图 简 单 ( 并 且 可 以 像 元 素 结 构 一 样 每 层 展 示 更 多 的 细 节 ) 然 而, 视 图 的 图 形 表 示 并 不 是 视 图 的 完 整 描 述, 它 只 给 人 设 计 的 直 觉, 而 不 能 有 效 地 提 供 设 计 的 细 节 举 个 例 子 说, 一 个 模 块 或 者 构 件 的 目 的 和 功 能 可 以 通 过 它 的 名 字 标 识, 但 这 并 不 充 分 因 此, 视 图 文 档 应 该 包 含 支 持 文 档 一 个 支 持 文 档 应 该 包 含 下 面 的 一 部 分 或 者 所 有 的 条 目 元 素 目 录 (Element Catalog) 提 供 视 图 中 展 现 的 元 素 的 更 多 信 息 另 外 还 描 述 了 元 素 的 目 的 和 接 口 ( 注 意, 体 系 结 构 中 所 有 元 素 都 有 与 其 他 元 素 交 互 的 接 口 ) 所 有 由 元 素 提 供 的 不 同 接 口 都 应 该 被 描 述 清 楚, 接 口 应 该 有 独 特 的 标 识 同 时, 这 个 文 档 规 范 应 该 给 出 元 素 的 语 法 和 语 义 信 息 语 法 信 息 通 常 是 通 过 接 口 基 调 (signature) 给 出 的, 基 调 描 述 了 接 口 的 类 型 及 其 所 涉 的 所 有 参 数 ; 语 义 信 息 描 述 这 个 接 口 是 做 什 么 的 ; 同 时, 接 口 可 能 返 回 的 错 误 也 应 该 清 楚 地 描 述 体 系 结 构 解 释 (Architecture Rationale) 视 图 指 定 了 元 素 和 它 们 之 间 的 关 系, 但 并 没 有 解 释 为 什 么 体 系 结 构 选 择 这 个 特 殊 的 结 构 体 系 结 构 解 释 给 出 了 元 素 选 择 以 及 组 成 方 式 的 原 因 这 个 部 分 也 可 能 提 供 关 于 其 他 可 选 方 案 的 讨 论, 及 为 什 么 没 有 采 纳 的 理 由 这 部 分 讨 论 除 了 对 选 择 进 行 解 释 外, 也 对 架 构 师 在 未 来 希 望 修 改 系 统 时, 指 明 了 一 些 修 改 的 不 合 理 性 行 为 (Behavior) 视 图 给 出 了 体 系 结 构 的 信 息, 但 并 不 代 表 实 际 的 行 为 或 执 行 过 程 因 此, 在 体 系 结 构 中, 需 要 展 示 执 行 中 所 有 的 交 互 有 时, 必 须 了 解 某 些 场 景 下 系 统 的 实 际 行 为 在 争 论 像 死 锁 这 类 的 系 统 属 性 时, 这 些 描 述 是 很 有 用 的 行 为 描 述 对 理 解 系 统 执 行 过 程 很 有 实 际 价 值 在 这 种 情 况 下, 要 使 用 通 信 图 或 顺 序 图 ( 我 们 在 第 六 章 的 OO 设 计 中 会 讨

94 论 ) 这 类 的 图 形 其 它 信 息 (Other Information) 描 述 在 体 系 结 构 创 建 时 没 有 决 定, 但 后 续 需 要 予 以 决 定 的 内 容 比 如, 服 务 器 或 者 协 议 的 选 择 如 果 这 些 选 择 已 经 完 成, 那 么 文 档 中 必 须 予 以 描 述, 因 为 其 修 改 可 能 会 对 体 系 结 构 产 生 影 响 不 同 的 视 图 是 相 关 联 的 目 前, 在 我 们 所 讨 论 的 内 容 中, 视 图 都 是 独 立 表 述 的 因 此, 体 系 结 构 文 档 既 要 描 述 视 图, 也 应 该 描 述 不 同 视 图 间 的 关 系, 这 是 整 个 视 图 文 档 的 主 要 目 的 基 本 上, 文 档 描 述 的 是 不 同 视 图 上 元 素 间 的 关 系 ( 例 如, 模 块 视 图 里 的 模 块 如 何 与 构 件 视 图 里 的 构 件 产 生 联 系, 或 者 C&C 视 图 里 的 构 件 如 何 与 进 程 视 图 里 的 进 程 相 关 联 ) 文 档 的 这 个 部 分 也 能 描 述 整 个 体 系 结 构 选 择 的 理 由, 如 : 为 什 么 选 择 这 个 视 图, 或 为 什 么 有 些 视 图 没 有 被 描 述 然 而, 通 常 不 同 的 视 图 间 的 关 系 是 直 接 的 或 者 非 常 强 在 这 种 情 况 下, 不 同 的 结 构 可 能 看 起 来 相 同, 分 开 描 述 视 图 可 能 会 导 致 重 复 在 这 种 情 况 下, 出 于 实 际 的 原 因, 把 所 有 的 视 图 组 合 成 一 张 是 更 好 的 另 外, 要 消 除 重 复, 这 个 方 法 也 可 以 帮 助 清 楚 地 显 示 出 两 个 视 图 间 的 强 烈 关 系 ( 并 且 这 个 过 程 也 减 少 了 跨 视 图 文 档 ) 组 合 视 图 对 于 需 要 多 张 视 图 的 分 析 者 也 很 有 用, 例 如, 性 能 分 析 师 就 常 常 要 用 到 C&C 视 图 和 配 置 视 图, 所 以, 有 时 对 视 图 进 行 合 并 是 可 取 的 然 而 合 并 视 图 只 有 在 视 图 的 关 系 紧 密 和 直 接 时 才 能 用 否 则 把 多 个 视 图 放 在 一 张 图 内 只 会 使 视 图 杂 乱 无 章 把 多 张 视 图 放 在 一 张 上 的 目 标 不 仅 仅 是 为 了 减 少 视 图 的 数 量, 主 要 还 是 帮 助 理 解 并 显 示 视 图 间 的 关 系 一 个 合 并 视 图 的 例 子 是, 在 模 块 视 图 里 有 多 个 模 块, 它 们 形 成 了 视 图 内 的 不 同 层 次 在 这 种 情 况 下, 显 示 由 这 些 图 层 组 合 的 视 图 可 能 更 自 然, 并 且 把 多 个 模 块 结 构 层 叠 起 来 很 多 层 次 系 统 的 体 系 结 构 实 际 上 就 是 用 的 这 种 方 法 在 这 种 情 况 下, 将 其 一 起 显 示 较 好, 即, 创 建 一 个 混 合 类 型 的 视 图, 其 中 包 括 模 块 视 图 和 C&C 视 图 总 的 来 说, 如 果 映 射 能 以 一 种 简 单 的 方 式 容 易 地 显 示 出 来, 那 么 为 了 达 到 简 单 紧 凑 的 目 的, 就 应 该 合 并 不 同 的 视 图 然 而, 如 果 不 同 视 图 间 的 关 系 很 复 杂 ( 例 如, 不 同 视 图 间 元 素 存 在 多 对 多 关 系 ), 那 还 是 将 它 们 分 开 展 示, 并 单 独 指 定 其 关 联 为 佳 这 儿 讨 论 的 一 般 结 构 可 作 为 体 系 结 构 文 档 的 一 个 导 引 然 而, 体 系 结 构 文 档 的 主 要 目 的 是 把 体 系 结 构 清 楚 地 描 述 给 责 任 相 关 人, 以 完 成 后 期 的 分 析 如 果 此 节 内 容 对 于 达 成 此 目 的 有 所 冗 余, 则 应 去 除 这 些 冗 余 内 容 同 样, 如 果 信 息 不 够, 那 么 就 得 补 足 最 后, 谈 谈 描 述 体 系 结 构 的 不 同 语 言 的 选 择 话 题 形 式 化 的 体 系 结 构 描 述 语 言 (ADLs), 以 及 非 形 式 化 的 表 示 法 都 是 可 选 的 许 多 人 喜 欢 用 UML 来 描 述 体 系 结 构, 这 使 得 主 要 视 图 的 描 述 有 多 种 可 能, 并 且 可 以 支 持 文 档 上 的 注 释 功 能 我 们 相 信, 只 要 目 标 相 同, 任 何 方 法 都 可 以 用 如 果 要 使 其 更 灵 活, 我 们 建 议 使 用 针 对 特 定 问 题 的 表 示 法 但 请 一 定 注 意 遵 循 对 好 的 视 图 表 示 法 的 建 议, 并 且 在 文 档 头 部 对 表 示 法 进 行 综 合 定 义

95 5.6 体 系 结 构 评 估 软 件 体 系 结 构 影 响 了 一 些 非 功 能 的 关 键 属 性, 如 可 修 改 性 性 能 可 靠 性 可 移 植 性 等 等 比 起 选 择 设 计 和 编 码, 体 系 结 构 对 一 些 属 性 有 更 显 著 的 影 响 也 就 是 说, 尽 管 算 法 和 数 据 结 构 的 选 择 对 大 部 分 的 属 性 都 很 重 要, 但 还 是 没 有 体 系 结 构 的 选 择 对 其 影 响 大 提 出 一 个 体 系 结 构 时, 对 这 些 属 性 进 行 论 证 能 对 软 件 产 生 很 大 的 影 响 系 统 体 系 结 构 设 计 中, 常 常 改 变 设 计 方 案 就 可 以 满 足 这 些 非 功 能 性 属 性 非 功 能 质 量 属 性 有 很 多 体 系 结 构 并 不 能 显 著 地 影 响 所 有 的 这 些 属 性, 有 显 著 影 响 的 属 性 包 括 性 能 可 靠 性 可 访 问 性 部 分 安 全 性 可 修 改 性 可 重 用 性 和 可 移 植 性, 有 轻 度 影 响 的 如 可 用 性 (usability) 这 样 的 属 性 如 何 评 估 一 个 体 系 结 构 的 非 功 能 性 属 性 呢? 对 于 性 能 和 可 靠 性 来 说, 可 以 用 形 式 化 的 方 法 进 行 评 估, 如 排 队 网 络 这 样 的 技 术 然 而, 对 于 每 个 构 件 的 执 行 时 间 和 可 靠 性, 通 常 评 估 所 需 要 的 信 息 都 超 出 了 体 系 结 构 描 述 的 范 围 另 外 一 个 方 法 就 是 过 程 化 进 行 一 系 列 的 模 拟 步 骤 后, 主 观 评 估 对 体 系 结 构 非 功 能 性 属 性 的 影 响 一 种 常 用 的 非 形 式 化 分 析 方 法 如 下 : 首 先, 分 辨 出 体 系 结 构 的 哪 些 属 性 需 要 评 估, 这 些 属 性 通 常 是 由 相 关 责 任 人 认 定 各 个 不 同 的 责 任 人 感 兴 趣 的 属 性 的 集 合 ; 然 后 将 这 些 属 性 列 在 一 张 表 上, 并 对 于 表 中 的 每 一 个 属 性 做 一 个 基 于 经 验 的 主 观 的 分 析, 评 估 出 体 系 结 构 要 支 持 它 们 的 级 别 分 析 时 可 以 为 每 个 属 性 提 出 个 级 别 ( 像 : 好, 中, 差 ), 或 者 只 是 简 单 的 提 出 是 否 满 意 基 于 这 些 分 析 的 结 果, 体 系 结 构 要 么 被 接 受, 要 么 被 拒 绝 如 果 被 拒 绝, 那 么 此 属 性 就 需 要 在 体 系 结 构 中 予 以 改 善 有 许 多 体 系 结 构 评 估 的 技 术, 这 些 技 术 的 一 个 调 查 报 告 见 [29] 5.7 小 结 软 件 体 系 结 构 提 供 了 一 个 高 层 次 的 视 图, 描 述 了 系 统 的 各 个 部 分 及 它 们 如 何 组 成 系 统 根 据 系 统 如 何 划 分, 可 以 得 到 不 同 的 系 统 体 系 结 构 图 因 此, 软 件 系 统 的 体 系 结 构 被 定 义 为 系 统 的 结 构 ( 包 括 软 件 元 素, 它 们 的 可 见 属 性 及 其 关 系 ) 体 系 结 构 便 于 产 生 高 质 量 的 系 统 它 也 可 用 以 分 析 像 性 能 这 样 在 软 件 生 命 周 期 早 期 要 达 到 的 系 统 目 标 系 统 体 系 结 构 有 三 种 最 重 要 的 视 图 模 块 图 构 件 / 连 接 件 图 配 置 图 在 模 块 视 图 中, 系 统 使 用 编 程 结 构 描 述, 如 包 类 函 数 等 ; 在 C&C 视 图 中, 系 统 是 所 有 称 为 构 件 的 运 行 实 体 的 集 合, 这 些 构 件 可 以 通 过 连 接 件 与 其 它 构 件 交 互 ; 配 置 图 描 述 了 不 同 的 软 件 单 元 如 何 被 部 署 在 系 统 的 硬 件 资 源 内 C&C 视 图 是 最 常 见 的, 通 常 也 是 体 系 结 构 描 述 的 核 心 通 过 框 图 指 定 不 同 的 构 件 和 不 同 的 连 接 件 可 以 描 述 这 个 视 图 C&C 视 图 有 一 些 常 用 的 风 格, 在 创 建 系 统 体 系 结 构 图 时 非 常 有 用 这 些 包 括 : 管 道 和 过 滤 器 共 享 数 据 客 户 端 服 务 器 发 布 订 阅 点 对 点 进 程 通 信 等 每 一 种 风 格 都 描 述 其 中 构 件 和 过 滤 器 的 类 型, 并 且 描 述 了 怎 么 使 用 它 们

96 管 道 和 过 滤 器 风 格 有 一 种 构 件 类 型 ( 过 滤 器 ) 和 一 种 连 接 件 类 型 ( 管 道 ), 并 且 构 件 可 以 通 过 管 道 连 接 客 户 端 服 务 器 风 格 有 两 种 构 件 类 型 ( 客 户 端 和 服 务 器 ) 和 一 个 连 接 件 ( 请 求 或 应 答 的 消 息 传 递 机 制 ) 一 个 客 户 端 只 能 与 一 个 服 务 器 通 信, 并 且 交 互 是 通 过 客 户 端 发 起 共 享 数 据 风 格 有 两 个 构 件 类 型, 它 们 是 仓 库 和 数 据 访 问 构 件 数 据 访 问 构 件 可 以 从 仓 库 中 读 / 写 数 据, 并 且 数 据 访 问 构 件 可 以 通 过 仓 库 共 享 信 息 体 系 结 构 是 系 统 及 其 他 设 计 与 开 发 活 动 的 基 石, 所 以 体 系 结 构 需 要 编 制 很 好 的 文 档 一 个 正 确 的 体 系 结 构 文 档 应 该 描 述 体 系 结 构 的 设 计, 创 建 不 同 的 体 系 结 构 视 图, 以 及 描 述 视 图 间 的 关 系 体 系 结 构 描 述 要 指 定 不 同 元 素 的 类 型 及 其 行 为, 并 对 体 系 结 构 设 计 进 行 解 释 应 该 评 估 体 系 结 构 是 否 满 足 需 求, 一 个 常 用 的 方 法 是 对 这 些 可 选 的 属 性 做 主 观 的 评 估 自 测 练 习 1. 为 什 么 体 系 结 构 不 仅 仅 是 由 系 统 的 各 部 分 及 其 相 互 关 系 组 成 的 一 个 结 构? 2. 在 构 件 连 接 件 结 构 中, 什 么 是 不 同 的 体 系 结 构 风 格? 3. 考 虑 一 个 交 互 性 网 站, 它 提 供 许 多 特 征 以 执 行 不 同 的 任 务 使 用 共 享 数 据 风 格 和 客 户 端 - 服 务 器 风 格 分 别 建 模 其 体 系 结 构 你 更 倾 向 于 哪 一 种? 为 什 么? 4. 体 系 结 构 文 档 中 需 要 包 含 哪 些 内 容? 5. 从 可 修 改 性 角 度, 你 如 何 评 估 体 系 结 构?

97 第 六 章 设 计 当 需 求 和 体 系 结 构 设 计 文 档 达 到 可 用 时, 就 可 以 进 入 设 计 阶 段 了 设 计 过 程 中, 进 一 步 完 善 软 件 的 体 系 结 构 通 常, 设 计 的 重 点 是 在 第 五 章 中 讨 论 的 模 块 视 图 (module view), 也 就 是 在 设 计 期 间, 我 们 要 确 定 系 统 需 要 什 么 模 块 哪 些 模 块 必 须 开 发 出 来 通 常, 模 块 视 图 可 以 有 效 地 转 变 为 体 系 结 构 中 每 一 个 构 件 的 模 块 结 构 因 此, 设 计 活 动 的 主 要 工 作 是 完 成 构 件 的 模 块 结 构 然 而, 构 件 和 模 块 间 的 简 单 映 射 并 不 总 是 有 效 的, 因 此 我 们 必 须 确 保 设 计 中 完 成 的 模 块 视 图 与 体 系 结 构 的 一 致 性 系 统 设 计 本 质 上 是 为 系 统 的 解 决 方 案 绘 制 核 心 蓝 图 或 者 规 划 这 里, 我 们 把 系 统 当 作 一 组 明 确 定 义 了 行 为 的 模 块, 这 些 模 块 在 定 义 好 的 方 式 和 环 境 下 相 互 影 响, 并 产 生 行 为 或 者 服 务 软 件 系 统 的 设 计 过 程 通 常 有 两 个 层 次 第 一 层 的 重 点 是 决 定 系 统 需 要 哪 些 模 块 模 块 的 规 范 以 及 不 同 模 块 之 间 如 何 交 互 这 个 过 程 称 为 模 块 设 计 或 者 概 要 设 计 ; 在 第 二 层 次, 重 点 是 模 块 内 部 设 计, 也 就 是 定 义 模 块 如 何 实 现 的 规 范, 这 一 设 计 常 称 为 详 细 设 计 或 者 逻 辑 设 计 详 细 设 计 极 大 的 扩 充 了 系 统 设 计, 使 其 包 含 了 更 多 的 处 理 逻 辑 细 节 和 数 据 结 构 说 明, 从 而 使 设 计 完 全 满 足 编 码 设 计 方 法 论 指 的 是, 应 用 一 系 列 技 术 和 原 则 创 建 设 计 的 系 统 化 方 法 大 多 数 设 计 方 法 论 聚 焦 于 模 块 设 计, 但 这 些 方 法 论 很 难 将 设 计 活 动 归 结 为 设 计 师 可 以 完 全 机 械 化 执 行 的 一 系 列 步 骤 在 这 一 章 中, 我 们 将 讨 论 : 模 块 化 聚 合 耦 合 开 闭 原 则 等 关 键 设 计 概 念 面 向 功 能 的 系 统 设 计 所 使 用 的 结 构 图 表 示 法 采 用 结 构 化 设 计 方 法 的 系 统 结 构 图 面 向 对 象 的 一 些 关 键 概 念, 以 及 面 向 对 象 设 计 中 可 使 用 的 统 一 建 模 语 言 UML (Unified Modeling Language) 使 用 UML 设 计 面 向 对 象 系 统 的 例 子 详 细 设 计 的 一 些 原 则 如 何 验 证 设 计 度 量 设 计 复 杂 性 的 几 种 量 化 指 标 6.1 设 计 的 基 本 概 念 如 果 一 个 准 确 依 照 系 统 设 计 而 构 建 的 系 统 能 满 足 系 统 的 需 求, 那 么 可 以 认 为 系 统 设 计 是 正 确 的 显 然, 设 计 阶 段 的 目 标 是 构 造 正 确 的 设 计 然 而, 正 确 性 并 不 是 设 计 好 坏 的 唯 一 标 准, 因 为 可 能 存 在 许 多 种 正 确 的 设 计 设 计 过 程 的 目 标 不 仅 仅 是 为 系 统 构 建 一 个 设 计, 而 是

98 在 目 标 需 求 物 理 与 社 会 环 境 的 限 制 下 找 出 可 能 的 最 佳 (best) 适 应 方 案 为 了 评 估 设 计 的 好 坏, 需 要 指 定 一 些 评 估 标 准 我 们 将 会 重 点 关 注 系 统 模 块 性 (modularity), 这 是 因 为 模 块 性 主 要 取 决 于 系 统 设 计, 而 且 也 是 系 统 设 计 好 坏 的 主 要 评 估 标 准 如 果 系 统 是 由 一 些 离 散 的 模 块 组 成, 那 么 系 统 被 认 为 是 模 块 化 的 (modular) 在 模 块 化 的 系 统 中, 模 块 可 以 独 立 实 现, 并 且 模 块 的 改 变 对 其 它 模 块 的 影 响 很 小 模 块 性 显 然 是 一 个 值 得 关 注 的 属 性 模 块 性 有 助 于 系 统 调 试, 如 果 系 统 是 模 块 化 的, 将 存 在 的 问 题 定 位 于 独 立 的 模 块 将 更 容 易 ; 也 有 助 于 系 统 修 复, 因 为 一 个 模 块 对 其 它 模 块 的 影 响 很 小, 所 以 改 变 系 统 的 一 部 分 较 为 容 易 ; 模 块 化 也 有 助 于 构 建 系 统, 一 个 模 块 化 的 系 统 很 容 易 通 过 组 装 所 有 模 块 的 方 式 实 现 把 一 个 系 统 简 单 的 砍 成 一 些 模 块 是 不 可 能 实 现 系 统 模 块 化 的 要 模 块 化, 每 一 个 模 块 需 要 支 持 一 个 明 确 的 抽 象 概 念, 以 及 清 晰 的 可 以 与 其 它 模 块 交 互 的 接 口 模 块 化 设 计 必 须 遵 守 一 些 标 准 来 选 择 模 块, 以 保 证 模 块 可 以 支 持 明 确 的 抽 象 并 且 是 可 实 现 的 和 可 修 改 的 耦 合 和 内 聚 是 两 个 经 常 使 用 的 模 块 化 标 准, 我 们 也 会 讨 论 模 块 化 的 另 一 个 标 准, 即 开 放 封 闭 原 则 耦 合 如 果 一 个 模 块 可 以 完 全 不 依 靠 另 一 个 模 块 而 运 行, 那 么 这 两 个 模 块 被 认 为 是 独 立 的 显 然, 如 果 有 两 个 模 块 是 独 立 的, 那 么 它 们 是 可 单 独 实 现 的 和 修 改 的 然 而, 系 统 中 所 有 模 块 不 可 能 都 完 全 独 立, 因 为 模 块 需 要 协 作 产 生 出 系 统 期 望 的 外 部 行 为, 因 此 模 块 之 间 必 须 交 互 模 块 间 联 系 越 多, 模 块 就 越 需 要 了 解 其 他 模 块 如 何 工 作 因 此, 模 块 间 的 联 系 越 少 越 简 单, 就 越 容 易 实 现 理 解 一 个 模 块, 而 不 用 同 时 理 解 其 它 的 模 块 的 思 想 耦 合 是 试 图 捕 捉 不 同 模 块 间 相 互 关 联 强 度 的 概 念 [79, 88] 模 块 间 的 耦 合 (Coupling) 指 度 量 模 块 间 相 互 关 联 的 强 度, 或 者 是 模 块 间 相 互 依 赖 程 度 的 指 标 通 常, 为 了 解 模 块 B, 而 需 要 了 解 模 块 A 越 多, 那 么 模 块 A 与 B 间 的 关 联 就 越 紧 密 高 耦 合 模 块 的 联 系 很 强, 低 耦 合 的 模 块 间 联 系 很 弱, 相 互 独 立 的 模 块 没 有 联 系 为 了 能 独 立 的 开 发 和 修 改 模 块, 我 们 希 望 模 块 间 是 低 耦 合 的 系 统 设 计 阶 段 创 建 了 系 统 的 模 块, 因 此 系 统 设 计 决 策 很 大 程 度 上 决 定 了 系 统 耦 合 度, 而 这 些 耦 合 在 实 现 阶 段 是 无 法 消 减 的 随 着 模 块 复 杂 性 和 含 糊 定 义 的 接 口 增 加, 模 块 间 的 耦 合 度 随 之 增 加 要 保 持 低 耦 合, 需 要 最 小 化 模 块 的 接 口 数 量 以 及 接 口 的 复 杂 性 接 口 用 于 在 模 块 间 传 递 消 息, 当 只 有 模 块 的 调 用 方 式 是 以 规 定 的 接 入 接 口 被 其 它 模 块 调 用, 而 不 是 其 他 方 式 ( 例 如, 通 过 全 局 变 量 ) 时, 才 能 减 少 耦 合 度 如 果 模 块 被 其 它 模 块 通 过 间 接 或 模 糊 接 口 来 调 用 ( 例 如, 直 接 调 用 模 块 的 内 部 函 数 或 使 用 共 享 变 量 的 方 式 ), 模 块 间 的 耦 合 度 将 增 加 接 口 复 杂 度 是 另 一 个 影 响 耦 合 度 的 因 素 接 口 越 复 杂, 耦 合 度 就 越 高 例 如, 接 口 复 杂

99 度 依 赖 于 参 数 的 数 量 和 每 个 参 数 的 复 杂 性 接 口 的 复 杂 性 级 别 由 其 需 要 支 持 的 模 块 间 通 信 所 决 定 然 而, 接 口 使 用 的 往 往 超 过 了 这 个 接 口 必 须 支 持 的 最 小 通 信 数 量 例 如, 如 果 一 个 程 序 需 要 使 用 一 个 记 录 的 某 个 字 段, 往 往 传 递 的 是 整 条 记 录, 而 不 仅 仅 是 那 个 字 段 由 于 传 递 整 条 记 录, 我 们 增 加 了 不 必 要 的 耦 合 度 本 质 上, 应 尽 可 能 的 保 持 模 块 间 接 口 简 单 且 小 巧 接 口 间 信 息 流 动 的 类 型 是 影 响 耦 合 度 的 第 三 个 主 要 因 素 有 两 种 信 息 在 接 口 间 流 动 : 数 据 和 控 制 传 递 或 接 收 控 制 信 息, 意 味 着 模 块 的 行 为 要 依 靠 于 这 条 控 制 信 息, 这 使 得 理 解 和 给 出 模 块 抽 象 定 义 更 为 困 难 在 接 口 间 传 递 数 据 信 息, 意 味 着 一 个 模 块 把 输 入 信 息 传 递 到 另 一 个 模 块 并 返 回 输 出 信 息 这 使 得 模 块 被 当 作 简 单 的 输 入 输 出 ( 执 行 一 些 对 输 入 数 据 加 工 ) 功 能 模 块 通 常, 接 口 耦 合 度 最 低 的 是 只 进 行 数 据 交 互 的 接 口, 其 次 是 只 传 递 控 制 数 据 的 接 口 如 果 数 据 是 混 合 的 ( 也 就 是 说 模 块 间 传 递 的 既 有 数 据 信 息 又 有 控 制 信 息 ), 耦 合 度 被 认 为 是 最 高 的, 这 三 个 影 响 耦 合 度 的 因 素 总 结 在 表 6.1 中 [79] 表 6.1 影 响 耦 合 度 的 因 素 接 口 复 杂 度 连 接 类 型 通 信 类 型 低 耦 合 度 简 单 明 显 通 过 名 字 连 接 数 据 控 制 高 耦 合 度 复 杂 的 隐 含 的 通 过 内 部 元 素 混 合 型 OO 系 统 的 耦 合 表 示 在 一 定 程 度 有 所 不 同, 这 是 因 为 对 象 在 语 义 上 比 函 数 更 为 丰 富 在 OO 系 统 中, 模 块 间 存 在 三 种 不 同 的 耦 合 [30] 交 互 耦 合 构 件 耦 合 继 承 耦 合 交 互 耦 合 (interaction coupling) 在 类 调 用 其 他 类 的 方 法 时, 出 现 交 互 耦 合 在 许 多 方 面, 这 种 情 况 类 似 于 一 个 函 数 调 用 另 一 个 函 数, 因 此 这 种 耦 合 类 似 于 上 面 讨 论 的 模 块 功 能 之 间 的 耦 合 与 功 能 耦 合 一 样, 如 果 某 个 方 法 直 接 访 问 其 他 方 法 的 内 部 组 成 部 分, 这 种 耦 合 度 最 高 如 果 方 法 间 通 过 参 数 交 互, 耦 合 度 最 低 同 上, 如 果 只 有 数 据 传 递, 耦 合 较 低 ; 如 果 传 递 控 制 信 息, 则 耦 合 较 高, 因 为 方 法 被 调 用 时 影 响 了 执 行 过 程 此 外, 如 果 传 递 的 数 据 增 加, 耦 合 度 更 高 因 此, 如 果 传 递 的 是 整 个 数 据 结 构, 而 其 中 只 有 部 分 是 必 需 的, 会 增 加 不 必 要 的 耦 合 度 类 似 的, 如 果 一 个 对 象 被 传 递 给 一 个 方 法 时, 而 在 此 方 法 中 只 有 该 对 象 的 一 部 分 被 使 用, 也 会 增 加 不 必 要 的 耦 合 因 此, 耦 合 最 小 的 情 况 是, 只 使 用 参 数 交 互 只 传 递 有 必 要 的 参 数, 且 参 数 只 传 递 数 据 构 件 耦 合 (component coupling) 是 指 在 两 个 类 之 间, 其 中 一 个 类 有 另 一 个 类 的 变 量 这 种 情 况 发 生 在 以 下 三 个 情 况 : 类 C 与 类 C1 构 件 耦 合, 当 C 有 一 个 C1 类 的 实 例 变 量 ; 或 者 C 有 一 个 带 有 C1 类 型 参 数 的 方 法 ; 或 者 C 有 一 个 带 有 C1 类 型 局 部 变 量 的 方 法 请 注 意, 若 C 是 与 C1 构 件 耦 合, 则 C 可 能 与 C1 的 所 有 子 类 耦 合, 因 为 在 运 行 时,C 可 能 被 实 例 化 为 其 任 何 子 类 应 该 明 确 的 是, 无 论 什 么 时 候 构 件 耦 合, 其 也 有 可 能 同 时 存 在 交 互 耦 合 构 件 耦 合 被 认 为 是 最 弱 的 ( 即 最 希 望 的 ) 耦 合 比 如 在 类 C 中,C1 类 型 的 变 量 可 以 声 明 于 类

100 C 的 某 个 方 法 基 调 (signature, 译 者 注 : 所 有 方 法 参 数 的 组 合 ) 中, 也 可 以 声 明 为 类 C 的 属 性 如 果 不 通 过 构 件 耦 合, 而 通 过 局 部 变 量 发 生 交 互, 则 交 互 对 外 部 不 可 见, 因 此 耦 合 度 增 加 继 承 耦 合 (inheritance coupling) 的 产 生 是 由 于 类 之 间 的 继 承 关 系 如 果 一 个 类 是 另 一 个 类 的 直 接 或 间 接 子 类, 那 么 这 两 个 类 被 认 为 是 继 承 耦 合 那 么 一 个 问 题 是, 如 果 继 承 增 加 耦 合, 为 什 么 不 废 除 继 承 机 制 呢? 原 因 是, 继 承 ( 虽 然 可 能 增 加 局 部 的 耦 合 ) 可 能 会 降 低 整 个 系 统 的 耦 合 举 两 种 情 况 的 例 子 如 果 类 A 与 类 B 耦 合, 而 B 又 有 B1 和 B2 的 两 个 子 类, 这 时 A 既 与 B1 又 与 B2 耦 合 ; 当 方 法 M() 从 B1 和 B2 析 取 出 来, 而 放 进 父 类 B 时, 这 时 因 为 A 只 与 B 耦 合, 系 统 的 耦 合 度 就 降 低 了 另 一 种 继 承 降 低 耦 合 的 情 况 是, 假 设 B 是 一 个 支 持 特 殊 化 与 泛 化 关 系 的 类 层 次 结 构, 类 A 调 用 了 B 的 方 法 这 时 即 使 B 添 加 了 新 的 子 类, 类 A 也 无 需 修 改 代 码 也 就 是 说, 尽 管 改 变 了 B 的 继 承 结 构, 类 A 也 不 需 要 修 改 代 码 如 果 没 有 继 承 结 构, 则 B 的 变 化 很 可 能 会 导 致 必 须 修 改 A 的 代 码 然 而, 也 有 些 情 况 下 继 承 耦 合 比 其 它 耦 合 程 度 要 高 最 糟 糕 的 情 况 是, 当 子 类 B1 修 改 了 B 的 一 个 方 法 的 基 调 ( 译 者 注 : 该 方 法 所 有 参 数 的 集 合,signature) 或 删 除 了 该 方 法 这 种 修 改 违 背 了 IS - A 关 系 的 真 正 精 神, 而 极 易 导 致 运 行 时 错 误 如 果 修 改 方 式 是 保 留 基 调, 但 改 变 方 法 的 实 现, 尽 管 可 能 不 会 导 致 运 行 时 错 误, 但 同 样 违 背 IS - A 关 系, 因 此 也 应 该 避 免 耦 合 最 小 的 方 式 是 增 加 子 类 的 实 例 变 量 和 方 法, 但 不 修 改 任 何 继 承 关 系 内 聚 上 文 提 到 处 于 不 同 模 块 的 元 素 之 间 关 系 最 小 化 时, 耦 合 度 随 之 减 小 也 就 是 说, 当 不 同 模 块 的 元 素 间 联 系 很 少 甚 至 没 有 联 系 时 耦 合 度 减 小 另 一 种 达 到 此 目 的 的 方 法 是 最 大 化 模 块 内 元 素 间 的 联 系, 从 而 加 强 模 块 内 部 元 素 的 联 系 内 聚 是 描 述 模 块 内 部 元 素 联 系 紧 密 程 度 [79, 88] 的 概 念 对 于 内 聚, 我 们 感 兴 趣 的 是 如 何 判 定 模 块 内 不 同 元 素 间 联 系 的 紧 密 度 内 聚 代 表 模 块 内 元 素 联 系 的 密 切 度, 模 块 的 内 聚 给 设 计 者 提 供 了 这 么 一 个 思 路, 即 元 素 是 否 应 该 归 属 于 同 一 模 块 内 聚 和 耦 合 联 系 很 明 显, 通 常 来 说, 模 块 的 内 聚 度 越 大, 模 块 间 的 耦 合 度 就 越 小 这 个 关 联 并 不 总 是 成 立, 但 却 是 符 合 实 践 经 验 的 从 内 聚 的 程 度 而 言, 有 以 下 几 个 级 别 : - 偶 然 内 聚 - 逻 辑 内 聚 - 时 间 内 聚 - 过 程 内 聚 - 通 信 内 聚 - 顺 序 内 聚 - 功 能 内 聚

101 偶 然 内 聚 的 级 别 是 最 低 的, 而 功 能 内 聚 级 别 是 最 高 的 当 模 块 元 素 之 间 出 现 偶 然 的 没 有 意 义 的 联 系 时 就 会 出 现 偶 然 内 聚 ; 如 果 通 过 将 程 序 切 块 的 方 式 实 现 模 块 化, 也 会 出 现 偶 然 内 聚 ; 如 果 创 建 一 个 模 块 的 目 的 是 连 接 两 部 分 代 码 而 减 少 代 码 重 复, 那 么 此 模 块 就 可 能 出 现 偶 然 内 聚 逻 辑 内 聚 出 现 的 情 况 是, 模 块 的 元 素 间 存 在 逻 辑 关 系, 并 且 元 素 执 行 的 功 能 都 属 于 相 同 的 逻 辑 级 别 典 型 例 子 是, 一 个 模 块 执 行 系 统 内 所 有 输 入 或 输 出 在 这 样 的 情 况 下, 如 果 想 输 入 或 输 出 特 定 的 记 录, 就 需 要 将 记 录 传 输 给 该 模 块 通 常, 需 要 通 过 特 殊 的 标 志 来 决 定 模 块 应 该 执 行 哪 些 语 句 除 了 导 致 模 块 间 的 混 杂 的 信 息 流, 这 样 的 模 块 通 常 都 包 含 笨 拙 的 代 码, 这 是 一 种 最 差 的 模 块 内 聚 方 式 一 般 来 说, 应 尽 可 能 避 免 逻 辑 内 聚 模 块 的 出 现 时 间 内 聚 基 本 上 和 逻 辑 内 聚 相 同, 除 此 之 外, 时 间 内 聚 模 块 的 元 素 在 时 间 上 关 联 并 同 时 执 行 执 行 初 始 化 清 理 终 止 这 类 活 动 的 模 块 通 常 都 在 时 间 上 有 联 系 在 时 间 内 聚 的 模 块 内, 尽 管 元 素 间 也 有 逻 辑 关 联, 但 时 间 内 聚 比 逻 辑 内 聚 的 级 别 要 高, 这 是 因 为 元 素 的 执 行 是 同 时 的, 这 样 就 避 免 了 传 递 标 志 的 问 题, 而 且 代 码 也 会 简 洁 一 些 过 程 内 聚 模 块 包 含 的 因 素 隶 属 于 一 个 普 通 的 过 程 单 元 例 如, 模 块 内 的 循 环 或 序 列 的 判 断 语 句 可 能 被 结 合 形 成 一 个 独 立 的 模 块 根 据 流 程 图 划 定 模 块 结 构, 常 常 是 过 程 内 聚 出 现 的 原 因 过 程 内 聚 经 常 跨 越 功 能 的 边 界, 只 存 在 过 程 内 聚 的 模 块 可 能 只 包 括 完 整 功 能 中 的 一 部 分 或 几 个 部 分 通 信 内 聚 的 模 块 内, 元 素 具 有 联 系 的 原 因 是 同 样 的 输 入 或 输 出 数 据 也 就 是 说, 在 通 信 内 聚 的 模 块 中, 元 素 在 一 起 的 原 因 是 它 们 操 作 同 一 组 输 入 或 输 出 数 据, 一 个 例 子 是 印 刷 和 打 孔 记 录 (print and punch) 模 块 通 信 内 聚 的 模 块 可 能 执 行 多 个 功 能, 然 而, 如 果 设 计 时 很 难 找 出 具 有 高 内 聚 性 方 案, 那 么 通 信 内 聚 的 有 效 性 也 是 足 以 令 人 接 受 的 当 模 块 中 存 在 元 素, 一 个 元 素 的 输 出 被 作 为 另 一 种 元 素 的 输 入, 从 而 连 在 一 起 时, 出 现 顺 序 内 聚 如 果 有 一 个 元 素 序 列, 在 该 序 列 中, 一 个 元 素 的 输 出 形 成 了 另 一 个 元 素 的 输 入, 那 么 顺 序 内 聚 并 没 有 提 供 如 何 将 它 们 结 合 到 模 块 中 的 任 何 原 则 功 能 内 聚 是 最 强 的 内 聚 在 功 能 上 受 到 约 束 的 模 块 中, 所 有 的 元 素 都 单 一 功 能 的 执 行 有 关 这 里 的 功 能 不 是 指 简 单 的 功 能, 比 如 算 术 ; 模 块 完 成 的 单 一 目 标 也 在 此 范 围 一 些 功 能 如 计 算 平 方 根 和 排 序 阵 列 是 模 块 功 能 内 聚 明 显 例 子 没 有 任 何 数 学 公 式 可 以 用 于 判 定 模 块 的 内 聚 程 度, 有 效 的 判 断 功 能 内 聚 的 方 法, 就 是 能 用 一 句 话 来 全 面 正 确 的 描 述 模 块 的 功 能 或 目 的, 如 果 不 能 用 一 个 简 单 的 句 子 来 描 述 模 块 的 功 能, 这 个 模 块 就 不 大 可 能 存 在 功 能 内 聚 在 OO 系 统 中, 内 聚 包 括 三 个 方 面 : 方 法 内 聚 类 内 聚 继 承 内 聚

102 方 法 内 聚 (Method cohesion) 与 模 块 中 的 功 能 内 聚 是 一 样 的, 它 关 注 于 为 什 么 把 若 干 不 同 代 码 元 素 放 在 同 一 个 方 法 之 中 内 聚 的 最 高 形 式 是, 每 个 方 法 实 现 一 个 明 确 定 义 的 功 能, 且 方 法 的 所 有 语 句 都 是 为 了 实 现 此 功 能 类 内 聚 关 注 于 为 什 么 把 不 同 的 属 性 和 方 法 放 在 同 一 个 类 中 其 目 标 是, 一 个 类 只 实 现 单 一 的 概 念 或 者 抽 象, 这 个 类 所 包 含 的 元 素, 均 是 为 了 实 现 此 概 念 或 抽 象 而 存 在 的 通 常, 若 一 个 类 里 封 装 了 多 个 概 念, 则 这 个 类 的 内 聚 度 很 低, 应 修 改 变 此 设 计, 使 得 类 只 封 装 单 一 的 概 念 当 一 个 类 体 现 了 多 个 抽 象 概 念 时, 类 所 属 方 法 可 以 分 成 两 组 或 更 多, 每 组 仅 访 问 类 中 特 定 的 属 性 集 也 就 是 说, 可 以 把 类 中 的 方 法 和 属 性 分 组, 每 组 封 装 不 同 的 概 念 很 明 显, 在 这 样 的 情 况 下, 独 立 的 类 封 装 不 同 的 概 念, 可 以 改 善 模 块 的 内 聚 程 度 在 许 多 情 况 下, 虽 然 类 封 装 了 两 个 或 者 更 多 概 念, 但 有 若 干 方 法 可 以 访 问 到 这 些 概 念 的 公 共 属 性, 这 种 情 况 发 生 在 类 代 表 不 同 实 体 的 联 系 为 了 提 高 内 聚 程 度, 最 好 将 它 们 看 做 相 互 间 有 联 系 的 独 立 的 类 也 就 是 说, 这 种 情 况 下 应 该 设 计 多 个 类, 每 个 类 里 有 方 法 可 以 访 问 其 他 类 的 对 象 某 种 意 义 下, 内 聚 的 改 善 会 增 大 耦 合 度 然 而, 对 于 可 修 改 性 和 理 解 性, 最 好 是 每 个 类 单 独 封 装 一 个 概 念 继 承 内 聚 关 注 于 把 类 放 在 一 个 层 次 结 构 里 的 原 因 继 承 有 两 个 主 要 原 因, 第 一 是 对 一 般 _ 特 殊 关 系 进 行 建 模, 第 二 是 代 码 重 用 如 果 该 继 承 层 次 结 构 支 持 概 念 的 一 般 _ 特 殊 关 系 ( 可 以 帮 助 代 码 重 用 ), 则 被 认 为 是 高 内 聚 如 果 该 层 次 里 的 超 类 和 子 类 的 一 般 特 殊 关 系 较 弱, 仅 仅 是 为 了 共 享 代 码, 那 么 这 种 继 承 是 低 内 聚 的 换 句 话 说, 我 们 希 望 在 OO 系 统 里 的 类 层 次 只 支 持 概 念 明 确 的 特 殊 化 关 系 开 闭 原 则 开 闭 原 则 是 OO 一 类 书 籍 中 常 出 现 的 设 计 理 念, 其 基 本 目 标 就 是 帮 助 系 统 易 于 修 改 正 如 内 聚 和 耦 合, 由 于 修 改 和 改 变 是 频 繁 发 生 的, 且 设 计 若 不 易 于 适 应 变 化 则 会 导 致 系 统 被 抛 弃, 也 因 此 无 法 适 应 这 个 变 化 的 世 界, 因 此 设 计 的 基 本 目 标 就 是 促 进 构 建 易 修 改 的 系 统 正 如 Bertrand Meyer 说, 设 计 的 基 本 原 则 是 软 件 实 体 应 当 对 扩 展 (extension) 开 放, 但 对 修 改 关 闭 [66] 一 个 对 扩 展 开 放 的 模 块, 意 味 着 需 求 和 系 统 功 能 的 改 变, 而 需 要 模 块 新 增 功 能 时, 其 行 为 可 以 以 扩 展 的 方 式 适 应 一 个 对 修 改 关 闭 的 模 块, 意 味 着 当 需 要 改 进 时, 已 有 的 模 块 代 码 不 能 被 修 改 那 么 怎 么 通 过 不 改 变 源 代 码 的 方 式 改 进 模 块 呢? 开 闭 原 则 规 定, 改 变 仅 限 于 对 模 块 扩 展, 例 如, 允 许 添 加 新 的 代 码, 但 不 允 许 更 改 现 有 的 代 码 如 果 可 以 做 到 这 一 点, 显 然 有 巨 大 的 价 值, 这 是 因 为 代 码 变 更 涉 及 沉 重 的 风 险, 并 且 确 认 变 更 没 有 产 生 破 坏 往 往 需 要 大 量 的 回 归 测 试 如 果 不 更 改 现 有 代 码, 就 可 以 最 小 化 这 种 风 险 但 是 如 果 不 修 改 代 码, 如 何 进 行 改 进 呢? 开 闭 原 则 说 的 是, 应 该 通 过 增 加 新 代 码, 而 不 是 修 改 已 有 代 码 的 方 式 来 进 行 改

103 进 这 个 原 则 还 有 其 他 的 好 处, 通 常 程 序 员 宁 愿 重 新 写 代 码 也 不 愿 维 护 旧 代 码 但 是 事 实 上, 大 都 数 系 统 都 是 基 于 已 有 软 件 开 发 的 如 果 满 足 开 闭 原 则, 通 过 对 旧 系 统 增 加 新 代 码 就 可 以 扩 展 现 有 系 统, 则 可 最 小 化 代 码 变 更 的 需 要 通 过 合 理 使 用 继 承 和 多 态, 这 一 原 则 在 OO 设 计 中 可 以 满 足 继 承 允 许 创 建 新 类, 在 不 改 变 的 基 础 上 扩 展 已 有 类 的 行 为 可 以 用 这 种 性 质 支 持 开 闭 原 则 举 例 而 言, 考 虑 一 个 应 用 程 序, 其 中 客 户 端 对 象 和 打 印 机 对 象 交 互, 并 为 完 成 印 刷 需 要 调 用 打 印 机 对 象 必 要 的 方 法, 类 图 如 6.1 所 示 Client 0..n 0..n Printer1 图 6.1 不 使 用 子 类 型 的 例 子 这 个 设 计 中, 客 户 直 接 调 用 打 印 机 对 象 的 方 法 来 打 印 设 想 现 在 需 要 为 系 统 增 加 功 能, 使 得 客 户 可 以 使 用 另 外 一 种 打 印 机 在 图 6.1 的 设 计 下, 为 了 实 现 这 种 修 改, 需 要 创 建 一 个 新 的 类 Printer2,Client 类 的 代 码 也 要 改 变 以 使 用 Printer2 类 的 对 象 这 种 设 计 不 支 持 开 闭 原 则, 因 为 如 果 改 变, 客 户 端 就 不 再 封 闭 然 而 这 种 系 统 可 以 以 另 外 一 种 方 式 设 计, 该 方 式 支 持 开 闭 原 则 这 个 设 计 就 是 创 建 了 一 个 抽 象 打 印 机 类, 定 义 打 印 机 接 口 和 打 印 机 支 持 的 所 有 方 法 Print1 可 以 作 为 该 类 的 一 个 特 殊 实 现 这 个 设 计 中 的 Print2 是 以 子 类 的 形 式, 作 为 另 一 种 类 型 的 打 印 机 而 添 加 的 因 为 要 和 Print 类 的 对 象 交 互, 客 户 端 不 需 要 知 道 这 种 子 类 型 也 就 是 说, 客 户 端 仅 需 要 处 理 通 用 的 Print 类, 而 无 论 对 象 是 Print1 或 者 Print2, 其 作 用 域 是 相 同 的 类 图 如 6.2 所 示 正 因 如 此,OO 的 继 承 规 则 有 力 的 支 持 了 开 闭 原 则 其 基 本 思 路 是, 用 一 个 抽 象 类 封 装 概 念 如 果 抽 象 类 需 要 扩 展, 可 以 通 过 创 建 新 的 子 类 完 成, 从 而 保 证 不 改 变 现 有 代 码

104 Client 0..n 0..n Printer Printer1 Printer2 图 6.2 使 用 子 类 型 的 例 子 如 果 以 这 种 方 式 构 造 继 承 层 次, 是 可 以 满 足 里 氏 代 换 原 则 LSP(Liskov Substitution Principle) 的 [65] 里 氏 代 换 原 则 的 意 思 是, 如 果 一 个 程 序 使 用 类 C( 基 类 ) 的 对 象 O,C 有 一 个 子 类 C 1, 那 么 当 O 被 C 1 类 的 对 象 O 1 替 换 后, 该 程 序 应 该 保 持 不 变 如 果 类 的 基 础 层 次 满 足 该 原 则, 那 么 这 个 类 层 次 是 合 理 的, 并 且 它 同 时 支 持 了 开 闭 原 则 还 应 指 出 的 是, 若 是 为 了 支 持 这 个 原 则, 那 么 因 为 继 承 产 生 耦 合 和 内 聚 都 是 合 理 的 6.2 面 向 功 能 设 计 设 计 阶 段 主 要 关 注 如 何 对 软 件 系 统 进 行 设 计 多 年 来, 出 现 了 许 多 设 计 技 术, 针 对 处 理 大 型 系 统 设 计 的 复 杂 性 提 供 一 些 准 则 设 计 方 法 并 不 奢 求 于 要 将 设 计 过 程 简 化 为 一 系 列 机 械 的 步 骤, 而 是 为 了 在 设 计 过 程 中 给 设 计 人 员 提 供 指 导 性 的 意 见 在 本 章, 我 们 讨 论 支 持 面 向 功 能 系 统 设 计 的 结 构 化 设 计 方 法 [79,88] 结 构 化 设 计 方 法 使 用 若 干 用 于 结 构 图 的 表 示 法 来 进 行 设 计 因 此, 在 讨 论 设 计 方 法 之 前, 我 们 先 介 绍 这 些 表 示 法 结 构 图 在 设 计 过 程 中, 图 形 化 的 设 计 表 示 法 经 常 被 用 来 表 示 设 计 或 设 计 决 策, 这 样 使 得 利 益 相 关 者 可 以 以 简 单 的 方 式 对 设 计 进 行 交 流 和 评 估 对 于 一 个 面 向 功 能 的 设 计, 结 构 图 可 以 图 形 化 地 表 示 设 计 程 序 的 结 构 是 由 程 序 的 模 块 以 及 模 块 之 间 的 关 系 组 成 的, 每 一 个 计 算 机 程 序 有 一 个 结 构, 对 于 给 定 的 程 序, 它 的 结 构 是 确 定 的 一 个 程 序 的 结 构 图 是 其 结 构 的 图 形 化 表 示 在 结

105 构 图 中, 模 块 用 一 个 写 着 模 块 名 字 的 方 框 来 表 示 模 块 A 到 模 块 B 的 箭 头 表 示 模 块 A 调 用 模 块 B 模 块 B 称 为 模 块 A 的 下 级 模 块 (subordinates), 模 块 A 称 为 模 块 B 的 上 级 模 块 (superordinates) 箭 头 标 记 包 含 了 输 入 和 输 出, 其 中 输 入 是 模 块 B 接 收 的 参 数, 输 出 是 模 块 B 返 回 的 参 数, 输 出 和 输 入 参 数 的 数 据 流 方 向 使 用 小 箭 头 表 示 参 数 可 以 是 数 据 ( 标 签 尾 部 是 空 心 圆 圈 ) 或 控 制 ( 在 标 签 的 尾 部 是 实 心 的 圆 圈 ) 举 个 例 子, 考 虑 下 面 程 序 的 结 构, 它 的 结 构 如 图 6.3 所 示 main a,n. a,n a a,n sum readnums sort add_n x,y x,y switch 图 6.3 排 序 程 序 的 结 构 图

106 main () { int sum, n, N, a[max ]; readnums (a, &N); sort (a, N); scanf (&n); sum = add_n (a, n); printf ( sum ); } readnums (a, N) int a[], *N; { : } sort (a, N) int a[], N; { : if ( a[i] > a[t] ) switch (a[i], a[t ]); : } /* Add the first n numbers of a */ add_n (a, n) int a[], n; { : }

107 一 般 情 况 下, 结 构 图 中 不 包 含 程 序 过 程 性 的 信 息, 而 重 点 表 示 模 块 的 层 次 结 构 但 是 在 一 些 情 况 下, 设 计 师 可 能 希 望 显 式 地 表 示 某 些 过 程 性 的 信 息, 例 如 主 要 的 循 环 和 主 要 的 选 择 这 些 信 息 也 可 以 在 结 构 图 中 表 示 出 来 例 如, 考 虑 一 个 情 况, 模 块 A 有 下 级 模 块 B C 和 D, 模 块 A 反 复 调 用 模 块 C 和 模 块 D 这 可 以 由 一 个 代 表 反 复 的 箭 头 来 表 示, 这 个 箭 头 联 结 模 块 C 和 模 块 D 并 指 向 模 块 A, 如 图 6.4 中 左 图 所 示, 同 一 循 环 箭 头 封 装 有 公 共 活 动 的 所 有 下 级 模 块 可 以 使 用 类 似 的 方 式 表 示 主 要 的 选 择 例 如, 如 果 模 块 A 依 赖 于 一 些 判 断 结 果 来 决 定 是 否 调 用 模 块 C 和 模 块 D, 这 可 以 由 模 块 A 方 框 中 的 菱 形 来 表 示, 以 这 个 菱 形 作 为 出 发 点, 从 模 块 A 指 向 模 块 C 和 模 块 D 的 箭 头 指 向 对 应 的 模 块, 如 图 6.4 所 示 A A B C D B C D 图 6.4 循 环 和 选 择 的 表 示 在 一 个 系 统 中 模 块 可 分 为 几 类 有 一 些 模 块, 从 其 下 级 模 块 得 到 信 息, 然 后 将 信 息 传 递 给 它 们 的 上 级 这 种 类 型 的 模 块 是 输 入 模 块 (input module) 类 似 的, 输 出 模 块 (output module) 从 它 们 的 上 级 模 块 得 到 信 息, 并 将 信 息 传 给 它 的 下 属 模 块 正 如 模 块 的 名 称, 输 入 和 输 出 模 块 典 型 地 应 用 于 从 环 境 中 收 集 数 据 以 及 向 环 境 输 出 数 据 输 入 模 块 从 源 头 上 得 到 数 据, 并 做 好 预 处 理 ; 输 出 模 块 获 得 产 生 的 输 出, 并 将 其 加 工 为 合 适 的 表 示 法 传 送 到 环 境 中 有 些 模 块 主 要 用 于 把 数 据 转 化 成 其 他 一 些 形 式, 这 样 的 模 块 称 为 加 工 模 块 (transform module), 大 部 分 的 计 算 模 块 都 属 于 这 一 类 模 块 最 后 一 种 模 块 主 要 关 注 如 何 管 理 不 同 下 级 模 块 之 间 的 数 据 流, 这 类 模 块 称 为 协 调 模 块 (coordinate modules) 一 个 模 块 可 以 实 现 超 过 一 种 类 型 的 功 能 结 构 图 通 过 功 能 抽 象, 可 以 很 好 地 表 示 设 计 的 结 果 它 层 次 化 地 显 示 模 块 及 模 块 之 间 的 调 用 记 录 模 块 之 间 的 接 口 以 及 模 块 之 间 的 信 息 传 递 因 此, 对 于 软 件 系 统, 一 旦 它 的 结 构 确 定 了, 这 个 系 统 的 模 块 和 模 块 之 间 的 接 口 及 依 赖 关 系 也 就 确 定 了 结 构 化 设 计 方 法 的 目 标, 就 是 在 设 计 阶 段 确 定 系 统 结 构, 从 而 控 制 系 统 最 终 的 结 构 其 目 的 是, 使 系 统 程 序 可 以 按 照 具 有 层 次 结 构 的 设 计 来 实 现, 模 块 的 功 能 内 聚 以 及 尽 可 能 少 的 模 块 交 互

108 6.2.2 结 构 化 设 计 方 法 没 有 一 个 设 计 方 法 能 够 将 设 计 简 化 为 一 系 列 机 械 执 行 的 步 骤, 设 计 方 法 最 多 是 提 供 一 套 指 南, 这 些 指 南 在 大 多 数 情 况 下, 能 够 在 应 用 中 产 生 一 个 模 块 化 的 简 单 设 计 与 大 多 数 其 他 方 法 一 样, 结 构 化 设 计 背 后 的 基 本 原 则 是 问 题 分 解 (problem partitioning) 结 构 化 设 计 方 法 在 高 层 把 一 个 系 统 分 成 多 个 不 同 的 子 系 统, 一 些 用 来 管 理 主 要 的 输 入, 一 些 用 来 管 理 主 要 的 输 出, 一 些 进 行 主 要 的 加 工 执 行 加 工 的 模 块 在 抽 象 层 处 理 数 据, 因 此 主 要 关 注 于 如 何 求 解 概 念 级 别 的 问 题, 而 不 会 受 到 如 何 获 得 输 入 数 据 以 及 表 示 输 出 数 据 等 问 题 的 干 扰 在 许 多 系 统 中, 特 别 是 数 据 处 理 系 统, 问 题 分 解 的 基 本 原 理 是 系 统 代 码 分 别 负 责 管 理 输 入 和 输 出 处 理 输 入 的 模 块 必 须 处 理 屏 幕 读 取 数 据 格 式 错 误 异 常 信 息 完 整 性 信 息 结 构 等 问 题 同 样, 处 理 输 出 的 模 块 必 须 将 输 出 加 工 为 合 适 的 格 式 画 图 表 产 生 报 告 等 因 此, 对 于 很 多 系 统, 这 就 需 要 有 一 部 分 代 码 专 门 处 理 输 入 和 输 出 系 统 中 实 际 的 加 工 往 往 不 是 很 复 杂 它 处 理 数 据, 使 它 有 适 当 的 格 式 用 来 执 行 加 工, 或 按 要 求 的 格 式 产 生 输 出 这 种 划 分 是 结 构 化 设 计 方 法 的 核 心, 该 方 法 有 四 个 主 要 步 骤 : 1. 使 用 数 据 流 图 描 述 问 题 2. 识 别 输 入 和 输 出 数 据 元 素 3. 第 一 层 分 解 4. 分 解 输 入, 输 出 和 加 工 分 支 现 在, 我 们 将 详 细 讨 论 这 些 步 骤 使 用 数 据 流 图 复 述 问 题 (Restate the Problem as a Data Flow Diagram) 使 用 这 种 方 法, 第 一 步 是 构 建 这 个 问 题 的 数 据 流 图 在 第 三 章, 我 们 已 经 学 习 过 数 据 流 图 然 而, 在 需 求 分 析 时 的 数 据 流 图 和 结 构 设 计 时 的 数 据 流 图 有 着 根 本 的 区 别 在 需 求 分 析 时, 数 据 流 图 描 述 的 是 问 题 域 的 模 型 分 析 师 不 能 影 响 问 题 域, 他 的 任 务 是 从 问 题 中 提 取 所 有 信 息, 并 表 现 为 一 个 数 据 流 图 在 设 计 活 动 中, 我 们 不 再 是 对 问 题 求 解 域 建 模, 而 是 为 最 终 的 系 统 在 问 题 解 域 开 发 模 型 也 就 是 说, 设 计 过 程 中 得 到 的 数 据 流 图 描 述 了 在 最 终 的 系 统 数 据 如 何 流 动 在 这 个 模 型 中, 软 件 的 主 要 加 工 和 功 能 已 经 确 定 了, 数 据 流 图 显 示 了 软 件 主 要 的 加 工 单 元 以 及 数 据 如 何 在 不 同 转 化 单 元 之 间 流 动 ATM 的 数 据 流 图 如 图 6.5 所 示

109 记 录 取 得 美 元 账 号 账 号 借 方 账 号 交 易 记 录 交 易 账 号 记 录 新 账 号 查 询 账 号 记 录 更 新 账 号 获 得 账 号 数 字 和 密 码 账 号 密 码 验 证 账 号 账 号 数 据 库 系 统 数 据 库 图 6.5 ATM 的 数 据 流 图 图 中 有 两 个 主 要 的 输 入 数 据 流, 第 一 个 是 账 号 和 密 码 ; 第 二 个 是 要 扣 除 的 总 额 需 要 注 意 的 是, 在 数 据 流 图 的 不 同 地 方 使 用 的 符 号 * 含 义 不 同 例 如, 加 工 验 证 用 于 验 证 账 号 和 密 码 的 合 法 性, 这 个 加 工 单 元 不 仅 需 要 账 号 和 密 码, 而 且 还 需 要 从 系 统 信 息 数 据 库 获 得 额 外 的 数 据 做 验 证 变 换 付 款 账 户 的 加 工 单 元 有 两 个 输 出, 一 个 用 来 记 录 事 务, 另 外 一 个 用 于 更 新 账 户 信 息 确 定 抽 象 的 输 入 和 输 出 数 据 元 素 (Identify the Most Abstract Input and Output Data Elements) 大 多 数 系 统 通 过 一 些 基 础 的 加 工 功 能 来 执 行 所 需 的 操 作 然 而, 在 大 多 数 情 况 下, 这 些 加 工 功 能 不 能 直 接 的 获 得 实 际 物 理 输 入, 并 产 生 期 望 的 物 理 输 出 实 际 上, 首 先 需 要 把 这 些 输 入 加 工 为 合 适 的 格 式, 使 加 工 单 元 可 以 使 用 它 们 同 样, 主 加 工 模 块 产 生 的 输 出, 往 往 必 须 经 过 整 理 才 能 得 到 期 望 的 物 理 输 出 第 二 步 的 目 的 是 对 数 据 流 图 中 将 输 入 输 出 加 工 为 所 需 格 式 的 加 工 器 与 实 现 计 算 的 加 工 器 进 行 区 分 为 了 实 现 这 种 分 解, 一 旦 数 据 流 图 准 备 好 了, 下 一 步 就 是 确 定 最 抽 象 的 输 入 和 输 出 数 据 流 图 中 包 含 最 抽 象 输 入 数 据 元 素 (The most abstract input data elements), 这 些 数 据 是 将 物

110 理 输 入 数 据 尽 可 能 的 删 减 后, 仍 可 认 为 是 系 统 输 入 的 数 据 最 抽 象 输 入 数 据 元 素 与 实 际 物 理 数 据 很 少 有 相 似 之 处, 这 些 数 据 通 常 是 在 一 系 列 操 作 后 获 得 的 数 据, 例 如 : 错 误 检 查 数 据 验 证 正 确 的 格 式 化 完 成 之 后 在 数 据 流 图 中 识 别 最 抽 象 的 输 入 数 据 元 素 是 从 物 理 输 入 开 始, 朝 着 系 统 输 出 的 方 向, 遍 历 数 据 流 程 图, 直 到 数 据 元 素 几 乎 不 能 被 认 为 是 输 入 目 标 是 尽 可 能 的 在 不 丢 失 数 据 元 素 的 自 然 属 性 情 况 下, 尽 可 能 的 远 离 物 理 输 入, 这 个 过 程 针 对 每 一 个 输 入 流 进 行 确 定 最 抽 象 数 据 项 代 表 了 设 计 师 的 价 值 判 断, 但 选 择 往 往 是 显 而 易 见 的 同 样 地, 确 定 最 抽 象 输 出 数 据 元 素 (most abstract output data elements) 的 方 法, 也 是 从 物 理 输 入 开 始, 朝 着 系 统 输 入 的 方 向, 遍 历 数 据 流 图 这 些 数 据 元 素 离 实 际 的 输 出 数 据 最 远, 但 仍 然 被 认 为 是 输 出 流 这 些 数 据 元 素 被 认 为 是 输 出 的 逻 辑 数 据 项, 在 数 据 流 图 中, 这 些 数 据 项 之 后 的 加 工 基 本 上 是 把 逻 辑 输 出 加 工 成 系 统 需 要 的 输 出 格 式 在 最 抽 象 输 入 和 输 出 数 据 项 之 间 通 常 会 存 在 一 些 加 工 单 元, 这 些 中 心 加 工 单 元 执 行 系 统 中 最 基 本 的 加 工, 将 最 抽 象 的 输 入 加 工 成 最 抽 象 的 输 出 将 中 心 加 工 单 元 分 离 出 来, 以 处 理 最 抽 象 的 数 据 项, 是 为 了 使 加 工 单 元 能 够 专 注 于 执 行 加 工 任 务, 而 不 需 考 虑 如 何 把 数 据 格 式 加 工 数 据 验 证 等 问 题 考 虑 如 图 6.5 中 所 示 的 自 动 取 款 机 的 数 据 流 图 两 个 最 抽 象 的 输 入 是 金 额 和 经 过 验 证 的 账 号 经 过 验 证 的 账 号 是 最 抽 象 的 输 入, 而 不 是 读 入 的 账 号, 因 为 它 虽 然 是 输 入, 但 是 它 有 着 账 号 有 效 性 的 保 障 两 个 抽 象 输 出 是 显 而 易 见 的, 在 数 据 流 图 中, 抽 象 输 入 和 输 出 都 标 记 出 来 了 第 一 级 分 解 (First-level Factoring) 当 确 定 了 中 心 加 工 单 元 和 最 抽 象 的 输 入 和 输 出 数 据 项 后, 已 经 准 备 好 识 别 系 统 的 模 块 我 们 先 指 定 一 个 主 模 块, 它 的 任 务 是 调 用 下 级 模 块 因 此, 主 模 块 是 一 个 协 调 模 块 对 于 每 个 最 抽 象 输 入 数 据 项, 对 应 声 明 一 个 主 模 块 的 下 级 模 块 每 一 个 这 种 模 块 都 是 一 个 输 入 模 块, 它 的 目 的 是 把 对 应 的 最 抽 象 数 据 项 传 给 主 模 块 同 样 地, 对 于 每 个 最 抽 象 输 出 数 据 项, 对 应 声 明 一 个 接 受 主 模 块 数 据 的 下 级 输 出 模 块 每 个 连 接 这 些 输 入 输 出 下 级 模 块 的 箭 头, 都 按 数 据 流 动 方 向 标 记 其 对 应 的 抽 象 数 据 项 最 后, 对 于 每 个 中 心 加 工 单 元, 声 明 一 个 主 模 块 的 下 级 模 块, 这 些 模 块 是 加 工 模 块, 它 们 的 目 的 是 接 受 主 模 块 的 数 据, 并 且 向 主 模 块 返 回 适 当 的 数 据 从 主 模 块 到 加 工 模 块 的 数 据 项 是 在 数 据 流 图 中 相 应 加 工 单 元 的 传 入 箭 头 上, 返 回 的 数 据 项 在 该 加 工 单 元 的 传 出 箭 头 上 必 须 注 意 的 是, 我 们 为 每 个 加 工 单 元 创 建 一 个 加 工 模 块, 为 每 个 数 据 创 建 输 入 / 输 出 模 块 让 我 们 看 看 ATM 的 数 据 流 图 我 们 已 经 知 道 其 中 包 含 两 个 最 抽 象 的 输 入, 两 个 最 抽 象 的 输 出, 以 及 两 个 中 心 加 工 单 元 对 应 地, 我 们 为 这 些 数 据 和 功 能 分 别 描 绘 一 个 模 块, 获 得 如 图 6.6 所 示 的 结 构 图

111 主 模 块 trans $$ acct # rec rec $$ new acct 获 取 账 号 获 取 美 元 数 目 查 询 账 目 记 录 借 方 账 户 更 新 账 目 记 录 交 易 图 6.6 ATM 的 第 一 层 分 解 正 如 我 们 所 看 到 的, 在 数 据 流 图 中 最 抽 象 输 入 和 输 出 数 据 项 被 确 定 以 后, 第 一 级 分 解 很 简 单 主 模 块 是 全 局 控 制 模 块, 在 设 计 实 现 时 它 将 成 为 主 要 的 程 序 或 过 程 这 是 一 个 协 调 模 块, 它 通 过 调 用 输 入 模 块 获 得 最 抽 象 数 据 项, 并 把 这 些 传 给 适 当 的 加 工 模 块, 递 送 加 工 模 块 的 结 果 给 其 他 加 工 模 块, 直 到 得 到 最 抽 象 数 据 项 最 后 将 这 些 数 据 传 送 到 输 出 模 块 分 解 输 入 输 出 和 加 工 分 支 (Factoring the Input, Output, and Transform Branches) 第 一 级 分 解 输 出 的 是 一 个 抽 象 的 高 层 结 构, 其 中 每 个 下 级 模 块 都 有 很 多 处 理 工 作 为 了 简 化 这 些 模 块, 这 些 下 级 模 块 必 须 继 续 分 解, 形 成 更 多 下 级 模 块 来 分 担 相 关 的 工 作 必 须 考 虑 分 解 每 个 输 入 输 出 和 加 工 模 块 让 我 们 从 输 入 模 块 开 始 从 主 程 序 看, 输 入 模 块 的 目 的 是 产 生 一 些 数 据 为 了 分 解 输 入 模 块, 首 先 将 数 据 流 图 中 生 成 数 据 项 的 加 工 单 元 视 为 中 心 加 工 单 元 这 个 新 的 中 心 加 工 单 元 的 分 解 过 程, 与 完 成 第 一 级 分 解 的 过 程 相 同, 只 是 在 这 里 把 输 入 模 块 当 成 主 模 块 实 施 过 程 是, 为 每 个 流 入 新 中 心 加 工 单 元 的 数 据 流, 建 立 一 个 下 级 输 入 模 块 新 创 建 的 输 入 模 块 能 够 被 再 次 分 解, 直 到 达 到 物 理 输 入 分 解 输 入 模 块 时 通 常 不 会 产 生 任 何 下 级 输 出 模 块 输 出 模 块 的 分 解 和 输 入 模 块 的 分 解 是 对 称 的 对 于 输 出 模 块, 我 们 对 输 出 进 行 加 工, 使 其 更 加 接 近 最 终 所 需 输 出 的 数 据 单 元 这 个 单 元 成 为 中 心 加 工 单 元, 对 这 个 模 块 的 每 个 输 出 数 据 流, 对 应 创 建 输 出 模 块 在 分 解 输 出 模 块 时, 通 常 不 会 产 生 新 的 下 级 输 入 模 块 如 果 问 题 的 数 据 流 图 足 够 详 细, 输 入 输 出 模 块 的 分 解 很 简 单 但 是, 中 心 加 工 单 元 的 分 解 没 有 类 似 规 则 我 们 的 目 标 是 确 定 下 级 加 工 单 元, 它 们 将 组 合 起 来 完 成 整 体 加 工 对 于 每 个 新 找 到 的 加 工 单 元, 重 复 这 个 过 程, 直 到 达 到 原 子 模 块 分 解 中 心 加 工 单 元 本 质 上 是 一 个 功 能 分 解 的 过 程, 它 取 决 于 设 计 者 的 经 验 和 判 断 分 解 加 工 模 块 的 方 法 之 一 是, 把 它 当 成 一 个 问 题 并 为 它 画 一 个 数 据 流 图 这 个 数 据 流 图, 输 入 的 是 流 入 该 模 块 的 数 据, 输 出 的 是 模 块 返 回 的 数 据 数 据 流 图 中 每 个 加 工 表 示 为 中 心 单 元 的 下 级 加 工 中 心 加 工 单 元 可 以 通 过 为 数 据 流 图 中 每 个 加 工 创 建 下 级 加 工 来 分 解, 对 每 个 新 的 加 工 模 块 可 以 重 复 这 个 过 程, 直 到 达 到 原 子 模 块 例 子 举 个 确 定 输 入 文 件 中 不 同 单 词 的 数 量 的 例 子, 数 据 流 图 如 图 6.7 所 示

112 这 个 问 题 只 有 一 个 输 入 数 据, 即 输 入 文 件, 期 望 的 输 出 是 统 计 得 到 文 件 中 不 同 单 词 的 总 数 为 了 把 输 入 加 工 成 期 望 的 结 果, 要 做 的 第 一 件 事 是 列 出 文 件 中 所 有 的 单 词 下 一 步 最 好 是 将 列 表 中 的 单 词 排 序, 因 为 这 能 帮 助 更 简 单 地 识 别 不 同 的 单 词 排 序 后 的 列 表 将 被 用 来 统 计 不 同 单 词 的 数 量, 这 个 加 工 单 元 输 出 的 是 期 望 得 到 的 计 数 值, 结 果 会 被 打 印 出 来, 这 个 数 据 加 工 的 顺 序 已 经 在 数 据 流 图 中 描 述 数 据 流 图 中 的 虚 线 弧, 表 示 最 抽 象 输 入 和 最 抽 象 输 出 选 择 最 抽 象 的 输 入 很 容 易, 只 需 要 按 顺 序 查 看 系 统 的 输 入 : 首 先, 将 输 入 文 件 加 工 为 单 词 列 表 这 两 者 本 质 上 只 是 输 入 的 不 同 形 式, 排 序 过 的 单 词 列 表 仍 然 是 输 入, 它 的 内 容 不 变, 只 是 单 词 的 排 序 不 同 这 似 乎 是 最 抽 象 输 入, 因 为 下 一 个 数 据 ( 即, 计 数 值 ) 不 再 只 是 形 式 不 同 我 们 也 能 很 容 易 找 出 最 抽 象 的 输 出, 自 然 的 选 择 ( 通 常 不 会 选 则 输 入 数 据 作 为 最 抽 象 输 出 ) 就 是 计 数 值 因 此, 得 到 一 个 中 心 加 工, 统 计 不 同 单 词 的 数 目, 它 包 含 一 个 输 入 和 一 个 输 出 数 据 项 mai mao 排 序 后 的 表 输 入 获 取 单 词 表 w.l 数 目 打 印 数 目 经 过 了 第 一 级 分 解 之 后, 单 词 统 计 问 题 的 结 构 图 如 图 6.8 所 示 获 取 排 序 后 的 单 词 表 排 序 后 的 单 词 表 图 6.8 第 一 层 分 解 在 这 个 结 构 图 中, 包 含 一 个 输 入 模 块, 它 将 排 好 序 的 单 词 列 表 返 回 主 模 块 输 出 模 块 从

113 主 模 块 得 到 计 数 值 这 个 例 子 中, 只 有 一 个 中 心 加 工 单 元, 对 应 的, 结 构 图 中 只 有 一 个 加 工 模 块 必 须 注 意 的 是, 这 个 加 工 模 块 的 输 入 输 出 数 据 项 与 流 出 流 入 中 心 加 工 单 元 的 输 入 输 出 数 据 项 是 相 同 的 分 解 第 一 级 结 构 中 的 获 取 排 序 后 的 单 词 表 模 块, 得 到 的 结 构 图 如 图 6.9 所 示 生 成 该 模 块 所 要 返 回 的 输 入 数 据 的 加 工 模 块 ( 也 就 是 排 序 加 工 ), 被 当 成 是 中 心 加 工 模 块 它 的 输 入 是 单 词 列 表 因 此, 在 第 一 级 分 解 中, 我 们 有 一 个 输 入 模 块 来 获 得 列 表, 一 个 加 工 模 块 来 排 序 列 表 输 入 模 块 可 以 进 一 步 分 解, 因 为 模 块 需 要 完 成 两 个 功 能, 得 到 一 个 单 词 并 把 它 加 入 到 列 表 值 得 注 意 的 是, 图 中 用 循 环 箭 头 是 描 述 这 个 迭 代 在 这 个 例 子 中, 获 得 最 抽 象 输 出 之 后 只 需 要 一 次 加 工, 所 以 不 必 分 解 输 出 模 块 图 6.9 对 输 入 模 块 的 第 一 次 分 解 ( 为 什 么 没 有 中 文 的 图 ) 对 中 心 加 工 模 块 统 计 不 同 单 词 的 数 目 进 行 分 解, 获 得 结 构 图 如 图 6.10 由 于 这 个 加 工 比 较 简 单, 不 需 要 再 画 数 据 流 图 为 了 确 定 单 词 的 个 数, 我 们 按 顺 序 获 得 列 表 的 每 一 个 单 词, 确 定 它 是 否 与 前 面 的 单 词 相 同 ( 对 于 排 好 序 的 单 词 列 表, 这 个 检 查 足 以 确 定 单 词 是 否 有 重 复 ), 如 果 有 不 同 的 单 词, 则 单 词 个 数 加 一 对 于 这 三 个 不 同 的 功 能, 我 们 都 有 一 个 下 级 模 块 与 其 对 应, 由 此 得 到 结 构 图 如 图 6.10 所 示 图 6.10 对 中 心 加 工 的 分 解 ( 为 什 么 没 有 中 文 的 图 )

114 6.3 面 向 对 象 设 计 近 年, 面 向 对 象 (OO) 软 件 开 发 非 常 盛 行 许 多 新 项 目 都 使 用 OO 技 术 和 语 言 进 行 开 发 OO 系 统 具 有 很 多 优 势,OO 模 型 的 描 述 方 式 更 为 逼 近 问 题 域, 设 计 和 理 解 设 计 也 更 为 容 易 当 需 求 改 变 时, 系 统 中 的 对 象 不 太 受 这 些 变 化 影 响, 从 而 使 修 改 变 得 更 容 易 继 承 和 对 象 的 紧 密 关 联 帮 助 设 计 贴 近 问 题 域 中 的 实 体, 因 此 更 易 于 复 用 举 例 而 言, 新 的 应 用 程 序 能 更 有 效 地 使 用 以 前 开 发 的 模 块, 从 而 减 少 开 发 代 价 和 开 发 时 间 人 们 相 信 OO 方 法 更 为 直 观, 并 为 思 维 和 抽 象 提 供 了 丰 富 的 结 构 更 高 级 的 技 术, 如 常 见 的 设 计 模 式 也 被 发 现 可 以 很 好 的 提 高 重 用 性 ( 设 计 模 式 是 一 种 高 级 课 题, 我 们 不 会 进 一 步 讨 论, 有 兴 趣 的 读 者 可 参 考 文 献 [38] ) 面 向 对 象 设 计 与 面 向 过 程 方 法 的 根 本 差 别 在 于 它 们 使 用 了 不 同 的 抽 象 形 式, 这 需 要 以 不 同 的 思 维 和 系 统 分 解 方 法 可 以 这 么 说, 面 向 对 象 方 法 中, 思 维 对 于 开 发 真 正 的 OO 设 计 是 最 重 要 的 本 章 将 首 先 讨 论 面 向 对 象 一 些 重 要 的 基 本 概 念 然 后 再 描 述 OO 设 计 时 会 用 到 的 统 一 建 模 语 言 UML, 最 后 是 介 绍 一 个 面 向 对 象 设 计 实 例 面 向 对 象 基 本 概 念 这 里 简 单 讨 论 一 下 面 向 对 象 的 主 要 概 念 对 OO 语 言 熟 悉 的 读 者 对 这 些 概 念 会 很 熟 悉 类 和 对 象 类 和 对 象 是 OO 设 计 中 基 本 的 元 素, 就 象 函 数 ( 和 程 序 ) 是 面 向 过 程 设 计 的 基 本 元 素 一 样 对 象 是 封 装 了 一 些 状 态 且 能 为 其 他 客 户 端 程 序 提 供 服 务 的 实 体, 客 户 端 程 序 可 以 是 另 一 个 对 象 程 序 或 者 用 户 对 象 基 本 的 属 性 是 封 装 : 对 象 封 装 了 它 所 包 含 的 数 据 和 信 息, 并 支 持 良 好 抽 象 意 义, 一 系 列 外 部 对 象 可 以 调 用 的 服 务 形 成 了 对 象 的 接 口 对 象 的 某 些 操 作 只 能 在 内 部 使 用, 而 不 能 在 外 部 使 用, 这 些 操 作 不 是 接 口 的 组 成 成 员 封 装 的 一 个 主 要 优 点 是, 定 义 的 数 据 操 作 对 封 装 内 的 数 据 访 问 是 有 限 制 的 如 果 外 部 的 程 序 可 以 直 接 操 作 对 象 内 部 数 据 结 构, 数 据 完 整 性 很 难 保 证 因 此, 在 封 装 的 支 持 下, 更 加 容 易 确 保 数 据 的 完 整 性 封 装 接 口 与 实 现 的 分 离 使 得 接 口 不 变 时, 改 变 其 实 现 不 会 影 响 到 客 户 端 程 序 对 象 的 状 态 定 义 是 对 象 封 装 的 数 据 对 象 的 一 个 重 要 属 性 是 状 态 的 存 在 性, 与 函 数 或 者 程 序 中 定 义 的 数 据 相 比, 数 据 在 函 数 没 有 运 行 ( 或 者 运 行 完 成 ) 时 会 丢 失, 而 对 象 的 状 态 在 其 生 命 期 一 直 存 在, 除 非 这 个 对 象 被 主 动 的 销 毁 对 象 的 状 态 和 服 务 一 起 定 义 了 对 象 的 行 为 可 以 认 为 对 象 行 为 是 对 象 如 何 对 其 状 态 改 变 进 行 反 应, 以 及 对 象 如 何 调 用 其 他 对 象 的 服 务 和 操 作 通 常, 对 对 象 来 说, 对 象 定 义 的 操 作 确 定 了 对 象 的 行 为 对 象 代 表 了 OO 系 统 中 运 行 时 的 基 本 实 体, 它 们 占 用 内 存 空 间, 保 存 其 状 态 以 及 按 定 义

115 好 的 方 式 提 供 操 作 另 一 方 面, 类 定 义 了 一 个 可 能 的 对 象 集 合 对 象 的 属 性 值 组 成 了 对 象 的 状 态, 因 此 对 象 的 类 定 义 了 对 象 拥 有 的 属 性 类 只 提 供 定 义, 它 不 创 建 对 象, 也 不 能 保 存 任 何 值 一 旦 对 象 创 建, 就 会 得 到 一 个 私 有 的 实 例 变 量 副 本, 对 象 执 行 类 定 义 的 操 作 时, 它 就 执 行 在 这 个 特 别 的 对 象 的 状 态 上 类 和 对 象 的 关 系 就 像 类 型 和 类 型 元 素 的 关 系 类 代 表 着 拥 有 共 用 结 构 和 行 为 的 对 象 的 集 合, 而 对 象 是 类 的 实 例 对 象 间 的 关 系 (Relationships among Objects) 对 象 作 为 独 立 存 在 的 实 体, 它 的 能 力 是 有 限 的 它 只 提 供 其 定 义 好 的 服 务 任 何 复 杂 的 系 统 都 会 由 许 多 不 同 的 类 的 对 象 组 成, 这 些 对 象 相 互 交 互, 以 致 整 个 系 统 的 对 象 都 可 以 相 见 OO 系 统 中, 对 象 通 过 发 信 息 到 其 它 的 对 象 的 方 式, 驱 动 其 提 供 服 务, 从 而 达 到 对 象 间 交 互 的 目 的 对 象 接 收 到 请 求 消 息 时, 会 唤 醒 被 请 求 的 服 务 或 者 方 法, 如 果 需 要 的 话, 它 还 会 返 回 运 行 结 果 这 种 客 户 - 服 务 器 形 式 的 交 互 是 封 装 和 抽 象 的 直 接 反 应 如 果 对 象 调 用 其 它 对 象 的 服 务, 我 们 可 以 说 这 两 个 对 象 相 关 如 果 对 象 使 用 了 其 它 对 象 的 服 务, 两 个 对 象 间 就 有 关 联 这 关 联 也 称 连 接 (Link) 如 果 对 象 调 用 了 另 一 个 对 象 的 服 务, 连 接 存 在 于 一 个 对 象 与 另 一 个 对 象 之 间 编 程 时, 连 接 频 繁 的 以 指 针 形 式 展 现 连 接 显 示 对 象 之 间 的 信 息 流 向 然 而, 当 连 接 存 在 时, 尽 管 消 息 是 流 向 被 连 接 方 的, 但 信 息 可 能 是 双 向 的 ( 例 如, 服 务 端 可 能 返 回 结 果 给 客 户 端 ) 伴 随 着 关 联 而 来 的 问 题 是 可 见 性, 那 就 是, 对 象 应 该 对 谁 可 见 基 本 问 题 是 如 果 从 对 象 A 到 B 有 一 个 关 联, 因 为 A( 客 户 端 ) 可 以 发 一 个 消 息 到 B( 服 务 端 ), 那 么 B 必 须 对 A 可 见 有 不 同 的 方 法 可 以 提 供 可 见 性 一 些 可 能 的 重 要 方 法 有 [15]: 提 供 者 (supplier) 对 象 对 客 户 来 说 是 全 局 的 提 供 者 对 象 是 发 送 消 息 的 客 户 对 象 定 义 的 操 作 的 参 数 提 供 者 对 象 是 客 户 对 象 的 一 部 分 在 一 些 操 作 中 声 明 提 供 者 对 象 为 局 部 变 量 对 象 间 的 关 联 抓 住 了 客 户 / 服 务 器 的 类 型 关 系, 另 一 种 对 象 间 关 系 是 聚 合, 它 反 映 了 全 部 / 或 部 分 关 系 尽 管 不 必 要, 但 聚 合 通 常 暗 示 着 包 含 也 就 是 说, 如 果 对 象 A 是 对 象 B 和 C 的 聚 合, 那 么 对 象 B 和 C 就 包 含 于 对 象 A( 尽 管 聚 合 概 念 有 时 未 必 实 际 反 映 对 象 的 包 含 关 系 ) 聚 合 关 系 的 关 键 在 于, 被 包 含 对 象 不 能 独 立 于 包 含 对 象 而 独 立 存 在, 而 关 联 则 不 属 于 这 种 情 况 继 承 和 多 态 性 继 承 是 类 之 间 的 关 系, 在 一 个 存 在 的 类 的 基 础 上 继 承 允 许 定 义 和 实 现 一 个 类 [62] 当 类 B 继 承 类 A,B 就 是 A 的 子 类 或 派 生 类,A 是 父 类 或 基 类 通 常, 子 类 B 有 两 个 部 分 : 派 生 部 分 和 增 量 部 分 [62] 派 生 部 分 是 从 类 A 上 继 承 来 的, 增 量 部 分 是 特 别 地 加 在 B 上 的 新 的 代 码 和 定 义 它 们 间 的 关 系 见 图 6.11[62] 类 B 的 对 象 既 有 增 量 部 分 也 有 派 生 部 分 因 此, 只 要 定 义 增 量 部 分, 再 从 一 个 类 中 继 承 派 生 部 分, 就 能 定 义 一 个 包 含 两 部 分 的 对 象

116 X 基 类 is-a 派 生 部 分 ( 来 自 X) 增 量 部 分 ( 新 ) Y- 派 生 类 图 6.11 继 承 继 承 常 常 叫 做 is-a 关 系, 意 味 着 类 B 的 一 个 对 象 也 是 类 A 的 一 个 实 例 尽 管 父 类 可 能 不 止 一 个 实 例, 子 类 的 实 例 也 是 父 类 的 实 例 类 之 间 的 继 承 关 系 形 成 一 个 层 次 正 如 前 文 所 讨 论, 一 个 很 重 要 的 问 题 是, 层 次 反 映 了 应 用 领 域 里 的 一 个 结 构, 而 不 是 仅 仅 为 了 重 用 类 的 部 分 代 码 层 次 的 判 定 标 准 是, 类 的 对 象 也 是 问 题 域 中 该 类 的 所 有 父 类 的 对 象 继 承 的 特 点 在 于, 子 类 的 所 有 公 共 特 征 能 集 中 在 其 父 类 中 换 句 话 说, 特 征 可 以 被 置 于 更 高 层 次 的 抽 象 中 一 旦 如 此, 子 类 可 以 继 承 父 类 的 特 征 并 直 接 使 用 这 意 味 着, 如 果 有 许 多 定 义 可 用 的 抽 象 类, 当 需 要 一 个 新 类 时, 新 类 可 能 是 一 个 或 多 个 现 有 类 的 特 殊 化 在 这 种 情 况 下, 可 以 通 过 继 承 现 有 类 来 定 义 新 类 继 承 可 分 为 两 种 类 型 : 严 格 继 承 和 不 严 格 的 继 承 [77] 在 严 格 继 承 中, 子 类 需 要 从 父 类 继 承 所 有 功 能, 并 添 加 额 外 的 功 能 以 完 成 特 殊 化 也 就 是 说, 基 类 中 的 所 有 数 据 成 员 和 操 作, 在 派 生 类 中 也 可 用 这 种 形 式 支 持 is- a 关 系, 是 最 简 单 的 继 承 形 式 在 不 严 格 继 承 中, 子 类 不 包 含 父 类 的 所 有 特 征 或 子 类 重 新 定 义 某 些 特 征, 这 不 符 合 里 氏 替 换 原 则 类 的 层 次 有 时 不 是 简 单 的 树 状 结 构, 而 可 能 是 一 个 图 这 意 味 着 类 可 以 从 多 个 类 继 承 这 种 从 多 个 父 类 继 承 的 继 承 方 式, 称 为 多 重 继 承 多 重 继 承 问 题 更 复 杂, 通 常 不 鼓 励 使 用, 我 们 将 假 设 不 使 用 多 重 继 承 继 承 带 来 多 态 的 概 念, 这 是 一 个 被 广 泛 应 用 类 型 理 论 (type theory) 的 概 念, 它 使 得 对 象 可 以 属 于 不 同 的 类 型 面 向 对 象 编 程 中, 多 态 的 出 现 形 式 是, 引 用 可 以 在 不 同 时 间 指 向 不 同 的 对 象 面 向 对 象 系 统 中, 有 继 承 则 必 须 支 持 多 态 原 因 是 继 承 支 持 的 is-a 关 系, 对 象 x 声 明 为 B 类 的 实 例, 那 么 x 也 是 B 的 任 意 父 类 A 的 实 例 因 此, 需 要 A 的 实 例 的 时 候, 就 可 以

117 使 用 x 因 为 多 态, 实 体 可 以 拥 有 静 态 类 型 和 动 态 类 型 [62] 静 态 类 型 保 持 不 变, 是 程 序 中 声 明 的 对 象 类 型 另 一 方 面, 动 态 类 型 随 时 可 变, 仅 在 引 用 时 确 定 实 体 一 旦 声 明, 该 实 体 的 类 型 可 以 在 编 译 时 通 过 类 继 承 层 次 结 构 的 类 型 集 合 确 定 对 象 的 动 态 类 型 是 此 类 型 集 合 中 的 一 个, 但 只 能 在 对 象 引 用 时 确 定 其 实 际 动 态 类 型 多 态 需 要 支 持 对 操 作 的 动 态 绑 定 动 态 绑 定 意 味 着, 直 到 调 用 程 序 时, 才 知 道 实 际 调 用 的 代 码 [62] 举 个 例 子, 假 设 x 是 个 多 态 引 用, 它 的 静 态 类 型 是 B, 但 其 动 态 类 型 可 以 是 A 或 B 假 设 类 A 有 一 个 操 作, 类 B 又 重 新 定 义 了 O() 现 在, 当 调 用 x 的 操 作 O(), 我 们 不 知 道 将 执 行 哪 部 分 静 态 代 码 也 就 是 说, 将 要 执 行 的 语 句 x.o() 是 在 运 行 时 决 定 的, 依 赖 于 x 的 动 态 类 型 如 果 动 态 类 型 是 A, 则 类 A 中 的 操 作 O() 将 被 执 行 ; 如 果 动 态 类 型 是 B, 则 类 B 中 的 操 作 O() 将 被 执 行 动 态 绑 定 在 开 发 应 用 程 序 时, 可 以 有 效 减 少 代 码 量 多 态 性 特 征, 本 质 上 是 对 特 征 的 重 载 ( 例 如, 在 不 同 上 下 文 中, 一 个 特 征 可 以 意 味 着 不 同 的 功 能, 只 有 运 行 时 才 能 明 确 其 功 能 定 义 ) 在 严 格 继 承 体 系 中, 重 载 不 会 有 问 题, 因 为 子 类 可 以 访 问 超 类 的 所 有 特 征 但 不 严 格 继 承 中 的 重 载 可 能 导 致 问 题, 因 为 子 类 可 能 因 为 重 载 失 去 某 些 特 征 由 于 功 能 的 绑 定 是 在 运 行 时 动 态 决 定 的, 所 以 当 对 象 绑 定 到 超 类 中 不 存 在 的 功 能 时, 可 能 导 致 运 行 错 误 统 一 建 模 语 言 UML UML 是 一 种 表 达 面 向 对 象 设 计 的 图 形 表 示 法 [35] 它 被 称 为 一 种 建 模 语 言, 而 不 是 设 计 表 示 法, 因 为 它 可 以 表 示 系 统 的 各 个 方 面, 而 不 仅 仅 是 需 要 被 编 程 实 现 的 设 计 对 于 面 向 对 象 设 计, 只 需 描 述 系 统 中 各 个 类 的 规 约 可 能 就 足 够 了, 然 而 在 设 计 过 程 的 建 模 阶 段, 设 计 师 还 要 试 图 了 解 不 同 的 类 是 如 何 关 联 的, 以 用 它 们 如 何 交 互 以 提 供 所 需 的 功 能 在 这 些 方 面 进 行 建 模, 有 助 于 建 立 更 有 可 能 满 足 系 统 需 求 的 设 计 由 于 UML 具 有 创 造 不 同 模 型 的 能 力, 所 以 它 除 了 是 表 达 设 计 的 方 法, 更 成 为 理 解 系 统 设 计 系 统 的 辅 助 手 段 虽 然 UML 现 在 已 发 展 成 为 一 个 非 常 全 面 和 大 型 的 建 模 表 示 法, 但 是 我 们 只 会 关 注 少 数 与 类 类 之 间 的 关 联 和 交 互 相 关 的 核 心 概 念 和 符 号 对 于 UML 的 更 详 细 的 讨 论, 读 者 可 以 参 考 [35] 类 图 (Class Diagram) UML 类 图 是 一 个 设 计 或 模 型 的 核 心 部 分 顾 名 思 义, 类 图 描 述 设 计 中 的 类 由 于 一 个 面 向 对 象 实 现 的 最 终 代 码 主 要 是 类, 所 以 这 些 图 与 最 终 的 代 码 有 非 常 密 切 的 联 系 目 前 有 许 多 将 类 图 加 工 成 代 码 骨 架 的 工 具, 从 而 避 免 了 类 图 被 程 序 员 人 为 加 工 为 类 定 义 时 可 能 出 现 的 错 误 类 图 定 义 为 1. 系 统 中 存 在 的 类 (Classes that exist in the system)--- 类 图 除 了 能 够 描 述 类 名, 还 能 够 描 述 一 个 类 重 要 的 属 性 和 方 法 2. 类 之 间 的 关 联 (Associations between classes)--- 类 图 能 够 描 述 不 同 类 之 间 存 在 的 不

118 同 种 类 的 关 联 3. 子 类, 基 类 关 系 (Subtype, supertype relationship)--- 利 用 多 态 可 以 给 出 一 个 类 型 间 的 层 次 结 构, 则 一 些 类 会 成 为 另 一 些 类 的 子 类 类 图 也 可 以 表 示 这 种 层 次 关 系 在 类 图 中, 类 用 矩 形 表 示, 这 个 矩 形 被 划 分 成 三 个 部 分 最 上 面 的 部 分 给 出 了 类 名 按 照 惯 例 类 名 是 一 个 首 字 母 大 写 的 单 词 ( 一 般 来 说, 如 果 类 名 是 许 多 单 词 的 组 合, 那 么, 每 个 单 词 第 一 个 字 母 是 大 写 的 ); 中 间 部 分 列 出 了 这 个 类 关 键 的 属 性 或 域, 属 性 描 述 了 这 个 类 的 对 象 所 拥 有 的 状 态 按 照 惯 例, 属 性 的 名 称 以 小 写 开 头, 如 果 包 含 多 个 单 词, 每 个 新 单 词 首 字 母 大 写 底 部 列 出 了 类 的 方 法 或 操 作, 它 们 代 表 了 类 可 以 提 供 的 行 为 命 名 习 惯 与 属 性 相 同, 但 为 了 表 明 它 是 一 个 函 数, 名 称 用 () 结 束 ( 如 果 需 要 的 话, 方 法 的 参 数 也 可 以 指 定 ) 如 果 一 个 类 是 一 个 接 口 ( 有 详 细 的 规 约 声 明, 但 没 有 具 体 实 现 ), 可 以 通 过 在 类 名 上 面 写 出 衍 型 标 记 <<interface>> 来 表 明 相 似 地, 如 果 一 个 类 / 方 法 / 属 性 有 一 些 性 质 我 们 想 要 指 定, 可 以 标 记 它 们, 即 在 它 们 的 名 称 旁 用 { 和 } 括 上 这 个 性 质, 或 者 也 可 以 使 用 一 些 特 殊 的 标 记 符 号 图 6.12 展 示 了 一 个 有 标 记 值 的 类 以 及 一 个 接 口 的 类 图 例 子 Queue {private} front:int {private} rear:int {readonly}max:int {public} add(element:int) {public} remove():int {protected} isempty():boolean calculatearea():double calculateperimeter():double 图 6.12 类, 衍 型 和 标 记 值 矩 形 内 的 内 容 用 来 描 述 一 个 类 作 为 单 独 实 体 时 的 主 要 特 点, 然 而, 类 与 类 之 间 有 关 系, 不 同 的 类 的 对 象 之 间 还 有 交 互 因 此, 为 一 个 系 统 或 应 用 软 件 建 模, 必 须 表 示 出 类 与 类 之 间 的 关 系 一 种 常 见 的 关 系 是 一 般 - 特 殊 关 系, 这 种 关 系 最 终 被 映 射 成 继 承 层 次 结 构 在 这 种 层 次 结 构 中, 具 有 普 遍 意 义 的 性 质 被 分 配 到 一 个 更 一 般 的 类 基 类 中 ; 能 够 使 对 象 进 一 步 细 化 的 性 质 被 放 在 子 类 中 基 类 的 所 有 性 质 都 由 子 类 继 承, 除 此 以 外, 子 类 还 包 含 它 自 身 的 一 些 性 质 一 般 - 特 殊 关 系 通 过 从 子 类 指 向 基 类 的 箭 头 来 表 示, 空 心 三 角 箭 头 与 基 类 相 接 通 常, 当 一 个 类 有 多 个 子 类, 可 以 使 用 一 个 箭 头 指 向 基 类, 然 后 从 该 箭 头 绘 制 不 同 的 线 到 达 不 同 的 子 类 在 此 层 次 结 构 中, 特 殊 化 是 基 于 一 些 辨 别 器 (discriminator) 来 完 成 的 辨 别 器 用 于 描 述 一 个 基 类 产 生 的 多 个 子 类 之 间 具 有 区 别 的 那 个 性 质 换 句 话 说, 通 过 使 用 辨 别 器, 属 于 基 类 的 对 象 被 划 分 为 属 于 不 同 子 类 的 对 象 一 般 - 特 殊 关 系 中 使 用 的 辨 别 器 可 以 直 接 标 记 在 箭 头 连 线 上 如 何 利 用 UML 对 一 般 - 特 殊 关 系 建 模 的 例 子 如 图 6.13 所 示

119 学 生 员 工 本 科 生 职 工 教 职 工 图 6.13 类 层 次 在 这 个 例 子 中, IITKPerson 类 代 表 所 有 属 于 IITK 的 人, 这 些 人 大 致 分 为 两 个 子 类, 学 生 和 员 工, 这 两 类 人 有 许 多 不 同 的 性 质 ( 也 有 些 共 同 的 ) 和 不 同 的 行 为 类 似 的, 学 生 有 两 个 不 同 的 子 类, 本 科 生 和 研 究 生, 各 自 有 一 些 不 同 属 性 和 不 同 的 约 束 员 工 有 代 表 教 职 员 工 和 研 究 人 员 的 子 类 ( 此 层 次 结 构 来 源 于 一 个 为 研 究 所 开 发 的 实 际 工 作 系 统 ) 除 了 一 般 - 特 殊 关 系, 另 一 种 常 见 的 关 系 是 关 联 关 联 允 许 对 象 相 互 通 信 两 个 类 之 间 的 关 联 意 味 着 一 个 类 的 对 象 在 执 行 它 自 己 的 服 务 时, 需 要 其 他 类 的 对 象 提 供 的 服 务 这 种 关 系 表 现 了 这 些 类 的 对 象 可 以 互 相 使 用 对 方 的 服 务 关 联 关 系 可 以 在 两 个 类 之 间 使 用 一 条 连 线 表 示 一 个 关 联 可 以 通 过 标 记 关 联 线 指 定 名 称 ( 关 联 也 可 以 指 定 一 些 自 己 的 属 性 ), 命 名 关 联 两 端 的 角 色 在 一 个 关 联 中, 每 一 端 可 以 标 识 一 个 多 重 数, 以 此 表 示 1 对 1 1 对 多 等 类 型 的 关 联 当 要 标 识 一 个 确 定 数 目 的 多 重 性 时, 在 关 联 一 端 加 上 那 个 数 字 ; * 表 示 不 确 定 数 目 (0 或 0 个 以 上 ) 的 多 重 性 IITK Person * Advances 图 6.14 类 之 间 的 聚 合 和 关 联 另 一 种 关 系 是 部 分 - 整 体 关 系, 它 表 示 一 个 对 象 是 由 许 多 部 分 组 成, 每 个 部 分 本 身 也 是 一 个 对 象 这 种 关 系 表 示 了 组 合 或 聚 合, 也 就 是 说, 一 个 类 的 对 象 包 含 在 另 一 个 类 的 对 象 中 ( 组 合 和 聚 合 可 以 有 区 别 地 对 待 和 表 示, 但 此 处 我 们 认 为 它 们 是 相 同 的 ) 为 了 表 示 聚 合 关 系, 使 用 一 端 带 有 菱 形 的 线 连 接 代 表 整 体 的 类 ( 位 于 菱 形 一 端 ) 和 代 表 部 分 的 类 通 常 在 具 体 实 现 时, 这 种 关 系 和 关 联 关 系 会 采 用 相 同 的 方 式 因 此, 整 体 - 部 分 关 系 有 时 在

120 建 模 时 就 被 建 立 为 一 个 关 联 关 系 关 联 和 聚 合 关 系 如 图 6.14 所 示, 用 以 扩 展 之 前 关 于 IITK 的 例 子 一 个 IITKPerson 类 的 对 象 包 含 两 个 Address 类 的 对 象, 代 表 着 永 久 地 址 和 当 前 地 址 它 还 包 含 一 个 BiometricInfo 类 的 对 象, 它 保 存 着 这 个 人 的 个 人 信 息, 例 如 照 片 和 签 名 由 于 这 些 对 象 对 所 有 人 都 是 通 用 的, 所 以 它 们 属 于 基 类 而 不 是 子 类 一 个 IITKPerson 类 的 对 象 ( 即 隶 属 于 IITK 的 一 个 人 ) 允 许 从 该 研 究 所 取 得 一 些 预 付 款, 以 满 足 旅 游 医 疗 等 的 需 要 因 此, 预 付 款 (Advances) 是 一 个 完 全 不 同 的 类 ( 也 许 它 也 有 其 所 属 的 层 次 结 构 ), 而 IITKPerson 类 和 Advances 类 具 有 1 对 多 的 关 联 关 系 ( 图 中 这 些 关 系 也 是 来 源 于 实 际 系 统 ) 类 图 重 点 在 类 上 面, 不 应 与 对 象 图 混 淆 对 象 是 类 的 具 体 实 例 有 时, 建 模 具 体 的 对 象 和 它 们 之 间 的 关 系 是 可 取 的, 那 时 对 象 图 才 被 使 用 对 象 的 表 示 和 类 相 似, 除 了 一 点, 即 对 象 的 名 称 需 要 明 确 表 明 它 所 属 的 类 一 般 来 说, 对 象 名 称 的 开 头 小 写, 类 名 在 一 个 冒 号 后 指 定 为 了 更 清 楚 的 表 示, 整 个 对 象 名 称 带 下 划 线, 例 如 mylist: List 对 象 的 属 性 值 可 以 在 属 性 名 后 被 指 定 ( 例 如,name= 约 翰 ) 顺 序 图 和 协 作 图 类 图 表 示 系 统 的 静 态 结 构 也 就 是 说, 它 们 表 现 了 实 现 系 统 所 需 代 码 的 结 构, 以 及 代 码 中 不 同 类 之 间 的 关 系 但 是 类 图 没 法 表 示 系 统 的 动 态 行 为 也 就 是 说, 类 图 无 法 表 示 系 统 在 执 行 某 个 功 能 时 的 具 体 行 为 这 是 通 过 顺 序 图 或 协 作 图, 合 称 为 交 互 图 来 实 现 交 互 图 通 常 用 于 描 述 一 个 用 例, 以 及 系 统 中 不 同 对 象 如 何 协 作 以 实 现 一 个 用 例 的 模 型 让 我 们 先 讨 论 在 两 种 交 互 图 中 更 常 见 的 顺 序 图 顺 序 图 表 示 了 以 下 信 息 : 当 不 同 对 象 协 作 以 提 供 一 些 所 需 的 系 统 功 能 ( 或 实 现 用 例 ) 时, 它 们 之 间 的 一 系 列 消 息 交 换, 以 及 这 些 交 换 之 间 的 时 序 绘 制 顺 序 图 一 般 是 为 了 描 述 特 定 用 例 下, 对 象 之 间 的 交 互 请 注 意, 在 一 个 顺 序 图 ( 以 及 在 协 作 图 ) 中, 参 与 的 是 对 象, 而 不 是 类 当 描 述 动 态 行 为 时, 类 的 作 用 是 有 限 的, 因 为 在 程 序 执 行 过 程 中 存 在 的 只 是 对 象 在 一 个 顺 序 图 中, 所 有 参 与 交 互 的 对 象 以 包 含 其 名 称 的 方 框 表 示, 位 于 图 的 顶 部 对 于 每 一 个 对 象, 一 条 向 下 的 棒 条 代 表 了 其 生 命 线 由 箭 头 表 示 消 息, 从 一 个 对 象 的 生 命 线 到 另 一 个 对 象 的 生 命 线 每 条 消 息 都 有 名 字 作 为 标 记, 通 常 应 是 目 标 对 象 所 属 类 的 一 个 方 法 名 一 个 对 象 还 可 以 进 行 自 我 调 用, 表 示 为 一 个 消 息 的 起 点 和 重 点 位 于 同 一 条 生 命 线 为 了 表 明 消 息 的 顺 序 和 消 息 之 间 的 相 对 时 序, 时 间 的 表 示 方 法 是 离 上 方 的 对 象 名 越 远, 即 生 命 线 的 越 长, 代 表 的 时 间 就 越 长 也 就 是 说,Y 轴 代 表 时 间, 向 下 增 加

121 图 6.15 打 印 毕 业 论 文 的 顺 序 图 使 用 对 象 的 生 命 线 和 消 息 箭 头, 可 以 为 对 象 的 生 存 期, 以 及 消 息 如 何 从 一 个 对 象 流 动 到 另 一 个 对 象 建 模 然 而, 只 有 在 一 定 条 件 下 从 一 个 对 象 到 另 一 个 对 象 才 能 频 繁 发 送 消 息 这 个 条 件 可 以 在 顺 序 图 中 表 示, 即 在 消 息 名 称 前 用 括 号 来 指 定 如 果 一 条 消 息 发 送 到 多 个 接 收 对 象, 那 么 这 个 多 重 性 需 在 消 息 的 名 称 前 添 加 一 个 * 来 表 现 出 来

122 每 条 消 息 都 有 一 个 回 应 : 当 操 作 完 成 时, 返 回 值 ( 如 果 有 的 话 ) 给 发 起 这 条 消 息 的 对 象, 虽 然 返 回 消 息 经 常 可 以 不 显 式 地 表 示 出 来, 但 有 时 可 能 需 要 明 确 地 指 明 返 回 消 息 返 回 消 息 通 过 使 用 一 个 虚 线 箭 头 表 示 一 个 顺 序 图 例 子 如 图 6.15 所 示 这 个 例 子 是 关 于 打 印 学 生 的 毕 业 报 告, 为 了 获 取 有 关 信 息,GradReport 类 的 对 象 ( 它 负 责 打 印 报 告 ) 将 消 息 发 送 到 Student 类 的 对 象,Student 类 的 对 象 再 从 CourseTaken 类 的 对 象 中 获 得 学 生 参 与 的 课 程, CourseTaken 类 的 对 象 从 Course 类 的 对 象 中 获 取 课 程 的 信 息 协 作 图 还 表 示 对 象 如 何 通 信, 与 顺 序 图 中 使 用 基 于 时 间 轴 的 表 示 法 相 比, 协 作 图 看 起 来 更 象 一 个 状 态 图 每 个 对 象 在 图 中 都 有 表 示, 一 个 对 象 发 送 到 另 一 个 对 象 的 消 息 由 从 一 个 对 象 到 另 外 一 个 对 象 的 被 编 号 的 箭 头 表 现 换 言 之, 与 顺 序 图 利 用 图 形 化 的 方 式 表 示 消 息 之 间 的 顺 序 不 同, 协 作 图 利 用 给 消 息 编 号 来 表 示 消 息 之 间 的 时 间 关 系 需 要 说 明 的 是, 两 种 类 型 的 交 互 图 在 语 义 上 是 等 价 的, 具 有 相 同 的 表 现 力 上 面 例 子 以 协 作 图 来 表 示, 即 图 6.16 所 示 近 年 来, 顺 序 图 变 得 越 来 越 受 欢 迎, 因 为 人 们 发 现 时 序 的 图 像 化 表 示 能 够 被 人 更 快 地 掌 握 GradReport GraduationReport Student_obj:Student 2:getGrades() Course_obj: Course 4:ReturnDetails() Student_obj:Student 3:getCourseDetails() 图 6.16 打 印 毕 业 论 文 的 协 作 图 正 如 我 们 所 看 到 的, 交 互 图 是 对 系 统 执 行 某 项 功 能 时 的 系 统 内 部 动 态 行 为 的 建 模 系 统 的 内 部 动 态 特 性 是 通 过 对 象 之 间 如 何 交 互 来 展 现 的 通 过 交 互 图, 我 们 可 以 清 楚 地 看 到 一 个 系 统 内 部 是 如 何 实 现 一 个 操 作, 以 及 不 同 对 象 之 间 传 递 了 何 种 信 息 如 果 我 们 无 法 使 用 已 有 的 类 图 来 为 系 统 中 的 某 个 操 作 构 建 一 个 合 理 的 交 互 图, 就 可 以 说 目 前 的 系 统 结 构 不 支 持 这 个 操 作, 必 须 改 进 系 统 结 构 进 而, 我 们 可 以 通 过 这 种 方 式 来 验 证 按 类 图 设 计 出 来 的 系 统 是 否 能 够 提 供 需 要 的 服 务 由 于 一 个 系 统 中 有 多 个 功 能, 且 每 个 功 能 都 涉 及 多 个 不 同 的 对 象 及 不 同 的 交 互 方 式, 因 此 我 们 需 要 为 系 统 中 的 每 一 个 功 能 或 用 例 设 计 一 个 动 态 模 型 换 言 之, 尽 管 用 一 个 类 图 就 可 以 表 现 整 个 系 统 的 代 码 结 构, 都 需 要 很 多 图 来 表 达 系 统 的 动 态 行 为 由 于, 为 系 统 中 的 每

123 一 个 使 用 场 景 画 一 张 交 互 图 是 不 可 行 的, 通 常 情 况 下, 在 设 计 阶 段 我 们 只 为 一 些 关 键 的 用 例 或 功 能 画 交 互 图 我 们 可 以 利 用 这 些 交 互 图 来 保 证 已 有 的 类 图 切 实 能 够 提 供 需 要 的 用 例, 以 及 理 解 这 些 用 例 的 动 态 特 性 其 他 图 表 和 功 能 UML 是 一 种 可 扩 展 复 杂 的 建 模 方 法 前 面 我 们 已 经 讨 论 了 为 系 统 建 模 时 的 两 种 最 通 用 的 模 型 类 图 和 交 互 图 将 这 两 者 结 合 起 来 可 以 帮 助 设 计 者 实 现 系 统 的 静 态 结 构 及 动 态 行 为 建 模 但 是 由 于 系 统 的 许 多 其 他 侧 面 同 样 需 要 建 模, 因 此 需 要 更 多 的 模 型, 为 此,UML 提 供 了 许 多 不 同 类 型 的 模 型 的 表 示 法 在 建 模 和 构 建 系 统 中, 正 如 我 们 所 看 到 的, 构 件 也 可 以 被 使 用 构 件 封 装 成 大 元 素, 并 在 语 义 上 比 类 简 单 构 件 通 常 封 装 子 系 统, 并 提 供 明 确 定 义 的 通 过 这 些 构 件 可 以 被 系 统 中 其 他 构 件 使 用 的 接 口 在 设 计 一 个 体 系 结 构 时, 正 如 我 们 所 看 到 的, 构 件 是 非 常 有 用 的 UML 提 供 一 个 用 于 指 定 一 个 构 件 符 号 和 用 于 指 定 一 个 子 系 统 的 单 独 符 号 在 一 个 大 型 系 统 中, 许 多 类 可 以 被 组 合 成 包, 其 中 包 可 能 是 许 多 元 素 的 集 合, 这 些 元 素 很 可 能 是 不 同 的 类 型 UML 还 提 供 了 用 来 指 定 包 的 符 号, 这 些 元 素 都 显 示 在 图 6.17 中 Math Printing <<subsystem>> Data storage 图 6.17 子 系 统, 构 件 和 包 正 如 第 5 章 所 讨 论 的, 系 统 的 部 署 视 图 与 构 件 或 模 块 视 图 是 截 然 不 同 的 在 部 署 视 图 中, 重 点 是 哪 个 软 件 元 素 使 用 哪 个 硬 件, 也 就 是, 该 系 统 如 何 部 署 UML 有 部 署 视 图 的 表 示 符 号 主 要 元 素 是 一 个 节 点, 表 示 为 一 个 命 名 的 立 方 体, 它 代 表 一 个 像 CPU 一 样 的 实 际 存 在 的 计 算 机 资 源 立 方 体 的 名 称 标 识 了 资 源 以 及 它 的 类 型 在 立 方 体 内 软 件 元 素 部 署 的 节 点 ( 可

124 以 是 构 件, 包, 类 等 ) 都 是 使 用 它 们 各 自 的 符 号 节 点 显 示 出 来 如 果 不 同 的 节 点 互 相 沟 通, 这 通 过 连 接 节 点 的 线 表 示 出 来 包 部 署 视 图 等, 从 不 同 的 角 度 提 供 了 的 系 统 的 结 构 视 图 UML 还 提 供 相 应 符 号 来 表 达 不 同 的 行 为 类 型 状 态 图 是 一 个 模 型, 建 立 模 型 的 实 体 被 看 成 是 一 个 状 态 集 合, 当 某 些 事 件 发 生 时, 状 态 之 间 发 生 转 变 一 个 状 态 表 示 为 带 有 圆 边 的 矩 形, 椭 圆 形 或 者 圆 形 ; 箭 头 表 示 两 个 状 态 间 的 变 换 描 述 也 可 以 附 加 在 变 换 上 面 状 态 图 通 常 被 用 来 为 类 对 象 的 行 为 建 立 模 型 --- 状 态 代 表 对 象 的 不 同 状 态, 变 换 表 示 在 对 象 上 的 不 同 操 作 的 执 行 因 此, 鉴 于 交 互 图 捕 捉 对 象 之 间 如 何 合 作, 状 态 图 模 仿 当 操 作 在 其 上 执 行 时, 一 个 对 象 如 何 演 化 这 有 助 于 清 楚 地 了 解, 并 指 定 类 的 行 为 活 动 图 (Activity Diagram) 这 是 对 动 态 行 为 进 行 建 模 的 另 一 种 图, 它 的 目 的 是 当 系 统 执 行 某 些 功 能 时, 通 过 系 统 内 部 发 生 的 活 动 对 系 统 进 行 建 模 每 个 活 动 用 一 个 椭 圆 形 表 示, 活 动 的 名 称 标 示 在 椭 圆 形 里 面 从 一 个 活 动 开 始, 系 统 执 行 至 其 他 活 动 通 常, 下 一 步 执 行 的 活 动 取 决 于 一 些 判 断 判 断 用 菱 形 表 示, 并 连 接 至 多 个 活 动 ( 这 些 活 动 称 为 判 断 的 选 择 ) 重 复 执 行 的 活 动 也 可 以 通 过 活 动 图 展 示 这 类 图 表 像 是 流 程 图, 但 也 可 用 于 表 示 一 个 系 统 里 面 并 行 执 行 的 活 动 通 过 将 一 个 活 动 分 解 成 多 个 活 动 或 者 将 多 个 活 动 在 他 们 完 成 之 合 并 ( 同 步 ) 来 表 达 并 行 执 行 的 活 动 UML 是 一 种 可 扩 展 的 建 模 方 式, 它 使 得 建 模 者 能 够 更 灵 活 地 表 达 新 出 现 的 概 念 在 许 多 情 况 下, 建 模 者 需 要 一 些 类 似 于 已 有 的, 然 而 又 不 完 全 一 样 的 表 示 方 式 例 如, 在 某 些 情 况 下, 我 们 可 能 要 指 定 一 个 类 是 一 个 抽 象 类 还 是 一 个 接 口 与 为 这 些 概 念 指 定 特 殊 表 示 方 式 不 同 的 是,UML 使 用 衍 型 的 概 念 通 过 衍 型,UML 使 用 现 有 的 表 示 方 式 来 为 不 同 的 概 念 建 模 现 有 的 表 示 方 式, 比 如 类 的 表 示, 可 以 通 过 衍 型 的 方 式 在 <<>> 里 为 一 个 新 的 概 念 指 定 名 称, 用 于 表 示 一 些 其 它 相 似 的 概 念 我 们 已 经 看 到 前 面 一 个 例 子, 元 类 可 以 用 相 似 的 方 式 进 行 描 述 ; 工 具 类 ( 工 具 类 具 有 可 以 直 接 使 用 的 功 能, 但 不 适 合 于 用 来 创 建 对 象 ) 也 同 样 可 以 表 示 标 记 值 可 以 用 来 指 定 它 们 所 依 附 元 素 的 额 外 性 质, 它 们 可 以 附 加 于 任 何 名 称, 并 用 {} 指 定 虽 然 标 计 值 可 以 用 于 表 达 建 模 者 想 要 的 任 何 概 念, 但 是 最 好 将 其 限 制 在 几 个 明 确 定 义 ( 和 预 先 约 定 ) 的 性 质 之 内, 比 如 私 有 抽 象 询 问 (query) 只 读 等 等 说 明 也 可 以 附 加 到 一 个 模 型 中 的 各 类 元 素, 我 们 在 图 6.12 已 经 看 到 过 一 些 使 用 了 的 标 记 值 的 元 素 用 例 图 也 是 UML 的 一 部 分, 我 们 在 前 面 的 章 节 中 已 经 讨 论 过 用 例 在 用 例 图 中, 每 个 用 例 用 一 个 节 点 表 示, 参 与 者 和 用 例 之 间 的 关 系 使 用 弧 线 表 示, 他 们 大 多 用 来 为 系 统 的 使 用 提 供 高 层 概 括 设 计 方 法 论 研 究 者 们 提 出 过 多 种 设 计 和 分 析 的 方 法 论 就 如 之 前 所 说, 方 法 论 一 般 都 使 用 概 念 ( 比

125 如 OO) 为 设 计 活 动 提 供 设 计 原 则 虽 然 方 法 论 很 有 用, 但 并 不 能 把 设 计 简 化 为 一 系 列 机 械 化 步 骤 这 里 简 要 讨 论 一 种 方 法 论 尽 管 它 是 一 种 早 期 提 出 的 方 法, 但 至 今 它 的 基 本 概 念 仍 适 用 [15] 假 设 在 体 系 结 构 设 计 过 程 中, 系 统 划 分 为 高 层 次 的 子 系 统 或 者 构 件 要 解 决 的 问 题 是 如 何 为 子 系 统 进 行 OOD(object-oriented design) 正 如 前 面 提 到 的,OO 设 计 包 括 系 统 实 现 中 所 有 类 和 对 象 的 设 计 规 范 完 整 的 OO 设 计 在 实 现 阶 段 中 应 该 是 : 只 需 要 添 加 方 法 或 属 性 的 细 节, 设 计 之 后 只 添 加 很 少 的 底 层 对 象, 绝 大 多 数 类 对 象 和 关 系 在 设 计 过 程 中 定 义 创 建 OO 设 计 的 方 法 应 该 包 括 如 下 步 骤 : 识 别 类 及 类 的 关 系 设 计 动 态 模 型, 基 于 它 们 定 义 类 的 操 作 设 计 函 数 模 型, 基 于 它 定 义 类 的 操 作 确 定 内 部 类 和 操 作 优 化 和 打 包 (Package) 识 别 类 和 关 系 识 别 类 及 类 之 间 的 关 系 需 要 鉴 别 问 题 域 中 对 象 类 型 类 之 间 的 结 构 ( 包 括 继 承 和 聚 合 ) 不 同 类 的 属 性 关 联 和 每 个 类 需 要 为 系 统 提 供 的 服 务 基 本 上, 这 个 步 骤 是 定 义 最 初 始 的 类 图 识 别 和 分 析 对 象, 始 于 查 看 问 题 的 描 述 在 问 题 的 描 述 中, 考 查 代 表 实 体 的 词 如 果 系 统 需 要 记 忆 某 个 实 体 的 信 息 需 要 它 提 供 服 务 或 它 包 含 多 个 属 性, 那 么 将 其 定 义 为 对 象 若 系 统 不 需 要 保 持 实 体 信 息, 或 不 需 要 实 体 提 供 任 何 服 务, 则 不 需 要 把 它 作 为 设 计 中 的 对 象 对 于 单 属 性 对 象 要 认 真 考 虑, 其 他 对 象 可 能 会 高 频 率 的 包 含 这 些 对 象, 而 作 为 其 属 性 使 用 虽 然 分 析 过 程 着 重 于 识 别 对 象, 但 建 模 中 需 要 表 示 出 这 些 对 象 和 类 类 具 有 属 性, 属 性 是 对 象 相 关 数 据 的 集 合, 给 类 增 加 了 更 详 细 的 信 息 对 于 Person 类 的 对 象 而 言, 属 性 包 括 姓 名 性 别 和 地 址 这 些 属 性 对 外 部 类 隐 藏, 只 能 通 过 对 象 的 成 员 函 数 访 问 和 操 作 问 题 域 和 需 求 决 定 类 应 该 具 有 哪 些 属 性 例 如, 在 建 模 一 个 医 院 系 统 时, 类 Person 的 身 高 体 重 出 生 年 月 是 需 要 的 属 性 ; 然 而 在 建 模 一 个 保 存 国 家 不 同 地 区 人 口 变 化 的 数 据 库 来 说, 这 些 属 性 不 需 要 通 过 考 虑 问 题 域 中 的 需 要 而 识 别 类 属 性 通 常 很 简 单, 之 后 是 通 过 结 构 确 定 属 性 的 位 置 常 见 属 性 应 该 放 在 基 类 中, 具 体 到 特 殊 对 象 的 属 性 应 该 放 在 子 类 中 在 识 别 属 性 时, 可 能 会 定 义 新 的 类, 有 可 能 删 去 旧 的 类 ( 例 如, 可 能 发 现 一 个 类 完 全 是 另 一 个 类 的 属 性 ) 对 类 图 来 说, 也 需 要 确 定 类 间 的 结 构 和 联 系 要 确 定 类 的 结 构, 可 以 考 虑 把 已 经 识 别 为 泛 化 的 类, 查 看 其 他 的 类 是 否 为 此 类 的 特 例 化, 特 例 化 对 于 问 题 域 来 说 很 有 意 义 举 例 而 言, 如 果 问 题 域 不 关 注 某 个 对 象 的 制 造 材 料, 那 么 就 不 必 因 为 制 造 材 料 构 建 这 个 类 的 子 类 相 似 的, 若 已 有 特 例 化 的 类, 察 看 是 否 有 类 与 其 有 相 似 属 性 如 果 有, 查 看 是 否 能 将 其 中 一 个 类 泛 化 再 次 说 明, 类 结 构 应 该 自 然 地 反 映 问 题 域 中 类 型 的 层 次 结 构, 泛 化 的 产 生 不 应 仅

126 因 为 类 有 相 同 名 字 的 属 性 可 以 用 相 似 的 方 法 识 别 组 合 结 构, 把 类 的 对 象 当 作 一 个 组 合 体, 然 后 识 别 其 部 件 关 注 点 在 于 这 些 部 件 是 否 需 要 被 系 统 持 续 跟 踪 如 是, 可 以 把 这 些 部 件 作 为 对 象 ; 否 则, 这 些 部 件 就 不 应 该 从 类 中 剥 离 出 来 然 后, 把 类 的 对 象 当 作 部 件, 察 看 它 是 否 属 于 另 一 个 对 象 再 次 强 调, 只 有 在 系 统 需 要 时 才 保 持 这 些 部 件 单 独 存 在 对 于 关 联, 需 要 识 别 不 同 类 实 例 间 的 关 系 举 个 例 子,Company 类 的 实 例 可 能 会 通 过 employs 类 与 Person 类 的 实 例 产 生 关 系 这 里 做 的 就 像 ER 模 型 一 样 实 例 间 的 关 系 也 像 ER 模 型 中 一 样, 可 能 是 1 对 1 关 系, 也 就 是 一 个 类 实 例 只 和 另 一 个 类 实 例 关 联, 也 可 以 是 1 对 M 的, 表 示 一 个 类 实 例 可 能 和 另 一 个 类 的 许 多 实 例 关 联 ; 也 有 M 对 M 关 系, 以 及 并 不 多 见 的 多 路 (multiway) 关 系 一 旦 对 象 被 识 别, 直 接 从 问 题 域 中 派 生 出 对 象 的 联 系 一 个 关 联 也 可 能 有 其 属 性 ; 这 些 属 性 不 属 于 任 何 一 个 对 象 尽 管 许 多 情 况 下, 这 些 属 性 可 能 会 被 强 制 属 于 两 个 对 象 中 的 某 一 个, 而 不 丢 失 任 何 信 息, 但 除 非 这 个 属 性 本 就 属 于 此 对 象, 否 则 应 避 免 这 种 情 况 发 生 动 态 建 模 类 图 给 出 了 初 始 的 模 块 设 计 这 种 设 计 将 会 被 系 统 中 的 事 件 进 一 步 优 化, 因 为 设 计 必 须 确 保 事 件 所 期 待 的 行 为 能 得 到 支 持, 构 建 系 统 的 动 态 行 为 将 有 助 于 以 后 设 计 的 重 定 义 动 态 模 型 描 述 当 事 件 发 生 时, 对 象 状 态 如 何 变 化, 事 件 是 在 某 个 时 间 实 例 发 生 的 某 件 事 情 对 一 个 对 象 而 言, 事 件 是 对 操 作 的 请 求 典 型 的 事 件 是 哪 些 发 生 时 在 时 间 上 不 会 持 续 的 事 情 每 个 事 件 都 有 发 起 者 和 响 应 者 事 件 可 以 是 系 统 内 部 的, 这 时 发 起 者 和 响 应 者 都 在 系 统 内 部 相 反, 当 事 件 的 发 起 者 和 响 应 者 都 在 系 统 外 部 时, 事 件 就 是 一 个 外 部 事 件 ( 例 如, 系 统 的 用 户 或 者 传 感 器 ) 正 如 在 第 3 章 中 讨 论 的 用 例 所 看 到 的, 场 景 是 系 统 的 一 个 特 定 的 执 行 状 态 发 生 的 一 系 列 事 件 从 场 景 中, 可 以 识 别 出 不 同 对 象 上 执 行 的 不 同 事 件, 进 而 用 于 识 别 对 象 提 供 的 服 务 不 同 的 场 景 组 合 在 一 起, 可 以 完 全 的 表 征 系 统 行 为 进 行 动 态 建 模 的 基 本 原 因 是 : 如 果 一 个 设 计 可 以 支 持 所 有 的 场 景, 那 么 可 以 确 定 这 个 设 计 可 以 支 持 系 统 预 期 的 动 态 行 为 通 过 用 例, 动 态 建 模 包 含 预 期 重 要 场 景 设 计 交 互 图 触 发 外 部 事 件 的 场 景 是 一 个 好 的 入 门 例 子, 场 景 只 需 考 虑 主 要 的 交 互, 不 需 覆 盖 所 有 可 能 性 首 先, 应 该 建 模 主 要 的 成 功 场 景, 然 后 建 模 例 外 的 场 景 举 例 而 言, 餐 馆 里 下 订 单 的 主 要 场 景 可 以 是 下 面 一 系 列 行 为 : 顾 客 读 菜 单 ; 顾 客 下 单 ; 送 单 子 到 厨 房 准 备 ; 上 菜 ; 顾 客 索 要 账 单 ; 准 备 好 账 单 ; 给 顾 客 账 单 ; 顾 客 付 账 例 外 场 景 可 能 是 没 有 顾 客 要 求 的 菜 或 者 顾 客 取 消 订 单 必 须 在 每 个 场 景 中 识 别 事 件 事 件 是 系 统 与 外 部 世 界 的 交 互, 或 者 系 统 内 对 象 间 的 交 互 对 系 统 中 控 制 流 效 果 相 同 的 事 件 被 视 为 同 一 类 型 的 事 件 集 合 每 一 类 型 的 事 件 都 会 分 配 给 对 象 类, 由 对 象 类 初 始 化 并 服 务 这 类 事 件 完 成 这 些 工 作 后, 场 景 可 以 描 述 为 时 序 ( 或 顺 序 ) 图, 用 于 描 述 与 场 景 对 应 的 事 件, 餐 馆 的 主 要 成 功 场 景 的 一 个 可 能 顺 序 图 如 图 6.18 所 示

127 customer Customer Kitchenr place order serve getbil 图 6.18 餐 馆 模 型 的 顺 序 图 ( 统 一 用 中 文?) 一 旦 模 型 化 了 主 要 场 景, 对 象 上 支 持 不 同 执 行 场 景 的 各 种 事 件 就 清 楚 了 可 以 用 这 些 信 息 加 强 对 类 的 认 识 一 般 来 说, 顺 序 图 中 每 一 个 事 件, 都 会 调 用 对 象 中 的 一 个 操 作 所 以, 通 过 使 用 场 景 和 时 序 图, 我 们 可 以 精 化 对 象 视 图, 并 增 加 一 些 初 始 化 建 模 时 没 有 识 别 的 操 作 例 如, 图 6.18 的 事 件 跟 踪 图 中, 如 果 需 要 支 持 这 些 交 互, 那 么 可 以 看 到 place order 和 getbill 将 会 是 订 单 类 型 对 象 的 两 个 操 作 不 同 事 件 在 类 上 的 作 用 可 以 建 模 为 状 态 图 状 态 加 工 图 在 系 统 设 计 中 可 能 需 要 限 制 次 数, 而 更 多 的 在 详 细 设 计 中 使 用 因 此, 类 的 状 态 模 型 会 在 后 续 章 节 讨 论 功 能 建 模 如 果 不 考 虑 计 算 的 控 制 方 面, 系 统 的 功 能 模 型 指 定 如 何 从 输 入 值 计 算 得 到 输 出 值 功 能 面 向 展 示 系 统 的 功 能 视 图 输 入 输 出 的 映 射 及 其 中 涉 及 的 不 同 步 骤 通 常, 当 输 入 到 输 出 的 加 工 比 较 复 杂 且 包 括 许 多 步 骤, 功 能 建 模 可 能 很 有 用 相 反, 如 果 系 统 中 输 入 到 输 出 的 加 工 不 复 杂, 功 能 模 型 就 可 能 很 直 白 正 如 我 们 所 见, 系 统 的 功 能 模 型 可 以 表 示 成 数 据 流 图 (DFD) 我 们 之 前 在 问 题 建 模 以 及 结 构 设 计 方 法 时 曾 讨 论 过 DFD 如 动 态 模 型, 用 模 型 确 保 对 象 模 型 能 执 行 系 统 需 要 的 加

128 工, 是 功 能 建 模 的 基 本 目 的 由 于 流 程 代 表 操 作, 并 且 在 面 向 对 象 系 统 中, 大 多 数 流 程 通 过 类 的 操 作 完 成, 因 此 流 程 应 以 类 的 操 作 形 式 展 现 基 于 DFD 图 的 抽 象 层 次, 一 些 操 作 可 以 处 理 为 对 象 上 的 单 一 操 作 ; 其 他 时 候 可 能 表 现 为 不 同 对 象 的 多 个 操 作 如 果 DFD 足 够 详 细, 那 么 所 有 操 作 都 应 表 现 为 类 的 方 法 根 据 DFD 中 定 义 的 输 入 输 出, 也 可 以 识 别 操 作 的 抽 象 基 调 ( 译 注 : 即 参 数 列 表 ) 定 义 内 部 类 和 操 作 至 目 前 为 止, 我 们 从 问 题 域 中 识 别 类, 对 象 的 方 法 需 要 满 足 其 与 环 境 和 用 户 交 互 的 需 要, 并 支 持 功 能 需 求 然 而, 最 后 的 设 计 是 系 统 实 现 的 蓝 图, 因 此, 需 要 考 虑 实 现 问 题 当 考 虑 实 现 问 题 时, 会 出 现 算 法 和 优 化 问 题, 由 这 一 步 处 理 这 些 问 题 第 一, 审 慎 评 估 每 一 个 类, 是 否 为 最 后 实 现 需 要 如 果 设 计 者 觉 得 实 现 过 程 中 不 需 要 某 些 类, 这 些 类 就 可 能 被 丢 弃 第 二, 考 虑 类 上 操 作 的 实 现, 对 于 操 作 的 实 现, 可 能 要 粗 略 考 虑 一 些 算 法 当 做 这 一 步 时, 简 单 的 类 可 能 会 定 义 称 为 底 层 操 作 的 复 杂 操 作 换 句 话 说, 对 操 作 的 有 效 实 现 可 能 需 要 与 数 据 结 构 深 层 次 的 交 互, 并 且 仅 从 该 对 象 的 角 度 考 虑 使 用 哪 些 数 据 结 构 这 些 识 别 出 的 类 在 考 虑 实 现 时 需 要 很 多 支 持, 它 们 可 能 需 要 存 储 中 间 结 果, 或 对 将 要 实 现 某 些 操 作 的 对 象 进 行 某 些 方 面 的 建 模 一 旦 类 和 操 作 的 实 现 都 考 虑 了, 并 且 也 能 令 人 满 意, 那 么 系 统 设 计 也 就 完 成 了 详 细 设 计 也 可 能 发 现 一 些 低 级 别 对 象, 系 统 设 计 时 应 识 别 大 多 数 的 对 象 优 化 和 打 包 初 始 设 计 可 能 低 效 设 计 的 最 后 一 步 应 考 虑 效 率 问 题, 应 该 记 住 的 是, 最 后 的 结 构 不 应 偏 离 初 始 逻 辑 结 构 太 多 可 能 有 不 同 的 优 化 方 案, 但 设 计 者 应 将 模 块 化 记 在 心 里, 以 检 验 其 对 设 计 的 判 断 例 子 在 实 际 运 用 上 述 方 法 之 前, 我 们 应 该 记 住, 设 计 方 法 无 法 将 设 计 活 动 完 全 转 化 成 一 连 串 可 机 械 执 行 的 步 骤, 也 就 是 说 设 计 活 动 中 的 每 一 步 都 需 要 一 些 工 程 性 的 判 断 方 法 论 本 质 上 只 是 一 种 辅 助 设 计 者 执 行 设 计 活 动 的 指 导, 它 们 并 不 是 不 可 违 逆 的 规 则 我 们 在 这 里 举 的 例 子 相 对 比 较 简 单, 没 有 完 全 反 映 上 述 方 法 的 全 部 内 容 字 数 统 计 问 题 我 们 以 之 前 讨 论 过 的 字 数 统 计 问 题 作 为 介 绍 结 构 化 设 计 方 法 的 示 例 对 问 题 的 初 步 分 析 表 明 存 在 一 个 File 对 象, 它 是 许 多 Word 对 象 的 集 合 此 外, 可 以 认 为 存 在 一 个 用 于 记 录 不 同 单 词 个 数 的 计 数 器 (counter), 计 数 器 是 应 该 作 为 一 个 单 独 的 对 象 还 是 应 该 作 为 一 个 操 作 则 没 有 绝 对 标 准 如 果 计 数 器 被 当 作 一 个 操 作, 那 么 它 应 该 属 于 哪 个 对 象 呢? 由 于 计 数 本 质 上 并 不 属 于 Word 类 或 File 类, 那 么 不 得 不 将 它 硬 性 的 附 加 到 这 些 类 中 的 某 一 个 出 于 这 个 原 因, 我 们 将 计 数 器 作 为 一 个 单 独 的 对 象 对 待 经 过 对 问 题 基 本 内 容 的 分 析, 我 们 识 别 出 了 文 件 (File) 单 词 (word) 和 计 数 器 (counter) 三 个 对 象 然 而, 对 问 题 进 一 步 分 析 发 现, 需 要 一 个 历 史 检 查 机 制 (history mechanism) 以 判 断 某 个 单 词 是 否 曾 经 出 现

129 过 经 过 初 步 建 模 之 后 得 到 的 类 图 如 图 6.19 所 示 File name History addword() exists() getword() iseof() Word string setstring() getstring() Counter count increment() display() 图 6.19 字 计 数 问 题 的 类 图 现 在 让 我 们 开 始 对 这 个 问 题 进 行 动 态 建 模, 这 个 问 题 实 质 上 是 一 个 批 处 理 问 题, 系 统 接 收 一 个 文 件 作 为 输 入, 根 据 输 入 给 出 输 出 该 问 题 的 使 用 场 景 十 分 直 观, 正 常 情 况 下 的 场 景 可 以 描 述 如 下 : - 系 统 提 示 输 入 文 件 名 ; 用 户 输 入 文 件 名 - 系 统 检 查 有 关 文 件 是 否 存 在 - 系 统 读 取 文 件 内 容 - 系 统 打 印 出 字 数 统 计 结 果 从 这 个 简 单 的 应 用 场 景 中 我 们 没 有 发 现 新 的 操 作, 所 以 类 图 保 持 不 变 现 在 来 考 虑 功 能 模 型, 一 个 可 能 的 功 能 模 型 如 图 6.20 所 示 该 模 型 引 入 了 一 个 新 的 对 象, 这 个 对 象 用 于 检 查 哪 些 单 词 曾 经 出 现 过 进 而 判 断 单 词 的 唯 一 性 它 还 引 入 了 increment(), isunique() 和 addtohistory() 等 几 个 操 作, 其 中 的 每 个 操 作 可 以 作 为 类 中 的 一 个 方 法 或 多 个 方 法 的 组 合 的 形 式 出 现 在 系 统 中 在 这 个 例 子 中, 这 些 过 程 大 部 分 体 现 为 对 类 进 行 修 改, 并 被 纳 入 设 计 之 中

130 Text file History File name Read File Get words Check for Uniqueness No of diffenent words Increment Count Add to History History 图 6.20 字 统 计 问 题 的 功 能 模 型 现 在 到 了 设 计 方 法 的 最 后 两 步, 在 这 两 个 步 骤 中, 我 们 通 过 对 问 题 的 实 现 和 优 化 来 改 进 对 象 模 型 我 们 的 第 一 项 决 策 是 系 统 中 的 历 史 检 查 机 制 使 用 二 叉 搜 索 树 实 现, 因 此, 我 们 使 用 B 树 类 代 替 原 有 的 History 类 另 外, Word 类 需 要 有 一 些 操 作 来 比 较 不 同 的 单 词, 还 需 要 有 设 置 和 获 取 单 词 内 容 的 操 作 最 终 的 类 图 在 结 构 上 与 图 6.19 相 似, 除 了 此 处 引 入 的 一 些 变 化 之 外 外 设 计 活 动 的 最 后 一 步 是 准 确 表 述 这 个 设 计, 这 本 身 并 不 是 设 计 方 法 的 一 部 分, 但 这 个 步 骤 非 常 重 要, 因 为 这 一 步 生 成 的 设 计 规 范 是 设 计 文 档 的 主 要 内 容 如 前 所 述, 设 计 规 范 应 该 详 细 说 明 设 计 中 所 有 的 类 类 的 所 有 方 法 以 及 它 们 的 接 口 我 们 使 用 C++ 的 类 结 构 来 表 述 最 终 的 设 计 规 范, 这 个 规 范 可 作 为 设 计 实 现 的 基 础 class Word { private : char *string; // string representing the word 单 词 的 内 容 public: bool operator == ( Word ); // Checks for equality 判 断 是 否 相 等 bool operator < ( Word ); bool operator > ( Word ); Word operator = ( Word ); // The assignment operator 赋 值 操 作 符 void setword ( char * ); // Sets the string for the word 设 置 单 词 的 内 容 char *getword ( ); // gets the string for the word 取 得 单 词 的 内 容 }; class File {

131 private: FILE infile; char *filename; public: Word getword ( ); // get a word; Invokes operations of Word 获 得 一 个 单 词 bool iseof ( ); // Checks for end of file 判 断 是 否 是 文 件 末 尾 void fileopen ( char * ); }; class Counter { private: int counter; public: void increment ( ); void display ( ); }; class Btree: GENERIC in <ELEMENT_TYPE> { private: ELEMENT_TYPE element; Btree < ELEMENT_TYPE > *left; Btree < ELEMENT_TYPE > *right; public: void insert( ELEMENT_TYPE ); // to insert an element 插 入 一 个 元 素 bool lookup( ELEMENT_TYPE ); // to check if an element exists 检 查 元 素 是 否 已 经 存 在 }; 我 们 可 以 看 到, 除 了 方 法 的 实 现 细 节, 给 出 的 设 计 规 范 中 涵 盖 了 所 有 类 的 定 义 类 中 的 数 据 成 员 操 作 以 及 所 有 主 要 的 声 明 设 计 向 代 码 的 加 工 只 需 要 对 该 设 计 规 范 进 行 必 要 的 添 加 和 修 改, 这 个 设 计 的 最 终 编 码 实 现 大 约 有 240 行 C++ 代 码 ( 不 包 含 注 释 和 空 行 ) 回 报 率 问 题 让 我 们 考 虑 一 个 更 大 一 些 的 问 题, 计 算 投 资 的 回 报 率 一 名 投 资 者 对 一 些 公 司 进 行 投 资 对 于 每 一 项 投 资, 在 一 个 文 件 中 给 出 了 公 司 的 名 称 所 有 投 资 的 钱 ( 包 括 最 初 的 收 购 以 及 随 后 的 收 购 ) 所 有 已 经 收 回 的 钱 ( 通 过 出 售 股 份 或 股 息 ) 每 笔 交 易 的 日 期, 以 及 该 投 资 当 前 的 价 值 和 日 期 我 们 的 目 标 是 计 算 投 资 者 每 个 投 资 所 获 得 的 回 报 率, 以 及 为 整 个 投 资 组 合 的 回 报 率 此 外, 输 出 他 最 初 的 投 资 金 额 后 期 的 投 资 金 额 已 收 回 的 金 额, 以 及 投 资 组 合 的 当 前 值

132 这 是 投 资 者 经 常 需 要 解 决 的 一 个 实 际 问 题, 而 计 算 回 报 率 计 算 器 在 一 个 较 大 的 财 务 管 理 系 统 中 很 容 易 成 为 重 要 的 组 成 部 分 回 报 率 的 计 算 并 不 简 单, 不 能 很 容 易 地 通 过 电 子 表 格 完 成 因 此, 这 种 软 件 的 具 有 实 际 的 用 途 初 步 分 析 问 题 很 容 易 得 出 利 率 投 资 组 合 (Portfolio) 投 资 (Investment) 和 交 易 (Transaction) 几 个 对 象 一 个 投 资 组 合 包 括 很 多 投 资, 一 项 投 资 由 很 多 交 易 组 成 因 此,Portfolio 类 是 许 多 Investment 类 的 一 个 聚 集 体,Investment 类 是 很 多 Transaction 类 的 聚 合 体 一 个 Transaction 类 可 以 是 提 取 (Withdrawal) 类 型 或 存 放 (Deposit) 类 型, 这 样 就 产 生 了 类 层 次 结 构 Investment 类 成 为 父 类,Withdrawal 类 和 Deposit 类 作 为 子 类 对 于 Investment 类, 需 要 实 现 的 主 要 操 作 是 计 算 回 报 率 ; 对 于 Portfolio 类, 我 们 需 要 添 加 操 作 来 计 算 回 报 率 总 的 初 始 投 资 和 总 的 回 收 值 总 投 资 组 合 的 当 前 值 因 此, 我 们 需 要 操 作 来 实 现 这 些 功 能 通 过 对 问 题 的 分 析 得 到 类 图 如 图 6.21 所 示 Portfolio totinitinvest totcurvalue totwithdrawls totdeposlts rate computerate() computerest() printresults() Investment name rate computerate() Transaction date amount Deposit getamt() Withdrawl getamt() 图 6.21 投 资 回 报 率 类 图 在 这 个 问 题 中, 与 环 境 的 互 动 并 不 多, 动 态 模 型 并 不 明 显 因 此, 我 们 忽 略 了 这 个 问 题 的 动 态 建 模 在 图 6.22 中 给 出 了 一 种 可 能 的 功 能 模 型, 这 些 类 确 实 能 用 来 保 证 功 能 模 型 的 进 程 能 在 各 种 对 象 的 操 作 中 反 映 出 来 可 以 看 到, 大 部 分 的 进 程 已 经 作 为 操 作 存 在 了

133 现 在, 我 们 需 要 执 行 设 计 方 法 中 的 最 后 两 步, 实 现 和 优 化 这 些 类 考 虑 到 计 算 总 的 初 始 投 资 整 体 回 报 率 所 有 值 的 收 回 (withdrawal) 等, 为 此, 每 个 投 资 需 要 有 一 个 适 当 的 数 据 输 入 文 件 获 取 投 资 细 节 投 资 细 节 计 算 投 资 的 各 种 比 率 计 算 总 的 回 报 率 打 印 结 果 计 算 另 一 个 账 号 图 6.22 投 资 回 报 率 问 题 的 功 能 模 型 因 此, 对 Investment 类, 需 要 添 加 适 当 的 操 作 另 外, 我 们 注 意 到, 所 有 对 初 始 投 资 总 额 当 前 总 现 值 等 的 计 算, 也 要 一 起 做, 这 些 基 本 上 是 将 各 项 投 资 中 价 值 相 加 因 此, 可 以 将 他 们 合 并 到 Protfolio 类 的 一 个 单 独 的 操 作 中, 作 为 Investment 类 的 一 个 独 立 操 作 研 究 类 的 层 次, 我 们 发 现 Withdrawal 和 Deposit 两 个 子 类 中 唯 一 的 不 同 在 于, 其 中 一 个 在 总 量 上 做 减 法 而 另 一 个 做 加 法 在 这 种 情 况 下, 通 过 将 提 款 数 量 设 成 负 数, 存 款 数 量 设 成 正 数, 这 两 种 类 型 可 以 很 容 易 地 考 虑 成 一 种 类 型 于 是, 我 们 删 除 这 些 子 类, 从 而 简 化 了 设 计 和 实 现 这 里 我 们 没 有 给 出 最 后 设 计 的 类 图, 而 是 提 供 了 类 的 详 细 说 明 : class Transaction { private: int amount; // money amount for the transaction 交 易 金 额 int month; // month of the transaction 交 易 的 月 份 int year; // year of the transaction 交 易 的 年 public: getamount(); getmonth(); getyear();

134 Transaction(amount, month, year); // sets values }; class Investment { private: char *investmentname; // Name of the company 公 司 名 称 Transaction *transactarray; // List of transactions 交 易 列 表 int nooftransacts; // Total number of transactions 交 易 总 数 float rateofreturn; // rate of return 回 报 率 public: gettransactdetails(); // Set 1 details of transactions 取 得 交 易 细 节 computerate(); float getrate(); // Return the rate of the returns 返 回 回 报 率 compute(initval, totwithdrawls, totcurval, totdeposits); // Returns these values for this investment 返 回 投 资 值 }; class Portfolio { private: Investment *investarray; // List of investments 投 资 的 列 表 int noofinvestments; // Total number of investments 投 资 总 数 int totalinitinvest; int totaldeposits; int totalcurval; int totalwithdrawl; float RateOfReturns; // Overall rate of returns 中 的 回 报 率 public: getinvestdetails( char * fname ); // Parse the input file 解 析 输 入 文 件 computerate(); // Compute rates of return 计 算 回 报 率 compute(); // Compute other totals 计 算 其 他 总 数 printresults(); // Print return rates, total values, etc. 打 印 回 报 率 总 价 值 等 }; 这 种 设 计 不 言 自 明, 设 计 后 通 过 C++ 实 现, 我 们 发 现 在 实 现 中 只 增 加 了 很 小 细 节 的 补 充, 显 示 出 设 计 的 正 确 性 和 完 整 性 程 序 的 最 终 大 小 约 为 470 C++ 代 码 ( 不 包 括 注 释 和 空 格 ) 6.4 详 细 设 计 在 前 两 节 中, 我 们 讨 论 了 两 种 不 同 的 系 统 设 计 方 法 基 于 功 能 的 抽 象, 和 基 于 对 象 在 系 统 设 计 中 我 们 关 注 于 一 个 系 统 中 的 模 块 以 及 它 们 之 间 如 何 交 互 一 旦 模 块 确 定 并 在 高 层 设 计 中 给 定, 就 可 以 设 计 实 现 给 定 规 约 的 内 部 逻 辑, 这 是 本 节 的 重 点 1 此 处 作 者 笔 误, 应 为 get

135 详 细 设 计 活 动 往 往 不 是 形 式 化 和 文 档 化 的, 因 为 保 持 详 细 设 计 文 档 和 代 码 的 完 全 一 致 几 乎 是 不 可 能 的 基 于 这 一 点, 为 复 杂 和 重 要 的 模 块 制 定 详 细 设 计 是 非 常 有 用 的, 并 且 常 常 是 程 序 员 个 体 代 码 开 发 过 程 中 的 一 部 分 逻 辑 / 算 法 设 计 详 细 设 计 的 基 本 目 标 是 给 系 统 设 计 中 给 定 的 不 同 模 块 指 定 逻 辑, 而 指 定 这 些 逻 辑 需 要 首 先 设 计 出 能 够 实 现 给 定 需 求 的 算 法 在 这 里, 考 虑 一 些 实 现 算 法 或 逻 辑 的 常 用 原 则 算 法 (algorithm) 这 个 术 语 是 相 当 通 用 的, 广 泛 的 应 用 于 各 种 领 域 对 于 软 件, 可 以 把 一 个 算 法 当 成 是 一 个 解 决 问 题 的 无 二 义 性 过 程 [42] 一 个 过 程 是 一 个 有 限 的 定 义 明 确 的 步 骤 或 操 作 的 序 列, 每 一 个 步 骤 都 需 要 在 有 限 的 内 存 和 时 间 内 完 成 在 这 个 定 义 中, 我 们 假 设 终 止 是 程 序 的 重 要 属 性 从 现 在 起, 我 们 将 过 程 算 法 和 逻 辑 视 为 等 价 设 计 一 个 算 法 时 有 很 多 步 骤 第 一 步 是 声 明 问 题 用 于 设 计 算 法 的 问 题 必 须 是 准 确 清 楚 说 明 的, 并 能 被 负 责 设 计 的 人 正 确 理 解 对 于 详 细 设 计, 问 题 的 声 明 来 自 于 系 统 设 计 也 就 是 说, 当 一 个 模 块 开 始 详 细 设 计, 问 题 的 声 明 已 经 可 用 ; 第 二 步 是 开 发 这 个 问 题 的 一 个 数 学 模 型 在 建 模 时, 必 须 选 择 最 适 合 问 题 的 数 学 结 构, 它 可 以 借 鉴 其 他 已 经 解 决 的 类 似 问 题 在 许 多 例 子 中, 建 模 使 用 已 知 类 似 问 题 的 模 型 或 修 改 已 知 模 型 以 适 应 当 前 问 题 第 三 步 是 算 法 设 计 在 这 一 步 中, 数 据 结 构 和 程 序 结 构 已 经 明 确 了, 一 旦 设 计 了 算 法, 它 的 正 确 性 必 须 被 验 证 算 法 设 计 不 能 给 出 明 确 的 程 序 用 现 有 的 方 法 不 可 能 有 的 程 序, 帮 助 自 动 设 计 问 题 的 算 法 然 而, 可 以 提 供 一 些 启 发 式 方 法 帮 助 设 计 师 为 模 块 设 计 算 法 为 模 块 设 计 算 法 或 逻 辑 的 最 普 遍 的 方 法 是 使 用 逐 步 求 精 技 术 (stepwise refinement technique) [84] 逐 步 求 精 技 术 把 逻 辑 设 计 问 题 分 成 一 系 列 步 骤, 从 而 使 开 发 可 以 逐 步 进 行 这 个 过 程 的 第 一 步 是, 把 模 块 的 详 细 规 约 描 述 转 化 成 包 含 抽 象 语 句 的 算 法 的 抽 象 描 述, 在 每 一 步, 算 法 中 的 一 个 或 多 个 陈 述 分 解 为 更 详 细 的 说 明 当 所 有 指 令 充 分 精 确, 逐 步 求 精 结 束, 它 们 可 以 很 容 易 地 加 工 成 编 程 语 言 语 句 在 求 精 时, 数 据 和 指 令 都 必 须 被 精 化 一 种 求 精 的 方 针 是, 在 每 一 步 的 逐 步 分 解 中, 分 解 的 每 个 结 果 都 可 用 于 处 理 代 表 设 计 决 策 的 问 题 一 般 来 说, 详 细 设 计 没 有 必 要 使 用 形 式 化 的 语 言, 但 可 以 使 用 正 规 编 程 语 言, 如 外 部 结 构 ( 如 循 环, 条 件 等 ), 而 内 部 描 述 的 格 式 可 以 自 由 些 这 可 以 帮 助 设 计 人 员 把 重 点 放 在 逻 辑 上, 而 不 是 编 程 语 言 的 表 达 方 式 类 的 状 态 模 型 对 于 面 向 对 象 设 计, 这 种 方 法 只 是 讨 论 详 细 设 计 是 否 可 用 于 设 计 方 法 的 逻 辑 但 是 类 不 是 功 能 的 抽 象, 不 能 被 视 为 只 是 一 个 函 数 的 集 合 ( 方 法 ) 为 了 更 详 细 和 整 体 的 了 解 一 个 类 的 信 息, 在 不 涉 及 不 同 方 法 的 逻 辑 时, 已 经 和 基 于 求 精

136 的 方 法 不 同 了 一 个 类 的 对 象 有 一 些 声 明 和 许 多 操 作 为 了 更 好 地 理 解 一 个 类, 必 须 了 解 语 句 和 各 种 操 作 的 关 系, 以 及 各 种 操 作 的 效 果 这 可 以 被 看 作 是 面 向 对 象 开 发 的 详 细 设 计 活 动 目 标 之 一 一 旦 整 体 类 都 被 更 好 的 理 解, 它 的 许 多 方 法 的 算 法 就 可 以 开 发 了 解 类 的 行 为 的 一 个 方 法 是 把 它 作 为 一 个 有 限 状 态 自 动 机, 其 中 包 含 了 状 态 和 状 态 间 的 加 工 当 为 一 个 对 象 建 模 时, 状 态 是 它 的 属 性 的 值, 事 件 是 一 项 针 对 对 象 的 操 作 状 态 图 通 过 展 示 当 事 件 执 行 时 状 态 如 何 变 化, 而 把 事 件 和 状 态 关 联 起 来 一 个 对 象 的 状 体 一 般 有 一 个 初 始 状 态, 并 从 该 状 态 可 以 到 达 所 有 状 态 ( 即, 有 一 个 从 初 始 状 态 到 达 所 有 其 他 状 态 的 路 径 ) 一 个 对 象 的 状 态 图 并 不 代 表 对 象 的 所 有 实 际 状 态, 因 为 对 象 的 可 能 状 态 有 许 多 状 态 图 仅 尝 试 表 示 对 象 的 逻 辑 状 态, 对 象 的 逻 辑 状 态 是 对 于 所 有 可 能 事 件, 行 为 相 近 状 态 的 组 合 两 个 逻 辑 状 态 至 少 含 有 针 对 一 个 特 定 事 件 而 行 为 不 同 的 情 况 例 如, 对 于 一 个 表 示 堆 栈 的 对 象, 所 有 表 示 堆 栈 中 数 据 大 小 超 过 0 但 比 最 大 值 小 的 状 态 都 是 类 似 的, 因 为 在 这 些 状 态 中 所 有 操 作 实 施 在 堆 栈 上 时, 堆 栈 的 行 为 类 似 ( 如 压 栈 时, 增 加 一 个 元 素 ; 出 栈 时, 删 除 一 个 元 素 等 ) 但 是, 代 表 栈 空 的 状 态 是 不 同 的, 因 为 栈 顶 的 行 为 和 出 栈 操 作 不 同 了 ( 可 能 会 返 回 错 误 消 息 ) 同 样 地, 代 表 栈 满 的 状 态 也 是 不 同 的, 综 合 起 来, 有 限 大 小 的 栈 的 状 态 模 型 如 图 6.23 所 示 图 6.23 一 个 栈 的 有 穷 状 态 自 动 机 (FSA) 模 型 ( 能 用 中 文 呢?) 有 限 状 态 建 模 是 一 种 了 解 对 象 在 不 同 状 态 下, 对 其 进 行 不 同 操 作 时 运 行 情 况 的 方 法 对 对 象 状 态 的 合 理 理 解 可 以 帮 助 描 述 每 一 个 操 作 的 逻 辑 要 进 行 对 这 些 逻 辑 的 开 发, 可 以 使 用 算 法 开 发 等 常 规 方 法 状 态 模 型 也 可 用 于 验 证 操 作 逻 辑 的 正 确 性, 正 如 我 们 后 面 将 看 到 的, 状 态 模 型 可 以 用 来 生 成 程 序 验 证 用 的 测 试 案 例 6.5 验 证 在 开 始 下 一 阶 段 活 动 前, 应 该 对 设 计 活 动 的 输 出 进 行 验 证 如 果 设 计 是 通 过 一 些 分 析 工 具 支 持 的 形 式 化 符 号 表 示, 那 么 就 可 以 通 过 工 具 检 查 内 部 一 致 性 ( 例 如, 被 其 他 模 块 使 用 了 的 模 块 是 否 已 经 定 义 模 块 接 口 与 其 他 模 块 是 否 与 使 用 它 的 方 式 一 致 数 据 的 使 用 与 声 明 是 否 一 致 等 ) 如 果 设 计 不 是 基 于 形 式 化 可 执 行 的 语 言, 它 不 能 通 过 工 具 处 理, 那 么 就 需

137 要 使 用 其 他 验 证 方 法 验 证 最 常 见 的 方 法 是 设 计 审 查, 这 里 我 们 讨 论 这 种 方 法 设 计 审 查 的 目 的 是 确 保 设 计 满 足 要 求, 并 具 有 良 好 的 质 量 如 果 错 误 发 生 在 设 计 过 程 中, 他 们 最 终 会 反 映 在 代 码 和 最 终 系 统 中 随 着 检 测 错 误 的 延 误, 除 去 设 计 时 发 生 的 错 误 的 花 费 会 随 之 增 加, 最 好 的 情 况 是 设 计 错 误 能 够 尽 早 的 发 现, 以 避 免 他 们 在 系 统 中 出 现, 在 设 计 中 检 测 错 误 是 设 计 审 查 的 目 的 系 统 设 计 审 查 过 程 类 似 于 过 程 检 查, 一 群 人 聚 在 一 起 讨 论, 目 标 是 揭 示 设 计 错 误 或 不 需 要 的 功 能 审 查 小 组 必 须 包 括 系 统 设 计 团 队 详 细 设 计 团 队 需 求 文 档 的 作 者 负 责 维 护 设 计 文 件 的 作 者, 以 及 一 个 独 立 的 软 件 质 量 工 程 师 如 同 任 何 其 它 审 查, 应 牢 记 的 是 会 议 的 目 的 是 揭 露 设 计 错 误, 而 不 是 试 图 修 复, 修 复 在 后 面 完 成 设 计 出 现 的 错 误 有 很 多 种 形 式, 而 引 入 错 误 仅 关 注 于 设 计 师 的 创 造 力 然 而, 最 重 要 的 设 计 错 误 是 该 设 计 不 完 全 支 持 系 统 要 求 例 如, 有 些 例 外 的 情 况 无 法 处 理, 或 一 些 设 计 约 束 并 没 有 得 到 满 足 对 于 设 计 质 量, 模 块 化 是 主 要 标 准 然 而, 当 需 要 验 证 设 计 是 否 能 够 满 足 性 能 要 求, 则 效 率 是 评 估 一 个 设 计 的 另 一 个 重 要 的 性 能 6.6 度 量 指 标 本 节 讨 论 如 何 从 设 计 中 抽 取 指 标, 并 用 这 些 指 标 评 估 设 计 我 们 不 讨 论 用 于 项 目 监 控 使 用 的 指 标, 例 如 标 准 的 工 作 量 或 者 每 个 项 目 开 发 阶 段 的 缺 陷 数 据 产 品 度 量 总 会 关 注 产 品 的 大 小, 而 对 于 设 计 的 大 小, 模 块 总 数 是 一 种 常 用 指 标 ( 通 过 模 块 的 平 均 大 小,LOC 的 最 终 大 小 可 以 估 算 并 与 项 目 预 期 比 较 ) 复 杂 性 是 度 量 的 另 一 个 关 注 点, 设 计 过 程 中 的 复 杂 性 度 量, 可 以 帮 助 降 低 模 块 设 计 的 复 杂 性, 从 而 直 接 提 高 可 测 试 性 和 可 维 护 性 我 们 将 提 出 几 个 度 量 复 杂 性 的 量 化 指 标 本 节 首 先 讨 论 面 向 功 能 设 计 的 度 量, 然 后 讨 论 面 向 对 象 设 计 的 度 量 面 向 功 能 设 计 的 复 杂 性 度 量 网 络 指 标 (Network Metrics) 网 络 指 标 是 一 个 用 于 观 察 结 构 图 是 否 足 够 好 的 复 杂 度 指 标 模 块 被 调 用 时 会 增 加 耦 合, 因 此 如 果 一 个 模 块 只 有 一 个 调 用 者, 那 么 就 是 一 个 好 结 构 也 就 是 说, 调 用 结 构 如 果 是 一 个 完 全 树, 那 么 是 最 简 单 的 调 用 结 构 越 不 接 近 于 树, 系 统 结 构 就 越 复 杂 与 树 结 构 的 差 异 称 作 为 设 计 图 的 不 纯 性 (impurity) 不 纯 性 定 义 为 图 的 不 纯 性 = n - e - 1 其 中 n 是 结 构 图 中 的 节 点 数 目,e 是 边 数 由 于 在 完 全 树 中 节 点 总 数 比 边 数 多 一, 因 此 树 结 构 的 不 纯 性 为 0 每 当 模 块 的 扇 入 超 过 1, 那 么 图 的 不 纯 性 增 加 此 方 法 的 主 要 缺 点 是 忽 略 了 一 些 开 发 惯 例, 比 如 库 或 支 持 条 件 用 于 处 理 这 个 问 题 的 一 种 方 法 是, 计 算 不 纯 性 时 不 考 虑 图 中 最 底 层 节 点, 因 为 多 数 底 层 模 块 是 被 许 多 不 同 模 块 使 用 的 库 模 块 一 般 也 在 结 构

138 图 的 底 层 ( 即 使 库 程 序 有 自 己 的 结 构, 应 用 程 序 的 结 构 图 中 也 不 用 考 虑 它 们 ) 还 有 其 他 一 些 网 络 度 量 指 标, 但 它 们 与 复 杂 性 度 量 中 最 重 要 问 题 的 关 联 性 尚 不 确 定, 因 此, 仅 使 用 它 们 帮 助 理 清 结 构 设 计 的 思 路 信 息 流 度 量 网 络 图 的 不 纯 性 度 量 的 基 本 假 设 是, 随 着 图 的 不 纯 性 性 增 加, 耦 合 也 会 增 加 但 是, 不 纯 性 对 耦 合 度 而 言 并 非 是 很 好 的 近 似, 模 块 耦 合 度 的 增 加 取 决 于 接 口 的 复 杂 性 与 其 耦 合 的 模 块 总 数 以 及 模 块 是 调 用 者 还 是 被 调 用 者 因 此, 在 定 量 度 量 模 块 间 的 耦 合 时 必 须 处 理 上 述 问 题 信 息 流 指 标 试 图 依 据 通 过 模 块 的 总 信 息 流 来 确 定 复 杂 性 在 信 息 流 度 量 的 最 早 期 工 作 中 [48,49], 模 块 的 复 杂 性 被 认 为 是 依 赖 于 模 块 内 的 复 杂 性 和 模 块 间 的 复 杂 性 模 块 内 复 杂 度 用 模 块 的 代 码 行 数 近 似, 模 块 间 复 杂 度 依 赖 于 流 入 模 块 的 总 信 息 和 流 出 模 块 的 总 信 息 模 块 流 入 信 息 量 由 流 入 模 块 的 抽 象 元 素 总 数 度 量 ( 即, 模 块 使 用 的 数 据 ), 而 流 出 是 抽 象 数 据 元 素 流 动 模 块 的 总 数 ( 即, 其 由 此 模 块 定 义, 而 由 其 他 模 块 使 用 的 数 据 ) 模 块 复 杂 性 被 定 义 成 Dc: Dc= size * ( 流 入 * 流 出 ) 2 术 语 ( 流 入 * 流 出 ) 是 指 源 输 入 和 目 标 输 出 的 乘 积 而 取 平 方 是 因 为 对 确 定 模 块 复 杂 性 而 言, 模 块 之 间 互 连 的 复 杂 度 比 模 块 内 部 的 复 杂 度 更 为 重 要 具 有 更 多 连 接 的 模 块 更 难 测 试 和 修 改, 这 是 一 条 得 到 普 遍 验 证 的 经 验 上 述 指 标 定 义 中, 模 块 复 杂 性 只 与 模 块 的 数 据 流 入 流 出 以 及 模 块 大 小 有 关 另 一 个 指 标 假 设, 复 杂 性 不 仅 依 赖 于 信 息 流 入 流 出 的 总 量, 也 依 赖 于 与 其 交 互 模 块 的 数 量, 而 模 块 的 大 小 被 认 为 微 不 足 道 一 个 模 块 的 复 杂 性 Dc 被 定 义 为 [89]: Dc = 扇 入 * 扇 出 + 流 入 * 流 出 其 中 扇 入 表 示 调 用 此 模 块 的 模 块 数, 扇 出 表 示 此 模 块 调 用 的 模 块 数 这 个 度 量 对 设 计 的 帮 助 在 于, 文 献 [89] 提 出 了 一 种 模 块 突 显 法 假 设 avg complexity 表 示 模 块 的 平 均 复 杂 度,std deviation 表 示 系 统 中 模 块 复 杂 性 的 标 准 差 该 方 法 把 模 块 划 分 为 三 类 : 容 易 出 错 的, 复 杂 的, 正 常 的 如 果 Dc 表 示 一 个 模 块 的 复 杂 性, 它 可 以 分 为 以 下 几 类 : 容 易 出 错 的 如 果 Dc > avg complexity + std deviation 复 杂 的 如 果 avg complexity < Dc < avg complexity +std deviation 正 常 的 其 它 请 注 意, 容 易 出 错 的 和 复 杂 的 的 定 义 与 计 算 模 块 复 杂 性 的 方 法 无 关 采 用 这 种 方 式, 可 以 将 关 注 点 集 中 于 容 易 出 错 和 复 杂 的 模 块, 而 非 整 个 设 计 这 些 信 息 可 用 来 重 新 设 计 系 统, 以 降 低 模 块 复 杂 性 ( 同 时 降 低 整 个 设 计 的 复 杂 性 ) 这 种 方 法 在 识 别 易 出 错 模 块 方 面, 被 认 为 相 当 有 效 [89]

139 6.6.2 OO 设 计 的 复 杂 性 度 量 OO 软 件 复 杂 性 度 量 曾 有 若 干 讨 论 [1,21,64], 本 节 展 示 OOD 复 杂 度 的 评 估 方 法 由 于 类 的 设 计 是 OOD 的 核 心 问 题, 并 且 OOD 方 法 的 主 要 结 果 是 类 的 定 义, 所 以 对 OOD 的 度 量 也 主 要 是 对 类 的 度 量 文 献 [21] 提 出 了 若 干 度 量 指 标, 本 节 讨 论 其 中 一 部 分, 它 们 被 实 验 证 明 在 错 误 探 测 上 最 为 有 用 [3] 类 按 方 法 加 权 (WMC) 开 发 一 个 类 的 工 作 量 主 要 由 类 的 方 法 数 以 及 类 方 法 的 复 杂 度 决 定 因 此, 在 评 估 类 的 复 杂 度 时, 组 合 方 法 数 和 方 法 复 杂 度 的 指 标 是 有 用 的,WMC 就 是 这 样 一 种 指 标 a 假 设 类 C 中 定 义 了 M1,M2,...,Mn 这 n 种 方 法 设 Mi 的 复 杂 度 为 i 由 于 方 法 与 常 a 规 的 函 数 或 过 程 相 似, 因 此 适 用 于 函 数 的 度 量 指 标 都 可 用 来 定 义 i ( 例 如, 预 估 的 代 码 长 度 接 口 的 复 杂 性, 和 数 据 流 的 复 杂 度 ) WMC 定 义 如 下 : i= WMC = n a i i= 1 假 设 每 个 方 法 的 复 杂 度 都 是 1, 则 由 WMC 得 到 的 是 类 中 方 法 的 总 个 数 继 承 树 深 度 DIT(Depth of Inheritance Tree) 前 面 说 过, 继 承 是 面 向 对 象 的 一 个 特 性, 同 时 也 是 OO 中 复 用 的 主 要 机 制 一 个 类 在 继 承 树 中 的 层 次 越 深, 它 拥 有 的 可 重 用 方 法 越 多, 也 就 拥 有 了 更 多 的 被 复 用 的 可 能 但 正 如 前 文 所 说, 继 承 增 加 了 耦 合, 这 会 使 类 的 修 改 更 为 困 难 换 句 话 说, 在 继 承 树 中 很 深 的 类 可 以 继 承 很 多 方 法, 但 这 会 使 其 行 为 难 以 预 测 基 于 上 述 原 因, 对 继 承 的 评 估 很 有 价 值 DIT 就 是 一 个 这 样 的 度 量 指 标 类 C 的 DIT 是 指 它 在 从 继 承 树 根 元 素 算 起 的 深 度, 也 就 是 代 表 类 C 的 节 点 与 根 元 素 的 最 短 路 径 长 度, 或 者 类 C 的 祖 先 个 数 如 果 可 以 多 继 承, 那 么 DIT 是 从 根 结 点 到 C 的 最 大 路 径 长 度 类 间 耦 合 CBC(Coupling between Class) CBC 是 一 个 度 量 类 间 耦 合 程 度 的 指 标 类 C 的 CBC 值 是 类 C 所 有 耦 合 类 的 数 量 如 果 类 的 方 法 访 问 另 一 个 类 的 方 法 或 者 实 例 变 量, 那 么 两 个 类 是 耦 合 的 一 般 来 说, 判 断 两 个 类 是 否 耦 合 可 以 通 过 查 看 两 个 类 中 所 有 方 法 和 变 量 定 义 然 而, 一 些 不 太 直 接 的 耦 合 方 法 ( 例 如 通 过 指 针 的 耦 合 ), 是 很 难 通 过 代 码 识 别 的 类 的 响 应 RFC(Response for a Class) 尽 管 CBC 度 量 了 类 间 的 耦 合 度, 但 并 没 有 量 化 类 间 交 互 的 强 度 换 句 话 说,CBC 并 没 有 解 释 类 间 方 法 的 关 联 程 度 RFC 尝 试 通 过 类 的 外 部 可 调 用 方 法, 对 类 间 交 互 强 度 进 行 独 立 可 以 把 类 C 的 可 响 应 方 法 组 成 一 个 集 合 可 响 应 方 法 集 合 指 的 是, 若 有 一 条 消 息 发 送 到 类 C, 那 么 所 有 可 以 被 调 用 的 方 法 集 合 可 响 应 方 法 集 合 包 括 了 类 C 和 及 其 有 联 系 的 类 中 的 所 有 方 法 RFC 值 是 类 的 可 相 应 方 法 集 合 的 基 数 那 么, 即 使 类 的 CBC 值 是 1( 即, 它 只 与 一 个 类 有 耦 合 ), 它 的 RFC 值 却 可 以 很 高, 即 这 两 个 类 间 关 系 很 紧 密 需 要 注 意 的

140 是, 测 试 RFC 值 很 高 的 类 是 困 难 的 ( 译 注 : 因 为 它 紧 密 依 赖 于 其 它 的 类 ) 6.7 小 结 ---- 系 统 的 设 计 是 对 待 解 决 问 题 的 规 划, 如 果 这 个 规 划 可 被 实 现, 则 这 个 系 统 设 计 能 满 足 系 统 的 要 求 并 维 持 系 统 的 架 构 模 块 层 次 设 计 界 定 了 系 统 中 的 实 现 其 架 构 的 模 块, 并 详 细 设 计 了 模 块 的 处 理 逻 辑 ---- 模 块 化 的 系 统 应 该 是 每 个 模 块 有 一 个 良 好 定 义 的 抽 象, 一 个 模 块 的 变 化 对 其 他 模 块 的 影 响 最 小 评 价 模 块 设 计 的 两 个 标 准 是 耦 合 性 和 内 聚 性 耦 合 性 反 映 了 模 块 间 相 互 依 赖 的 程 度, 内 聚 性 是 度 量 模 块 内 各 个 元 素 之 间 关 联 的 方 法 总 的 来 说, 在 模 块 设 计 中, 应 该 减 小 耦 合 性, 增 强 内 聚 性 模 块 还 应 该 遵 循 开 放 封 闭 原 则, 也 就 是 说, 对 扩 展 开 放, 对 修 改 封 闭 ---- 一 个 过 程 化 系 统 的 结 构 图 反 映 了 系 统 的 模 块 和 他 们 之 间 的 调 用 关 系 ---- 结 构 化 设 计 方 法 提 供 了 有 关 如 何 创 建 一 个 模 块 设 计 ( 反 映 为 结 构 图 ), 使 彼 此 依 赖 最 低 ( 低 耦 合 性 ) 和 高 内 聚 性 为 此, 把 高 级 系 统 分 割 为 多 个 子 系 统 的 方 法 是, 一 个 子 系 统 管 理 主 要 的 输 入, 一 个 子 系 统 管 理 主 要 的 输 出, 一 个 子 系 统 管 理 主 要 的 加 工 清 晰 的 把 系 统 分 割 为 不 同 的 部 分, 每 一 部 分 能 独 立 处 理 各 自 的 任 务 ---- 统 一 建 模 语 言 有 多 种 类 型 的 模 型 来 对 不 同 的 属 性 建 模, 包 括 系 统 的 静 态 结 构 和 动 态 行 为 的 模 型 代 表 静 态 结 构 的 主 要 是 类 图, 它 代 表 了 系 统 中 的 类, 以 及 类 之 间 的 关 系 为 了 针 对 动 态 行 为 建 模, 顺 序 图 和 协 作 图 可 以 用 来 展 示 一 个 场 景 是 如 何 涉 及 到 各 种 对 象 以 实 现 的 ---- 用 统 一 建 模 语 言 符 号, 就 可 以 创 建 系 统 的 面 向 对 象 设 计 面 向 对 象 设 计 方 法 集 中 于 识 别 类 和 找 出 它 们 间 关 系, 并 使 用 动 态 和 功 能 建 模 的 方 法 来 验 证 类 的 定 义 ---- 在 程 序 的 详 细 设 计 中, 执 行 程 序 的 逻 辑 被 表 示 为 半 形 式 化 的 符 号 对 类 来 说, 状 态 图 能 用 来 对 方 法 之 间 的 关 系 进 行 建 模 ---- 验 证 设 计 最 常 见 的 方 法 是 设 计 复 查, 用 一 个 团 队 来 检 查 设 计, 以 找 出 设 计 中 的 缺 陷 ---- 有 一 系 列 可 以 被 用 来 评 价 一 个 设 计 复 杂 性 的 指 标 网 络 标 准 评 价 结 构 图 并 考 虑 对 树 状 结 构 的 偏 离 来 衡 量 设 计 的 质 量 ; 信 息 流 的 复 杂 性 度 量 基 于 设 计 的 复 杂 性, 模 块 内 部 的 复 杂 性 和 模 块 之 间 的 连 接 数 量 这 些 都 可 以 用 来 识 别 容 易 出 错 的 模 块, 以 及 通 过 减 少 复 杂 性 来 改 善 设 计 度 量 面 向 对 象 设 计 复 杂 性 的 方 法 与 指 标 包 括, 类 加 权 方 法 类 的 继 承 树 方 法 以 及 最 大 类 层 次 结 构 深 度 等 自 测 练 习 1. 体 系 结 构 和 模 块 级 设 计 的 关 系 是 什 么?

141 2. 如 果 给 你 一 个 用 于 实 现 SRS 的 设 计 方 案, 你 会 选 择 什 么 标 准 来 评 估 这 个 设 计 方 案 的 质 量 3. 考 虑 一 个 程 序 包 含 了 许 多 模 块, 如 果 一 个 全 局 变 量 x 必 须 用 于 在 模 块 A 和 模 块 B 之 间 共 享 数 据, 你 会 在 这 两 个 模 块 间 设 计 怎 么 样 的 接 口 来 减 少 耦 合 性 4. 下 列 模 块 的 内 聚 性 如 何? 你 能 用 什 么 方 法 来 改 变 模 块 使 内 聚 性 增 强? Procedure file(file_ptr,file_name,op_name); Begin Case op_name of "open":perform activities for opening the file. "close":perform activities for close the file. "print":print the file End case End 5. 画 出 下 面 程 序 的 结 构 图 main(); { int x,y; x=0;y=0; a();b(); } a() { x=x+y; y=y+5; } b() { x=x+5;y=y+x;a(); } 你 会 用 什 么 方 法 修 改 程 序 从 而 提 高 程 序 的 模 块 化 6. 列 出 一 些 你 在 开 发 一 个 软 件 系 统 时, 使 用 面 向 对 象 方 法 增 加 内 聚 减 少 耦 合 的 方 法 7. 面 向 对 象 的 实 现 阶 段, 主 要 对 类 进 行 编 码 在 设 计 过 程 中, 使 用 UML 进 行 动 态 建 模 的 作 用 是 什 么? 8. 您 将 如 何 度 量 一 个 指 定 结 构 图 的 信 息 流 复 杂 性? 9. 描 述 量 化 度 量 面 向 对 象 设 计 复 杂 性 的 两 个 指 标, 你 将 如 何 使 用 其 中 的 一 个 指 标 来 确 定 高 度 复 杂 或 容 易 出 错 的 模 块?

142 第 七 章 编 码 和 单 元 测 试 以 最 好 的 方 式 实 现 软 件 设 计, 是 编 码 或 编 程 活 动 的 目 的 同 时 编 码 活 动 又 深 刻 地 影 响 到 测 试 和 维 护 正 如 前 面 所 看 到 的, 编 码 仅 花 费 整 个 软 件 过 程 时 间 的 一 小 部 分, 而 测 试 和 维 护 占 了 大 部 分 因 此, 应 该 明 确 指 出, 编 码 时 的 目 标 应 不 只 是 降 低 实 现 的 成 本, 而 且 要 有 助 于 降 低 后 续 阶 段 的 成 本 编 码 中 应 牢 记 的 是, 程 序 不 应 为 了 使 它 们 容 易 写 而 构 造, 而 应 使 其 易 于 阅 读 和 理 解, 因 为 可 能 会 有 其 他 人 来 阅 读 这 段 程 序 编 码 时 就 以 可 读 性 和 可 理 解 性 为 明 确 目 标, 确 实 可 以 使 编 码 的 成 果 更 容 易 阅 读 和 理 解 温 伯 格 的 一 个 著 名 实 验 显 示 : 如 果 程 序 员 被 指 定 一 个 明 确 的 目 标, 他 们 通 常 都 能 很 好 的 完 成 [82] 在 实 验 中,5 个 不 同 的 队 伍 给 予 同 样 的 问 题, 为 此, 他 们 制 定 了 各 自 的 方 案 然 而, 每 个 小 组 被 指 定 了 一 个 不 同 且 必 须 实 现 的 目 标 这 些 不 同 目 标 是 :1 最 大 限 度 地 减 少 完 成 程 序 的 工 作 量 ;2 尽 量 减 少 语 句 数 量 ;3 最 大 限 度 地 减 少 所 需 内 存 ;4 最 大 程 度 提 高 程 序 的 可 理 解 性 ;5 最 大 化 输 出 的 清 晰 度 结 果 发 现, 大 部 分 情 况 下, 团 队 在 指 定 给 其 的 目 标 上 成 绩 都 是 最 佳 的 表 7.1 展 示 了 排 名 情 况 表 7.1 温 伯 格 的 实 验 结 果 排 名 (1 表 示 最 好 ) O1 O2 O3 O4 05 最 大 限 度 地 减 少 需 要 完 成 该 程 序 的 工 作 量 (O1) 尽 量 减 少 语 句 数 量 (O2) 最 大 限 度 地 减 少 所 需 的 内 存 (O3) 最 大 化 程 序 的 可 理 解 性 (O4) 最 大 化 输 出 的 清 晰 度 (O5) 该 实 验 清 楚 地 表 明, 如 果 目 标 明 确, 程 序 员 往 往 容 易 实 现 这 一 目 标 因 此, 如 果 可 读 性 是 编 程 的 目 标, 那 么 很 可 能 程 序 员 会 设 计 出 很 容 易 理 解 的 方 案 它 也 表 明, 如 果 重 点 是 最 大 限 度 地 减 少 编 码 工 作, 程 序 可 理 解 性 则 会 大 打 折 扣 总 之, 易 于 理 解 和 修 改 是 编 程 活 动 的 基 本 目 标 这 一 章 将 讨 论 :

143 程 序 设 计 的 一 些 原 则, 例 如 结 构 化 信 息 隐 藏 代 码 编 写 标 准, 这 些 可 以 帮 助 提 高 程 序 的 可 读 性 一 些 开 发 流 程, 如 增 量 开 发 和 测 试 驱 动 开 发, 这 些 可 以 有 效 提 高 代 码 质 量 如 何 利 用 源 代 码 控 制 机 制 和 代 码 重 构, 来 控 制 代 码 演 化 如 何 使 用 单 元 测 试 框 架, 进 行 单 元 测 试 一 个 可 用 于 改 善 代 码 质 量 的 结 构 化 代 码 检 查 过 程 7.1 编 程 原 则 和 指 导 方 针 程 序 员 需 要 面 对 的 最 主 要 任 务 就 是 写 出 bug 尽 量 少 的 程 序, 另 外 就 是 能 够 快 速 地 写 出 代 码 能 写 出 健 壮 的 代 码 是 一 种 技 能, 这 只 能 通 过 练 习 来 掌 握 不 过, 根 据 经 验, 存 在 一 些 可 以 指 导 程 序 员 们 的 一 般 规 则 或 指 引 尽 管 设 计 出 色 的 编 程 语 言 使 程 序 员 的 工 作 更 简 单, 但 良 好 的 编 程 风 格 ( 编 出 正 确 的 和 简 单 的 程 序 ) 仍 是 通 过 不 断 实 践 训 练 出 的, 与 目 标 编 程 语 言 无 关 在 本 节 中, 我 们 将 讨 论 一 些 概 念 和 做 法, 可 以 帮 助 程 序 员 写 出 更 高 质 量 的 并 且 容 易 被 理 解 的 代 码 结 构 化 编 程 如 前 所 述, 编 码 活 动 的 一 个 基 本 目 标 是 使 代 码 易 理 解 结 构 化 编 程 的 许 多 做 法 都 被 认 为 有 助 于 提 高 代 码 可 读 性 结 构 化 编 程 运 动 始 于 20 世 纪 70 年 代, 当 时 很 多 人 都 在 谈 论 它, 写 关 于 它 的 报 告 现 在, 这 个 概 念 被 普 遍 接 受 甚 至 被 扩 大 化 编 程 就 是 结 构 化 虽 然 对 结 构 化 编 程 的 关 注 很 多, 但 是 结 构 化 编 程 的 概 念 和 结 构 化 编 程 背 后 的 动 机 往 往 没 有 被 充 分 的 了 解 结 构 化 编 程 往 往 被 视 为 没 有 goto 语 句 的 编 程 尽 管 广 泛 使 用 goto 方 法 是 不 可 取 的, 但 是 在 结 构 化 编 程 中 还 是 可 以 用 goto 语 句 的 下 面 提 供 了 一 个 简 短 的 讨 论, 谈 谈 究 竟 什 么 是 结 构 化 编 程 程 序 有 静 态 结 构, 也 有 动 态 结 构 静 态 结 构 是 代 码 本 身 的 语 句 顺 序, 动 态 结 构 就 是 程 序 运 行 时 的 语 句 执 行 顺 序 换 言 之, 静 态 结 构 和 动 态 行 为 都 是 代 码 语 句 序 列 静 态 结 构 的 语 句 序 列 是 固 定 的 ; 而 动 态 结 构 的 语 句 序 列 是 和 程 序 的 运 行 相 关 的, 即 不 同 次 的 运 行 可 以 产 生 不 同 的 动 态 语 句 执 行 序 列 如 果 动 态 结 构 与 静 态 结 构 类 似, 显 然 会 使 动 态 行 为 更 易 于 理 解 程 序 代 码 结 构 和 代 码 执 行 序 列 间 的 相 关 性 越 密 切, 程 序 就 会 越 容 易 理 解 ; 如 果 程 序 代 码 结 构 和 代 码 执 行 时 序 列 的 区 别 越 大, 则 从 程 序 代 码 中 讨 论 程 序 行 为 结 构 就 会 很 困 难 了 结 构 化 编 程 的 目 的 是 确 保 程 序 的 静 态 结 构 和 动 态 结 构 一 致 也 就 是 说, 结 构 化 编 程 的 目 的 是 编 写 出 这 样 的 程 序 : 程 序 执 行 时 产 生 的 语 句 执 行 序 列 与 该 程 序 代 码 文 本 的 语 句 序 列 相 同 由 于 在 程 序 代 码 文 本 中 语 句 是 线 性 组 织 的, 因 而 结 构 化 编 程 的 目 标 可 以 认 为 是 开 发 出 如 下 的 程 序 : 其 运 行 时 控 制 流 是 线 性 化,

144 并 且 这 种 线 性 化 的 结 构 和 代 码 文 本 的 线 性 化 结 构 相 一 致 然 而, 结 构 化 编 程 的 真 正 动 机 是 为 了 程 序 的 形 式 化 验 证 为 了 证 明 程 序 是 正 确 的, 需 要 证 明 当 程 序 执 行 时, 其 行 为 是 预 期 的 为 了 指 定 行 为, 需 要 指 定 在 若 干 条 件 下, 程 序 输 出 满 足 各 种 条 件 由 于 一 个 程 序 通 常 只 能 对 特 定 范 围 内 的 输 入 产 生 合 理 的 输 出, 而 不 能 处 理 任 意 的 输 入 数 据 因 此, 一 般 需 要 说 明 对 于 何 种 情 况 的 输 入 程 序 才 能 被 调 用, 以 及 在 哪 些 情 况 下 程 序 才 会 产 生 出 有 效 的 结 果 程 序 的 后 置 条 件 (post-condition) 是 指 关 于 程 序 预 期 的 最 终 状 态 的 断 言 程 序 的 前 置 条 件 (pre-condition) 是 指 关 于 输 入 条 件 的 断 言 通 常, 在 程 序 验 证 时, 确 定 出 能 使 后 置 条 件 得 到 满 足 的 前 置 条 件 就 是 证 明 的 目 标 用 Hoare 的 表 达 式 [50] 来 说, 为 了 验 证 一 个 程 序, 关 于 一 个 程 序 段 的 基 本 断 言 为 如 下 形 式 : P { S } Q. 这 个 表 达 式 的 解 释 是, 如 果 断 言 P 在 执 行 S 之 前 为 真, 且 S 的 执 行 会 终 止, 则 执 行 S 之 后, 断 言 Q 为 真 断 言 P 是 前 置 条 件,Q 是 后 置 条 件 这 些 断 言 是 关 于 S 执 行 前 后, 程 序 内 各 个 变 量 的 取 值 这 些 断 言 通 常 不 会 为 变 量 指 定 一 个 特 殊 的 值, 而 是 指 定 了 变 量 的 基 本 性 质 及 它 们 之 间 的 关 系 为 了 验 证 大 型 的 程 序 正 确 性, 可 能 会 通 过 对 程 序 的 组 件 或 者 一 组 语 句 构 造 断 言 来 确 定 整 个 程 序 的 断 言 如 果 程 序 是 一 个 语 句 序 列, 那 么 确 定 这 个 复 合 程 序 的 语 义 将 会 非 常 容 易 假 如 语 句 S 由 两 个 顺 序 执 行 的 语 句 S1 S2 组 成, 那 么 根 据 S1 和 S2 的 语 义, 可 以 得 出 S 的 语 义 ( 这 条 规 则 被 叫 做 并 置 规 则 [50]), 如 下 所 述 : ( 请 用 公 式 编 辑 器 重 写 ) 这 个 表 达 式 的 解 释 是 : 如 果 分 子 部 分 可 证 明 是 正 确 的, 那 么 分 母 部 分 就 可 以 根 据 分 子 推 断 出 来 用 这 条 规 则, 如 果 证 明 了 P1 { S1 } Q1 和 P2 { S2 } R2 成 立, 那 么 就 可 以 决 定 S1;S2 的 语 义, 需 要 验 证 的 是 Q1 => P 2, 所 以 我 们 可 以 断 定, 如 果 前 置 条 件 P1 被 满 足, 执 行 了 S1;S2 后, 后 置 条 件 Q2 也 会 满 足 换 句 话 说, 要 证 明 P { S1;S2 } R, 且 已 经 确 定 了 S1 和 S2 的 行 为, 只 需 要 一 步 这 使 得 可 以 从 组 成 部 分 的 证 明 达 到 构 造 大 程 序 证 明 的 目 的 请 注 意, 该 规 则 只 能 处 理 语 句 严 格 序 列 化 的 程 序 因 此, 如 果 要 使 用 这 条 规 则, 需 要 将 程 序 构 建 为 序 列 化 的 形 式 这 就 是 将 程 序 线 性 化 以 便 于 进 行 验 证 (verification) 的 动 机 显 然, 有 目 的 程 序 都 难 以 写 成 简 单 的 语 句 序 列 而 没 有 任 何 分 支 或 循 环 ( 循 环 也 包 含 分 支 ) 因 此, 如 何 线 性 化 程 序 的 控 制 流? 这 需 要 使 用 结 构 化 的 构 造 块 来 实 现 在 结 构 化 编 程 中, 语 句 不 是 简 单 的 赋 值 语 句, 而 是 一 个 结 构 块 形 式 的 语 句 结 构 块 的 关 键 特 性 是 其 特 定 的 入 口 和 特 定 的 出 口 也 就 是 说, 结 构 化 语 句 的 执 行 过 程 从 确 定 的 点 开 始, 并 在 确 定 的 点 终 止 结 构 化 的 单 入 口 / 单 出 口 特 性, 使 程 序 可 以 看 作 是 有 顺 序 的 ( 结 构 ) 语 句 如 果 所 有 的

145 语 句 是 结 构 化 的, 那 么 在 执 行 过 程 中, 这 些 语 句 的 执 行 顺 序 将 与 该 程 序 的 文 本 顺 序 相 同 因 此, 使 用 单 入 口 / 单 出 口 语 句, 静 态 和 动 态 结 构 是 一 致 的 最 常 用 的 单 入 口 / 单 出 口 语 句 有 : 选 择 语 句 : if B then S1 else S2 if B then S1 循 环 语 句 : While B do S repeat S until B 顺 序 语 句 : S1; S2; S3;... 可 以 证 明 这 三 个 基 本 结 构 足 以 构 造 任 何 可 能 的 算 法 在 现 代 编 程 语 言 中 有 其 他 类 似 的 结 构 将 程 序 的 控 制 流 线 性 化, 一 般 来 讲, 线 性 化 的 控 制 流 可 以 使 我 们 更 容 易 地 理 解 程 序 因 此, 程 序 应 尽 可 能 的 写 成 单 入 口 单 出 口 的 形 式 这 样 做 的 基 本 目 的 是 使 程 序 的 逻 辑 尽 量 简 单 易 懂 当 然, 没 有 可 以 适 应 所 有 情 况 又 快 又 准 的 规 则 结 构 化 编 程 可 以 引 导 程 序 员 编 写 出 简 明 清 晰 的 程 序 关 于 结 构 化 块 最 后 要 注 意 的 是, 不 是 任 何 带 有 单 入 口 单 出 口 的 代 码 段 都 能 被 视 为 结 构 化 构 造 块 否 则, 人 们 可 以 在 任 何 程 序 中 定 义 适 当 的 块 单 元, 使 程 序 看 起 来 像 是 这 些 块 单 元 的 序 列 ( 最 坏 的 情 况 下, 整 个 程 序 可 以 看 作 为 一 个 块 单 元 ) 结 构 化 的 基 本 目 标 是 线 性 化 程 序 的 控 制 流, 使 程 序 执 行 的 行 为 更 容 易 理 解 和 评 价 线 性 化 的 控 制 流 使 得 我 们 在 准 确 了 解 每 一 个 基 本 结 构 的 行 为 时, 整 个 程 序 的 行 为 可 被 视 为 不 同 语 句 行 为 的 合 成 这 其 中 隐 含 的 意 思 是 : 我 们 能 够 清 楚 地 了 解 和 识 别 每 个 结 构 块 的 行 为, 这 要 求 我 们 能 够 简 洁 地 理 解 或 描 述 每 个 结 构 块 的 行 为 除 非 我 们 能 够 做 到 这 一 点, 否 则 就 不 可 能 通 过 部 分 组 成 整 体 显 然, 对 于 任 意 的 结 构, 仅 因 为 它 是 单 入 口 和 单 出 口 的, 不 能 认 为 其 达 到 了 结 构 化 的 目 标 基 于 这 样 的 观 点, 前 文 所 述 结 构 体 被 表 现 为 结 构 化 的 语 句 存 在 良 定 义 的 规 则 可 用 于 描 述 这 些 语 句 在 执 行 过 程 中 的 行 为 表 现, 这 使 得 我 们 可 以 基 于 此 讨 论 更 大 规 模 的 程 序 总 体 而 言, 可 以 说, 结 构 化 程 序 比 非 结 构 化 的 程 序 更 容 易 理 解, 而 且 这 种 程 序 更 容 易 被 形 式 化 证 明 然 而, 应 该 记 住 的 是 结 构 化 编 程 本 身 并 不 是 最 终 目 的 我 们 的 基 本 目 标 是, 程 序 能 容 易 理 解, 而 结 构 化 编 程 是 实 现 这 一 目 标 的 安 全 做 法 不 过, 也 有 一 些 常 见 的 大 家 都 知 道 的 编 程 做 法, 它 灵 活 地 使 用 非 结 构 化 结 构 ( 例 如,break 语 句,continue 语 句 ) 虽 然 我 们 应 该 尽 量 避 免 使 用 那 些 违 反 了 单 入 口 / 单 出 口 的 语 句, 但 是 如 果 使 用 这 些 语 句 是 简 化 程 序 的 最 简 单 的 方 法, 则 从 可 读 性 的 角 度 来 看, 我 们 应 该 还 是 可 以 使 用 这 些 语 句 的 主 要 的 一 点 是, 任 何 非 结 构 化 语 句 应 该 只 有 在 结 构 化 语 句 很 难 理 解 的 情 况 下 使 用 采 取 这 种 观 点 的 前 提 是 我 们 的 主 要 目 标 是 可 读 性 如 果 目 标 是 程 序 可 以 形 式 化 验 证, 那 么 结 构 化 编 程 很 可 能 是 必 须 的

146 7.1.2 信 息 隐 藏 为 解 决 问 题 而 设 计 的 软 件 总 会 使 用 一 些 数 据 结 构, 而 这 些 数 据 结 构 是 问 题 域 中 某 些 信 息 的 表 示, 也 就 是 说, 为 了 解 决 某 个 问 题 而 进 行 软 件 开 发, 该 软 件 会 使 用 数 据 结 构 以 捕 捉 问 题 域 的 信 息 一 般 来 说, 只 有 若 干 特 定 操 作 用 于 执 行 这 些 信 息 也 就 是 说, 域 中 的 某 一 条 信 息 只 能 以 有 限 的 方 式 使 用 例 如, 会 计 师 事 务 所 总 账 有 一 些 非 常 明 确 的 用 途 : 借 贷 检 查 当 前 的 平 衡 等 ; 将 所 有 的 扣 款 乘 在 一 起, 然 后 除 所 有 贷 款 总 和, 这 些 操 作 通 常 是 不 会 执 行 的 因 此, 问 题 域 的 任 何 信 息 通 常 只 能 用 于 指 定 的 少 数 操 作 当 信 息 表 示 为 数 据 结 构 时, 应 用 同 样 的 原 则, 仅 有 若 干 明 确 的 操 作 才 能 使 用 该 数 据 结 构, 这 本 质 上 是 信 息 隐 藏 的 原 则 在 数 据 结 构 中 包 含 的 数 据 应 该 对 系 统 其 余 部 分 屏 蔽, 只 有 数 据 结 构 的 访 问 函 数 ( 其 代 表 着 可 以 对 数 据 进 行 的 操 作 ) 是 可 见 的 换 句 话 说, 当 信 息 在 数 据 结 构 中, 而 数 据 结 构 又 必 须 展 示 这 些 信 息 时, 对 信 息 的 每 个 操 作 都 需 要 有 一 个 访 问 函 数 正 如 在 问 题 域 系 统 一 样, 对 信 息 只 能 执 行 某 些 特 定 操 作, 在 软 件 的 其 余 部 分, 应 保 证 只 使 用 相 关 访 问 函 数 来 访 问 和 操 纵 数 据 结 构 信 息 隐 藏 可 以 减 少 模 块 间 耦 合 度, 使 系 统 更 易 于 维 护 信 息 隐 藏 也 是 软 件 开 发 过 程 中 控 制 复 杂 性 的 有 效 工 具 通 过 信 息 隐 藏 可 以 把 数 据 管 理 这 一 关 注 点 与 数 据 使 用 这 一 关 注 点 分 开, 以 产 生 预 期 的 结 果 许 多 老 的 语 言 如 Pascal,C 和 FORTRAN 语 言, 不 支 持 数 据 抽 象 的 机 制, 规 范 的 使 用 这 些 语 言 才 能 实 现 信 息 隐 藏 也 就 是 说, 这 些 语 言 并 没 有 提 供 限 制 性 规 则, 而 必 须 由 程 序 员 实 施, 大 多 数 现 代 面 向 对 象 语 言 提 供 了 实 现 信 息 隐 藏 的 机 制 程 序 设 计 的 最 佳 实 践 上 面 所 讨 论 的 观 念 能 帮 助 你 写 一 些 基 本 上 没 有 错 误 的 简 单 清 楚 的 程 序 也 有 很 多 编 程 的 实 践 经 验 能 帮 助 你 实 现 这 个 目 标 现 在 讨 论 一 些 可 以 使 代 码 更 容 易 阅 读 并 能 避 免 失 误 的 一 些 规 则 控 制 结 构 : 正 如 我 们 前 面 所 讨 论 的, 尽 可 能 的 使 用 一 些 单 入 口 / 单 出 口 的 结 构 体, 尽 量 使 用 一 些 标 准 的 结 构 体, 不 要 因 为 编 程 语 言 没 有 限 制 就 大 量 使 用 非 标 准 的 结 构 体 Goto 语 句 : 应 该 以 严 格 的 方 式 有 节 制 的 使 用 Goto 语 句 只 有 当 不 用 Goto 语 句 程 序 会 变 得 更 复 杂 的 情 况 下, 才 可 以 用 Goto 语 句 在 任 何 情 况 下, 使 用 Goto 语 句 之 前 应 该 考 虑 有 没 有 其 它 可 替 代 的 方 法 如 果 必 须 使 用 goto, 则 向 前 跳 转 比 向 后 跳 转 更 可 被 接 受 信 息 隐 藏 : 正 如 前 面 讨 论 的 一 样, 应 尽 可 能 使 用 信 息 隐 藏 技 术 只 有 数 据 结 构 中 那 些 允 许 被 访 问 的 函 数 是 可 见 的, 函 数 以 外 的 信 息 应 全 部 被 隐 藏 用 户 定 义 类 型 : 现 在 的 编 程 语 言 一 般 都 允 许 用 户 自 定 义 数 据 类 型, 像 枚 举 类 型 当 有 一

147 些 辅 助 工 具 支 持 时, 用 户 自 定 义 数 据 类 型 应 该 尽 可 能 加 以 复 用 举 例 而 言, 当 需 要 处 理 一 些 日 期 数 据 时, 可 以 把 一 周 中 的 一 天 定 义 为 一 种 类 型 比 起 为 每 一 天 定 义 代 码 然 后 分 别 处 理 它 们, 使 用 这 种 类 型 可 以 使 程 序 更 清 晰 嵌 套 : 如 果 if-else 语 句 嵌 套 太 深 的 话, 势 必 会 使 代 码 的 逻 辑 结 构 变 得 难 以 理 解 为 了 避 免 因 if-else 语 句 嵌 套 太 深, 导 致 难 以 分 辨 if 和 哪 个 else 语 句 相 关 连, 我 们 应 该 尽 量 避 免 使 用 嵌 套 太 深 的 结 构, 即 使 这 是 以 牺 牲 效 率 为 代 价 举 例 来 说, 看 下 面 的 这 个 嵌 套 语 句 结 构 : if C1 then S1 else if C2 then S2 else if C3 then S3 else if C4 then S4; 如 果 上 面 语 句 中 不 同 的 条 件 不 相 交 的 话, 那 上 面 的 结 构 就 可 以 转 变 成 下 面 的 这 种 结 构 了 : if C1 then S1; if C2 then S2; if C3 then S3; if C4 then S4; 这 个 顺 序 结 构 将 产 生 和 上 面 嵌 套 结 构 体 一 样 的 结 果 ( 如 果 条 件 不 相 交 ), 但 下 面 的 这 个 更 容 易 理 解, 代 价 也 不 过 就 是 牺 牲 了 一 点 点 效 率 模 块 的 大 小 : 我 们 在 系 统 设 计 的 时 候 讨 论 过 这 个 问 题 程 序 员 应 该 仔 细 检 查 那 些 有 太 多 代 码 的 函 数 ( 举 例 说 超 过 100 行 的 代 码 ), 大 的 模 块 常 常 不 能 很 好 的 内 聚 模 块 的 大 小 没 有 绝 对 性 的 限 制, 对 模 块 大 小 的 指 导 原 则 是 内 聚 和 耦 合 模 块 间 的 接 口 : 应 该 仔 细 检 查 带 有 复 杂 接 口 的 模 块 根 据 经 验, 若 模 块 的 接 口 超 过 五 个 参 数, 那 应 该 进 行 仔 细 检 查, 并 尽 可 能 将 其 分 解, 保 证 每 个 模 块 接 口 的 简 单 副 作 用 : 引 用 一 个 模 块 时, 如 果 模 块 接 口 里 定 义 的 参 数 在 外 部 被 修 改, 譬 如 修 改 全 局 变 量, 那 么 会 产 生 一 些 副 作 用 这 些 副 作 用 应 尽 可 能 避 免 若 模 块 已 经 产 生 了 副 作 用, 则 需 要 适 当 的 予 以 记 录 鲁 棒 性 : 一 个 能 按 计 划 运 行 甚 至 在 异 常 情 况 下 也 能 正 常 运 行 的 程 序 是 一 个 健 壮 的 程 序 程 序 在 输 入 参 数 不 正 确 输 入 不 正 确 的 参 数 值 或 者 溢 出 的 情 况 下 可 能 会 产 生 异 常 出 现 这 种 情 况 时, 程 序 不 应 立 即 崩 溃, 而 应 能 自 动 提 示 有 意 义 的 信 息 并 优 雅 的 退 出 带 default 的 switch 语 句 : 假 设 switch 语 句 不 带 default, 如 果 switch 中 的 case 语 句 的 值 都 不 满 足, 那 么 容 易 出 现 一 些 意 想 不 到 的 错 误 不 带 default 常 常 导 致 的 bug 包 括 空 引 用 内 存 泄 漏 甚 至 一 些 其 他 的 严 重 bug 在 switch 语 句 中 带 上 default 语 句 是 一 个 很 好 的 习 惯 switch (i){

148 case 0 : {s= malloc ( size ) } s [0] = y; /* NULL dereference if default occurs */ } catch 语 句 块 为 空 : 捕 捉 到 一 个 异 常, 却 没 有 相 应 的 操 作 语 句, 会 产 生 本 来 应 执 行 操 作 而 没 有 执 行 的 后 果 无 论 什 么 时 候 捕 捉 到 一 个 异 常, 执 行 一 些 默 认 的 操 作 是 一 个 很 好 的 习 惯, 即 便 这 些 操 作 只 是 输 出 错 误 的 信 息 try { FileInputStream fis = new FileInputStream (" InputFile "); } catch ( IOException ioe ) { } // 不 是 好 的 方 式 空 IF 陈 述 : 检 查 一 个 条 件, 但 是 没 有 相 应 的 执 行 语 句 这 通 常 用 于 处 理 一 些 错 误, 应 该 对 其 注 意 相 似 的 情 况 是 没 有 执 行 语 句 的 finally try synchronized 语 句, 以 及 空 的 静 态 方 法 等 等, 这 些 无 用 的 检 查 应 该 避 免 if (x == 0) {} /* nothing is done after checking x */ else { : } 输 入 数 据 需 要 检 查 : 通 常 程 序 员 默 认 输 入 的 数 据 是 符 合 要 求 的, 而 不 去 检 查 它 们 但 是 读 进 来 的 数 据 有 时 并 不 符 合 要 求, 会 导 致 之 后 的 程 序 出 现 些 错 误 忽 略 这 个 可 能 会 导 致 严 重 的 错 误 例 如, 用 scanf() 读 进 来 的 数 据 超 过 了 期 待 的 长 度, 那 么 可 能 会 导 致 溢 出 因 此, 在 使 用 读 入 的 数 据 之 前 应 先 检 查 是 否 符 合 要 求 ( 这 就 是 为 什 么 一 些 语 言 为 读 操 作 提 供 返 回 值 ) Finally 语 句 块 中 的 返 回 值 : 由 于 finally 语 句 块 的 返 回 值 会 导 致 一 些 错 误 的 意 思, 所 以 不 应 在 finally 语 句 块 中 返 回 值 看 下 面 的 代 码 public String foo () { try { throw new Exception ( "An Exception " ); } catch ( Exception e) { throw e; } finally { return " Some value "; }

149 } 在 上 面 的 例 子 中, 无 论 是 有 没 异 常 都 会 返 回 一 个 值 因 此, 考 虑 到 用 户, 他 们 不 能 分 辨 这 些 是 否 为 异 常 情 况 下 的 返 回 值 如 果 在 try 中 也 返 回 一 个 值, 那 么 就 会 出 现 一 个 有 趣 的 情 况 : 如 果 finally 也 返 回 值, 则 finally 返 回 的 值 会 取 代 try 返 回 的 值 参 数 相 关 性 : 通 常 参 数 之 间 具 有 隐 含 的 相 关 关 系 例 如, 在 下 面 的 代 码 中, 由 于 length 表 示 缓 冲 区 的 大 小 如 果 缓 冲 区 最 大 值 与 length 之 间 的 隐 含 相 关 性 不 成 立, 缓 冲 区 可 能 会 溢 出 ( 如 下 面 的 代 码 所 示 ) 因 此, 验 证 这 些 隐 含 的 相 关 性 是 很 好 的 做 法, 而 不 能 假 设 这 些 相 关 性 总 是 为 真 一 般 情 况 下, 最 好 做 一 些 有 关 参 数 隐 含 假 设 的 检 查 void ( char *src, int length, char destn []) { strcpy ( destn, src ); /* Can cause buffer overflow if length > MAX_SIZE */ } 可 信 的 数 据 源 : 使 用 输 入 的 数 据 之 前 应 该 先 检 查 它 们, 特 别 是 当 这 些 数 据 是 用 户 输 入 的 或 者 是 从 网 络 上 获 得 的 例 如, 当 处 理 一 些 字 符 串 复 制 的 操 作 时, 应 该 检 查 源 数 据 是 否 是 空, 它 的 长 度 是 否 规 范 相 似 的 情 况 是 网 络 上 的 数 据, 它 们 能 被 探 测, 并 且 容 易 被 修 改 破 坏 要 避 免 这 些 问 题, 我 们 应 该 执 行 一 些 检 查 语 句, 像 奇 偶 检 查, 哈 希 等 等, 通 过 这 些 来 验 证 输 入 数 据 的 正 确 性 重 视 异 常 : 大 多 数 程 序 员 都 不 太 重 视 异 常, 他 们 都 趋 向 于 处 理 程 序 中 的 事 件 流, 控 制 语 句 和 数 据 尽 管 主 要 工 作 都 做 好 了, 但 总 有 一 些 异 常 会 导 致 整 个 系 统 崩 溃 要 将 一 个 软 件 系 统 做 的 更 可 信, 程 序 员 应 该 考 虑 所 有 的 可 能 性, 并 且 写 合 适 的 异 常 处 理 语 句 来 避 免 失 败 或 损 失 编 码 标 准 比 起 写 代 码 所 花 的 时 间, 程 序 员 花 费 了 更 多 的 时 间 在 读 代 码 在 编 程 的 生 活 中, 笔 者 在 调 试 过 程 中 花 费 了 大 量 时 间 阅 读 和 加 强 它 读 者 而 不 是 作 者 也 花 费 相 当 大 的 努 力 在 阅 读 代 码 上, 因 为 代 码 常 常 被 其 他 人 而 不 是 本 人 维 护 总 之, 以 一 种 便 于 阅 读 和 理 解 的 方 式 写 代 码 是 最 重 要 的 编 码 标 准 提 供 了 程 序 的 某 些 方 面 的 规 则 和 指 引, 以 使 代 码 更 易 于 阅 读 大 多 数 组 织 定 期 为 制 定 自 己 的 软 件 编 码 标 准 一 般 而 言, 编 码 标 准 为 程 序 员 提 供 了 关 于 命 名 文 件 组 织 声 明 和 宣 言 以 及 布 局 和 注 释 的 指 南 为 了 给 出 一 个 编 码 标 准 的 想 法 ( 通 常 称 为 公 约 或 样 式 ), 我 们 讨 论 了 Java 的 基 于 公 开 标 准 的 一 些 准 则 ( 来 源 or java.sun.com/docs) 命 名 规 则 一 些 被 广 泛 运 用 的 标 准 命 名 规 则 通 常 有 : 包 名 是 小 写 字 母 ( 如 mypackage, edu.iitk.maths)

150 类 名 要 是 名 词, 并 且 所 有 单 词 的 首 字 母 要 大 写 ( 例 如 Day, DateOfBirth, EventHandler). 变 量 应 该 是 以 小 写 字 母 开 头 的 名 词 ( 例 如 name, amount). 常 量 的 所 有 字 母 均 应 大 写 ( 例 如 PI, MAX ITERATIONS). 方 法 名 是 副 词, 以 小 写 字 母 开 头, 其 它 单 词 首 字 母 大 写 ( 例 如 getvalue()). 私 有 类 应 该 在 单 词 尾 带 有 后 缀 ( 例 如 private int value_ ). ( 有 一 些 标 准 是 要 带 有 前 缀 的 ) 大 范 围 里 的 变 量 得 有 个 长 名 字 ; 局 部 变 量 应 该 是 个 短 名 字 ; 循 环 迭 代 器 里 的 变 量 应 该 被 命 名 为 i, j, k, 等 等. 前 缀 is 应 该 用 在 boolean 和 方 法 名 前 以 避 免 与 其 它 变 量 混 淆 ( 例 如 用 isstatus 代 替 status); 不 应 该 使 用 否 定 的 变 量 名 ( 例 如 isnotcorrect) 单 词 compute 可 以 放 在 一 些 需 要 计 算 的 词 前 面 ; 单 词 find 可 以 放 在 一 些 需 要 寻 找 的 词 前 面 ( 例 如 computemean(), findmin()). Exception 类 应 该 带 Exception 的 后 缀 ( 例 如 OutOfBoundException) 文 件 规 范 有 一 些 关 于 文 件 应 如 何 命 名, 文 件 中 应 包 含 什 么 内 容 的 约 定, 以 保 证 读 者 能 够 从 文 件 名 中 猜 测 的 该 文 件 会 有 一 些 什 么 东 西 下 面 是 一 些 约 定 : Java 源 文 件 的 扩 展 名 是.java 这 是 必 须 的 每 个 文 件 应 该 包 含 一 个 类, 并 且 该 类 名 应 该 和 文 件 名 一 样 每 一 行 的 长 度 不 应 超 过 80 列, 特 殊 字 符 应 避 免 如 果 行 较 长, 那 么 换 行 时 必 须 表 示 清 楚 语 句 这 里 有 一 些 针 对 声 明 及 可 执 行 语 句 的 指 南 下 面 是 一 些 例 子 请 注 意, 并 非 人 人 都 认 同 以 下 规 范 因 此 软 件 开 发 组 织 一 般 会 自 行 开 发 可 被 遵 循 的 规 范, 而 不 限 制 程 序 员 的 自 由 发 挥 变 量 应 该 在 它 声 明 的 地 方 初 始 化, 并 且 要 尽 可 能 使 它 们 声 明 的 范 围 最 小 相 关 的 变 量 一 起 声 明, 不 相 关 的 不 在 一 起 声 明 类 中 的 变 量 绝 不 要 声 明 为 public for 循 环 中 只 使 用 循 环 控 制 语 句 循 环 变 量 应 该 在 循 环 前 立 即 初 始 化 在 循 环 中 尽 量 避 免 使 用 break 和 continue

151 避 免 使 用 do... while 结 构. 避 免 过 于 复 杂 的 条 件 表 达 式 可 以 引 入 临 时 的 布 尔 变 量 来 代 替 避 免 在 条 件 表 达 式 中 执 行 语 句 注 释 和 布 局 注 释 旨 在 帮 助 读 者 理 解 程 序 的 代 码 注 释 的 目 的 并 不 是 解 释 代 码 的 逻 辑 如 果 逻 辑 太 复 杂 以 致 需 要 注 释 来 解 释, 那 么 最 好 还 是 重 写 或 者 简 化 代 码 一 般 来 说, 注 释 应 解 释 代 码 是 做 什 么 的 或 为 什 么 有 这 段 代 码, 使 得 人 们 可 以 独 立 于 代 码 而 了 解 整 个 程 序 一 般 只 为 代 码 块 提 供 注 释, 在 许 多 情 况 下, 只 需 为 模 块 提 供 注 释 模 块 的 注 释 是 最 有 用 的, 因 为 模 块 形 成 了 的 测 试 编 译 验 证 和 修 改 的 单 元 模 块 的 注 释 又 被 称 作 模 块 的 序 言, 描 述 了 模 块 的 功 能 目 的 公 共 接 口 如 何 使 用 接 口 参 数 ( 假 设 它 有 相 关 参 数 ) 以 及 任 何 其 它 的 负 面 影 响, 也 可 能 被 包 括 其 他 功 能 应 当 指 出, 序 言 只 有 在 一 直 符 合 模 块 逻 辑 时 是 有 用 的 如 果 模 块 被 修 改, 那 么 有 必 要 的 情 况 下, 序 言 也 应 进 行 修 改 Java 的 注 释 由 / **... * / 分 隔, 并 可 以 生 成 为 HTML 文 件 这 种 注 释 在 类 和 方 法 字 段 的 前 言 中 使 用, 主 要 是 为 了 给 不 能 访 问 源 码 的 用 户 提 供 帮 助 除 了 模 块 前 沿, 编 码 标 准, 可 以 指 定 如 何 注 释 及 放 置 在 哪 里 下 面 是 一 些 注 释 的 规 范 : 单 行 注 释 应 该 与 它 所 注 释 的 那 行 代 码 对 齐 为 程 序 中 的 主 要 变 量 做 注 释, 阐 明 它 们 代 表 着 什 么 多 行 注 释 以 /* 开 头, 以 */ 结 尾. 在 代 码 后 面 注 释 应 尽 可 能 的 短, 如 在 同 一 行, 应 使 其 离 所 注 释 代 码 足 够 远 布 局 集 中 指 导 代 码 应 如 何 缩 进, 应 如 何 使 用 空 行 空 格 等, 以 使 其 更 易 于 阅 读 缩 进 规 范 为 每 个 程 序 结 构 提 供 标 准 但 是, 大 多 数 程 序 员 通 过 其 他 人 或 书 本 上 的 代 码 片 段 学 习 代 码, 其 中 不 少 编 码 方 式 已 成 为 约 定 俗 成 的 标 准 我 们 提 倡 程 序 员 们 遵 循 普 遍 的 一 些 约 定, 并 保 持 一 致, 在 此 就 不 讨 论 其 它 的 一 些 规 范 细 节 了 7.2 增 量 式 开 发 当 准 备 好 设 计 方 案 和 模 块 规 范 时, 编 码 活 动 开 始 了 根 据 设 计 方 案, 将 各 种 模 块 分 配 给 开 发 人 员 编 码 开 发 者 在 实 现 模 块 编 码 时 会 使 用 一 些 过 程 实 现 这 个 目 标 的 过 程 有 很 多 下 面 讨 论 增 量 式 这 种 有 效 的 开 发 方 法

152 7.2.1 一 个 增 量 编 码 方 法 大 多 数 开 发 者 遵 循 的 方 法 是 为 当 前 指 定 模 块 编 码, 完 成 后 对 其 进 行 单 元 测 试 以 便 修 改 这 些 代 码 会 提 交 到 项 目 库 从 而 可 以 被 工 程 中 的 其 他 人 使 用 ( 稍 后 会 阐 述 提 交 代 码 的 过 程 ) 经 验 丰 富 的 开 发 者 经 常 遵 循 的 一 个 更 好 的 方 式 是 增 量 的 开 发 代 码, 即 先 编 码 实 现 模 块 的 部 分 功 能, 然 后 使 用 一 些 快 速 代 码 检 查 的 方 法 对 写 好 的 代 码 编 译 测 试 当 代 码 通 过 测 试 时, 开 发 者 继 续 添 加 代 码 以 实 现 其 他 功 能 的 换 句 话 说, 代 码 是 逐 步 开 发 的, 一 旦 新 撰 写 了 代 码 就 要 被 测 试, 这 种 编 码 过 程 如 图 7.1 所 示

153 模 块 规 范 写 一 些 代 码 实 现 某 些 功 能 改 善 测 试 脚 本 来 测 试 新 功 能 执 行 测 试 脚 本 修 改 出 错 是 否 所 有 规 格 满 足 是 退 出 图 7.1 增 量 编 码 方 法 这 种 每 写 完 一 些 代 码 就 测 试 的 增 量 开 发 方 法, 带 来 的 一 个 显 著 好 处 是 调 试 的 便 利 每 当 发 现 一 个 错 误, 由 于 上 一 次 测 试 的 成 功, 可 以 确 定 错 误 源 自 刚 添 加 的 代 码 然 而, 遵 循 这 种 方 法 时, 有 一 点 是 至 关 重 要 的, 即 测 试 可 以 通 过 简 单 运 行 测 试 脚 本 来 完 成 有 了 这 些 测 试 脚 本, 不 仅 测 试 可 以 如 期 顺 利 完 成, 同 时 也 易 于 添 加 新 的 测 试 用 例 这 些 测 试 脚 本 对 未 来 编 码 的 增 强 有 巨 大 的 帮 助, 因 为 通 过 这 些 测 试 脚 本 可 以 很 快 检 测 前 期 开 发 的 功 能 仍 然 可 用 另 外, 测 试 脚 本 也 可 用 来 帮 助 在 模 块 被 测 试 前 进 行 的 最 终 单 元 测 试

154 7.2.2 测 试 驱 动 开 发 测 试 驱 动 开 发 TDD (Test-Driven Development) 这 种 过 程 改 变 了 编 码 的 普 通 方 法 在 TDD 中, 一 个 开 发 者 先 写 测 试 脚 本, 然 后 再 写 代 码 去 进 行 测 试, 这 完 全 不 同 于 直 接 编 写 代 码 然 后 再 用 测 试 用 例 来 检 测 代 码 的 方 法 整 个 过 程 就 是 随 着 基 于 所 写 的 规 范 测 试 和 所 写 代 码 通 过 测 试 而 逐 步 完 成 的 TDD 方 法 如 图 7.2 所 示 TDD 是 已 经 收 录 到 极 限 编 程 中 的 一 个 较 新 的 方 法 TDD 的 概 念 比 较 一 般 性, 绝 不 拘 泥 于 任 何 特 定 的 方 法 TDD 中 有 几 点 值 得 注 意 第 一, 这 种 方 法 中 说 明 你 只 需 写 出 足 以 通 过 测 试 的 代 码 据 此, 代 码 总 是 和 测 试 同 步 当 然 这 与 code-first 方 法 不 太 一 样, 因 为 在 code-first 方 法 中 常 常 是 写 了 很 长 一 段 代 码 后 进 行 测 试, 但 测 试 仅 仅 覆 盖 了 一 小 部 分 代 码 通 过 鼓 励 编 写 能 通 过 测 试 代 码, 确 保 所 需 功 能 的 责 任 就 转 移 到 设 计 测 试 用 例 上 也 就 是 说, 检 查 后 续 开 发 的 代 码 能 否 实 现 需 要 的 功 能 是 测 试 的 任 务

155 模 块 规 范 为 一 些 功 能 部 分 写 / 加 测 试 脚 本 作 为 规 范 加 入 代 码 来 满 足 上 一 步 的 规 范 ( 同 时 还 要 满 足 之 前 的 ) 在 测 试 脚 本 上 执 行 代 码 修 改 改 善 代 码 出 错? 是 否 否 代 码 是 否 满 足 改 善 是 所 有 规 格 满 足? 否 是 退 出 图 7.2 测 试 驱 动 开 发 在 编 码 前 就 写 测 试 程 序 造 就 了 测 试 驱 动 开 发 模 式 的 发 展 由 于 测 试 要 先 基 于 规 范 写, 代 码 的 使 用 应 首 先 得 到 关 注 这 有 助 于 确 保 接 口 来 自 代 码 使 用 者 的 视 角 和 代 码 满 足 其 使 用 的 关 键 场 景, 同 时 这 有 助 于 减 少 接 口 错 误 在 TDD 中, 经 常 会 考 虑 优 先 某 些 代 码 的 开 发 很 多 时 候, 新 的 测 试 很 可 能 主 要 集 中 于 主 要 使 用 的 功 能 上 一 般 来 说, 优 先 级 较 低 的 特 性 或 功 能 的 测 试 会 比 较 晚 因 此,

156 优 先 级 高 的 特 性 会 先 被 开 发, 优 先 级 低 的 次 之 这 样 做 的 好 处 是 高 优 先 级 的 部 分 先 做 完, 缺 点 是 优 先 级 低 的 特 性 或 没 有 撰 写 测 试 用 例 的 代 码 可 能 得 不 到 处 理 由 于 编 写 的 代 码 需 要 满 足 测 试, 代 码 的 完 整 性 取 决 于 充 分 的 测 试 用 例 通 常, 为 所 有 的 场 景 或 特 殊 情 况 写 测 试 用 例 十 分 困 难 且 繁 琐, 对 开 发 者 而 言, 为 所 有 特 殊 情 况 写 测 试 程 序 是 不 可 能 的 在 TDD 中, 因 为 目 标 是 写 足 够 的 代 码 以 通 过 测 试, 一 些 特 殊 情 况 可 能 就 得 不 到 处 理 不 仅 如 此, 由 于 每 一 步 编 码 主 要 是 为 了 通 过 测 试, 可 能 稍 后 会 发 现 早 期 的 算 法 并 不 合 适 这 种 情 况 下, 增 加 新 功 能 前 需 要 先 改 良 以 前 的 代 码, 如 图 7.2 所 示 结 对 编 程 结 对 编 程 也 是 作 为 极 限 编 程 的 一 项 关 键 技 术 提 出 的 编 码 过 程 在 结 对 编 程 中, 是 一 对 编 码 人 员 而 不 是 单 个 人 来 编 写 代 码 的 即, 编 码 任 务 不 是 分 配 给 单 个 人 的 而 是 一 对 人 这 对 人 员 一 起 编 写 代 码 可 以 想 象 该 过 程 是 一 个 人 编 码, 同 时 另 一 个 人 也 积 极 参 与 并 一 直 检 查 都 编 写 了 些 什 么 一 旦 发 现 错 误 就 指 出 来 并 纠 正 必 要 时, 组 内 可 以 讨 论 这 些 算 法 数 据 结 构 和 编 码 中 使 用 的 策 略, 双 方 角 色 经 常 替 换 以 保 持 平 等 结 对 编 程 的 基 本 动 机 是, 因 为 阅 读 和 评 审 代 码 能 有 效 地 发 现 缺 陷, 一 对 人 编 程 能 得 知 代 码 在 书 写 的 同 时 得 到 评 审 即, 一 个 编 程 人 员 一 直 在 检 查 正 在 被 编 写 的 代 码 而 不 是 一 个 人 编 码 后 再 让 另 一 个 人 检 查 正 如 增 量 开 发 和 测 试, 这 里 是 增 量 的 评 审 除 了 增 量 的 评 审 代 码, 有 两 个 人 参 与 目 前 的 编 程 任 务 有 可 能 会 引 出 更 好 的 关 于 数 据 结 构 和 算 法 接 口 逻 辑 等 方 面 的 好 主 意, 有 可 能 会 想 出 更 好 的 方 法 来 解 决 易 导 致 错 误 的 情 况 然 而, 把 任 务 分 配 给 两 个 人 很 可 能 降 低 效 率 和 产 量, 这 是 结 对 编 程 的 潜 在 缺 陷 显 然, 两 个 人 会 编 写 出 更 优 的 代 码 现 在 需 要 解 决 的 问 题 是 由 代 码 的 改 良 带 来 的 生 产 率 上 升 是 否 能 抵 消 让 两 个 人 接 一 个 任 务 带 来 的 损 失 还 有 一 些 关 于 责 任 和 代 码 所 有 权 的 问 题, 特 别 是 当 结 对 不 固 定 和 进 行 角 色 转 换 时 影 响 很 显 著 ( 这 些 在 XP 中 都 提 到 了 ) 结 对 编 程 的 影 响 是 一 个 研 究 上 的 活 跃 话 题, 尤 其 是 对 于 有 经 验 的 软 件 工 程 方 面 知 识 的 研 究 者 而 言

157 7.3 代 码 演 化 的 管 理 在 编 码 阶 段, 一 个 或 一 对 程 序 员 写 的 代 码 演 化 从 开 始 的 一 无 所 有 到 最 后 经 过 很 好 测 试 的 模 块 在 这 个 阶 段, 代 码 默 默 的 变 化 着 代 码 不 仅 因 开 发 阶 段 的 发 展 而 变 化, 也 随 着 需 求 改 变 模 块 规 范 变 化 而 变 化 在 多 变 的 场 景 中, 管 理 不 断 变 化 的 代 码 是 一 个 挑 战 这 里 我 们 只 讨 论 两 个 问 题 怎 样 管 理 已 有 的 不 同 版 本 的 代 码, 如 何 在 不 断 变 化 中 保 证 代 码 质 量 源 代 码 控 制 和 开 发 在 一 个 项 目 中 有 很 多 人 开 发 源 代 码 程 序 员 们 修 改 不 同 的 源 文 件, 最 终 结 合 在 一 起 创 建 可 执 行 程 序 程 序 员 要 保 持 源 文 件 随 着 代 码 演 化 而 变 化, 就 如 我 们 在 上 面 提 到 的 过 程 一 样, 还 要 经 常 在 其 他 源 文 件 中 进 行 修 改 为 了 控 制 源 文 件 和 他 们 的 演 化, 源 代 码 控 制 几 乎 总 是 用 在 那 些 使 用 CVS ON UNIX 或 者 VSS ON WINDOWS 的 项 目 中 这 里 给 出 一 个 关 于 这 些 工 具 如 何 在 编 码 阶 段 使 用 的 简 洁 描 述, 我 们 的 讨 论 基 于 CVS 先 进 的 源 代 码 控 制 系 统 有 仓 库 的 概 念, 仓 库 本 质 上 是 个 受 约 束 的 目 录 结 构, 记 录 项 目 组 中 不 同 程 序 员 写 的 文 件 的 所 有 版 本 为 了 提 高 效 率, 文 件 历 史 的 保 留 方 式 一 般 是 在 基 础 文 件 上 的 增 加 或 减 少, 这 保 证 了 文 件 的 老 版 本 能 被 再 次 创 建, 如 果 新 的 需 求 出 现, 可 以 灵 活 地 丢 弃 曾 经 对 代 码 的 修 改, 仓 库 也 是 所 有 文 件 的 官 方 来 源 对 一 个 项 目, 仓 库 必 须 设 定 成 允 许 项 目 中 任 何 人 访 问 仓 库 要 存 放 的 文 件 也 是 有 规 定 的, 仓 库 中 记 录 着 这 些 文 件 的 演 化 程 序 员 用 这 个 仓 库 方 便 地 修 改 与 获 取 其 他 源 文 件 下 面 是 程 序 员 可 以 执 行 的 命 令 : 得 到 一 个 本 地 拷 贝 : 项 目 中 的 程 序 员 在 文 件 的 本 地 拷 贝 上 工 作 系 统 提 供 了 从 仓 库 中 得 到 一 个 本 地 拷 贝 的 指 令 本 地 拷 贝 的 命 令 一 般 叫 checkout 例 如, 命 令 cvs checkout <module>, 表 示 将 属 于 <module> 的 文 件 集 拷 贝 到 本 地 机 器 上 使 用 者 将 得 到 最 新 版 本 的 文 件 拷 贝 同 时, 使 用 者 想 要 得 到 该 文 件 的 任 何 版 本 都 是 可 以 从 仓 库 中 找 到 的, 很 多 使 用 者 使 用 这 条 命 令 修 改 文 件 : 对 本 地 文 件 的 修 改 只 有 在 提 交 (submit) 时 才 能 更 新 到 仓 库 里 通 过 提 交, 本 地 文 件 的 修 改 操 作 将 对 仓 库 中 的 文 件 生 效 此 后, 这 些 文 件 就 可 以 被 其 他 人 使 用, 这 个 操 作 也 被 称 为 checkin 更 新 本 地 文 件 : 本 地 文 件 中 没 有 其 他 项 目 成 员 新 提 交 到 仓 库 的 修 改 为 了 得 到 这 些 新 作 出 的 修 改, 本 地 拷 贝 必 须 进 行 更 新 通 过 更 新, 本 地 文 件 将 得 到 所 有 文 件 的 最 新 版 本

158 得 到 报 告 : 在 文 件 演 化 阶 段, 源 码 控 制 工 具 提 供 许 多 命 令 来 给 出 不 同 的 报 告 这 些 报 告 包 括 本 地 文 件 与 其 最 近 版 本 的 不 同 之 处, 所 有 对 此 文 件 进 行 的 修 改 及 原 因 一 旦 修 改 提 交, 文 件 便 对 小 组 成 员 开 放 程 序 员 提 交 的 源 文 件 必 须 对 其 他 人 有 用 项 目 成 员 的 标 准 行 为 如 下 : 检 查 需 要 修 改 的 文 件 的 最 新 版 本 ; 按 照 计 划 进 行 修 改 ; 确 认 修 改 达 到 了 期 望 效 果 ; 将 修 改 后 的 文 件 提 交 回 仓 库 必 须 明 确 的 是, 当 两 个 用 户 对 某 个 文 件 同 时 进 行 修 改 时, 那 么 对 文 件 相 同 位 置 的 不 同 修 改 可 能 导 致 冲 突 当 第 二 个 用 户 提 交 修 改 时, 工 具 会 察 觉 该 冲 突, 并 通 知 用 户 此 时, 用 户 需 要 手 动 解 决 冲 突, 例 如, 重 新 进 行 修 改 以 保 证 冲 突 消 失, 然 后 提 交 文 件 通 常, 冲 突 很 少 出 现, 除 非 都 在 文 件 相 同 的 几 行 上 进 行 了 修 改 在 源 码 控 制 系 统 的 帮 助 下, 程 序 员 不 需 要 维 护 所 有 版 本 如 果 需 要 取 消 一 些 修 改, 可 以 很 容 易 地 恢 复 到 旧 版 本 仓 库 应 经 常 备 份, 一 般 为 偶 然 性 损 失 做 好 准 备 此 外, 修 改 记 录 必 须 保 留 什 么 人 在 什 么 时 间 为 什 么 进 行 修 改 修 改 了 哪 些 内 容 等 最 重 要 的 是, 仓 库 给 项 目 中 最 近 和 最 权 威 的 文 件 版 本 提 供 了 一 个 中 心 位 置, 这 对 较 长 生 命 期 和 多 年 演 化 的 项 目 是 非 常 宝 贵 的 仓 库 除 了 保 存 不 同 文 件 版 本 外, 它 也 用 来 将 源 文 件 组 成 软 件 系 统 这 个 活 动 叫 build Build 从 仓 库 中 得 到 资 源 的 最 新 版 本 ( 或 想 要 的 版 本 号 ), 然 后 用 这 些 源 代 码 创 建 可 执 行 文 件 用 源 文 件 创 建 最 终 的 可 执 行 文 件 经 常 是 通 过 工 具 完 成 的, 就 像 makefile, 该 工 具 详 述 了 文 件 的 依 赖 关 系 和 如 何 从 源 文 件 创 建 最 终 可 执 行 文 件 这 些 工 具 可 以 识 别 文 件 的 修 改, 每 当 创 建 可 执 行 文 件 时, 工 具 能 将 所 有 文 件 重 新 编 译 在 源 码 控 制 工 具 的 帮 助 下, 这 些 工 具 能 从 仓 库 得 到 最 新 的 文 件, 然 后 用 它 们 创 建 可 执 行 文 件 这 里 讨 论 的 只 是 对 源 代 码 版 本 控 制 和 创 建 最 简 单 的 方 式, 大 多 数 情 况 构 建 大 型 系 统 时, 源 码 版 本 控 制 需 要 更 为 精 细 的 方 法 重 构 修 改 已 有 代 码 是 编 码 中 的 常 见 活 动, 当 需 求 变 更 或 增 加 新 功 能 时, 代 码 需 要 修 改 即 使 开 始 的 设 计 很 好, 由 于 对 模 块 做 出 了 修 改, 随 着 时 间 流 逝, 最 终 的 代 码 将 与 想 象 有 很 大 出 入 一 旦 设 计 变 得 复 杂, 那 么 为 适 应 变 化 而 做 的 代 码 优 化 也 将 变 得 更 复 杂 更 费 时 更 容 易 出 错 换 句 话 说, 生 产 率 和 质 量 开 始 下 降

159 重 构 是 一 种 改 进 现 有 代 码 和 防 止 设 计 出 现 问 题 的 技 术 重 构 是 编 码 的 一 部 分, 因 为 它 在 编 码 过 程 完 成, 但 它 不 是 常 规 的 编 码 重 构 是 程 序 员 们 常 常 进 行 的 活 动, 但 最 近 它 才 被 明 确 提 出, 被 视 为 XP 实 践 的 关 键 步 骤 重 构 也 在 测 试 驱 动 开 发 中 扮 演 重 要 角 色, 在 TDD 过 程 中 的 代 码 改 善 实 际 就 是 在 进 行 重 构 这 里 我 们 讨 论 重 构 的 一 些 关 键 概 念 和 方 法, 更 多 的 详 细 资 料 可 以 访 问 网 站 重 构 是 对 软 件 内 部 结 构 的 修 改, 在 不 修 改 其 外 在 行 为 的 情 况 下, 让 软 件 简 单 易 懂 和 易 于 修 改 这 里 一 个 关 键 点 在 于 重 构 是 为 提 高 代 码 质 量 而 进 行 的, 修 改 的 是 代 码 的 内 部 结 构 重 构 的 基 本 目 标 就 是 改 进 设 计 然 而 要 注 意 的 是, 重 构 并 不 是 要 在 设 计 阶 段 改 进 设 计, 而 是 为 了 改 善 现 有 代 码 所 对 应 的 设 计 换 句 话 说, 重 构, 虽 然 是 在 源 代 码 上 进 行, 但 目 的 是 改 善 代 码 所 对 应 的 设 计 所 以, 设 计 的 基 本 原 则 指 导 着 重 构 因 此, 重 构 通 常 会 达 到 以 下 一 个 或 多 个 结 果 : 1. 减 少 耦 合 2. 增 加 内 聚 3. 更 好 的 坚 持 开 放 封 闭 原 则 重 构 包 括 改 变 代 码 以 提 高 设 计, 同 时 保 持 其 外 部 行 为 不 变 重 构 往 往 在 编 码 需 要 修 改 时 进 行 如 果 现 有 代 码 需 要 修 改, 然 而 如 果 修 改 代 码 结 构 会 使 得 整 体 效 果 更 佳, 这 时 将 用 到 重 构 尽 管 重 构 是 软 件 改 变 所 触 发 的, 但 它 不 应 该 与 代 码 的 增 强 相 混 淆, 最 好 将 这 两 种 不 同 的 修 改 区 别 对 待 在 开 发 代 码 时, 如 果 需 要 重 构, 程 序 员 应 停 止 编 写 新 的 功 能, 马 上 开 始 重 构, 然 后 再 添 加 新 代 码 重 构 的 主 要 危 险 是 会 破 坏 已 有 代 码, 这 是 重 构 不 能 完 成 的 主 要 原 因 ( 另 一 个 原 因 是, 它 可 能 被 看 做 额 外 的 不 必 要 的 花 费 ) 降 低 这 种 风 险 的 两 个 黄 金 规 则 是 : 1. 小 步 骤 重 构 2. 用 现 有 脚 本 测 试 现 有 功 能 如 果 有 一 个 好 的 测 试 组 (test suite) 可 用, 那 么 可 以 方 便 的 检 查 重 构 是 否 保 留 了 现 有 功 能 缺 少 一 个 自 动 化 测 试 组, 重 构 就 难 以 完 成 因 为 在 缺 少 测 试 组 的 情 况 下, 无 论 外 部 行 为 是 否 改 变, 都 会 造 成 昂 贵 地 损 失 通 过 一 系 列 的 小 步 骤 重 构, 并 在 每 一 步 后 测 试, 重 构 中 引 入 的 错 误 可 以 轻 易 地 识 别 和 纠 正 这 样, 每 个 重 构 只 引 入 小 变 化, 但 一 系 列 重 构 可 以 显 著 地 改 变 结 构 通 过 重 构, 代 码 不 断 地 改 进 也 就 是 说, 与 其 说 设 计 随 着 时 间 衰 退, 倒 不 如 说 是 随 着 时

160 间 演 化 和 改 进 通 过 重 构, 设 计 的 质 量 大 大 提 高, 使 得 发 现 bug 和 修 改 更 加 容 易 重 构 的 额 外 开 支 是 由 后 期 减 少 的 测 试 和 调 试 成 本 更 高 的 软 件 质 量 以 及 较 少 的 修 改 成 本 来 承 担 的 如 果 在 设 计 阶 段 实 行 重 构, 也 可 以 减 轻 设 计 任 务 通 常, 设 计 人 员 花 费 很 大 努 力 让 设 计 尽 可 能 的 好, 试 着 想 象 未 来 可 能 发 生 的 改 变, 并 设 法 使 设 计 足 够 灵 活 来 容 纳 他 们 能 够 想 到 的 所 有 修 改 这 使 得 设 计 活 动 十 分 复 杂, 通 常 会 导 致 复 杂 的 设 计 通 过 重 构, 设 计 师 不 必 一 定 要 作 出 最 好 或 最 灵 活 的 设 计, 而 需 要 考 虑 的 是 好 的 简 单 的 设 计 如 果 未 来 产 生 新 的 需 求, 或 者 在 设 计 中 发 现 缺 点, 可 以 通 过 重 构 修 改 通 常 情 况 下, 过 度 为 变 化 性 考 虑 的 设 计 是 不 需 要 的, 那 样 反 倒 会 对 系 统 造 成 不 必 要 的 麻 烦 要 注 意 的 是, 重 构 并 不 是 一 种 以 修 复 bug 或 者 改 进 糟 糕 代 码 为 目 的 的 技 术 它 在 可 以 工 作 的 代 码 上 进 行 修 正, 其 目 的 是 调 整 代 码 以 延 长 其 生 存 周 期 它 以 合 理 的 代 码 开 始, 并 使 其 一 直 保 持 正 常, 并 避 免 变 弱 何 时 需 要 重 构? 代 码 中 会 有 一 些 容 易 察 觉 的 地 方, 有 时 被 称 为 坏 味 道, 坏 味 道 表 示 代 码 可 能 会 破 坏 一 些 好 的 设 计 理 念, 或 者 设 计 存 在 可 改 进 之 处 换 句 话 说, 如 果 你 闻 到 这 些 bad smells 的 其 中 之 一, 可 能 就 需 要 重 构 了, 例 举 一 些 bad smells 如 下 1. 重 复 代 码 这 相 当 普 遍, 一 个 原 因 是 一 些 小 功 能 会 在 许 多 地 方 被 用 到 另 一 个 常 见 的 原 因 是, 当 一 个 类 有 多 个 子 类, 然 后 每 个 子 类 最 终 可 能 会 做 一 些 相 同 的 事 情 重 复 的 代 码 意 味 着 如 果 逻 辑 或 函 数 必 须 修 改, 那 必 须 修 改 它 出 现 过 的 所 有 位 置, 这 会 使 修 改 更 困 难 代 价 更 高 2. 过 长 的 方 法 如 果 一 个 方 法 很 长, 往 往 表 示 它 需 要 做 很 多 的 事 情, 因 此 其 内 聚 性 会 降 低 3. 过 长 的 类 相 似 地, 一 个 大 的 类 可 能 象 征 着 它 封 装 了 过 多 的 概 念, 使 其 内 聚 性 降 低 4. 过 多 的 参 数 复 杂 的 接 口 显 然 不 可 取 它 们 使 代 码 更 难 理 解 通 常 情 况 下, 复 杂 并 非 不 可 避 免, 而 是 设 计 不 适 当 造 成 的 5. Switch 语 句 在 面 向 对 象 程 序 中, 如 果 不 合 理 的 使 用 多 态 的 特 性, 很 可 能 导 致 在 switch 语 句 中 产 生 对 象 行 为 依 赖 于 其 属 性 的 不 良 设 计 6. 过 于 的 继 承 有 些 类 继 承 层 次 存 在 的 原 因 是 因 为 子 类 可 能 不 同 然 而, 如 果 不 同 子 类 对 象 的 行 为 是 相 同 的, 也 没 有 理 由 认 为 其 行 为 可 能 会 发 生 变 化, 那 么 这 种 设 计 造 成 了 不 必 要 的 复 杂 7. 对 象 间 过 多 的 通 信 如 果 一 个 类 中 的 方 法 向 另 一 个 对 象 中 的 发 出 过 多 调 用 命 令 以 获 知 其 状 态, 这 标 志 着 强 耦 合 这 种 情 况 可 能 是 不 必 要 的, 因 此 应 考 虑 重 构 8. 消 息 链 一 个 对 象 请 求 另 一 个 对 象, 然 后 后 者 再 请 求 第 三 个 对 象 等 这 个 链 可 能 导 致 不 必 要 的 耦 合 这 些 bad smells 是 发 现 设 计 问 题 的 指 标 要 清 楚 的 是, 改 善 设 计 的 代 码 重 构 方 法 可 能 很 多, 但 也 有 一 些 可 应 用 于 多 个 场 景 的 标 准 重 构 步 骤, 常 见 的 重 构 方 法 分 类 及 其 实 施 步 骤 可 以 参 考 [36]

161 7.4 单 元 测 试 一 旦 程 序 员 为 模 块 编 写 了 代 码, 必 须 在 其 他 人 使 用 前 进 行 验 证 测 试 仍 然 是 最 常 用 的 验 证 方 法 由 程 序 员 进 行 的, 检 查 其 已 编 写 的 代 码 的 测 试 ( 相 对 于 检 查 整 个 软 件 系 统 而 言 ) 称 为 单 元 测 试 单 元 测 试 就 像 常 规 测 试, 程 序 员 执 行 测 试 数 据, 重 点 测 试 分 配 给 单 个 或 一 对 (pair) 程 序 员 的 小 程 序 或 模 块 如 前 面 讨 论 的, 编 程 过 程 中 的 测 试 大 部 分 是 单 位 测 试 作 为 程 序 语 言 的 单 元 可 能 是 函 数 或 较 小 的 函 数 集 合, 面 向 对 象 语 言 中 可 能 是 一 个 类 或 类 的 集 合 模 块 或 软 件 系 统 测 试 是 一 项 艰 巨 而 具 有 挑 战 性 的 任 务, 测 试 用 例 的 选 择 是 任 何 测 试 的 关 键 问 题 在 下 一 章 讨 论 测 试 时, 我 们 将 会 详 细 讨 论 测 试 用 例 的 选 择 问 题 目 前, 单 元 测 试 中 测 试 人 员 ( 一 般 是 程 序 员 ) 可 以 用 大 量 测 试 用 例 进 行 单 元 测 试, 并 了 解 被 测 试 单 元 的 实 际 行 为 基 于 这 些 行 为, 测 试 人 员 判 定 单 元 是 否 工 作 正 常 如 果 测 试 用 例 中 行 为 与 预 想 不 一 样, 那 么 程 序 员 就 会 找 出 程 序 的 缺 陷 ( 这 个 活 动 称 为 调 试 ), 并 修 复 它 消 除 缺 陷 后, 程 序 员 通 常 会 再 次 执 行 那 些 导 致 失 败 的 测 试 用 例, 以 确 保 修 复 已 经 完 成 单 元 测 试 的 一 个 问 题 是, 被 测 单 元 不 是 完 整 的 系 统 的 一 部 分, 本 身 不 可 执 行 此 外, 单 元 在 执 行 中 可 能 使 用 其 它 尚 未 开 发 的 模 块 因 此, 单 元 测 试 往 往 需 要 编 写 驱 动 代 码 (driver) 或 支 撑 代 码 (stub) 驱 动 代 码 扮 演 呼 叫 模 块 的 角 色, 常 负 责 生 成 测 试 数 据, 并 用 测 试 数 据 执 行 单 元, 然 后 报 告 结 果 支 撑 代 码 本 质 上 是 用 来 代 替 实 际 模 块 的 假 的 模 块, 以 便 于 单 元 测 试 因 此, 如 果 模 块 M 使 用 另 一 个 模 块 N 尚 未 开 发 的 服 务, 那 么 为 了 对 M 进 行 单 元 测 试, 需 要 写 一 个 N 的 支 撑 代 码, 这 样 M 才 可 以 调 用 N 的 服 务, 以 便 单 元 测 试 继 续 进 行 若 编 码 和 测 试 是 自 下 而 上 的, 有 时 候 不 需 要 支 撑 代 码 低 层 模 块 先 编 码 和 测 试, 当 高 层 的 模 块 需 要 测 试 时, 低 层 代 码 已 经 可 以 使 用 如 果 实 行 前 文 所 述 的 增 量 开 发, 那 么 程 序 员 每 添 加 一 些 代 码 都 需 要 进 行 单 元 测 试 显 然, 如 果 能 自 动 执 行 单 元 测 试, 那 将 会 非 常 高 效 这 样 每 当 做 测 试 时, 测 试 用 例 都 能 轻 易 地 自 动 执 行 目 前 已 经 有 一 些 自 动 化 工 具 可 以 使 用 本 章 讨 论 使 用 框 架 进 行 单 元 测 试 的 方 法 测 试 过 程 化 程 序 单 元 模 块 作 为 程 序 单 元 使 用 时, 程 序 可 以 看 作 一 个 结 构 图, 其 中 节 点 代 表 函 数, 边 代 表 调 用 关 系 单 元 测 试 中, 模 块 或 少 数 几 个 模 块 的 集 合 被 一 组 测 试 用 例 测 试 模 块 的 行 为 不 仅 依 赖 于 其 参 数 值, 也 和 它 在 系 统 的 状 况 有 关, 模 块 f() 的 测 试 用 例 将 包 含 f() 依 赖 的 所 有 系 统 状 态 以 及 相 关 参 数 值 测 试 用 例 的 取 值 和 系 统 状 态 取 值 取 决 于 用 例 的 目 的 此 外, 如 果 结 构 图 中 模 块 f() 之 下 的 还 有 模 块, 也 就 是 说,f 调 用 其 他 模 块, 例 如 g () 和 h(), 那 么 为 了 执 行 f(),g() 和 h() 必 须 已 经 开 发 有 两 种 方 法 处 理 这 种 情 况

162 第 一 是 以 自 下 而 上 的 方 式 进 行 测 试, 换 言 之, 先 测 试 结 构 图 底 部 的 模 块, 然 后 再 向 上 在 这 种 方 法 中, 当 测 试 f() 时,g() 和 h() 的 代 码 必 须 可 用, 并 在 测 试 过 程 中 会 被 用 到 另 一 种 方 法 是 为 g() 和 h() 写 stubs stubs 是 为 方 便 测 试 调 用 者 函 数 而 写 的 一 次 性 代 码 通 常, 如 果 不 需 要 返 回 值, 函 数 的 stubs 只 会 打 印 一 些 语 句 如 果 为 了 调 用 者 函 数 继 续 执 行 而 必 须 返 回 一 些 值, 那 么 在 stubs 中 将 会 硬 编 码 一 些 值, 然 后 调 用 者 函 数 在 调 用 时 只 能 使 用 stubs 指 定 的 参 数 下 面 我 们 假 设 测 试 按 前 一 种 方 式 进 行, 即 为 测 试 f() 模 块,g() 和 h () 的 代 码 已 经 写 好 并 可 用 测 试 模 块 f() 的 用 例 的 执 行 步 骤 如 下 : 1. 按 测 试 用 例 需 要 设 置 系 统 状 态 2. 设 置 适 当 的 参 数 值 3. 根 据 参 数 调 用 过 程 f() 4. 比 较 f 的 执 行 结 果 与 预 期 结 果 是 否 一 致 5. 宣 布 测 试 用 例 成 功 或 失 败 按 顺 序 执 行 这 些 步 骤 的 最 简 单 和 常 用 的 方 法 就 是 写 一 个 执 行 前 三 步 的 main() 程 序, 值 由 测 试 者 输 入 或 从 文 件 读 取 或 在 程 序 中 硬 编 码, 然 后 打 印 出 重 要 值 然 后 程 序 员 执 行 最 后 两 个 步 骤, 即, 比 较 f 的 结 果 与 预 期 的 结 果 并 决 定 测 试 用 例 是 否 成 功 由 于 需 要 程 序 员 对 输 出 结 果 进 行 评 估, 同 时 还 可 能 需 要 程 序 员 指 定 输 入 值, 这 种 方 法 扩 展 性 不 强 一 旦 指 定 了 测 试 用 例, 步 骤 顺 序 将 保 持 不 变, 因 此 最 理 想 的 情 况 下 是 完 全 自 动 化 在 一 个 测 试 框 架 中, 按 步 骤 顺 序 执 行 的 测 试 用 例 往 往 被 声 明 为 一 个 函 数, 其 中 包 括 检 查 输 出 和 宣 布 测 试 结 果 这 些 往 往 在 框 架 提 供 的 断 言 语 句 帮 助 下 完 成 一 个 测 试 组 是 这 些 函 数 的 集 合, 测 试 组 的 执 行 意 味 着 每 个 函 数 都 要 被 执 行 如 果 所 有 测 试 用 例 成 功, 则 测 试 组 也 成 功 如 果 一 个 测 试 用 例 失 败, 那 么 测 试 框 架 将 决 定 继 续 执 行 或 停 止 测 试 用 例 函 数 的 定 义 很 容 易 它 会 按 上 面 给 出 的 步 骤 顺 序 执 行 然 而, 用 测 试 用 例 执 行 模 块 并 不 很 容 易, 因 为 必 须 建 立 合 适 的 可 执 行 程 序, 而 此 程 序 需 要 执 行 这 些 反 映 测 试 用 例 的 函 数, 并 报 告 结 果 成 功 或 失 败 一 般, 测 试 过 程 不 应 修 改 模 块 代 码 或 模 块 中 包 含 的 文 件 如 果 在 单 元 测 试 后 源 代 码 保 持 不 变, 那 么 集 成 测 试 不 受 单 元 测 试 影 响 此 外, 单 元 测 试 之 后, 对 文 件 的 任 何 修 改 必 须 被 消 除 测 试 框 架 为 此 类 单 元 测 试 提 供 了 方 便 对 于 类 似 C 的 过 程 语 言 来 说, 常 见 的 单 元 测 试 框 架 有 CuTest,CUnit, Cutest,Check 等 等 在 这 些 测 试 框 架 中, 每 个 测 试 用 例 被 定 义 成 一 个 函 数, 这 个 函 数 以 框 架 提 供 的 断 言 语 句 结 尾, 判 定 测 试 成 功 还 是 失 败 每 个 函 数 代 表 一 个 单 元 测 试, 被 添 加 到 一 个 数 组 或 结 构 中, 这 个 数 组 或 结 构 形 成 了 测 试 组 也 可 以 创 建 多 个 测 试 组, 一 般 使 用 驱 动 函 数 来 驱 动 并 执 行 测 试 组 中 的 所 有 测 试 用 例

163 7.4.2 类 的 单 元 测 试 在 面 向 对 象 程 序 中, 测 试 单 元 一 般 是 类 的 对 象 对 象 测 试 的 一 般 定 义 是 : 发 现 对 象 在 执 行 过 程 中 状 态 或 流 程 上 的 错 误 的 过 程 [78] 测 试 一 个 类 时, 程 序 员 需 要 做 的 是 为 这 个 类 创 建 一 个 对 象, 使 其 具 备 一 定 的 状 态, 调 用 一 个 方 法, 然 后 检 查 执 行 后 对 象 状 态 是 否 如 期 望 的 那 样 对 一 个 方 法 而 言, 这 个 序 列 必 须 被 执 行 多 次, 同 时 也 适 用 于 其 他 所 有 方 法 因 此, 如 能 使 用 像 Junit 那 样 的 框 架 会 有 很 大 帮 助 尽 管 Junit 本 身 是 用 于 java 开 发 的, 但 类 似 框 架 已 被 开 发 并 用 于 其 它 编 程 语 言, 如 c++ 和 c# 这 里 我 们 简 要 描 述 如 何 用 Junit 测 试 一 个 类 的 例 子 用 Junit 测 试 类 CUT, 必 须 建 立 一 个 继 承 Junit 的 类 ( 比 如 : 类 CUTtest 继 承 Junit) Junit 的 框 架 由 这 个 CUTtest 引 入, 它 就 是 CUT 的 测 试 驱 动 这 个 类 必 须 有 一 个 构 造 函 数 来 创 建 测 试 用 例 需 要 的 对 象 执 行 测 试 前, 一 般 用 setup() 方 法 构 造 所 有 对 象 并 设 置 初 值 ; 一 个 suite() 方 法 和 一 个 main() 方 法 用 Junit 提 供 的 TestRunner 执 行 suite() 除 此 之 外, 其 他 方 法 就 是 测 试 用 例 这 些 方 法 通 常 被 命 名 为 testxxxx() 这 个 方 法 用 于 测 试 特 定 状 态 下 的 对 象 方 法 ( 方 法 和 状 态 的 关 键 字 一 般 包 含 在 xxxx 中 ) 这 个 方 法 中, 如 果 在 Setup 中 还 有 内 容 未 准 备 好, 则 先 设 置 对 象 状 态, 然 后 执 行 要 被 测 试 的 方 法 Junit 提 供 了 两 种 专 用 的 方 法 AssertTrue 和 AssertFalse 来 检 查 结 果 通 过 函 数 和 对 象 状 态 的 逻 辑 表 达 式, 可 以 判 断 执 行 后 状 态 是 否 正 确 如 果 所 有 方 法 的 断 言 语 句 成 功, 那 么 Junit 宣 布 测 试 通 过 如 果 任 何 一 个 断 言 语 句 失 败, Junit 就 会 宣 布 测 试 失 败 并 详 细 指 出 失 败 的 断 言 语 句 类 Matrix.java 测 试 的 例 子 说 明 了 它 具 体 如 何 工 作 的, 这 个 类 提 供 了 关 于 矩 阵 的 标 准 操 作 类 的 主 要 属 性 和 主 要 方 法 在 图 7.3 中 给 出 class Matrix { private double [][] matrix; //Matrix elements private int row, col; //Order of Matrix public Matrix(); // Constructor public Matrix(int i,int j); // Sets #rows and #cols public Matrix(int i,int j,double[][] a); // Sets from 2D array public Matrix(Matrix a); //Constructs matrix from another public void read(); //read elts from console and set up matrix public void setelement(int i,int j,double value); // set elt i,j public int noofrows(); // returns no of rows public int noofcols(); // returns no of cols public Matrix add(matrix a); // adds a to matrix public Matrix sub(matrix a); // subtracts a from matrix public Matrix mul(matrix b); // multiplies b to matrix public Matrix transpose(); // transposes the matrix public Matrix minor(int a, int b); // returns a x b sub-matrix

164 } public double determinant(); // determinant of the matrix public Matrix inverse() throws Exception; // inverse of the matrix public void print(); // prints matrix on console public boolean equals(matrix m); // checks for equality with m 图 7.3 类 Matrix.java. 关 于 Matrix 类 的 单 元 测 试, 很 明 显 需 要 测 试 标 准 操 作, 比 如 建 立 矩 阵, 设 置 初 值 等 也 要 测 试 一 些 操 作, 如 加 减 乘 行 列 式 等 每 一 个 测 试 用 例 都 按 设 初 值 执 行 操 作 的 过 程 进 行 操 作 结 果 通 过 断 言 语 句 检 查 例 如, 当 测 试 add() 时, 建 立 方 法 testadd() 来 实 现 矩 阵 与 另 一 个 矩 阵 之 和 正 确 的 结 果 预 先 存 储 在 第 三 个 矩 阵 中 执 行 完 成 后, 检 查 执 行 add() 所 得 到 的 结 果 与 正 确 结 果 是 否 相 等 实 现 这 个 方 法 的 例 子 如 图 7.4 对 add() 的 测 试 可 能 不 够, 因 此 需 要 更 多 的 测 试 方 法 测 试 Matrix 类 中 其 他 方 法 的 方 法 与 add() 方 法 类 似, 如 图 7.4 所 示 import junit. framework.*; public class MatrixTest extends TestCase { Matrix A, B, C, D, E, res; /* test matrices */ public MatrixTest ( String testcase ) { super ( testcase ); double a [][]= new double [][]{{9,6},{7,5}}; A = new Matrix (2,2,a); double b [][]= new double [][]{{16,21},{3,12}}; B = new Matrix (2,2,b); double d [][]= new double [][]{{2,2,3},{4,8,6},{7,8,9}}; res=new Matrix (); } public void testadd () { double c [][]= new double [][]{{25,27},{10,17}}; C = new Matrix (2,2,c); res=a.add(b); asserttrue ( res!= null ); asserttrue (C. equals (res )); } public void testsetget () { C=new Matrix (2,2); for (int i=0;i <2;i++) for (int j=0;j <2;j++) C. setelement (i,j,a. getelement (i,j)); asserttrue (C. equals (A));

165 } } public void testmul () { double c [][]= new double [][]{{162,261},{127,207}}; C = new Matrix (2,2,c); res=a.mul(b); asserttrue ( res!= null ); asserttrue (C. equals (res )); } public void testtranspose () { res=a. transpose (); res=res. transpose (); asserttrue ( res. equals (A)); } public void testinversecorrectness () { try{ res= null ; res=a. inverse (); res=res.mul(a); double dd [][]= new double [][]{{1,0},{0,1}}; Matrix DD=new Matrix (2,2, dd ); asserttrue ( res. equals (DD )); } catch ( Exception e) { asserttrue ( false ); } } 图 7.4 使 用 Junit 对 Matrix 类 进 行 单 元 测 试 Junit 鼓 励 自 动 测 试, 不 仅 自 动 执 行 测 试 用 例, 也 自 动 检 查 结 果, 这 使 测 试 运 行 完 全 自 动 化 通 过 建 立 测 试 脚 本 并 随 着 类 的 演 化 不 断 更 新, 我 们 始 终 保 持 着 可 以 很 快 运 行 的 测 试 脚 本 每 当 对 代 码 做 出 修 改, 只 需 点 击 一 个 按 钮, 就 可 以 迅 速 检 查 过 去 的 测 试 用 例 是 否 仍 然 可 用 增 量 开 发 或 测 试 驱 动 开 发 的 实 行 中, 这 几 乎 必 不 可 少 7.5 代 码 检 查 代 码 检 查 是 又 一 个 经 常 在 单 元 级 别 应 用 的 技 术 代 码 检 查 可 以 被 看 作 是 静 态 测 试, 即 不 通 过 执 行 代 码 检 测 缺 陷, 而 是 通 过 手 动 过 程 完 成 检 查 单 元 测 试 几 乎 针 对 所 有 的 代 码 进 行,

166 而 代 码 检 查 只 是 有 计 划 针 对 部 分 单 元 检 查 因 此, 代 码 检 查 是 另 一 个 形 式 的 单 元 测 试 然 而, 在 实 践 中, 往 往 单 元 测 试 和 代 码 检 查 都 是 需 要 的, 尤 其 针 对 关 键 的 模 块 应 该 指 出, 检 查 是 一 个 普 遍 的 验 证 方 法, 可 应 用 于 任 何 文 档 中 的 缺 陷 检 测 但 是, 检 查 首 先 应 用 于 检 测 代 码 缺 陷, 即 使 在 今 天, 仍 被 作 为 行 业 最 佳 实 践 而 被 广 泛 应 用 已 证 明 检 查 不 仅 有 助 于 提 高 质 量, 而 且 有 助 于 提 供 生 产 率 ( 见 报 道 [39,44,83]), 费 根 首 先 提 出 了 代 码 检 查 的 概 念 [31,32] 现 在 有 不 少 关 于 这 个 专 题 的 书 籍, 详 细 描 述 了 检 查 应 如 何 进 行 [37, 39] 代 码 检 查 是 由 一 群 组 员 根 据 定 义 的 过 程 审 查 代 码 检 查 的 基 本 目 标 是 发 现 缺 陷 提 高 代 码 质 量 检 查 的 主 要 特 点 有 : 代 码 检 查 有 程 序 员 进 行, 并 针 对 程 序 员 进 行 代 码 检 查 是 个 结 构 化 的 过 程, 每 个 参 与 者 有 定 义 好 的 职 责 聚 焦 于 发 现 缺 陷, 而 不 是 解 决 他 们 检 查 结 果 被 记 录, 并 用 于 检 测 检 查 过 程 是 否 有 效 检 查 由 一 个 包 括 作 者 在 内 的 评 审 小 组 进 行, 其 中 一 个 是 主 持 人 主 持 人 全 面 负 责, 以 确 保 检 查 以 适 当 的 方 式 完 成, 并 在 过 程 中 遵 循 标 准 步 骤 大 多 数 检 查 方 法 都 是 相 似 的, 只 有 一 些 微 小 的 变 化 在 这 里, 我 们 讨 论 由 商 业 组 织 [58] 采 用 的 检 查 过 程 在 这 个 过 程 的 不 同 步 骤 是 : 规 划 自 我 审 查 小 组 审 查 会 议 返 工 和 后 续 行 动 这 些 活 动 通 常 按 一 个 线 性 顺 序 执 行, 我 们 将 讨 论 每 一 个 步 骤 规 划 规 划 阶 段 的 目 标 是 对 检 查 进 行 准 备 包 括 代 码 撰 写 者 在 内 的 程 序 员 们 组 成 检 查 团 队 该 小 组 应 至 少 包 括 三 个 人, 四 或 五 个 会 员 也 可 以, 团 队 将 任 命 一 个 组 织 者 代 码 作 者 确 保 代 码 已 准 备 好, 并 对 认 为 其 代 码 已 经 达 到 检 查 标 准 常 用 的 检 查 标 准 是, 代 码 已 正 确 编 译, 并 且 已 应 用 现 有 静 态 分 析 工 具 进 行 分 析 组 织 者 将 会 检 查 代 码 已 达 到 上 述 标 准 组 织 者 会 准 备 一 个 代 码 包, 并 分 发 给 检 查 团 队 代 码 包 通 常 包 括 拟 进 行 检 查 的 代 码, 代 码 开 发 的 规 格 说 明, 以 及 检 查 所 需 的 标 准 清 单 在 代 码 包 分 发 之 后, 如 果 需 要 的 话, 组 织 者 可 以 开 始 一 个 开 幕 式, 作 者 可 以 提 供 一 个 简 短 的 产 品 介 绍 以 及 检 查 时 需 要 特 别 关 注 的 地 方 应 该 编 制 检 查 清 单 以 便 在 检 验 过 程 中 使 用 ( 或 使 用 一 些 标 准 的 清 单 ) 由 于 代 码 检 查 的 目 的 是 改 善 质 量, 除 了 编 码 缺 陷 外, 还 经 常 考 虑 其 他 一 些 代 码 质 量 标 准, 如 效 率 是 否 符 合 编 码 标 准 等 代 码 检 查 应 关 注 的 问 题 应 以 清 单 形 式 提 供 给 检 查 人 员

167 7.5.2 代 码 自 查 此 阶 段 中, 每 个 程 序 员 自 己 作 为 复 审 者 对 其 代 码 进 行 自 查 进 行 自 查 时, 复 审 者 审 阅 整 个 代 码, 并 在 自 我 审 查 日 志 (self-preparing log) 中 标 记 所 有 发 现 的 潜 在 缺 陷 通 常 情 况 下, 复 审 者 可 以 在 产 品 本 身 ( 译 注 : 程 序 代 码 中 ) 标 记 这 些 潜 在 缺 陷, 并 在 日 志 中 提 供 一 个 自 我 审 查 摘 要 该 评 审 还 需 要 记 录 代 码 自 查 花 费 的 时 间, 一 个 标 准 形 式 代 码 自 我 审 查 日 志, 如 图 7.5 所 示 [58] 项 目 名 称 及 代 码 : 工 作 产 品 及 ID: 评 审 者 姓 名 : 准 备 所 花 费 的 时 间 ( 小 时 ): 缺 陷 列 表 : 编 号 位 置 描 述 严 重 程 度 图 7.5 代 码 自 查 日 志 ( 此 处 的 图 标 注 是 否 应 该 拿 下 到 图 外 面 来 ) 理 想 的 情 况 下, 自 查 工 作 应 在 一 个 连 续 时 间 内 完 成 建 议 时 间 不 超 过 两 小 时 也 就 是 说, 检 查 的 范 围 不 应 过 大, 可 以 在 不 到 两 小 时 的 时 间 内 对 其 充 分 检 查 在 所 有 的 评 审 员 都 正 确 地 完 成 了 自 审 并 填 写 了 自 我 审 查 日 志 后, 代 码 自 查 过 程 完 成 小 组 评 审 会 议 小 组 评 审 会 议 的 基 本 目 的 是 基 于 评 审 员 的 初 评 缺 陷 列 表, 以 及 在 会 议 期 间 讨 论 新 发 现 的 缺 陷, 得 出 最 后 的 缺 陷 列 表 开 小 组 评 审 会 议 的 条 件 是 主 持 人 认 为 所 有 评 审 人 都 已 准 备 好 评 审 组 织 者 首 先 确 认 每 个 评 审 人 都 已 准 备 好, 这 由 一 个 简 单 的 检 查 完 成, 组 织 者 需 要 确 认 所 有 评 审 均 已 花 费 足 够 的 时 间 并 充 分 关 注 此 次 评 审 若 准 备 不 充 分, 则 评 审 被 推 迟, 直 到 所 有 准 备 工 作 完 成 若 所 有 工 作 完 成, 则 评 审 会 议 开 始 组 织 者 需 求 确 保 会 议 朝 向 评 审 的 基 本 目 标 进 行, 即 发 现 系 统 的 缺 陷, 而 不 是 进 行 头 脑 风 暴 或 者 是 个 人 攻 击 会 议 操 作 过 程 如 下 : 一 个 小 组 成 员 ( 称 为 读 者 ) 一 行 行 的 浏 览 代 码 ( 或 以 任 何 方 便 单 元

168 进 行 ), 并 将 其 解 释 给 组 员 听 有 时 不 需 要 解 释, 而 由 团 队 一 起 浏 览 一 行 行 的 代 码 在 任 何 代 码 行, 如 评 审 员 有 任 何 问 题, 或 在 会 议 上 发 现 新 的 问 题, 则 评 委 提 出 此 问 题 委 员 会 有 可 能 针 对 此 问 题 进 行 讨 论, 代 码 作 者 可 以 接 受 建 议 或 澄 清 为 什 么 这 个 问 题 不 构 成 缺 陷 经 讨 论 后 评 委 们 达 成 一 致, 由 一 个 成 员 ( 称 记 录 员 ) 在 日 志 中 记 录 发 现 的 缺 陷 会 议 结 束 时, 记 录 员 读 出 所 有 记 录 的 缺 陷, 并 由 所 有 成 员 认 可 请 注 意 整 个 过 程 仅 发 现 缺 陷, 成 员 们 无 需 提 出 解 决 方 案, 这 由 代 码 作 者 在 会 后 完 成 最 终 的 缺 陷 日 志 是 检 查 中 发 现 的 缺 陷 的 官 方 记 录, 此 记 录 也 可 用 于 跟 踪 缺 陷 直 至 其 关 闭 但 是, 为 了 分 析 检 查 的 有 效 性, 只 需 要 准 备 一 份 汇 总 层 次 的 总 结 报 告 报 告 摘 要 介 绍 代 码 审 查 耗 费 的 时 间 以 及 在 不 同 的 审 查 活 动 中 的 时 间 开 销 细 分, 每 个 类 别 发 现 的 缺 陷 总 数 若 记 录 中 包 含 不 同 类 型 的 代 码 缺 陷 记 录, 摘 要 中 也 可 记 录 每 个 类 别 的 缺 陷 总 数 一 个 部 分 填 充 的 总 结 报 告 如 图 7.6[58] 项 目 Xxxxxxxx 工 作 产 品 类 AuctionItem 产 品 大 小 250 行 Java 代 码 评 审 小 组 P1,P2,P3 时 间 开 销 ( 人 - 小 时 ) 准 备 总 计 3 人 - 小 时 小 组 评 审 会 议 4.5 人 - 小 时 总 计 开 销 7.5 人 - 小 时 缺 陷 重 要 缺 陷 数 3 细 微 缺 陷 数 8 总 计 缺 陷 数 11 评 审 状 态 通 过 对 下 一 阶 段 的 推 荐 评 价 代 码 质 量 可 进 一 步 提 高 ( 图 标 呢?) 7.6 度 量 指 标 在 传 统 意 义 上, 度 量 工 作 总 是 关 注 于 最 终 产 品, 也 就 是 代 码 从 某 种 意 义 上 来 说, 对 于 需 求 和 设 计 等 中 间 产 品 的 度 量 也 是 为 了 保 证 最 终 产 品 的 质 量 以 及 项 目 的 生 产 率 也 就 是 说, 度 量 中 间 产 品 的 基 本 目 标 是 预 测 或 者 窥 视 最 终 产 品 的 度 量 对 于 代 码 来 说, 最 常 用 的 度 量 是 规 模 和 复 杂 性 本 节 接 下 来 的 部 分 我 们 讨 论 一 些 规 模 和 复 杂 性 的 度 量 方 法

169 7.6.1 代 码 规 模 测 量 产 品 规 模 的 度 量 比 较 简 单, 容 易 计 算 我 们 关 心 规 模 的 度 量 主 要 是 因 为 规 模 是 影 响 项 目 开 销 的 主 要 因 素 规 模 本 身 并 没 有 什 么 直 接 的 用 处, 它 能 成 为 一 种 重 要 的 度 量, 主 要 是 因 为 规 模 和 项 目 花 费 以 及 产 品 质 量 有 关 规 模 也 被 用 来 度 量 项 目 的 生 产 率 ( 例 如, 千 行 代 码 / 每 人 月 ) 最 终 产 品 质 量 往 往 也 是 利 用 规 模 来 进 行 规 范 化 处 理 的 ( 例 如 每 千 行 代 码 的 缺 陷 数 ) 由 于 这 些 原 因, 代 码 规 模 是 最 重 要 最 常 用 的 度 量 之 一 最 常 用 的 规 模 度 量 是 统 计 交 付 了 多 少 行 源 代 码, 即 最 终 交 付 的 代 码 行 数 LOC( Lines of cod) 但 LOC 的 问 题 在 于 一 个 项 目 的 代 码 行 数 很 大 程 度 上 依 赖 于 所 使 用 的 语 言 例 如, 如 果 用 LOC 作 为 规 模 度 量 的 话, 一 段 用 汇 编 语 言 写 的 程 序 就 要 比 用 高 级 语 言 写 的 同 样 的 程 序 规 模 更 大 即 使 是 同 一 种 语 言, 用 不 同 的 方 式 统 计 代 码 行 数, 结 果 相 差 也 很 大 尽 管 有 这 样 一 些 缺 点,LOC 仍 然 是 一 种 便 利 并 且 合 理 的 规 模 度 量 方 式, 并 且 已 经 得 到 了 广 泛 地 使 用 目 前, 使 用 得 最 广 泛 的 规 模 统 计 方 法 是 只 计 算 除 了 注 释 和 空 行 以 外 的 代 码 行 数 Halstead [46] 提 出 了 一 种 代 码 长 度 和 容 量 的 度 量 方 法, 这 种 方 法 以 程 序 中 操 作 符 和 操 作 对 象 的 个 数 为 依 据 对 于 一 段 程 序, 我 们 定 义 以 下 几 个 可 测 量 的 量 : n 1 是 不 同 操 作 符 的 总 数 n 2 是 不 同 操 作 对 象 的 总 数 f {1,j} 是 第 j 种 操 作 符 出 现 的 次 数 f {2,j} 是 第 j 种 操 作 对 象 出 现 的 次 数 该 程 序 的 词 汇 量 定 义 为 n=n 1 + n 2 根 据 前 面 列 举 的 可 测 量 参 数, 我 们 定 义 两 个 新 的 参 数 N 1 = f {1,j}, N_2= f {2,j}. N 1 是 程 序 中 不 同 操 作 符 出 现 的 总 数,N 2 是 不 同 操 作 对 象 出 现 的 总 数 程 序 的 总 长 度 定 义 为 : N=N 1 +N 2 利 用 程 序 的 长 度 和 词 汇 量, 程 序 容 量 V 定 义 为 V=Nlog 2 (n) 这 一 程 序 容 量 的 定 义 代 表 了 描 述 一 个 程 序 最 少 需 要 多 少 个 二 进 制 位 Log 2 (n) 是 唯 一 描 述 程 序 中 每 个 不 同 的 元 素 所 需 要 的 二 进 制 位 的 个 数,N 表 示 这 些 不 同 的 元 素 总 共 出 现 了 多 少 次 容 量 也 被 用 来 度 量 程 序 的 规 模, 并 且 已 有 实 验 证 明, 一 个 程 序 的 容 量 和 它 的 代 码 行 数 是 高 度 相 关 的 复 杂 性 度 量 如 果 仅 仅 依 据 单 位 时 间 的 代 码 行 数 来 度 量 生 产 率, 那 么 结 果 将 因 被 开 发 系 统 的 复 杂 性 不

170 同 而 有 很 大 的 差 异 显 然, 相 对 于 简 单 的 应 用 程 序 来 说, 程 序 员 在 开 发 高 度 复 杂 的 系 统 软 件 时 能 够 产 生 的 代 码 量 就 会 少 一 些 同 样, 复 杂 性 对 于 程 序 的 维 护 成 本 也 有 很 大 的 影 响 为 了 量 化 程 序 的 复 杂 程 度, 而 不 仅 仅 是 用 模 糊 的 概 念 去 描 述 创 建 和 理 解 一 个 程 序 的 难 易, 我 们 需 要 一 些 度 量 方 法 来 度 量 程 序 的 复 杂 性 目 前 已 有 一 些 方 法 可 以 用 来 量 化 程 序 的 复 杂 性, 并 且 已 有 一 些 研 究 揭 示 了 复 杂 性 和 维 护 成 本 之 间 的 关 联 这 里 我 们 将 讨 论 几 种 复 杂 性 度 量 方 法 回 路 复 杂 性 基 于 人 类 思 维 能 力 的 局 限 以 及 人 们 的 一 般 经 验, 大 家 普 遍 认 为 条 件 和 控 制 语 句 会 增 加 程 序 的 复 杂 性 对 于 两 个 规 模 相 同 的 程 序, 包 含 大 量 条 件 语 句 的 程 序 很 可 能 更 加 复 杂 因 此 最 简 单 的 复 杂 性 度 量 是 统 计 程 序 中 有 多 少 构 成 成 分 会 导 致 程 序 的 控 制 流 出 现 分 支, 类 似 的 构 成 成 分 包 括 if then else, wile do, repeat until, 以 及 goto 等 语 句 McCabe 提 出 了 一 种 更 为 精 确 的 度 量 方 法, 叫 做 回 路 复 杂 性 度 量, 这 是 一 个 基 于 图 理 论 的 概 念 对 于 一 个 图 G, 如 果 它 包 含 n 个 节 点,e 条 边, 以 及 p 个 连 通 分 支, 那 么 它 的 回 路 的 数 量 V(G) 定 义 为 V(G)=e-n+p 要 利 用 这 一 公 式 计 算 一 个 程 序 模 块 的 回 路 复 杂 性, 需 要 先 画 出 模 块 的 控 制 流 图 G 构 造 一 个 程 序 模 块 的 控 制 流 图 需 要 先 把 该 模 块 进 行 分 块, 分 块 的 边 界 是 那 些 对 控 制 流 有 影 响 的 语 句, 例 如 if, while, repeat 和 goto 等 这 些 块 构 成 图 的 节 点 如 果 控 制 权 可 以 从 块 i 转 移 到 块 j, 那 么 就 在 图 中 的 节 点 i 和 节 点 j 之 间 画 一 条 弧 程 序 的 控 制 流 图 可 以 机 械 化 地 构 造 例 如 下 面 给 出 的 使 用 类 C 语 言 实 现 的 冒 泡 排 序 函 数, 他 的 控 制 流 图 如 图 7.7 所 示 0. { 1. i = 1; 2. while (i <= n) { 3. j = i; 4. while (j <= i) { 5. if (A[i] < A[j]) 6. swap(a[i], A[j]); 7. j = j + 1; } 8. i = i + 1; } 9. }

171 图 7.7 冒 泡 排 序 函 数 的 控 制 流 图 一 个 模 块 的 控 制 流 图 包 含 一 个 入 口 节 点 和 一 个 出 口 节 点, 对 应 程 序 的 第 一 个 和 最 后 一 个 语 句 块 ( 或 者 为 了 简 便, 我 们 也 可 以 创 建 一 些 人 造 的 节 点, 如 前 面 的 例 子 所 示 ) 在 这 样 一 个 图 中, 对 任 意 一 个 节 点 都 存 在 一 条 从 入 口 节 点 到 该 节 点 的 路 径, 同 样 对 于 任 意 一 个 节 点, 都 存 在 一 条 从 该 节 点 到 出 口 节 点 的 路 径 ( 假 设 程 序 中 不 存 在 类 似 于 不 可 达 节 点 这 样 的 非 常 规 结 构 ) 对 于 这 样 构 造 出 来 的 图, 它 的 回 路 数 有 可 能 是 零, 只 要 原 来 的 代 码 是 一 个 线 性 的 语 句 序 列, 没 有 控 制 语 句 如 果 我 们 再 画 一 条 从 出 口 节 点 到 入 口 节 点 的 弧, 整 个 图 就 会 是 强 连 通 的, 即 任 意 两 个 节 点 之 间 都 存 在 一 条 路 径 这 样 任 意 程 序 图 的 回 路 个 数 将 是 非 零 的 一 个 简 单 的 没 有 任 何 条 件 语 句 的 程 序 具 有 一 个 非 零 的 复 杂 性 是 合 理 的 ( 无 论 如 何, 这 样 一 个 程 序 还 是 有 一 点 复 杂 性 的 ) 因 此 在 计 算 一 个 程 序 的 回 路 复 杂 性 时, 我 们 总 是 在 其 控 制 流 图 的 出 口 和 入 口 节 点 之 间 增 加 一 条 弧, 以 便 构 成 一 个 强 连 通 的 图 对 于 一 个 模 块, 其 回 路 复 杂 性 定 义 为 这 样 一 个 图 中 回 路 的 个 数 事 实 上, 一 个 模 块 的 回 路 复 杂 性 ( 或 者 说 它 对 应 的 图 中 回 路 的 个 数 ) 等 于 图 中 线 性 无 关 环 路 的 最 大 个 数 对 于 一 个 环 路 的 集 合, 如 果 其 中 不 存 在 一 个 环 路 是 完 全 包 含 在 另 外 一 个 环 路 中, 或 者 是 由 其 他 环 路 构 成 的, 那 么 我 们 称 这 组 环 路 是 线 性 无 关 的 因 此, 计 算 一 个 模 块 的 回 路 个 数 时, 我 们 可 以 先 画 出 其 控 制 流 图, 通 过 连 接 出 口 和 入 口 节 点 使 其 强 连 通, 然 后 或 者 计 算 其 中 环 路 的 个 数 或 者 计 算 节 点 和 边 的 个 数 对 于 图 7.7 所 示 的 图, 其 回 路 复 杂 性 为 V(G)=10-7+1=4 其 中 无 关 的 环 路 包 括 ckt 1: b c e b ckt 2: b c d e b ckt 3: a b f a

172 ckt 4: a g a 研 究 表 明 一 个 模 块 的 回 路 复 杂 性 是 其 所 包 含 的 决 策 点 的 个 数 加 一, 这 里 一 个 决 策 点 可 以 是 任 何 一 种 条 件 语 句 因 此 我 们 也 可 以 简 单 地 通 过 计 算 模 块 中 决 策 点 的 个 数 来 计 算 器 回 路 复 杂 性 对 于 这 个 例 子, 我 们 可 以 看 到, 通 过 计 算 该 模 块 中 决 策 点 的 个 数 加 一, 我 们 可 以 得 到 同 样 的 回 路 复 杂 性 ( 这 个 模 块 包 含 三 个 决 策 点 : 其 中 两 个 在 while 语 句 中, 一 个 在 if 语 句 中 ) 回 路 个 数 是 一 种 度 量 模 块 复 杂 性 的 方 法 它 也 可 以 扩 展 用 于 计 算 整 个 程 序 的 复 杂 性, 但 它 还 是 更 适 合 用 在 模 块 级 别 McCabe 提 出 一 个 模 块 的 回 路 复 杂 性 一 般 来 说 应 该 控 制 在 10 以 下 回 路 个 数 同 时 也 可 以 作 为 测 试 阶 段 需 要 覆 盖 的 路 径 的 个 数 回 路 复 杂 性 是 使 用 最 为 广 泛 的 一 种 复 杂 性 度 量 一 些 实 验 指 出 回 路 复 杂 性 和 以 LOC 来 度 量 的 模 块 规 模 是 高 度 相 关 的 ( 无 论 如 何, 代 码 行 数 越 多 意 味 着 决 策 点 越 多 ) 也 有 人 发 现 它 和 模 块 中 的 故 障 数 有 关 联 Halstead 度 量 ( 请 统 一, 是 标 题 放 在 正 文 中, 还 是 另 起 一 行?) Halstead 在 他 的 软 件 科 学 中 还 提 出 其 他 一 些 度 量 指 标 [46], 其 中 一 些 可 以 作 为 复 杂 性 的 度 量 如 前 所 述, 软 件 科 学 中 定 义 了 一 些 变 量, 包 括 n 1( 不 同 操 作 符 的 个 数 ), n 2 ( 不 同 操 作 对 象 的 个 数 ), N 1 ( 所 有 操 作 符 的 总 数 ), 以 及 N 2 ( 所 有 操 作 对 象 的 总 数 ) 由 于 任 何 一 个 程 序 都 至 少 包 含 两 个 操 作 符 ( 一 个 是 函 数 调 用, 一 个 是 语 句 结 束 ), n 1 /2 可 以 看 作 是 由 于 程 序 中 存 在 更 多 的 操 作 符 而 带 来 的 相 对 困 难 程 度 的 提 高 N 2 / n 2 代 表 每 个 操 作 数 平 均 被 试 用 了 多 少 次 一 个 程 序 中, 如 果 其 中 的 变 量 经 常 被 改 动, 那 么 这 个 商 值 就 会 更 大 由 于 这 样 的 程 序 往 往 更 难 理 解, 我 们 将 读 写 的 难 易 程 度 定 义 为 D= ( n 1 * N 2 )/( 2 * n 2 ) 和 McCabe 的 复 杂 性 度 量 方 法 一 样,Halstead 的 度 量 方 法 同 样 关 注 模 块 内 部 的 复 杂 程 度 模 块 与 环 境 间 连 接 的 复 杂 性 没 有 受 到 足 够 的 重 视 在 Halstead 的 度 量 方 法 中, 模 块 与 环 境 的 连 接 反 映 在 操 作 对 象 和 操 作 数 上, 对 另 一 个 模 块 的 调 用 被 看 做 是 一 种 操 作 符, 调 用 过 程 中 涉 及 的 参 数 被 看 作 是 这 个 操 作 符 的 操 作 对 象

173 活 跃 变 量 在 一 段 计 算 机 程 序 中, 典 型 的 赋 值 语 句 只 使 用 和 修 改 很 少 的 变 量 但 是 一 般 来 讲 语 句 有 一 个 更 大 一 些 的 上 下 文 环 境 换 句 话 说, 要 想 编 写 和 理 解 一 条 语 句, 程 序 员 需 要 注 意 一 系 列 的 变 量, 而 不 仅 仅 是 直 接 被 这 个 语 句 使 用 到 的 那 些 对 于 一 个 语 句, 这 些 需 要 注 意 的 数 据 项 称 为 活 跃 变 量 直 观 来 讲, 一 个 语 句 涉 及 到 的 活 跃 变 量 越 多, 理 解 起 来 就 越 难 因 此, 活 跃 变 量 的 概 念 可 以 用 来 作 为 程 序 复 杂 性 的 一 种 度 量 首 先, 让 我 们 为 活 跃 变 量 给 出 一 个 更 准 确 的 定 义 一 个 变 量, 在 模 块 中 存 在 第 一 次 和 最 后 一 次 对 其 的 引 用, 在 这 之 间, 对 于 每 一 个 引 用 了 这 个 变 量 的 语 句 来 说, 该 变 量 是 活 跃 的 利 用 这 一 定 义, 可 以 很 容 易 地 通 过 分 析 模 块 代 码 来 计 算 每 个 语 句 对 应 的 活 跃 变 量 集 合, 确 定 活 跃 变 量 的 算 法 也 很 容 易 自 动 化 对 于 一 条 语 句, 活 跃 变 量 的 个 数 描 述 了 该 语 句 的 难 易 程 度 这 一 概 念 也 可 以 扩 展 到 整 个 模 块, 方 法 是 计 算 模 块 中 活 跃 变 量 个 数 的 平 均 值 这 一 平 均 活 跃 变 量 数 的 计 算 方 法 是, 用 所 有 可 执 行 语 句 的 活 跃 变 量 数 的 总 和 除 以 可 执 行 语 句 的 个 数, 这 一 平 均 值 可 以 作 为 模 块 复 杂 性 的 度 量 活 跃 变 量 是 从 数 据 使 用 的 角 度 来 定 义 的, 没 有 显 示 地 考 虑 模 块 中 的 逻 辑 逻 辑 仅 仅 用 来 确 定 对 于 某 个 变 量, 第 一 条 和 最 后 一 条 引 用 它 的 语 句 这 一 复 杂 性 的 概 念 和 回 路 复 杂 性 有 很 大 的 区 别, 因 为 后 者 主 要 考 虑 逻 辑, 而 将 数 据 放 在 次 要 的 位 置 另 外 一 个 面 向 数 据 使 用 的 概 念 是 跨 度 (span), 即 两 次 连 续 的 变 量 使 用 之 间 包 含 的 语 句 的 个 数 如 果 一 个 变 量 在 模 块 中 有 n 个 不 同 的 地 方 使 用, 那 么 这 个 变 量 的 跨 度 就 是 有 (n-1) 平 均 跨 度 是 一 个 变 量 相 邻 引 用 之 间 的 可 执 行 语 句 个 数 的 平 均 值 跨 度 大 意 味 着 代 码 的 读 者 需 要 在 很 长 的 一 段 时 间 内 ( 或 者 说 很 多 的 语 句 里 ) 都 记 得 一 个 变 量 的 定 义 换 句 话 说, 跨 度 也 可 以 看 作 是 一 种 复 杂 性 的 度 量 : 跨 度 越 大, 模 块 越 复 杂 结 数 文 献 [85] 提 出 了 一 种 以 程 序 中 控 制 转 移 所 处 的 位 置 为 基 础 的 复 杂 性 量 化 方 法, 这 种 方 法 主 要 是 针 对 FORTRAN 程 序 设 计 的, 这 种 程 序 中 控 制 转 移 是 通 过 显 示 的 goto 语 句 来 实 现 的 程 序 员 要 想 理 解 一 段 给 定 的 程 序, 通 常 会 在 程 序 的 控 制 节 点 及 其 目 标 语 句 之 间 画 箭 头, 帮 助 自 己 在 头 脑 中 构 造 出 一 个 描 述 该 程 序 及 其 控 制 转 移 的 图 按 照 这 一 度 量 方 式, 这 些 箭 头 之 间 的 缠 绕 越 多, 整 个 程 序 就 越 是 复 杂, 这 一 概 念 被 称 为 结 一 个 结 本 质 上 是 两 个 这 种 控 制 转 移 箭 头 之 间 的 交 叉 如 果 程 序 中 每 个 语 句 都 写 在 单 独 的 一 行 上, 这 个 概 念 可 以 用 如 下 的 方 式 进 行 形 式 化 的 定 义 一 个 从 a 行 到 b 行 的 跳 转 可 以 表 示 为

174 一 个 对 (a,b) 两 个 跳 转 (a,b) 和 (p,q) 如 果 满 足 下 面 的 条 件 之 一 就 会 导 致 一 个 结 : 或 者 min (a, b) min (p, q) max (a, b) max (p, q) max (a, b); 或 者 min (a, b) max (p, qa) max (a, b) min (p, q) min (a, b). 这 种 统 计 结 的 方 式 用 在 结 构 化 的 程 序 上 会 有 问 题 一 种 解 决 方 法 是 把 程 序 先 转 换 成 只 包 含 显 示 控 制 转 移 的 形 式, 然 后 再 计 算 结 的 个 数 基 本 的 文 法 可 以 抽 象 成 控 制 流 图, 尽 管 抽 象 后 的 结 果 中 只 包 含 程 序 中 的 跳 点 (bound) 拓 扑 复 杂 性 文 献 [20] 提 出 了 一 种 对 嵌 套 结 构 敏 感 的 复 杂 性 度 量 方 法, 与 回 路 复 杂 性 一 样, 这 种 方 法 也 是 基 于 模 块 或 者 程 序 的 控 制 流 图, 程 序 的 复 杂 性 由 图 中 最 大 交 叉 数 决 定 为 了 计 算 最 大 交 叉 数, 我 们 需 要 先 将 程 序 的 流 图 转 成 强 连 通 图 ( 通 过 在 终 止 节 点 与 初 始 节 点 之 间 再 连 接 一 条 边 ) 一 个 强 连 通 的 图 把 整 个 平 面 划 分 成 有 限 个 区 域 区 域 的 个 数 等 于 e( 边 数 )-n( 节 点 数 )+2 如 果 我 们 要 画 一 条 线, 使 其 进 入 每 个 区 域 一 次 并 且 只 有 一 次, 这 么 这 条 线 和 图 中 已 有 的 弧 之 间 交 叉 的 次 数 即 为 最 大 交 叉 数 这 一 最 大 交 叉 数 也 被 用 作 程 序 复 杂 性 的 一 种 度 量 7.7 总 结 由 于 阅 读 程 序 是 比 写 程 序 更 为 常 见 的 活 动, 因 此 编 码 活 动 的 目 标 除 了 写 出 程 序, 还 包 括 尽 量 少 的 缺 陷, 容 易 理 解 和 修 改 结 构 化 编 程 保 证 了 程 序 单 入 口 单 出 口 的 结 构, 这 使 得 程 序 易 于 理 解 和 验 证 其 他 良 好 的 编 程 做 法 也 有 助 于 提 高 代 码 的 可 读 性 和 质 量, 包 括 信 息 隐 藏 适 当 编 码 标 准 等 开 发 者 最 有 效 的 方 式 是 递 增 的 开 发 代 码 这 要 求 每 次 写 一 小 块 代 码, 对 其 进 行 测 试 和 调 试, 然 后 再 增 量 的 写 后 面 的 代 码 另 外, 测 试 驱 动 开 发 要 求 先 写 测 试 案 例, 然 后 再 编 写 代 码, 以 通 过 这 些 测 试 案 例 虽 然 通 常 是 程 序 员 来 写 一 个 模 块 的 代 码, 但 另 外 有 一 种 方 式 是 结 对 编 程 : 在 这 种 方 式 里, 一 对 程 序 员 一 起 设 计 策 略 数 据 结 构 算 法 等 需 要 很 好 的 管 理 代 码 演 化 这 可 以 通 过 正 确 的 源 代 码 控 制 工 具, 以 方 便 管 理 不 同 的 版 本, 以 及 在 需 要 时 可 以 轻 松 的 回 滚 到 已 修 改 的 代 码 由 于 代 码 随 时 间 变 化, 以 确 保 代 码 质 量 不 继 续 降 解 的 演 变, 重 构 可 能 做 到 的 重 构 不 添 加 新 功 能, 其 好 处 是 提 高 了 设 计, 包 括 减 少 代 码 耦 合 增 强 代 码 内 聚, 并 更 好 的 层 次 化 单 元 测 试 是 由 程 序 员 执 行 的, 非 常 流 行 且 最 常 用 的 验 证 代 码 的 方 法 在 单 元 测 试 中, 程 序 员 单 独 测 试 他 / 她 的 代 码 对 过 程 化 程 序 语 言, 这 种 测 试 通 常 针 对 一 个 过 程 或 函 数 ; 对 面 向 对 象 语 言, 一 般 针 对 一 个 类 或 少 数 几 个 类 的 集 合 单 元 测 试 需 要 驱 动 程 序 和 支 撑 程 序, 并 可 便 利 的 使 用 可 以 自 动 执 行 测 试 脚 本 的 框 架 优 秀 的 框 架 包 括 CUnit 和 JUnit, 他 们 分 别 针 对 过

175 程 化 语 言 和 面 向 对 象 语 言 定 量 衡 量 代 码 质 量 有 多 种 量 化 指 标 最 常 用 的 指 标 比 如 代 码 规 模, 它 被 用 来 评 估 人 员 生 产 率 和 成 本 估 算 最 常 见 的 代 码 规 模 指 标 是 代 码 行 (LOC), 它 也 用 于 大 多 数 开 销 估 计 模 型 中 ; 复 杂 性 度 量 指 标 的 目 标 是 量 化 度 量 软 件 复 杂 性, 而 复 杂 性 是 度 量 软 件 生 产 力 的 重 要 因 素, 并 且 是 项 目 成 本 估 计 的 要 素 现 有 的 多 个 复 杂 度 指 标 中, 最 常 见 的 是 圈 复 杂 性 它 来 源 于 程 序 的 内 部 逻 辑, 并 定 义 为 程 序 中 独 立 的 循 环 数 目 自 我 评 价 练 习 1. 什 么 是 结 构 化 编 程? 它 如 何 提 高 代 码 可 读 性? 2. 如 何 使 用 信 息 隐 藏 和 代 码 标 准 提 高 代 码 可 读 性? 3. 如 果 采 用 成 对 编 程 的 方 法, 请 分 析 测 试 驱 动 开 发 发 挥 作 用 的 可 能 性? 4. 用 测 试 驱 动 开 发 的 方 法 写 一 个 类 或 过 程 ( 并 使 用 一 些 测 试 框 架 ), 让 另 一 个 程 序 员 用 增 量 开 发 的 方 法 进 行 开 发 从 代 码 行 数 需 要 的 工 作 量 使 用 的 测 试 用 例 数 量 等 几 个 方 面 比 较 两 者 写 出 的 代 码 5. 考 虑 一 个 类 的 代 码, 找 出 两 个 你 希 望 重 构 这 些 代 码 的 原 因, 对 每 一 个, 提 出 你 将 进 行 重 构 的 方 法 6. 在 重 构 中, 测 试 框 架 和 自 动 测 试 脚 本 的 角 色 是 什 么? 7. 用 你 最 喜 欢 的 单 元 测 试 框 架 对 一 个 类 / 过 程 进 行 测 试, 要 求 这 个 类 / 过 程 与 其 他 的 类 或 过 程 存 在 依 赖 关 系 8. 使 用 流 程 图 描 述 代 码 审 查 过 程 9. 对 代 码 评 审 的 总 结 报 告, 写 出 几 条 评 估 规 则 10. 针 对 从 一 个 排 好 序 的 整 数 数 组 中 查 找 一 个 元 素 E, 考 虑 以 下 两 个 算 法 : 第 一 个 采 用 的 是 简 单 的 线 性 查 找, 第 二 个 是 二 分 查 找 一 般 来 说, 二 分 查 找 在 执 行 时 间 上 比 线 性 查 找 更 有 效 率 function lin search (A, E): boolean var i : integer; found: boolean; begin found := false; i := 1; while (not found) and (i <= n) do begin if (A[i] = E) then found := true; i := i + 1; end; lin search := found; end; function bin search (A, E): boolean var low, high, mid, i, j : integer;

176 found : boolean; begin low := 1; high := n; found := false; while (low <= high) and (not found) do begin mid := (low + high)/2; if E < A[mid] then high := mid - 1 else if E > A[mid] then low := mid + 1 else found := true; end; bin search := found; end; 针 对 这 两 个 函 数, 判 定 循 环 复 杂 度 和 活 跃 变 量 复 杂 度 对 这 两 个 函 数 而 言, 上 述 复 杂 度 度 量 是 否 接 近? 11. 什 么 是 Halstead s 大 小 度 量? 将 其 与 代 码 长 度 (LOC) 进 行 比 较

177 第 八 章 测 试 开 发 过 程 中, 每 一 个 阶 段 都 有 可 能 引 入 错 误 尽 管 每 个 阶 段 之 后, 都 可 以 借 助 某 些 技 术 ( 如 检 查 ) 来 寻 找 错 误, 但 仍 有 些 错 误 无 法 被 找 到 最 终, 这 些 残 存 的 错 误 将 在 代 码 中 反 映 因 此, 最 终 的 代 码 可 能 包 含 一 些 需 求 错 误 和 设 计 错 误, 此 外 还 有 一 些 在 编 码 过 程 中 引 入 的 错 误 为 了 保 证 最 终 发 布 的 软 件 质 量, 需 要 修 正 这 些 缺 陷 目 前, 两 种 不 同 类 型 的 方 法 用 于 识 别 错 误 静 态 ( 分 析 ) 和 动 态 ( 分 析 ) 在 静 态 分 析 方 法 中, 代 码 不 被 执 行, 而 是 通 过 一 些 流 程 或 者 一 些 工 具 来 定 位 错 误 在 之 前 章 节 中 讨 论 过 的 代 码 检 查 方 法, 就 是 一 种 静 态 分 析 方 法 此 外 就 是 使 用 一 些 工 具 来 静 态 的 分 析 代 码 在 动 态 分 析 方 法 中, 代 码 执 行 的 结 果 用 于 检 测 错 误, 一 般 测 试 常 使 用 动 态 分 析 技 术 实 际 上, 测 试 也 是 最 常 用 的 查 错 技 术, 并 在 质 量 控 制 中 扮 演 了 很 关 键 的 角 色 测 试 用 有 限 组 测 试 用 例 执 行 软 件, 被 测 软 件 SUT(Software Under Test) 运 行 结 果 与 预 期 结 果 比 较, 用 于 确 认 软 件 是 否 按 照 要 求 执 行 测 试 的 基 本 目 的 是 对 SUT 的 功 能 进 行 评 估 由 于 测 试 的 代 价 十 分 昂 贵 并 且 消 耗 近 乎 无 限, 所 以 尽 可 能 的 有 效 测 试 是 期 望 达 到 的 额 外 而 实 际 的 目 标 很 明 显, 测 试 用 例 的 选 择 决 定 了 测 试 的 效 果 和 效 率, 因 此 本 章 的 大 部 分 内 容 将 围 绕 测 试 用 例 的 选 择 进 行 探 讨 在 本 章 中, 我 们 将 讨 论 : 测 试 相 关 的 基 本 概 念 和 定 义, 如 : 错 误 缺 陷 失 败, 测 试 用 例 测 试 集, 测 试 工 具 等 测 试 过 程, 如 何 做 测 试 计 划, 如 何 完 成 单 元 测 试 如 何 在 黑 盒 测 试 中 选 择 测 试 用 例 如 何 在 白 盒 测 试 中 选 择 测 试 用 例 测 试 中 可 使 用 的 相 关 评 测 标 准, 如 覆 盖 率 可 靠 性 等 8.1 测 试 的 概 念 本 节 先 给 出 在 讨 论 测 试 时 常 用 术 语 的 定 义, 随 后 讨 论 和 测 试 过 程 以 及 测 试 人 员 心 理 相 关 的 基 本 问 题 错 误 缺 陷 和 失 败 当 讨 论 测 试 时, 我 们 经 常 使 用 诸 如 错 误 缺 陷 和 失 败 (error fault failure) 之 类 的 概 念 让 我 们 从 明 确 的 定 义 这 些 概 念 着 手 [52] 错 误 在 两 种 不 同 的 场 合 中 使 用 它 表 示 通 过 计 算 观 察 度 量 的 值 和 真 实 的 指 定

178 的 或 理 论 分 析 的 值 之 间 存 在 差 距 换 句 话 说, 错 误 是 指 软 件 运 行 结 果 和 真 实 输 出 结 果 之 间 的 差 值 基 于 这 种 解 释, 错 误 本 质 上 是 对 真 实 值 和 理 想 值 的 差 距 的 测 量 错 误 同 样 也 被 用 来 指 代 人 的 行 为 导 致 软 件 中 存 在 的 缺 点 (defect) 或 者 失 效 这 个 定 义 非 常 通 用, 并 且 囊 括 了 所 有 的 方 面 缺 陷 表 示 系 统 无 法 完 成 其 应 该 完 成 的 功 能 缺 陷 是 引 起 软 件 故 障 的 基 本 原 因, 通 常 与 bug 同 义, 或 者 一 些 更 通 常 的 说 法 缺 点 错 误 一 词 也 经 常 被 用 来 表 示 缺 陷 ( 参 见 错 误 的 第 二 个 定 义 ) 在 本 书 中, 将 继 续 按 照 常 用 方 法 使 用 这 些 定 义, 无 必 要 时 候, 将 不 加 详 细 区 分 失 败 指 系 统 或 者 系 统 的 构 件 无 法 满 足 计 划 中 的 功 能 需 求 当 软 件 的 运 行 和 描 述 不 一 致 时, 软 件 发 生 失 败, 功 能 或 运 行 的 因 素 都 可 能 引 起 失 败 请 注 意, 失 败 的 定 义 中 并 没 有 说 明 失 败 一 定 可 观 察 因 此, 在 系 统 运 行 中, 可 能 产 生 了 失 败, 但 是 人 们 并 未 发 现 这 些 定 义 有 一 些 潜 在 含 义, 错 误 存 在 意 味 着 失 败 一 定 会 出 现, 而 发 现 一 个 失 败 则 表 明 缺 陷 一 定 存 在 然 而, 缺 陷 的 存 在 不 能 表 明 一 个 失 败 一 定 发 生 缺 陷 存 在 只 表 明 系 统 有 可 能 会 在 执 行 中 失 败 在 一 段 时 间 内, 缺 陷 是 否 被 发 现 取 决 于 软 件 如 何 执 行 在 测 试 中 这 些 有 直 接 的 推 论, 如 果 在 测 试 当 中 没 有 发 现 任 何 错 误, 那 么 将 无 法 判 断 系 统 中 是 否 存 在 缺 陷 ; 从 另 一 个 方 面 来 说, 如 果 发 现 了 一 些 失 败, 那 么 就 可 以 认 为 系 统 中 存 在 一 些 缺 陷 缺 陷 和 失 败 的 关 系 使 得 选 择 测 试 用 例 富 有 挑 战 性, 选 择 测 试 用 例 的 目 标 是 暴 露 存 在 的 缺 陷 理 想 的 测 试 数 据 应 该 能 够 找 到 系 统 中 存 在 的, 但 大 多 数 情 况 下 不 会 引 发 失 败 的 缺 陷 需 要 注 意 的 是, 在 测 试 过 程 中, 只 有 失 败 是 可 发 现 的, 而 缺 陷 的 存 在 则 是 被 推 断 的 也 就 是 说, 测 试 结 果 揭 示 失 败 是 否 存 在 而 实 际 的 缺 陷 确 定 由 独 立 的 活 动 完 成, 通 常 被 称 为 调 试 换 句 话 说, 为 了 识 别 缺 陷, 在 测 试 中 发 现 了 存 在 缺 陷 之 后, 需 要 执 行 代 价 昂 贵 的 调 试 工 作, 这 也 是 为 什 么 通 过 测 试 识 别 缺 陷 的 代 价 昂 贵 的 原 因 之 一 测 试 用 例, 测 试 集 和 测 试 用 具 到 目 前 为 止 我 们 并 未 正 式 定 义 测 试 用 例 测 试 集, 让 我 们 更 准 确 的 定 义 它 们 一 个 测 试 用 例 ( 通 常 称 为 一 个 测 试 ) 可 以 被 认 为 包 含 一 组 测 试 输 入 测 试 环 境 被 设 计 为 按 某 种 特 定 的 方 式 执 行 SUT[52] 通 常 来 说, 测 试 用 例 也 包 括 在 指 定 运 行 情 况 和 输 入 下,SUT 期 望 的 输 出 结 果, 用 于 测 试 SUT 特 定 行 为 或 特 定 方 面 的 一 组 相 关 测 试 用 例 通 常 称 为 测 试 集 请 注 意, 测 试 用 例 中 的 测 试 输 入 和 执 行 条 件 需 要 分 别 予 以 说 明 测 试 输 入 是 由 用 户 或 其 他 程 序 指 定 给 SUT 的 特 定 参 数 值 或 其 他 的 输 入 而 运 行 环 境 则 反 应 了 与 SUT 相 关 的 系 统 和 环 境 的 状 态 例 如, 当 测 试 添 加 一 条 记 录 到 数 据 库 这 样 一 个 功 能 时, 功 能 的 行 为 将 同 时 依 赖 于 输 入 记 录 的 数 值 和 数 据 库 的 状 态, 一 个 测 试 用 例 同 时 需 要 上 述 两 个 方 面 例 如, 测 试 该 功 能 的 测 试 用 例 可 以 定 义 输 入 为 记 录 r, 同 时 可 定 义 数 据 库 状 态 为 记 录 r 已 经 存 在

179 测 试 可 以 通 过 测 试 人 员 手 工 执 行 测 试 集 中 的 测 试 用 例, 并 比 对 运 行 行 为 是 否 与 定 义 的 行 为 吻 合 实 际 上, 当 测 试 集 中 有 大 量 的 测 试 用 例 时, 这 是 一 个 十 分 繁 琐 的 过 程 由 于 每 次 SUT 修 改 后 都 要 频 繁 的 测 试, 这 项 工 作 将 变 得 更 加 繁 琐 因 此, 现 在 的 发 展 趋 势 是 进 行 自 动 测 试 在 自 动 测 试 中, 一 个 测 试 用 例 是 一 个 典 型 的 函 数 调 用 ( 或 方 法 调 用 ), 其 中 包 括 测 试 用 例 的 所 有 活 动 包 括 定 义 测 试 数 据 和 测 试 环 境 执 行 SUT 比 对 测 试 返 回 结 果 和 期 望 结 果 最 后 告 知 SUT 测 试 是 否 通 过 换 句 话 说, 自 动 测 试 中, 执 行 测 试 用 例 本 质 上 就 是 执 行 函 数 一 个 测 试 集 就 变 成 了 一 组 函 数, 每 一 个 表 示 一 个 测 试 用 例 用 测 试 集 测 试 一 个 SUT, 通 常 会 写 一 个 自 动 测 试 脚 本, 以 便 按 照 既 定 的 顺 序 调 用 测 试 用 例 为 了 建 立 自 动 执 行 的 测 试 集, 我 们 需 要 定 义 一 个 测 试 输 入 框 架 ; 框 架 内 定 义 以 函 数 表 示 的 测 试 用 例 需 要 的 输 入, 从 而 可 以 编 写 自 动 测 试 脚 本, 使 得 SUT 可 以 被 脚 本 执 行 ; 全 部 测 试 的 结 果 可 以 报 告 给 测 试 人 员 现 有 很 多 测 试 框 架 都 能 达 到 这 些 目 标, 并 且 配 置 也 很 简 单 测 试 框 架 有 时 也 称 为 测 试 工 具 套 (harness) 测 试 工 具 套 或 框 架 通 过 提 供 简 单 的 方 式 定 义 执 行 测 试 集, 并 报 告 结 果 而 简 化 测 试 人 员 的 工 作 在 测 试 框 架 下, 测 试 集 只 需 要 一 次 定 义, 任 何 时 候 需 要 实 施 测 试 只 要 点 击 一 个 按 钮 或 执 行 一 条 命 令 即 可 测 试 心 理 就 像 前 文 中 所 说,SUT 的 测 试 执 行 需 要 一 组 测 试 用 例 基 于 前 文 的 讨 论, 期 望 撰 写 出 完 备 的 测 试 用 例 以 发 现 所 有 的 错 误 是 不 可 行 的 此 外, 并 没 有 形 式 化 或 者 精 确 选 择 测 试 用 例 的 方 法 尽 管 现 在 有 很 多 启 发 式 测 试 用 例 选 择 和 使 用 技 巧, 但 选 择 测 试 用 例 仍 然 是 测 试 人 员 独 创 而 需 要 创 造 力 的 活 动 正 因 如 此, 测 试 中 人 的 心 里 因 素 尤 为 重 要 测 试 的 一 个 基 本 目 的 就 是 找 到 程 序 中 的 潜 在 错 误 因 此, 不 应 抱 着 证 明 程 序 正 确 的 目 的 进 行 测 试, 而 应 该 抱 着 证 明 程 序 不 能 运 行 的 目 标 进 行 测 试, 以 揭 示 任 何 可 能 存 在 的 缺 陷 基 于 这 一 点, 测 试 有 时 候 被 定 义 为 为 了 找 错 误 而 执 行 程 序 的 过 程 [68] 强 调 正 确 的 测 试 目 的 并 非 细 枝 末 节, 这 是 因 为 测 试 数 据 是 由 人 设 计 的, 而 人 有 为 达 到 其 既 定 目 标 而 行 动 的 趋 势 所 以, 如 果 目 的 是 证 明 程 序 有 效, 我 们 会 有 意 无 意 的 选 择 那 些 可 能 证 明 这 个 程 序 有 效 的 测 试 用 例, 这 将 和 测 试 的 基 本 目 的 冲 突 从 另 一 方 面 看, 如 果 目 的 是 证 明 程 序 不 能 运 行, 那 么 我 们 会 竭 尽 所 能 找 到 测 试 用 例 来 证 明 这 一 点, 同 时 有 可 能 发 现 更 多 的 错 误 测 试 本 质 上 说 是 一 个 破 坏 性 的 过 程, 因 为 测 试 人 员 必 须 把 程 序 看 做 是 需 要 被 击 败 的 敌 人 而 击 败 的 方 法 就 是 找 到 程 序 中 存 在 的 错 误, 这 是 为 何 有 些 组 织 雇 佣 独 立 测 试 团 队 ( 不 属 于 开 发 团 队 ) 的 原 因 之 一

180 8.1.4 测 试 的 级 别 除 了 在 编 码 中 引 入 的 错 误 之 外, 测 试 通 常 也 用 于 更 早 阶 段 引 入 的 错 误 因 此, 在 测 试 过 程 中 需 要 不 同 的 测 试 级 别, 每 一 级 测 试 针 对 系 统 的 一 个 方 面 基 本 测 试 级 别 有 : 单 元 测 试, 集 成 测 试, 系 统 测 试 和 验 收 测 试 不 同 级 别 的 测 试 试 图 发 现 不 同 类 型 的 错 误, 不 同 阶 段 的 错 误 之 间 和 不 同 的 测 试 级 别 之 间 的 关 系 如 图 8.1 所 示 客 户 要 求 验 收 测 试 需 求 系 统 测 试 设 计 集 成 测 试 代 码 单 元 测 试 图 8.1 测 试 的 级 别 第 一 级 的 测 试 是 我 们 在 前 面 已 经 讨 论 过 的 单 元 测 试, 单 元 测 试 主 要 是 为 了 确 认 个 体 程 序 员 完 成 的 代 码, 通 常 由 完 成 该 模 块 的 程 序 员 自 行 完 成 通 常 情 况 下, 一 个 模 块 只 有 在 完 成 单 元 测 试 后 才 会 被 用 于 集 成 而 提 供 给 系 统 其 它 部 分 使 用 测 试 的 下 一 级 通 常 称 为 集 成 测 试 在 这 一 级, 很 多 单 元 测 试 过 的 模 块 被 组 合 为 子 系 统, 接 着 被 测 试, 集 成 测 试 的 目 的 是 检 查 整 合 是 否 正 确, 因 此, 重 点 检 查 单 元 之 间 的 接 口 此 测 试 活 动 可 以 被 认 为 是 测 试 设 计 方 案 再 其 次 是 系 统 测 试 和 验 收 测 试, 这 里 将 测 试 整 个 软 件 系 统 这 个 过 程 的 相 关 文 件 是 需 求 文 档, 测 试 的 目 的 是 检 验 软 件 是 否 符 合 需 求 这 通 常 工 作 量 很 大, 对 于 大 型 项 目 来 说 可 能 持 续 数 周 或 数 月 本 质 上 这 是 一 个 确 认 过 程, 同 时 在 很 多 情 况 下, 也 只 是 一 个 确 认 活 动 验 收 测 试 通 常 需 要 通 过 客 户 的 真 实 数 据, 用 以 论 证 软 件 运 行 是 否 满 意 它 可 能 在 最 后 安 装 软 件 时 进 行, 验 收 测 试 本 质 上 测 试 系 统 是 否 能 实 现 客 户 委 托 完 成 的 功 能 上 述 测 试 都 是 在 系 统 构 建 过 程 中 进 行 的, 还 有 另 一 层 测 试, 叫 做 回 归 测 试, 回 归 测 试 在 已 有 系 统 发 生 修 改 时 进 行 我 们 知 道 修 改 对 于 软 件 来 说 十 分 普 遍, 每 一 个 软 件 都 会 经 历 修 改 然 而, 当 对 现 有 系 统 进 行 修 改 之 后, 需 要 进 行 测 试 来 保 证 修 改 不 会 造 成 负 面 效 果, 例 如 修 改 导 致 的 系 统 失 效 也 就 是 说, 在 保 证 新 服 务 的 预 期 效 果 的 同 时, 测 试 还 要 保 证 旧 服 务 的 预 期 效 果 得 到 保 持, 这 就 是 回 归 测 试 的 任 务 在 回 归 测 试 中, 老 系 统 中 使 用 的 测 试 用 例 将 被 保 留, 修 改 后 的 系 统 将 重 新 执 行 这 些 测 试

181 用 例, 同 时 对 比 新 老 系 统 的 运 行 结 果, 以 保 证 修 改 后 的 系 统 在 这 些 功 能 上 与 原 有 系 统 一 致 通 常, 这 是 修 改 系 统 之 后 的 一 个 主 要 工 作 即 使 自 动 测 试, 对 于 大 型 系 统 而 言 完 成 回 归 测 试 的 时 间 也 相 当 可 观 出 于 实 际 情 况 考 虑, 对 系 统 的 小 范 围 修 改 后 的 回 归 测 试 只 会 执 行 全 部 的 测 试 集 的 一 个 子 集 这 就 要 求 从 测 试 集 中 选 择 适 当 测 试 用 例, 以 确 保 可 以 对 由 于 修 改 产 生 影 响 的 范 围 获 得 全 面 测 试 对 于 回 归 测 试, 测 试 用 例 选 取 是 一 个 热 门 研 究 领 域, 已 有 文 献 推 荐 了 多 种 方 法, 在 此 不 做 进 一 步 讨 论 ( 怎 么 没 有 8.2 测 试 过 程?) 8.3 黑 盒 测 试 正 如 我 们 所 知, 设 计 好 的 测 试 用 例 是 系 统 测 试 的 关 键 测 试 系 统 的 目 标 是 通 过 尽 可 能 小 的 测 试 用 例 集 发 现 大 部 分 ( 希 望 是 所 有 ) 的 缺 陷 基 于 此 目 标, 认 真 选 择 测 试 用 例 很 重 要 如 果 存 在 的 话, 好 的 测 试 用 例 具 有 较 高 的 检 错 能 力, 并 且 它 会 给 人 一 种 信 心, 即 在 测 试 的 时 候, 没 有 出 现 错 误 即 暗 示 着 软 件 中 几 乎 没 有 ( 甚 至 没 有 ) 错 误 设 计 测 试 用 例 有 两 个 基 本 的 方 法 : 黑 盒 测 试 法 和 白 盒 测 试 法 黑 盒 测 试 法 中, 不 考 虑 目 标 程 序 的 内 部 结 构, 测 试 用 例 的 设 计 只 依 赖 于 程 序 或 模 块 的 需 求 或 规 格, 并 不 考 虑 其 内 部 结 构 本 节 将 陈 述 一 些 为 黑 盒 测 试 生 成 测 试 用 例 的 技 术, 而 白 盒 测 试 将 在 下 一 节 讨 论 黑 盒 测 试 中, 测 试 者 只 关 注 符 合 系 统 规 定 的 输 入 参 数 和 满 足 要 求 的 输 出 结 果 换 句 话 说, 决 定 测 试 用 例 的 是 系 统 或 者 模 块 的 需 求 和 规 范, 这 种 测 试 方 法 也 叫 做 功 能 测 试 或 行 为 测 试 最 明 显 的 功 能 测 试 是 不 切 实 际 的 全 面 测 试, 生 成 测 试 用 例 的 标 准 是 随 机 生 成, 这 个 策 略 得 到 一 系 列 极 佳 测 试 用 例 ( 即, 能 用 最 少 的 用 例 测 出 最 多 的 错 误 ) 的 可 能 性 是 很 小 的 因 此 选 择 测 试 用 例 时 还 需 要 其 他 标 准 或 规 则 尽 管 为 功 能 测 试 设 计 测 试 用 例 没 有 正 式 的 规 则, 但 许 多 启 发 式 技 术 在 探 测 错 误 方 面 非 常 有 效, 可 以 用 来 选 择 测 试 用 例, 下 面 我 们 介 绍 若 干 这 类 技 术 等 价 类 划 分 因 为 不 可 能 去 做 全 面 的 测 试, 所 以 一 个 自 然 的 方 法 就 是 将 输 入 域 划 分 成 一 系 列 的 等 价 类 如 果 对 于 某 类 的 一 个 值 程 序 运 行 正 常, 那 么 对 于 这 个 类 的 所 有 其 它 值 程 序 也 会 运 行 正 常 假 设 确 实 能 验 证 这 些 等 价 类, 那 么 从 每 一 个 等 价 类 中 取 一 个 值 来 测 试 程 序 就 等 于 对 程 序 的 全 面 测 试 然 而, 在 不 知 道 程 序 内 部 结 构 的 情 况 下, 验 证 等 价 类 是 不 可 能 的 ( 甚 至 在 知 道 程 序 内 部 结 构 的 情 况 下 也 是 不 可 能 的 ), 所 以 等 价 类 划 分 的 方 法 [68] 只 是 在 尝 试 逼 近 理 想 状 况 系 统 行 为 所 规 定 的 输 入 参 数 组 成 了 等 价 类, 每 个 不 同 的 输 入 参 数 组 是 一 个 独 立 的 等 价 类 这 样 划

182 分 的 等 价 类 的 理 由 是 : 如 果 规 范 要 求 等 价 类 中 的 每 个 元 素 行 为 相 同, 那 么 对 于 这 个 类 中 每 一 个 值, 程 序 要 么 成 功, 要 么 失 败 例 如, 一 个 计 算 整 数 的 绝 对 值 的 模 块, 参 数 为 正 整 数 时 模 块 指 定 一 个 行 为, 为 负 整 数 指 定 另 一 个 行 为 在 这 个 例 子 中, 我 们 将 得 到 两 个 等 价 类 一 个 由 正 整 数 组 成, 另 一 个 则 由 负 整 数 组 成 为 了 得 到 健 壮 的 软 件, 我 们 也 必 须 考 虑 那 些 无 效 的 输 入 我 们 应 该 为 无 效 的 输 入 划 分 一 个 等 价 类 一 个 等 价 类 是 通 过 考 虑 每 一 个 条 件 形 成 的, 这 些 条 件 指 定 了 作 为 有 效 等 价 类 输 入, 同 时 指 定 了 一 个 或 多 个 无 效 等 价 类 例 如, 假 定 一 个 输 入 指 定 了 值 的 范 围 ( 比 如 说 : 0 < count < Max ), 那 么 就 形 成 了 在 这 个 范 围 内 的 有 效 等 价 类 和 两 个 无 效 等 价 类, 其 中 一 个 无 效 等 价 类 的 值 都 低 于 范 围 的 最 小 值 ( 即, count < 0), 而 另 一 个 的 值 都 大 于 最 大 值 ( 即, count > Max) 如 果 输 入 指 定 了 一 组 值, 并 且 程 序 的 需 求 为 这 组 值 中 不 同 元 素 指 定 了 不 同 行 为, 那 么 每 个 元 素 就 形 成 了 一 个 有 效 的 等 价 类, 而 不 属 于 这 组 值 里 的 元 素 就 形 成 了 一 个 无 效 的 等 价 类 一 种 常 用 于 确 定 等 价 类 的 方 法 是 : 假 如 你 有 理 由 相 信, 会 以 不 同 方 式 处 理 整 个 范 围 内 的 输 入, 那 么 此 范 围 就 应 该 划 分 为 两 个 或 更 多 个 等 价 类, 在 每 一 个 等 价 类 中 处 理 输 入 值 的 行 为 是 相 似 的 例 如, 对 于 字 符 输 入, 假 如 我 们 有 理 由 相 信, 如 果 输 入 的 字 符 是 字 母, 数 字 或 特 殊 字 符 该 程 序 将 执 行 不 同 的 操 作, 那 么 就 应 该 把 输 入 划 分 成 三 个 有 效 等 价 类 另 一 个 形 成 等 价 类 的 方 法 是 考 虑 可 能 的 特 殊 值, 当 特 殊 值 作 为 输 入 时 程 序 有 不 同 的 行 为 时, 应 该 新 形 成 一 个 等 价 类 例 如, 值 0 可 以 作 为 整 数 输 入 特 殊 值 考 虑 另 外, 对 于 每 个 有 效 等 价 类, 应 该 建 立 一 个 或 多 个 对 应 的 无 效 等 价 类 通 过 输 出 来 考 虑 等 价 类 通 常 是 很 有 用 的, 对 于 一 个 输 出 等 价 类, 目 标 是 使 找 出 与 其 相 关 的 测 试 用 例 例 如, 考 虑 确 定 投 资 回 报 率 的 程 序, 有 三 个 明 显 的 输 出 等 价 类 : 正 数 回 报 率, 负 数 回 报 率 和 0 回 报 率 在 测 试 过 程 中, 测 试 每 个 输 出 的 等 价 类 是 很 重 要 的, 也 就 是 说, 给 定 一 些 输 入 值, 三 个 输 出 等 价 类 都 会 被 覆 盖 到 为 输 出 等 价 类 决 定 测 试 用 例 可 能 会 更 困 难, 但 是, 输 出 等 价 类 可 以 揭 示 仅 考 虑 输 入 等 价 类 时 无 法 揭 示 的 错 误 一 旦 为 每 一 个 输 入 选 定 了 等 价 类, 那 么 现 在 的 问 题 就 是 选 择 合 适 的 测 试 用 例 了, 有 几 种 不 同 的 选 择 测 试 用 例 的 方 法 一 种 策 略 是 选 择 能 尽 可 能 覆 盖 多 的 有 效 等 价 类 的 测 试 用 例, 而 对 每 一 个 无 效 的 等 价 类 分 开 测 试 一 个 更 好 的 方 法 是 使 测 试 覆 盖 尽 可 能 多 的 无 效 等 价 类, 但 这 需 要 更 多 的 测 试 用 例 在 后 一 种 情 况 下, 对 有 效 等 价 类 测 试 的 数 量 等 于 输 入 等 价 类 的 总 数 量, 再 加 上 无 效 等 价 类 的 总 数 举 个 例 子 说, 一 个 程 序 可 以 接 受 两 个 输 入 参 数 长 度 不 超 过 N 的 字 符 串 s, 和 整 数 n 这 个 程 序 是 确 定 s 中 出 现 次 数 最 多 的 n 个 字 符 测 试 者 相 信 程 序 员 会 分 开 处 理 不 同 类 型 的 字 符 表 8.1 列 出 了 一 组 有 效 和 无 效 的 等 价 类

183 表 8.1 有 效 等 价 类 和 无 效 等 价 类 输 入 有 效 等 价 类 无 效 等 价 类 S 有 效 等 价 类 1: 包 含 数 字 有 效 等 价 类 2: 包 含 小 写 字 母 无 效 等 价 类 1: 不 是 ASCII 字 符 无 效 等 价 类 2: 字 符 串 长 度 大 于 N 有 效 等 价 类 3: 包 含 大 写 字 母 有 效 等 价 类 4: 包 含 特 殊 字 符 有 效 等 价 类 5: 字 符 串 长 度 在 0-N 之 间 n 有 效 等 价 类 6: 有 效 范 围 内 的 整 数 无 效 等 价 类 3: 整 数 超 出 范 围 因 为 有 这 些 等 价 类, 我 们 必 须 选 择 测 试 用 例 这 个 程 序 的 测 试 用 例 是 一 对 s 和 n 的 值 采 用 每 一 种 确 定 一 个 测 试 用 例 的 策 略, 一 个 测 试 用 例 可 以 为 :s 可 以 是 一 个 包 含 小 写 字 母 大 写 字 母 数 字 和 特 殊 字 符 的 长 度 小 于 N 的 字 符 串, 而 n 可 以 是 数 字 5. 这 个 测 试 用 例 覆 盖 了 所 有 的 有 效 等 价 类 ( 有 效 等 价 类 1 到 等 价 类 6) 然 后 我 们 可 以 构 造 一 个 覆 盖 无 效 等 价 类 1 2 和 3 的 测 试 用 例 也 就 是 说, 总 共 需 要 四 个 等 价 类 用 第 二 种 方 法, 对 于 一 个 输 入, 用 一 个 测 试 用 例 可 以 覆 盖 一 个 等 价 类 所 以, 一 个 测 试 用 例 可 以 是 : 一 个 全 是 数 字 的 字 符 串 s, 和 一 个 数 字 5 这 个 方 案 覆 盖 了 有 效 等 价 类 1 和 6. 然 后 我 们 需 要 有 效 等 价 类 2 到 5 的 测 试 用 例, 和 分 开 测 试 无 效 等 价 类 1 到 3 的 用 例 边 界 值 分 析 研 究 指 出, 由 等 价 类 的 一 组 值 运 行 正 常 的 程 序 可 能 会 在 特 殊 值 情 况 下 运 行 失 败 这 些 特 殊 值 通 常 存 在 于 等 价 类 的 边 界 上 因 此, 包 含 等 价 类 边 界 值 的 测 试 用 例 可 能 成 为 高 产 测 试 用 例, 选 择 这 样 的 测 试 用 例 是 边 界 值 分 析 的 目 标 在 边 界 值 分 析 [68] 中, 我 们 从 等 价 类 中 选 出 位 于 等 价 类 边 界 的 输 入 做 测 试 用 例 边 界 值 应 该 包 括 每 个 等 价 类 ( 包 括 输 出 等 价 类 ) 的 边 界 值 边 界 值 测 试 用 例 也 被 叫 做 极 端 用 例 因 此 我 们 可 以 说 边 界 值 测 试 用 例 是 一 组 数 据, 它 依 赖 于 输 入 数 据 的 边 界 值, 或 者 产 生 输 出 数 据 边 界 值 对 于 有 范 围 的 值 来 说, 选 择 这 个 范 围 的 边 界 元 素 和 刚 刚 超 过 这 个 边 界 两 端 ( 两 个 无 效 等 价 类 ) 的 无 效 值 对 边 界 分 析 是 非 常 有 用 的 所 以, 假 设 这 个 范 围 是 0.0 x 1.0, 那 么 测 试 用 例 就 是 0.0,1.0( 有 效 输 入 ) 和 -0.1,1.1( 无 效 输 入 ) 相 似 的, 如 果 输 入 是 一 个 列 表, 我 们 就 应 该 注 意 这 张 列 表 的 起 始 元 素 在 边 界 值 分 析 中 也 应 该 考 虑 输 出 数 据 如 果 一 个 等 价 类 可 以 确 定 输 出, 则 应 该 尝 试 能 产 生 位 于 输 出 等 价 类 边 界 的 测 试 用 例 更 进 一 步, 还 应 该 尝 试 构 造 一 些 测 试 用 例, 能 产 生 不 在 输 出 等 价 类 范 围 之 内 的 输 出 ( 如 果 我 们 能 构 造 一 个 测 试 用 例, 使 程 序 产 生 的 输 出 在 等 价 类 外, 那 么 就 探 测 到 一 个 错 误 了 ) 与 等 价 类 划 分 方 法 一 样, 边 界 值 分 析 中 首 先 要 做 的 就 是 确 定 在 测 试 中 会 被 执 行 到 的 变 量 值 如 果 有 多 个 输 入, 那 么 测 试 用 例 该 怎 么 组 合 来 覆 盖 边 界 值? 假 设 每 个 输 入 变 量 都 有 范 围 定 义, 那 么 就 有 6 个 边 界 值 范 围 两 端 的 极 值, 刚 好 超 过 范 围 的 两 个 值, 刚 好 小 于 范 围 的

184 两 个 值 如 果 一 个 范 围 是 从 min 到 max 的 整 数, 那 么 这 六 个 边 界 值 分 别 是 :min-1,min, min+1,max-1,max,max+1 假 设 有 n 个 这 样 的 输 入 变 量, 测 试 中 有 两 种 方 法 来 组 合 这 些 变 量 的 边 界 值 第 一 种 方 法, 我 们 为 一 个 变 量 选 择 不 同 的 边 界 值, 并 且 保 持 其 它 变 量 不 变 选 择 一 个 由 所 有 变 量 组 成 的 确 定 值 的 测 试 用 例 在 这 种 情 况 下, 将 会 有 6n+1 个 测 试 用 例 如 果 有 两 个 变 量 X 和 Y, 则 有 13 个 如 图 8.4 所 示 的 测 试 用 例 图 8.4 边 界 值 的 测 试 用 例 另 一 种 方 法 是 尽 最 大 的 可 能 将 不 同 的 变 量 值 组 合 起 来, 由 于 一 个 变 量 有 七 个 值 ( 六 个 边 界 值 和 一 个 标 值 ), 如 果 有 n 个 变 量, 就 会 有 7n 个 测 试 用 例, 这 对 实 际 测 试 来 说 太 多 了 成 对 测 试 通 常 决 定 软 件 系 统 行 为 的 有 许 多 参 数, 这 些 参 数 可 能 是 直 接 输 入 到 软 件 的, 或 者 像 那 些 设 备 驱 动 一 样 隐 式 设 置 这 些 参 数 可 以 取 不 同 的 值, 并 且 其 中 一 些 值 有 可 能 使 软 件 运 行 不 正 常 许 多 软 件 缺 陷 发 生 的 条 件 都 是 当 某 个 参 数 取 到 特 殊 值 的 时 候, 这 种 缺 陷 被 叫 做 单 模 故 障 [70] 单 模 故 障 的 简 单 例 子 包 括, 不 能 在 某 个 特 殊 打 印 机 上 打 印, 当 旅 行 者 是 未 成 年 人 时 不 能 正 确 的 计 算 票 价, 电 话 计 费 软 件 不 能 在 某 特 别 的 国 家 正 确 计 算 出 账 单 等 通 过 对 不 同 参 数 的 不 同 值 进 行 测 试, 单 模 故 障 可 以 被 检 查 到 所 以, 假 设 一 个 系 统 中 有 n 个 参 数, 每 一 个 有 m 种 不 同 的 取 值 ( 或 者 m 个 不 同 类 型 的 值, 对 于 等 价 类 划 分 来 说 每 一 个 类 型 被 认 为 是 一 种 ), 那 么 用 一 个 测 试 用 例 可 以 测 试 一 个 参 数 值 的 组 合 换 句 话 说, 用 m 个 测 试 用 例 可 以 测 试 所 有 的 不 同 的 值

185 然 而, 不 是 所 有 的 故 障 都 是 单 模 的, 组 合 不 同 的 输 入 数 据 可 以 发 现 存 在 的 缺 陷 : 例 如, 电 话 计 费 软 件 在 晚 上 打 入 ( 一 个 参 数 ) 某 个 特 殊 国 家 ( 另 一 个 参 数 ) 时 不 能 正 确 计 费, 或 者 买 票 时 一 个 未 成 年 人 ( 一 个 参 数 ) 乘 坐 商 务 舱 ( 另 一 个 参 数 ), 且 周 末 不 住 在 那 ( 第 三 个 参 数 ) 里, 航 空 公 司 售 票 系 统 会 出 现 不 正 常 行 为, 这 些 多 模 缺 陷 可 以 通 过 不 同 参 数 的 组 合 ( 这 种 方 法 叫 组 合 测 试 ) 测 试 到 不 幸 的 是, 完 全 组 合 测 试 通 常 是 不 可 行 的, 对 于 一 个 有 n 个 参 数 的 系 统 来 说, 每 一 个 有 m 个 值, 不 同 的 组 合 的 总 合 是 n 的 m 次 方 对 于 一 个 带 有 5 个 参 数, 每 个 参 数 有 5 个 值 的 系 统 来 说, 所 有 组 合 的 总 数 就 有 3125 种 如 果 测 试 每 一 个 组 合 花 费 5 分 钟, 那 么 测 试 所 有 的 组 合 要 超 过 一 个 月 的 时 间 显 然, 对 于 那 些 有 很 多 参 数, 且 每 个 参 数 有 很 多 值 的 复 杂 系 统 来 说, 完 全 的 组 合 测 试 是 不 可 行 的, 需 要 用 实 际 的 技 术 来 减 少 测 试 的 次 数 有 些 研 究 建 议, 一 些 特 殊 的 单 个 值 或 一 对 相 互 作 用 的 值 [25] 可 以 发 现 出 软 件 故 障 也 就 是 说, 大 部 分 的 软 件 故 障 趋 向 于 要 么 单 模, 要 么 多 模 要 测 试 多 模 的 软 件 故 障, 可 以 不 需 要 用 所 有 的 组 合 参 数 值 去 测 试 系 统, 而 采 用 每 对 参 数 值 的 组 合 测 试, 这 个 叫 做 成 对 测 试 在 成 对 测 试 中, 所 有 成 对 的 值 必 须 在 测 试 中 执 行 如 果 有 n 个 参 数, 每 一 个 有 m 个 值, 那 么 在 每 两 个 参 数 之 间 我 们 有 m*m 对 值 第 一 个 参 数 与 剩 下 的 n-1 个 参 数 可 以 组 成 一 对, 第 二 个 参 数 与 剩 下 的 n-2 个 参 数 可 以 组 成 一 对 ( 因 为 第 二 个 参 数 与 第 一 个 参 数 的 组 合 已 经 包 含 在 第 一 个 参 数 中 ), 第 三 个 参 数 可 以 与 剩 下 的 n-3 个 成 对 等 等 所 以, 总 共 的 对 数 是 m * m * n * (n-1)/2 成 对 测 试 的 目 标 是 拥 有 一 组 包 含 任 意 对 的 测 试 用 例, 对 于 n 个 参 数, 每 个 测 试 用 例 是 这 些 参 数 值 的 一 个 组 合, 它 会 覆 盖 (n-1) + (n-2) +... = n(n-1)/2 对 在 最 好 的 情 况 下, 每 一 对 值 正 好 被 一 个 测 试 用 例 覆 盖 一 次, 则 覆 盖 所 有 的 对 需 要 m 平 方 个 不 同 的 用 例 举 个 例 子 说, 一 个 软 件 产 品 在 用 多 个 平 台 开 发, 并 用 浏 览 器 来 作 为 这 个 软 件 的 接 口 假 设 这 个 软 件 被 设 计 成 可 以 工 作 在 三 种 不 同 的 操 作 系 统 和 三 个 不 同 的 浏 览 器 下 另 外, 由 于 这 个 产 品 的 内 存 紧 缺, 有 一 个 要 求 要 测 试 它 在 不 同 级 别 的 内 存 下 的 表 现 所 以 有 下 面 的 带 有 不 同 值 的 三 个 参 数 : 操 作 系 统 : Windows, Solaris, Linux 内 存 大 小 : 128M, 256M, 512M 浏 览 器 : IE, Netscape, Mozilla 为 了 方 便 讨 论, 我 们 说 这 个 软 件 系 统 有 三 个 参 数 :A( 操 作 系 统 ),B( 内 存 大 小 ), 和 C ( 浏 览 器 ) 它 们 每 一 个 有 三 个 不 同 的 值, 不 妨 称 之 为 a1,a2,a3,b1,b2,b3 和 c1,c2, c3 则 总 的 成 对 组 合 数 有 9 * 3 = 27 种, 而 总 的 可 以 覆 盖 所 有 对 的 测 试 用 例 数 据 则 要 少 很 多 三 个 参 数 值 组 成 的 测 试 用 例 覆 盖 了 三 个 组 合 对 (A-B,B-C, 和 A-C) 因 此, 在 最 好 的 情 况 下, 我 们 可 以 通 过 27/3=9 个 测 试 用 例 覆 盖 所 有 的 27 个 组 合, 这 些 测 试 用 例 列 在 表 8.2 中, 它 包 含 了 所 有 要 覆 盖 的 成 对 值

186 表 8.2 成 对 测 试 的 测 试 用 例 A B C 对 a1 a1 a1 a2 a2 a2 a3 a3 a3 b1 b2 b3 b1 b2 b3 b1 b2 b3 c1 c2 c3 c2 c3 c1 c3 c1 c2 (a1,b1)(a1,c1)(b1,c1) (a1,b2)(a1,c2)(b2,c2) (a1,b3)(a1,c3)(b3,c3) (a2,b1)(a2,c2)(b1,c2) (a2,b2)(a2,c3)(b2,c3) (a2,b3)(a2,c1)(b3,c1) (a3,b1)(a3,c3)(b1,c3) (a3,b2)(a3,c1)(b2,c1) (a3,b3)(a3,c2)(b3,c2) 应 该 清 楚, 生 成 一 个 能 覆 盖 所 有 对 的 测 试 用 例 不 是 一 个 简 单 的 任 务 一 个 测 试 用 例 正 好 覆 盖 最 小 个 数 的 测 试 通 常, 生 成 最 小 数 量 的 测 试 用 例 是 不 可 能 的, 尤 其 是 当 不 同 参 数 的 值 的 数 量 不 同 时 研 究 者 们 提 出 各 种 算 法, 有 些 程 序 可 以 在 线 生 成 测 试 用 例 来 覆 盖 所 有 的 对 在 一 些 手 工 方 法 不 可 行 的 情 况 下, 可 以 使 用 下 面 的 方 法 首 先 找 出 用 含 有 最 多 值 的 两 个 参 数 ( 因 为 我 们 必 须 至 少 得 有 这 么 多 的 测 试 用 例 来 测 试 所 有 这 两 个 参 数 组 成 的 值 对 ), 用 它 们 的 所 有 值 组 合 来 形 成 一 个 测 试 用 例 然 后 通 过 加 入 其 他 还 未 被 覆 盖 的 参 数 值 来 补 充 该 测 试 用 例 当 所 有 的 完 成, 再 通 过 组 合 尽 可 能 多 的 没 被 覆 盖 的 值 对 来 构 造 额 外 的 测 试 用 例, 以 使 得 生 成 尽 可 能 覆 盖 所 有 值 对 的 测 试 用 例 为 了 避 免 覆 盖 重 复 的 值 对, 可 以 构 造 一 个 小 的 覆 盖 所 有 值 的 测 试 用 例 的 一 个 集 合, 在 成 对 测 试 中 生 成 最 小 数 量 的 测 试 用 例 有 一 些 高 效 算 法 在 [25] 中 给 出 了 一 个 例 子, 有 13 个 参 数, 每 个 参 数 有 3 个 不 同 的 值, 只 用 了 13 个 测 试 用 例 就 把 所 有 的 值 对 给 覆 盖 了, 而 这 些 参 数 的 组 合 数 的 总 数 超 过 了 10 亿 成 对 测 试 对 于 测 试 带 有 独 特 功 能 对, 且 有 许 多 不 同 的 参 数 的 大 型 软 件 系 统 是 一 个 很 实 用 的 方 法 一 个 例 子 是 带 有 不 同 参 数 值 且 不 同 参 数 值 有 不 同 利 率 的 计 费 系 统 ( 如 电 话 宾 馆 航 空 等 等 ), 或 那 些 期 望 运 行 在 不 同 平 台 和 配 置 下 的 通 用 软 件 产 品, 以 及 期 望 工 作 在 不 同 类 型 系 统 上 的 软 件 都 是 个 很 实 用 的 方 法 特 殊 情 况 由 上 文 我 们 知 道, 程 序 发 生 异 常 时 经 常 是 因 为 输 入 了 一 些 特 殊 的 参 数 原 因 是, 程 序 中 一 些 输 入 组 合 需 要 特 别 对 待, 但 用 于 处 理 这 些 特 殊 情 况 的 语 言 常 常 易 被 忽 略 例 如, 在 一 个 算 术 运 算 中, 如 果 有 一 个 为 0 的 除 数, 就 得 采 取 一 些 特 殊 的 操 作, 而 这 些 操 作 很 容 易 被 程 序 员 忘 掉 特 殊 的 参 数 往 往 是 好 的 测 试 用 例 的 关 键, 它 可 以 发 现 其 它 测 试 用 例 难 以 发 现 的 错 误 特 殊 的 参 数 常 依 赖 于 模 块 的 数 据 结 构 和 函 数 怎 样 判 定 这 些 特 殊 参 数 是 没 有 规 律 可 循 的, 测 试 者 不 得 不 用 其 直 觉 和 经 验 验 证 这 些 测 试 用 例 因 此, 决 定 特 殊 参 数 也 被 称 为 错 误 猜 测

187 心 理 学 对 于 错 误 猜 测 特 别 重 要 测 试 者 应 该 扮 演 魔 鬼 代 言 人, 试 着 猜 想 程 序 员 所 做 的 不 正 确 的 假 设 可 能 忽 略 或 者 处 理 不 当 的 情 形 基 本 上, 测 试 者 正 试 图 确 定 一 些 容 易 出 错 的 情 况 然 后 写 出 针 对 于 这 些 情 况 的 测 试 用 例 例 如, 文 件 中 找 出 不 同 单 词 的 个 数 这 样 一 个 问 题 ( 在 前 面 的 章 节 中 讨 论 过 ), 一 些 特 殊 参 数 可 以 是 : 文 件 是 空 的, 文 件 中 只 有 一 个 单 词, 文 件 中 一 行 只 有 一 个 单 词, 文 件 中 有 一 些 空 行, 所 有 的 单 词 都 一 样, 单 词 已 经 分 类, 文 件 的 开 始 和 结 尾 有 一 个 空 格 由 于 规 范 不 齐 全, 或 者 一 些 属 性 由 于 作 者 想 当 然 而 没 有 声 明, 就 造 成 程 序 员 经 常 做 出 的 假 设 不 正 确 无 论 什 么 时 候, 只 依 靠 自 己 的 理 解 而 不 明 确 声 明 规 范, 就 有 可 能 做 出 错 误 的 假 设 常 常, 这 些 错 误 的 假 设 是 关 于 系 统 环 境 的 然 而, 应 该 明 确 指 出, 特 殊 的 情 况 在 很 大 程 度 上 取 决 于 问 题, 测 试 者 应 该 尝 试 进 入 设 计 者 和 编 码 者 的 殿 堂, 再 确 定 这 些 特 殊 事 例 基 于 状 态 的 测 试 有 些 系 统 可 以 认 为 是 无 状 态 的, 也 就 是 说, 无 论 在 什 么 情 况 下 对 相 同 的 输 入 总 会 有 相 同 的 输 出 或 者 展 现 相 同 的 行 为 许 多 批 处 理 系 统 计 算 机 系 统 服 务 器 都 属 于 这 个 范 畴 硬 件 方 面, 组 合 电 路 也 在 该 范 畴 内 大 部 分 较 底 层 的 功 能 都 应 以 这 种 形 式 表 现 然 而 很 多 系 统 的 行 为 是 有 状 态 的, 因 为 在 不 同 时 间 他 们 行 为 表 现 不 同, 而 且 可 能 产 生 不 同 输 出 系 统 的 状 态 可 能 不 同 导 致 了 行 为 的 不 同 换 句 话 说, 系 统 的 行 为 和 输 出 不 仅 取 决 于 输 入, 还 受 系 统 状 态 的 影 响 系 统 的 状 态 取 决 于 先 前 系 统 接 受 的 输 入 也 就 是 说, 状 态 代 表 了 先 前 的 输 入 对 该 系 统 影 响 的 累 积 在 硬 件 方 面, 时 序 系 统 属 于 该 范 畴 在 软 件 方 面, 许 多 大 型 系 统 为 了 控 制 系 统 的 行 为, 需 要 将 过 去 的 状 态 记 录 在 数 据 库 或 者 文 件 中, 因 此 都 属 于 该 范 畴 对 于 这 些 系 统, 另 一 种 选 择 测 试 用 例 的 方 法 就 是 基 于 状 态 的 测 试 理 论 上 讲, 任 何 用 来 保 存 状 态 的 软 件 都 可 以 转 化 为 一 个 状 态 机 然 而, 作 为 一 个 形 成 该 状 态 的 所 有 变 量 域 的 矢 量 积, 任 何 合 理 计 划 的 状 态 空 间 几 乎 都 是 无 限 的 对 于 许 多 系 统 而 言, 状 态 空 间 可 以 划 分 成 几 个 状 态, 每 个 状 态 代 表 不 同 关 注 的 状 态 变 量 值 的 逻 辑 组 合 如 果 一 个 系 统 的 状 态 集 是 可 控 制 的, 则 可 建 立 该 系 统 的 状 态 模 型 系 统 的 状 态 模 型 包 括 四 个 组 成 部 分 : - 状 态 代 表 先 前 的 输 入 对 系 统 的 影 响 - 转 换 代 表 系 统 的 状 态 在 事 件 的 触 发 下, 怎 么 从 一 种 状 态 转 变 成 另 一 种 状 态 的 - 事 件 系 统 的 输 入 - 动 作 事 件 的 输 出 状 态 模 型 向 我 们 展 现 了 : 一 个 系 统 为 响 应 一 个 事 件, 完 成 了 什 么 动 作 和 发 生 了 何 种 状 态 转 化 当 一 个 状 态 模 型 建 立 于 一 个 系 统 的 需 求 之 上 时, 我 们 只 能 包 括 状 态, 转 变 和 一 些 动 作 ( 陈 述 在 需 求 中 或 由 其 推 导 出 ) 如 果 设 计 规 范 描 述 了 更 多 可 用 的 信 息, 就 可 以 建 立 更 为 丰

188 富 的 模 型 比 如, 第 五 章 中 讨 论 了 一 个 学 生 调 查 例 子 根 据 要 求, 我 们 应 该 创 建 一 个 学 生 调 查 的 系 统 学 生 接 受 调 查, 并 将 调 查 结 果 返 回 系 统, 且 最 多 5 个 调 查 结 果 我 们 考 虑 一 个 架 构, 在 数 据 库 和 服 务 器 有 缓 存 : 在 新 的 请 求 到 来 时, 如 果 调 查 达 到 五 次, 调 查 结 果 会 更 新 缓 存 架 构 后 端 有 一 个 数 据 库, 可 能 会 down 掉 为 了 建 立 这 个 系 统 的 状 态 机 模 型, 我 们 注 意 到 如 果 系 统 连 续 接 收 6 个 请 求, 对 前 5 个 的 处 理 可 能 会 不 一 样 因 此, 把 系 统 分 为 两 种 状 态 : 第 一 个 状 态 接 受 1 个 到 4 个 请 求 ( 状 态 1), 另 一 种 状 态 表 示 接 收 第 5 个 请 求 ( 状 态 2) 数 据 库 可 以 是 启 动 或 者 关 闭 的, 而 且 在 任 一 个 状 态 中 它 都 可 能 关 闭 如 果 数 据 库 关 闭, 行 为 可 能 会 不 同 所 以, 我 们 建 立 另 外 一 组 状 态 ( 状 态 3 和 4) 一 旦 数 据 库 失 败, 接 收 前 5 个 请 求 时, 系 统 会 使 用 旧 数 据 继 前 5 个 请 求 被 接 收 后, 系 统 接 收 一 个 新 的 请 求 时, 该 系 统 进 入 失 败 状 态 ( 状 态 5), 该 状 态 不 会 给 外 界 任 何 响 应 当 系 统 从 错 误 状 态 恢 复 后, 它 可 能 会 立 刻 更 新 它 的 缓 存, 因 此 进 入 状 态 2 该 系 统 的 状 态 模 型 表 示 如 表 8.5(i 代 表 用 户 调 查 的 输 入 ) Fail 图 8.5 学 生 调 查 系 统 的 状 态 模 型 注 意, 假 设 系 统 状 态 模 型 是 可 以 从 其 规 范 或 者 设 计 来 创 建 的, 大 多 数 状 态 模 型 都 是 这 么 建 立 的, 上 例 中 的 模 型 也 是 如 此 建 立 的 一 旦 状 态 模 型 建 好, 可 以 用 它 选 择 测 试 用 例 当 设 计 实 现 时, 这 些 测 试 用 例 可 以 用 来 检 测 代 码 所 以, 我 们 将 基 于 状 态 的 测 试 等 同 于 黑 盒 测 试 的 策 略

189 然 而, 状 态 模 型 常 常 需 要 系 统 设 计 相 关 的 一 些 信 息 在 上 面 的 例 子 中, 我 们 利 用 了 一 些 建 筑 学 方 面 的 知 识 有 时, 建 立 状 态 模 型 可 能 需 要 系 统 设 计 方 面 的 详 细 信 息 比 如 说, 对 于 一 个 类 来 说, 我 们 知 道 状 态 模 型 是 在 设 计 中 实 现 的, 并 且 设 计 中 已 经 了 解 很 多 关 于 这 个 类 的 信 息, 比 如 说 它 的 属 性 和 方 法 因 此, 可 以 将 基 于 状 态 的 测 试 看 做 一 种 位 于 黑 盒 和 白 盒 之 间 的 测 试 方 法 有 时 将 这 些 策 略 称 为 灰 盒 测 试 假 定 有 一 个 系 统 的 状 态 模 型, 那 么 如 何 生 成 测 试 用 例 呢? 人 们 提 出 了 许 多 覆 盖 标 准 [69] 这 里, 我 们 只 讨 论 其 中 几 种 假 设 测 试 用 例 的 组 合 是 T 一 些 标 准 如 下 : 所 有 迁 移 的 覆 盖 (AT) 测 试 用 例 一 定 要 确 保 状 态 图 中 的 每 个 迁 移 都 被 用 到 所 有 迁 移 对 的 覆 盖 (ATP) 测 试 用 例 一 定 要 执 行 所 有 相 邻 迁 移 的 配 对 ( 一 个 迁 移 对 包 括 两 个 迁 移 : 对 状 态 的 一 个 输 入 邻 近 的 和 该 状 态 的 一 个 输 出 迁 移 ) 迁 移 树 的 覆 盖 (TT) 测 试 用 例 一 定 要 执 行 多 条 简 单 路 径, 简 单 路 径 是 指, 开 始 于 初 始 状 态, 结 束 于 一 个 已 经 访 问 过 的 状 态 或 者 最 终 状 态 第 一 个 状 态 测 试 标 准 要 求 测 试 要 触 发 所 有 的 迁 移, 同 时 这 也 确 保 了 访 问 所 有 的 状 态 ; 迁 移 对 的 覆 盖 是 更 强 大 的 一 个 标 准, 该 标 准 要 求 测 试 用 例 要 执 行 每 个 状 态 的 输 入 输 出 迁 移 组 合 如 果 一 个 状 态 有 两 个 输 入 迁 移 t1 和 t2, 有 两 个 输 出 迁 移 t3 和 t4, 那 么, 一 个 满 足 AT 要 求 的 测 试 用 例 将 如 下 执 行 : 执 行 t1 t3 组 合 ; 执 行 t2 t4 组 合 然 而, 为 了 达 到 ATP 的 要 求, 测 试 用 例 也 要 保 证 t1 t4 组 合, 以 及 t2 t3 组 合 执 行 转 换 树 可 以 基 于 辨 认 状 态 图 路 径 而 构 建, 因 此 迁 移 树 得 以 命 名 在 ATP 中, 不 仅 仅 考 虑 迁 移, 需 要 执 行 的 是 状 态 图 中 所 有 不 同 路 径 一 般 而 言,ATP 涵 盖 了 AT 对 于 上 面 的 例 子,AT 适 用 的 测 试 用 例 在 下 面 的 表 8.3 给 出 这 里 req() 表 示 接 收 到 一 个 调 查 请 求,fail() 表 示 数 据 库 失 败,recover() 表 示 失 败 的 数 据 库 恢 复 表 8.3 基 于 状 态 测 试 的 事 例 S.No. Transition Test case > 2 1 -> 2 2 -> 1 1 -> 3 3 -> 3 3 -> 4 4 -> 5 5 -> 2 req() req();req();req();req();req(); seq for 2; req() req();fail() req();fail();req() req();fail();req();req();req();req();req(); seq for 6; req() seq for 6; req();recover() 正 如 我 们 了 解 的, 基 于 状 态 的 测 试 关 注 状 态 及 其 迁 移 即 使 在 上 面 简 单 的 例 子 中, 我 们 也 可 以 看 到 不 同 的 测 试 场 景 ( 比 如 说, 当 数 据 库 失 败 时 系 统 的 行 为 和 恢 复 后 的 系 统 行 为 )

190 如 果 设 计 测 试 用 例 仅 仅 关 注 输 入 域, 那 么 许 多 场 景 会 被 忽 略 当 使 用 另 一 种 标 准 时, 测 试 用 例 集 会 更 丰 富 对 于 如 何 使 用 其 他 标 准 来 发 掘 测 试 用 例, 我 们 把 它 作 为 本 章 练 习 8.4 白 盒 测 试 前 面 讨 论 了 黑 盒 测 试, 当 程 序 功 能 允 许 执 行 时 可 以 使 用 此 方 法 黑 盒 测 试 不 考 虑 实 际 程 序 的 内 部 逻 辑 结 构, 因 此, 其 主 要 虑 程 序 功 能 而 不 是 实 现 另 一 方 面, 白 盒 测 试, 用 于 测 试 程 序 的 实 现 白 盒 测 试 的 目 标 不 是 执 行 不 同 的 输 入 输 出, 而 是 执 行 程 序 中 不 同 的 设 计 结 构 和 数 据 结 构 白 盒 测 试 也 叫 结 构 测 试, 我 们 将 不 区 分 两 个 术 语 测 试 程 序 的 结 构, 结 构 测 试 的 目 标 是 实 现 足 以 满 足 不 同 结 构 覆 盖 的 测 试 用 例 人 们 提 出 了 许 多 标 准 用 以 达 到 此 目 标 与 不 太 精 确 的 功 能 测 试 标 准 不 同, 结 构 测 试 由 于 是 基 于 程 序 结 构 的, 从 而 相 当 精 确 这 里 我 们 将 讨 论 结 构 测 试 的 方 法 之 一 : 基 于 控 制 流 的 测 试, 这 也 是 最 常 见 的 结 构 测 试 方 法 基 于 控 制 流 的 测 试 准 则 大 多 数 基 于 结 构 的 准 则 是 基 于 程 序 控 制 流 的 在 这 些 标 准 中, 考 虑 的 是 程 序 的 控 制 流 图, 以 及 对 这 些 途 中 路 径 的 覆 盖 因 此, 在 我 们 考 虑 测 试 准 则 前, 先 定 义 何 谓 程 序 控 制 流 图 把 程 序 P 的 控 制 流 图 ( 或 者 简 称 为 流 图 ) 定 义 成 G 图 中 的 一 个 节 点 代 表 一 个 语 句 块, 语 句 块 中 的 语 句 是 经 常 一 起 执 行 的, 也 就 是, 无 论 何 时 第 一 个 语 句 执 行 了, 其 他 所 有 语 句 也 要 执 行 一 条 边 (i,j)( 从 节 点 i 到 节 点 j) 代 表 一 个 可 能 的 转 移, 表 示 当 节 点 i 代 表 的 块 中 的 最 后 一 个 语 句 执 行 完 后, 执 行 节 点 j 代 表 的 块 中 第 一 个 语 句 一 个 节 点 对 应 块 的 第 一 个 语 句 是 P 的 开 始 语 句, 这 个 节 点 被 称 为 G 的 开 始 节 点 一 个 节 点 对 应 块 的 最 后 一 个 语 句 是 退 出 语 句, 这 个 节 点 被 称 为 退 出 节 点 一 条 路 径 是 节 点 的 一 个 有 限 序 列 (n 1,n 2,,n k ),k>1, 因 此 对 于 序 列 中 的 所 有 节 点 都 有 一 条 边 (n i,n i+1 )( 除 了 最 后 一 个 节 点 n k ) 一 个 完 整 路 径 是 这 样 的 一 条 路 径 : 它 的 第 一 个 节 点 是 开 始 节 点, 最 后 一 个 节 点 是 退 出 节 点 现 在 考 虑 控 制 流 准 则 也 许 最 简 单 的 覆 盖 标 准 是 语 句 覆 盖, 它 要 求 测 试 程 序 中 的 每 一 个 语 句 至 少 要 被 执 行 一 次 换 言 之, 它 要 求 测 试 时 路 径 执 行 包 括 图 中 所 有 的 节 点, 这 也 被 称 为 所 有 节 点 标 准 [73] 这 个 覆 盖 标 准 不 是 很 健 壮, 可 能 遗 留 未 被 检 测 到 的 错 误 举 个 例 子, 如 果 程 序 中 有 一 个 没 有 else 子 句 的 if 语 句, 一 个 评 价 条 件 为 真 的 测 试 用 例 将 满 足 这 个 语 句 的 语 句 覆 盖 标 准 测 试 用 例 不 必 对 if 语 句 的 条 件 为 假 时 程 序 运 行 正 确 这 是 一 个 严 重 的 缺 点, 因 为 程 序 中 的

191 条 件 可 能 导 致 潜 在 的 错 误 例 如, 考 虑 下 面 计 算 A 的 绝 对 值 的 函 数 : int abs (x) int x; { if (x >= 0) x = 0 - x; return (x) } 这 个 程 序 显 然 是 错 误 的, 假 设 我 们 用 一 套 测 试 用 例 {x=0} 来 执 行 这 个 函 数 ( 也 就 是 这 个 测 试 集 只 有 一 个 测 试 用 例 ) 用 这 套 测 试 用 例 测 试 时 将 会 满 足 语 句 覆 盖 标 准, 但 是 不 能 发 现 错 误 一 个 更 普 遍 的 覆 盖 标 准 是 分 支 覆 盖, 它 要 求 测 试 时 控 制 流 图 中 的 每 一 条 边 至 少 被 穿 过 一 次 换 句 话 说, 测 试 时 分 支 覆 盖 要 求 程 序 的 每 个 判 定 至 少 取 真 值 和 假 值 各 一 次 基 于 分 支 覆 盖 的 测 试 通 常 被 称 为 分 支 测 试 100% 的 分 支 覆 盖 标 准 也 被 称 为 全 边 标 准 因 为 每 条 语 句 都 是 某 个 确 定 分 支 的 一 部 分, 因 此 分 支 覆 盖 意 味 着 语 句 覆 盖 在 前 面 的 例 子 中, 一 个 满 足 此 标 准 的 测 试 用 例 会 发 现 程 序 的 错 误 如 果 程 序 的 分 支 语 句 包 含 很 多 条 件 ( 比 如 由 多 个 布 尔 运 算 符 AND 和 OR 组 成 的 布 尔 表 达 式 ), 那 么 分 支 覆 盖 的 就 会 出 现 问 题 在 这 种 情 况 下, 不 需 要 覆 盖 所 有 的 条 件, 而 即 可 判 定 条 件 为 真 和 假 例 如, 考 虑 下 面 的 函 数, 检 查 输 入 的 数 据 项 的 有 效 性 如 果 它 在 0 到 100 之 间, 则 函 数 输 入 数 据 项 是 有 效 的 int check(x) int x; { if ((x >=) && (x <= 200)) check = True; else check = False; } 该 模 块 是 不 正 确 的, 因 为 它 是 检 查 X 是 否 小 于 等 于 200, 而 不 是 100( 或 许 这 是 程 序 员 的 一 个 打 字 失 误 ) 假 设 模 块 用 以 下 的 测 试 用 例 测 试 :{x = 5,x = -5} 分 支 覆 盖 标 准 将 满 足 此 模 块 然 而, 即 使 此 模 块 的 行 为 满 足 此 测 试 用 例 集 中 所 有 用 例, 也 就 是 说, 这 个 模 块 是 符 合 测 试 规 范 的, 错 误 也 不 能 被 发 现 即, 覆 盖 标 准 是 满 足 的, 但 错 误 没 有 被 检 测 出 现 这 样 的 情 况 是 因 为 这 个 判 定 为 真 为 假 都 依 赖 于 条 件 (X>= 0) 在 此 测 试 期 间 条 件 (X<= 200) 永 远 不 会 评 估 为 假, 因 此 在 这 种 情 况 下 不 能 发 现 错 误 通 过 要 求 所 有 条 件 取 值 为 真 和 假, 这 个 问 题 是 可 以 解 决 的 然 而, 一 个 判 定 语 句 可 能 得

192 不 到 真 假 值 的 情 况 会 出 现, 即 使 个 别 条 件 取 值 为 真 和 假 一 个 明 显 的 解 决 问 题 的 方 案 是, 要 求 判 定 / 条 件 覆 盖, 即 在 测 试 时 所 有 的 判 定 和 条 件 都 被 取 到 真 值 和 假 值 有 研 究 表 明, 分 支 测 试 会 遗 漏 很 多 错 误 这 是 因 为 一 些 错 误 与 分 支 组 合 有 关, 只 有 在 执 行 某 一 特 定 路 径 时 才 能 发 现 因 此, 一 个 更 广 泛 的 覆 盖 标 准 是 要 求 测 试 时 控 制 流 图 中 所 有 可 能 的 路 径 被 执 行 这 就 是 所 谓 的 路 径 覆 盖 标 准 或 全 路 径 标 准, 基 于 此 标 准 的 测 试 通 常 被 称 为 路 径 测 试 这 个 标 准 的 困 难 是, 包 含 循 环 的 程 序 可 能 有 一 个 极 大 的 路 径 数 此 外, 可 能 有 的 路 径 无 法 找 到 合 适 的 输 入 来 执 行 它 们 由 于 路 径 覆 盖 标 准 可 能 导 致 极 大 的 路 径 数, 我 们 必 须 努 力 找 出 介 于 分 支 覆 盖 和 路 径 覆 盖 之 间 的 标 准 这 些 方 法 的 基 本 目 标 是, 选 择 一 个 路 径 集 来 保 证 分 支 覆 盖 标 准, 同 时 尝 试 其 他 可 能 发 现 错 误 的 路 径 一 种 基 于 此 思 路 寻 找 路 径 集 的 方 法 是, 如 果 两 条 路 径 的 区 别 只 是 循 环 导 致 的 不 同 子 路 径, 那 么 可 以 认 为 两 条 路 径 是 相 同 的 当 然, 即 使 有 这 条 限 制, 路 径 数 还 是 非 常 大 的 必 须 指 出 的 是 这 些 标 准 中 没 有 一 个 能 发 现 程 序 中 的 所 有 错 误 例 如, 如 果 一 个 程 序 缺 少 用 来 检 查 特 殊 值 的 控 制 流 路 径 ( 如 指 针 为 空 和 除 数 为 零 ), 那 么 即 使 执 行 所 有 的 路 径 也 不 一 定 会 检 测 到 错 误 同 样 地, 如 果 测 试 集 满 足 全 路 径 标 准, 但 仅 包 含 条 件 集 合 中 的 一 部 分, 那 么 条 件 集 合 中 没 有 执 行 的 那 一 部 分 的 错 误 也 不 能 被 发 现 因 此, 即 使 所 讨 论 的 最 强 标 准 的 全 路 径 覆 盖, 也 不 能 保 证 发 现 所 有 错 误 测 试 用 例 生 成 及 工 具 支 持 一 旦 确 定 覆 盖 标 准, 按 照 标 准 来 测 试 必 须 解 决 两 个 问 题 首 先 确 定 是 否 有 满 足 标 准 的 测 试 用 例 集 合 ; 二 是 依 据 给 定 标 准 生 成 测 试 用 例 集 虽 然 在 理 论 上 是 可 以 手 工 完 成, 但 没 有 工 具 帮 助 下 决 定 测 试 用 例 集 是 否 满 足 标 准 是 一 项 繁 重 的 任 务 几 乎 所 有 的 结 构 测 试 技 术, 都 用 工 具 来 确 定 是 否 已 经 满 足 测 试 标 准 一 般 来 说, 工 具 将 提 供 关 于 测 试 标 准 是 否 充 分 满 足 的 反 馈 意 见 工 具 生 成 测 试 用 例 一 般 很 难 做 得 很 便 利, 这 是 因 为 问 题 的 性 质 ( 即 路 径 的 可 达 性 不 易 判 定 ), 一 个 完 全 满 足 标 准 的 自 动 测 试 用 例 生 成 工 具 是 不 存 在 的 因 此, 工 具 只 是 尽 可 能 的 帮 助 测 试 者 一 种 产 生 测 试 用 例 的 方 法 是 随 机 生 成 测 试 数 据, 直 到 测 试 标 准 被 满 足 ( 是 否 满 足 标 准 由 工 具 判 定 ) 这 样 很 多 测 试 用 例 将 执 行 相 同 的 路 径, 因 此 可 能 导 致 大 量 冗 余 因 为 测 试 用 例 生 成 不 能 完 全 自 动 化, 频 繁 的 测 试 用 例 选 择 一 般 是 通 过 测 试 人 员 手 工 进 行 操 作 的 方 式 是 从 一 个 初 始 的 测 试 用 例 集 开 始, 基 于 评 估 工 具 提 供 的 反 馈 选 择 更 多 的 测 试 用 例 测 试 用 例 评 估 工 具 可 以 告 诉 我 们 哪 些 路 径 需 要 执 行 或 哪 些 测 试 变 异 需 要 剔 除 这 些 信

193 息 可 用 于 进 一 步 选 择 测 试 用 例 即 使 在 工 具 的 帮 助 下, 选 择 测 试 用 例 也 不 是 一 个 简 单 的 过 程 对 一 些 尚 未 执 行 的 代 码 选 择 测 试 用 例 常 常 是 非 常 困 难 的 正 因 为 如 此, 以 及 一 些 其 他 的 原 因, 测 试 的 标 准 往 往 被 降 低 例 如, 原 本 要 求 的 100% 的 语 句 和 分 支 覆 盖, 而 目 标 是 可 接 受 的 一 个 较 高 的 比 率 ( 但 小 于 100%) 有 许 多 可 用 于 语 句 和 分 支 覆 盖 的 工 具 这 个 标 准 使 用 得 最 频 繁 对 于 不 同 编 程 语 言 都 有 可 用 的 商 业 和 免 费 的 工 具 这 些 工 具 通 常 也 给 予 更 高 层 次 的 覆 盖 数 据, 像 功 能 覆 盖, 方 法 覆 盖, 和 类 覆 盖 为 了 得 到 覆 盖 数 据, 程 序 在 测 试 过 程 中 必 须 被 密 切 监 测 以 便 数 据 的 收 集, 一 个 常 用 的 检 测 方 法 是 在 程 序 中 插 入 一 些 被 称 为 探 针 的 语 句 探 测 的 唯 一 目 的 是 在 测 试 时 生 成 有 关 程 序 执 行 的 可 以 用 来 计 算 覆 盖 的 数 据 基 于 此, 可 以 得 到 产 生 覆 盖 数 据 的 三 个 阶 段 : 1). 在 程 序 中 运 用 探 针 2). 用 测 试 用 例 执 行 程 序 3). 分 析 探 测 数 据 的 结 果 探 针 插 入 可 通 过 一 个 预 处 理 程 序 自 动 完 成, 程 序 的 执 行 是 由 测 试 者 完 成 的 测 试 后, 覆 盖 数 据 由 工 具 显 示 有 时 也 以 图 形 化 显 示 8.5 度 量 标 准 软 件 测 试 基 于 对 一 组 测 试 用 例 的 执 行 而 进 行, 因 此 软 件 的 交 付 质 量 实 质 上 依 靠 测 试 的 质 量, 当 然, 一 些 问 题 也 在 意 料 之 中 : 测 试 到 底 能 做 到 多 好? 测 试 完 成 后 软 件 质 量 和 可 靠 性 如 何? 测 试 研 究 中 提 出 的 主 要 度 量 目 标 都 是 为 了 尝 试 解 决 此 类 问 题 接 下 来, 我 们 将 讨 论 可 能 有 用 的 一 些 度 量 指 标 覆 盖 率 分 析 一 种 普 遍 用 于 评 估 测 试 完 整 性 的 方 法 是 用 覆 盖 率 作 为 度 量 指 标 我 们 已 经 讨 论 过 实 践 中 普 遍 使 用 的 覆 盖 率 度 量 语 句 覆 盖 和 分 支 覆 盖 使 用 覆 盖 率 指 标 来 评 估 测 试 质 量, 需 要 使 用 特 有 的 范 围 分 析 工 具, 对 测 试 覆 盖 以 及 未 覆 盖 的 内 容 进 行 分 析

194 通 常, 在 测 试 中 必 须 为 系 统 需 要 达 到 的 覆 盖 率 建 立 标 准 一 般 来 说, 覆 盖 率 指 标 要 求 对 于 单 元 测 试 较 高, 而 对 于 系 统 测 试 较 低 这 是 因 为 当 整 个 系 统 执 行 时 辨 认 对 代 码 的 覆 盖 会 更 困 难 通 常, 单 元 测 试 级 覆 盖 率 可 能 会 达 到 90%-100%( 需 要 记 住 的 是,100% 可 能 无 法 达 到, 因 为 永 远 有 代 码 无 法 访 问 到 ) 此 外, 除 了 程 序 结 构 的 覆 盖 率, 对 需 求 的 覆 盖 率 也 经 常 需 要 检 查 需 求 覆 盖 率 的 检 查 需 要 评 估 测 试 用 例 集 合 中, 是 否 包 含 足 够 多 并 赋 予 了 合 适 数 据 的 测 试 用 例 其 度 量 指 标 是 : 在 所 有 的 需 求 中, 对 任 何 需 求 或 其 子 需 求 / 条 件, 至 少 存 在 有 一 个 测 试 用 例 的 比 率 一 般 在 需 求 级, 会 要 求 测 试 达 到 全 覆 盖 可 靠 性 测 试 完 成 以 及 软 件 交 付 后, 开 发 被 认 为 已 经 结 束 了 从 量 化 的 意 义 而 言, 已 交 付 软 件 的 可 靠 性 度 量 变 得 容 易 由 于 软 件 的 可 靠 性 取 决 于 测 试 的 质 量, 所 以 通 过 可 靠 性, 我 们 可 以 判 断 测 试 的 质 量 另 外, 评 估 可 靠 性 可 以 判 断 测 试 工 作 是 否 足 够 也 就 是 说, 除 了 描 述 交 付 产 品 的 质 量, 可 靠 性 评 估 对 项 目 管 理 起 重 要 作 用 项 目 经 理 可 以 根 据 它 决 定 测 试 工 作 是 否 完 成, 何 时 可 以 停 止 测 试 可 靠 性 表 示 产 品 在 一 定 间 内, 无 故 障 运 行 的 概 率 大 多 数 可 靠 性 模 型 要 求 失 败 发 生 是 随 机 的 这 要 求 即 使 代 码 被 修 复 过, 其 随 机 性 假 设 依 然 成 立, 这 对 于 较 大 系 统 而 言 可 以 成 立, 但 对 小 程 序 而 言 不 成 立 因 此, 可 靠 性 建 模 对 于 大 型 系 统 而 言 更 有 意 义 用 一 个 随 机 数 X 表 示 系 统 的 寿 命 可 靠 性 是 系 统 在 时 间 t 内 没 发 生 故 障 的 概 率 即 R(t) = P(X > t). 一 个 系 统 的 可 靠 性, 也 可 以 指 定 为 平 均 故 障 间 隔 时 间 (MTTF) MTTF 代 表 系 统 的 预 期 寿 命 从 可 靠 性 的 功 能 来 看, 它 可 以 表 示 为 [80] MTTF= R(x)dx 0 可 靠 性 也 能 定 义 为 软 件 在 t 时 间 内 的 故 障 率 ( 即 单 位 时 间 内 的 故 障 数 ) 从 度 量 角 度 看, 如 果 缺 陷 被 记 录, 测 试 过 程 中 测 量 故 障 率 是 最 简 单 的 一 个 简 单 方 法 是 在 测 试 的 最 后 阶 段 计 算 每 周 或 每 天 失 败 的 次 数 而 失 败 次 数 近 似 缺 陷 个 数

195 的 记 录 ( 虽 然 错 误 和 缺 陷 不 同, 但 在 测 试 的 最 后 阶 段, 我 们 可 以 假 设 导 致 错 误 的 缺 陷 会 被 很 快 修 复, 因 此 缺 陷 不 会 导 致 重 复 性 错 误 ) 通 常, 在 测 试 开 始 阶 段, 随 着 缺 陷 越 来 越 多, 故 障 率 也 会 随 之 增 长, 在 测 试 中 期 某 处 达 到 顶 峰, 然 后 随 着 更 少 的 缺 陷 被 发 现, 故 障 率 慢 慢 下 降 对 于 给 定 的 测 试 集 合, 如 果 所 有 缺 陷 被 修 复, 那 么 在 末 端 就 应 该 几 乎 没 有 错 误 这 可 以 被 看 作 发 布 软 件 的 适 当 时 间 也 就 是 说, 一 个 发 布 的 标 准 可 能 是 : 在 发 布 时 持 续 一 段 零 故 障 时 间, 或 在 执 行 测 试 集 合 时 零 故 障 谈 及 每 天 每 周 的 错 误, 虽 然 失 败 率 的 变 动 轨 迹 给 出 了 一 个 可 靠 性 的 粗 略 计 算, 但 为 了 更 准 确 的 评 估 可 靠 性, 我 们 需 要 更 好 的 模 型 软 件 可 靠 性 建 模 是 一 项 复 杂 的 任 务, 需 要 严 格 的 模 型 和 复 杂 的 统 计 分 析 因 此, 很 多 人 为 软 件 可 靠 性 评 估 提 出 了 很 多 模 型, 以 及 [33,67] 给 出 的 对 众 多 模 型 的 综 述 应 当 提 及 的 是, 由 于 软 件 故 障 的 发 生 也 依 赖 于 运 行 环 境, 因 此 只 有 当 测 试 逼 真 地 模 仿 用 户 行 为, 测 试 故 障 率 才 能 反 应 用 户 使 用 软 件 后 的 真 实 可 靠 性 但 事 实 往 往 不 是 这 样, 尤 其 是 较 低 级 别 的 测 试 无 论 如 何, 较 高 级 别 的 测 试 需 要 努 力 模 仿 实 际 使 用 情 况 如 此, 那 么 可 以 对 可 靠 性 评 估 有 信 心 缺 陷 消 除 率 缺 陷 消 除 率 是 另 一 个 分 析 指 标, 不 过 这 只 在 软 件 发 布 后 的 某 个 时 间 内 被 确 定 这 项 分 析 的 目 的 是 评 估 测 试 过 程 的 效 率 而 非 针 对 特 定 目 标 的 测 试 质 量 这 项 分 析 将 对 未 来 的 测 试 过 程 十 分 有 用 通 常 在 软 件 交 付 后, 客 户 会 发 现 缺 陷, 而 这 些 缺 陷 不 得 不 被 修 复 ( 通 常 由 原 开 发 者 修 复, 这 常 是 合 同 中 的 一 部 分 ) 通 常 缺 陷 数 据 也 会 被 记 录 下 来 几 个 月 之 内, 大 部 分 缺 陷 会 被 客 户 发 现 ( 保 修 期 通 常 是 3-6 个 月 ) 缺 陷 的 总 数 目 一 旦 ( 或 者 跟 总 数 目 十 分 接 近 的 数 值 ) 确 定, 就 可 以 开 始 进 行 缺 陷 消 除 率 DRE(Defect Removal Efficency) 的 评 估 质 量 控 制 活 动 中 的 缺 陷 消 除 率 是, 错 误 数 量 在 质 量 控 制 执 行 后 减 少 的 比 率 [61] 举 例 来 说, 假 设 记 录 的 总 缺 陷 数 量 是 500 个, 其 中 20 个 在 交 付 后 被 发 现,200 个 在 系 统 测 试 期 间 被 发 现 由 于 开 始 测 试 时 存 在 的 缺 陷 总 数 目 是 220, 那 么 系 统 测 试 的 缺 陷 消 除 率 是 200/220( 约 90%) 整 个 质 量 控 制 过 程 的 缺 陷 消 除 效 率 为 480/500, 数 值 为 96% 附 带 提 一 下, 这 个 DRE 水 平 是 不 错 的, 同 时 也 是 许 多 商 业 组 织 能 达 到 的 显 而 易 见 的 是,DRE 是 一 个 能 被 应 用 于 任 何 缺 陷 消 除 活 动 的 一 般 概 念 举 例 来 说, 可 以 计 算 DRE 的 过 程 包 括 设 计 评 审 以 及 单 元 测 试 如 果 这 样 操 作, 那 么 除 了 记

196 录 缺 陷 发 生 的 时 间 地 点, 该 缺 陷 在 那 个 阶 段 被 引 入 的 也 被 分 析 并 记 录 下 来 了 有 了 这 些 信 息, 当 所 有 缺 陷 都 被 记 录 下 来 以 后, 质 量 控 制 活 动 的 DRE 就 能 被 确 定 了, 这 些 信 息 对 提 高 总 体 质 量 极 为 有 效 8.6 总 结 测 试 是 为 了 核 查 和 验 证 程 序 的 动 态 方 法, 使 用 精 细 设 计 的 测 试 用 例 以 发 现 系 统 行 为 测 试 用 例 是 一 个 输 入 集 输 入 条 件 以 及 输 出 条 件 测 试 集 是 一 组 在 一 起 执 行 的 为 了 测 试 一 些 特 殊 行 为 的 测 试 用 例 集 合 在 测 试 过 程 中, 一 但 发 现 故 障, 即 可 对 系 统 存 在 的 错 误 进 行 推 演 ; 进 而 对 活 动 进 行 分 解, 验 证 故 障 藏 身 之 所 并 修 正 它 们 测 试 的 目 的 是 增 加 对 软 件 正 确 性 的 信 心 因 此, 开 发 测 试 用 例 应 做 到, 对 系 统 中 任 何 一 个 缺 陷, 总 有 一 个 测 试 用 例 可 以 揭 示 要 确 保 上 述 目 标, 带 着 揭 示 缺 陷 的 目 的 仔 细 设 计 测 试 用 例 很 重 要 较 早 阶 段 核 查 方 法 的 局 限 性, 代 码 中 还 会 包 含 设 计 和 需 求 的 缺 陷 除 了 在 编 码 阶 段 引 入 的 错 误, 测 试 也 用 来 探 测 其 他 阶 段 的 错 误 因 此, 常 常 在 不 同 阶 段 进 行 不 同 级 别 的 测 试 以 发 现 错 误 一 些 普 通 级 别 的 测 试 是 单 元 测 试, 集 成 测 试, 系 统 测 试 和 验 收 测 试 要 测 试 一 个 软 件 产 品, 应 该 计 划 好 整 体 的 测 试, 并 且 也 要 在 计 划 中 标 定 每 个 单 元 的 验 证 ; 应 该 仔 细 设 计 测 试 用 例, 以 达 到 揭 示 错 误 的 目 的, 并 且 这 些 测 试 用 例 应 该 在 文 档 或 测 试 脚 本 中 指 定 出 来 设 计 测 试 用 例 的 两 个 方 法 : 黑 盒 测 试 和 白 盒 测 试 黑 盒 测 试 中, 不 必 考 虑 测 试 系 统 的 内 部 逻 辑, 并 且 测 试 用 例 是 由 规 约 或 者 需 求 决 定 的 等 价 类 划 分 边 界 值 分 析 和 因 果 图 表 是 选 择 黑 盒 测 试 用 例 的 方 法 基 于 状 态 的 测 试 是 另 一 种 方 法, 此 方 法 中 的 系 统 模 块 表 现 为 一 个 状 态 机, 通 过 迁 移 覆 盖 或 路 径 覆 盖 准 则 选 择 测 试 用 例 基 于 状 态 的 测 试 也 可 看 作 灰 盒 测 试, 因 为 它 要 求 除 需 求 外 更 多 的 信 息 在 白 盒 测 试 中, 基 于 被 测 试 程 序 的 内 部 逻 辑 设 计 测 试 用 例 白 盒 测 试 通 常 会 制 定 一 个 标 准, 但 测 试 者 需 要 自 行 决 定 选 择 哪 些 测 试 用 例 以 满 足 该 标 准 最 常 用 的 标 准 是 语 句 覆 盖 和 分 支 覆 盖 测 试 带 来 的 效 益 主 要 由 度 量 软 件 可 靠 性 进 行 如 果 记 录 了 测 试 中 发 现 的 缺 陷, 可 以 通 过 发 生 错 误 的 几 率 来 评 估 软 件 可 靠 性, 当 然 还 有 更 精 确 的 可 靠 性 评 估 模 型 测 试 达 到 的 覆 盖 率, 故 障 被 有 效 排 查 率, 是 其 他 两 个 效 益 指 标 自 我 评 价 练 习 1. 给 出 fault, error, 和 failure 定 义. 2. 假 设 你 要 测 试 一 个 有 两 个 输 入 参 数 的 程 序, 用 它 们 做 些 计 算, 然 后 操 作 一 个 全 局 的 表, 且 操 作 依 赖 于 表 状 态 那 么 对 于 这 个 程 序 而 言, 测 试 用 例 的 完 整 规 范 是 什 么? 3. 测 试 有 哪 些 级 别, 并 且 不 同 级 别 测 试 的 目 标 是 什 么?

197 4. 对 于 记 录 缺 陷 来 说, 每 一 个 缺 陷 被 定 义 为 一 个 Defect 类, 给 出 这 个 类 的 定 义 5. 假 设 一 个 软 件 有 三 个 输 入, 每 个 参 数 有 一 个 有 效 的 取 值 范 围 你 要 需 要 多 少 测 试 用 例 以 找 出 所 有 边 界 值? 6. 对 于 边 界 值 分 析, 假 设 产 生 测 试 用 例 的 策 略 是 考 虑 所 有 可 能 的 不 同 值 的 组 合, 那 么 对 于 一 个 有 三 个 输 入 X Y 和 Z 的 软 件 来 说, 测 试 用 例 是 什 么? 7. 假 设 一 个 软 件 有 五 个 相 互 独 立 的 不 同 配 置 变 量 如 果 它 们 中 三 个 是 二 进 制, 而 另 一 个 有 三 个 值, 则 成 对 测 试 需 要 多 少 测 试 用 例? 8. 有 一 个 接 收 硬 币 的 自 动 售 货 机, 当 它 收 到 两 个 硬 币 时, 就 给 出 一 瓶 苏 打 水 给 这 个 系 统 设 计 一 个 状 态 模 型, 然 后 以 此 标 准 构 造 测 试 用 例 9. 考 虑 一 个 简 单 的 文 本 格 式 的 问 题 有 一 个 包 括 空 格, 换 行 和 字 符 的 文 本, 这 段 文 本 的 格 式 要 严 格, 没 有 一 行 的 字 符 数 超 过 MAXPOS 个, 行 之 间 的 间 隙 是 换 行 符 或 者 空 格 符, 并 且 在 每 一 行 中 应 该 有 尽 可 能 多 的 单 词 下 面 的 这 段 程 序 是 为 这 个 文 本 的 格 式 而 写 的 : alarm := false; bufpos := 0; fill := 0; repeat inchar(c); if (c = BL) or (c = NL) or (c = EOF) then if bufpos!= 0 then begin if (fill + bufpos < MAXPOS) and (fill!= 0) then begin outchar(bl); fill := fill + 1; end else begin outchar(nl); fill := 0; end; for k:=1 to bufpos do outchar(buffer[k]); fill := fill + bufpos; bufpos := 0; end else if bufpos = MAXPOS then alarm := true else begin bufpos := bufpos + 1; buffer[bufpos] := c; end until alarm or (c = EOF); 对 此 程 序 : a) 用 黑 盒 测 试 法 选 择 测 试 用 例 集 使 用 尽 可 能 多 的 技 术, 以 及 错 误 猜 想 法 选 择 测 试 用 例

198 b) 选 择 可 以 提 供 100% 分 支 覆 盖 的 测 试 用 例 集 10. 假 设 测 试 已 进 行 7 天, 进 入 最 后 一 轮 了 在 这 个 测 试 中 所 有 的 单 元 都 被 执 行 而 没 有 修 复 缺 陷 在 测 试 中, 每 天 记 录 的 系 统 错 误 分 别 是 : 2, 0, 1, 2, 1, 1, 0 如 果 用 户 按 与 测 试 相 似 的 方 式 每 天 使 用 此 软 件 两 小 时, 那 么 对 用 户 来 说, 可 靠 性 是 多 少?

199 参 考 文 献 [1] F. B. Abreu and R. Carapuca. Candidate metrics for object-oriented software wihin a taxonomy framework. Journal of Systems and Software, 26(1):87 96, Jan [2] V. R. Basili. Tutorial on models and metrics for software management and engineering. IEEE Press, [3] V. R. Basili, L. Briand, and W. L. Melo. A validation of object-oriented design metrics as quality indicators. IEEE Transactions on Software Engineering, 22(10): , Oct [4] V. R. Basili and A. Turner. Iterative enhancement, a practical technique for software development. IEEE Transactions on Software Engineering, SE-1(4), Dec [5] V. R. Basili and D. M. Weiss. Evaluation of a software requirements document by analysis of change data. In 5th Int. Conf. on Software Engineering, pages IEEE, [6] L. Bass, P. Clements, and Rick Kazman. Software Architecture in Practice, Second Edition. Addison-Wesley Professional, [7] K. Beck. Extreme Programming Explained. Addison-Wesley, [8] K. Beck. Test Driven Development: by Example. Addison-Wesley Professional, [9] R.V. Binder. Testing Object-Oriented Systems Model, Patterns, and Tools. Addison-Wesley, [10] B. Boehm. Software engineering. IEEE Transactions on Computers, 25(12), Dec [11] B. Boehm. Tutorial: software risk management. IEEE Computer Society,1989. [12] B. W. Boehm. Software Engineering Economics. Prentice Hall, Englewood Cliffs, NJ, [13] B. W. Boehm. Software engineering economics. IEEE Transactions on Software Engineering, 10(1): , Jan [14] B. W. Boehm. Improving software productivity. IEEE Computer, pages 43 57, Sept [15] G. Booch. Object-Oriented Analysis and Design. The Benjamin/Cummings Publishing Company, [16] F. Brooks. The Mytical Man Month. Addison-Wesley, [17] N. Brown. Industrial-strength management strategies. IEEE Software, July [18] R.N. Charette. Software Engineering Risk Analysis and Management. Mc-Graw Hill, [19] R.N. Charette. Large-scale project management is risk management. IEEE Software, July [20] E. Chen. Program complexity and programmer productivity. IEEE Transactions on Software Engineering, SE-4: , May [21] S. R. Chidamber and C. F. Kemerer. A metrics suite for object-oriented design. IEEE Transactions on Software Engineering, 20(6): , June [22] T.S. Chow. Testing software design modeled by finite state machines. IEEE Transactions on Software Engineering, SE-4(3): , [23] P. Clements, F. Bachmann, L. Bass, D. Garlan, J. Ivers, R. Little, R. Nord, and J. Stafford. Documenting Software Architectures: Views and Beyond. Addison-Wesley, [24] A. Cockburn. Writing Effective Use Cases. Addison-Wesley, [25] D.M. Cohen, S.R. Dalal, M.L. Fredman, and G.C. Patton. The AETG system: An approach to testing based on combinatorial design. IEEE Transactions on Software Engineering, 23(7): , [26] S. D. Conte, H. E. Dunsmore, and V. Y. Shen. Software Engineering Metrics and Models. The

200 Benjamin/Cummings Publishing Company, [27] J. S. Davis. Identification of errors in software requirements through use of automated requirements tools. Information and Software Technology, 31(9): , Nov [28] T. DeMarco. Structured Analysis and System Specification. Yourdon Press, [29] L. Dobrica and E. Niemela. A survey on software architecture analysis methods. IEEE Transactions on Software Engineering, 28(7): , [30] J. Eder, G. Kappel, and M. Schrefl. Coupling and cohesion in objectoriented systems. Technical report, University of Klagenfurt, [31] M. E. Fagan. Design and code inspections to reduce errors in program development. IBM System Journal, (3): , [32] M. E. Fagan. Advances in software inspections. IEEE Transactions on Software Engineering, 12(7): , July [33] W. Farr. Software reliability modeling survey. In M. R. Lyu, editor, Software Reliability Engineering, pages McGraw Hill and IEEE Computer Society, [34] S. I. Feldman. Make a program for maintaining computer programs. Software Practice and Experience, 9(3): , March [35] M. Fowler. UML Distilled A Brief Guide to the Standard Object Modeling Language. Addison-Wesley Professional, [36] M. Fowler, K. Beck, J. Brant, W. Opdyke, and D. Roberts. Refactoring: Improving the Design of Existing Code. Addison-Wesley, [37] D. P. Freedman and G. M. Weinberg. Handbook of Walkthroughs, Inspections, and Technical Reviews Evaluating Programs, Projects, and Products. Dorset House, [38] E. Gamma, R. Helm, R. Johnson, and J. Vlissides. Design Patterns Elements of Reusable Object-Oriented Software. Addison-Wesley Professional,1995. [39] T. Gilb and D. Graham. Software Inspection. Addison-Wesley, [40] H. Gomma and D. B. H. Scott. Prototyping as a tool in the specification of user requirements. In Fifth Int. Conf. on Software Engineering, pages , [41] J. Goodenough and S. L. Gerhart. Towards a theory of test data selection. IEEE Transactions on Software Engineering, SE-1: , [42] S. E. Goodman and S. T. Hedetniemi. Introduction to the Design and Analysis of Algorithms. McGraw-Hill, [43] R. Grady and D. Caswell. Software Metrics: Establishing a Company-wide Program. Prentice Hall, [44] R. B. Grady and T. V. Slack. Key lessons learned in achieving widespread inspection use. IEEE Software, pages 48 57, July [45] E.M. Hall. Managing Risk: Methods for Software Development and Enhancement. Addison-Wesley, [46] M. Halstead. Elements of Software Science. Elsevier North-Holland, [47] W. Harrison, K. Magel, R. Kluczny, and A. DeKock. Applying software complexity metrics to program maintenance. IEEE Computer, pages 65 79, Sept [48] S. Henry and D. Kafura. Software structure metrics based on information flow. IEEE Transactions on Software Engineering, 7(5): , [49] S. Henry and D. Kafura. The evaluation of software systems structures using quantitative software metrics. Software Practice and Experience, 14(6): , June 1984.

201 [50] C. A. R. Hoare. An axiomatic basis for computer programming. Communications of the ACM, 12(3): , [51] IBM-Rational. Rational unified process best practices for software development teams. Technical report, IBMwebsite, [52] IEEE. IEEE standard glossary of software engineering terminology. Technical report, [53] IEEE. IEEE recommended practice for software requirements specifications. Technical report, [54] IEEE. IEEE recommended practice for architectural description of software-intensive systems. Technical Report , [55] International Standards Organization. Software engineering product quality. part 1: Quality model. Technical Report ISO9126-1, [56] I. Jacobson. Object-oriented Software Engineering A Use Case Driven Approach. Addison-Wesley, [57] P. Jalote. CMM in Practice Processes for Executing Software Projects at Infosys. Addison-Wesley, [58] P. Jalote. Software Project Management in Practice. Addison-Wesley, [59] P. Jalote, A. Palit, and P. Kurien. The timeboxing process model for iterative software development. In Advances in Computers, Vol. 62, pages Academic Press, [60] P. Jalote, A. Palit, P. Kurien, and V. T. Peethamber. Timeboxing: A process model for iterative software development. The Journal of Systems and Software, 70: [61] S.H. Kan. Metrics and Models in Software Quality Engineering. Addison-Wesley, [62] T. Korson and J. D. Gregor. Understanding object-oriented: A unifying paradigm. Communications of the ACM, 33(9):40 60, Sept [63] P. Kruchten. The Rational Unified Process. Addison-Wesley, [64] W. Lie and S. Henry. Object-oriented metrics that predict maintainability. Journal of Systems and Software, 23(2): , [65] B. Liskov. Data abstraction and hierarchy. SIGPLAN Notices, 23(5), May [66] B. Meyer. Object Oriented Software Construction. Prentice Hall, [67] J. D. Musa, A. Iannino, and K. Okumoto. Software Reliability Measurement, Prediction, Application. McGraw Hill, [68] G. Myers. The Art of Software Testing. Wiley-Interscience, New York,1979. [69] J. Offutt, S. Liu, A. Abdurazik, and P. Ammann. Generating test data from state-based specifications. The Journal of Software Testing, Verification, and Reliability, 13(1):25 53, March [70] M.S. Phadke. Planning efficient software tests. Crosstalk, Oct [71] L. H. Putnam. A general empirical solution to the macro software sizing and estimation problem. IEEE Transactions on Software Engineering, SE-4: , July [72] L. H. Putnam and W. Myers. Industrial Strength Software: Effective Management Using Measurement. IEEE Computer Society, [73] S. Rapps and E. J. Weyuker. Selecting software test data using data flow information. IEEE Transactions on Software Engineering, 11(4): , Apr [74] W. W. Royce. Managing the development of large software systems. In Proc. 9th Int. Conf. on Software Engineering (ICSE-9); originally in IEEE Wescon, Aug 1970, pages IEEE, 1987.

202 [75] SEI (Software Engineering Institute). The Capability Maturity Model: Guidelines for Improving the Software Process. Addison-Wesley, [76] M. Shaw and D. Garlan. Software Architecture: Perspectives on an Emerging Discipline. Prentice Hall, [77] M. D. Smith and D. J. Robson. Object oriented programming: The problems of validation. Proc. of 6th Int. IEEE Conference on Software Maintenance, pages , Nov [78] M. D. Smith and D. J. Robson. A framework for testing object-oriented programs. Journal of Object-Oriented Programming, pages 45 53, June [79] W. P. Stevens, G. J. Myers, and L. Constantine. Structured design. IBM Systems Journal, 13(2), [80] K. S. Trivedi. Probability and Statistics with Reliability, Queuing, and Computer Science Applications, Second Edition. Wiley-Interscience, [81] C. Watson and C. Felix. A method of programming measurement and estimation. IBM Systems Journal, 16(1), Jan [82] G. M. Weinberg and E. L. Schulman. Goals and performance in computer programming. Human Factors, 16(1):70 77, [83] E. F. Weller. Lessons learned from three years of inspection data. IEEE Software, pages 38 53, Sept [84] N. Wirth. Program development by stepwise refinement. Communications of the ACM, 14(4): , April [85] M. Woodward, M. Hennell, and D. Hedley. A measure of control flow complexity in program text. IEEE Transactions on Software Engineering, SE-5:45 50, Jan [86] R. T. Yeh and P. Zave. Specifying software requirements. Proceedings of the IEEE, 68(9): , Sept [87] B. H. Yin and J. W. Winchester. The establishment and use of measures to evaluate the quality of designs. Software Engineering Notes, 3:45 52, [88] E. Yourdon and L. Constantine. Structured Design. Prentice Hall, [89] W. M. Zage and D. M. Zage. Evaluating design metrics on large-scale software. IEEE Software, pages 75 81, July 1993.

203 对 照 表 A Acceptance testing 接 受 测 试 Activity diagram 活 动 图 Adaptive maintenance 自 适 应 维 护 Aggregation 聚 合 Agile 敏 捷 Algorithm design 算 法 设 计 Analysis 分 析 problem partitioning 问 题 分 解 projection 投 影 transition to specification 过 渡 到 规 范 化 Architecture 体 系 结 构, 见 软 件 体 系 结 构 Architecture description language 体 系 结 构 描 述 语 言 B Base class 基 类 Black-box testing 黑 盒 测 试 boundary value analysis 边 界 值 分 析 equivalence class partitioning 等 价 类 划 分 error guessing 错 误 猜 测 pairwise testing 成 对 测 试 state-based testing 基 于 状 态 的 测 试 Branch testing 分 支 测 试 Bug 程 序 中 的 缺 陷, 见 失 效 错 误 节 Build process 实 现 过 程 C Central transforms 中 央 变 换 Chief programmer team 主 程 序 员 组 Class 类 Class diagram 类 图 Client-server interaction of objects 对 象 以 客 户 端 - 服 务 器 模 式 交 互 Client-server style 客 户 端 - 服 务 器 风 格 COCOMO 构 造 性 成 本 模 型 distribution with phases 阶 段 分 步 effort multipliers 权 值 schedule distribution 时 间 表 分 步 schedule estimation 时 间 表 估 计 Code inspection 代 码 检 查 Coding 编 码

204 incremental coding 增 量 编 码 pair programming 结 对 编 程 process 过 程 refactoring 重 构 test-driven development 测 试 驱 动 开 发 top-down approach 自 顶 向 下 方 法 Coding standards 代 码 标 准 commenting and layout 注 释 和 布 局 conventions for statements 语 句 规 则 conventions on files 文 件 规 则 naming conventions 命 名 规 则 Cohesion 内 聚 Collaboration diagram 协 作 图 Combinatorial testing 组 合 测 试 Commenting 注 释 Communicating processes style 通 信 过 程 风 格 Complexity metrics 复 杂 度 度 量 指 标 Component and connector view 构 件 - 连 接 件 视 图, blackboard style 黑 板 风 格 client-server style 客 户 端 - 服 务 器 风 格 communicating processes style 通 信 过 程 风 格 components 构 件 connectors 连 接 件 n-tier structure n- 层 结 构 object-oriented style 面 向 对 象 peer-to-peer style 点 对 点 风 格 pipe-and-filter style 管 道 - 过 滤 器 风 格 publish-subscribe style 发 布 - 订 阅 风 格 shared-data style 共 享 数 据 风 格 Configuration management 配 置 管 理 Context diagram 环 境 图 Control flow graph 控 制 流 图 Control flow-based testing 基 于 控 制 流 的 测 试 criteria 标 准 Corrective maintenance 故 障 检 修 Correctness of design 设 计 正 确 性 Cost estimation 成 本 估 计 Coupling 耦 合 Coverage analysis 覆 盖 率 分 析 Cross referencing of requirements 需 求 交 叉 引 用 Cyclomatic complexity 圈 复 杂 性 D Data dictionary 数 据 字 典

205 Data flow diagram 数 据 流 图 conventions 约 定 leveled 标 准 Debugging 调 试 Defect 缺 陷 life cycle 生 命 周 期 logging and tracking 记 录 跟 踪 Defect injection and removal cycle 缺 陷 注 入 和 移 除 周 期 Defect removal efficiency 缺 陷 消 除 效 率 Defects 缺 陷 Depth of inheritance tree 继 承 树 深 度 Design 设 计 Design constraints 设 计 约 束 Design methodology 设 计 方 法 论 Design metrics 设 计 度 量 指 标 graph impurity 图 不 纯 度 identifying error-prone modules 识 别 易 出 错 模 块 information flow metrics 信 息 流 指 标 network metrics 网 络 指 标 Design principles 设 计 原 则 Design review 设 计 复 审 Design verification 设 计 验 证 Detailed design 详 细 设 计 algorithm design 算 法 设 计 state modeling of classes 类 的 状 态 建 模 stepwise refinement 渐 进 优 化 Development process 开 发 过 程 iterative development 迭 代 开 发 iterative enhancement model 迭 代 增 强 模 型 prototyping 原 型 timeboxing model 时 间 盒 模 型 waterfall model 瀑 布 模 型 Dynamic binding 动 态 绑 定 Dynamic modeling 动 态 建 模 E Efficiency 效 率 Effort 工 作 量 Effort estimation 工 作 量 估 计 Encapsulation 封 装 Equivalence class partitioning 等 价 类 划 分 ER diagrams ER 图 Error 错 误 Estimation 估 计

206 a bottom-up approach example 一 个 至 底 向 上 方 法 例 子 bottom-up approach 至 底 向 上 COCOMO 构 造 性 成 本 模 型 single variable models 单 变 量 模 型 size estimation 模 型 估 计 top-down estimation model 至 顶 向 下 模 型 External interface requirements 外 部 接 口 F Factoring 分 解 Failure 失 败 Fault 缺 陷 multi-mode 多 模 single-mode 单 模 Fault tolerance 容 错 Finite state automata 有 些 状 态 自 动 机 Function points 功 能 点 Functional modeling 功 能 建 模 Functional requirements 功 能 需 求 Functional testing 功 能 测 试 Functionality 功 能 H Halstead's measures Halstead 度 量 I Incremental development 增 量 开 发 refactoring 重 构 test-driven development 测 试 驱 动 开 发 Industrial-strength software 工 业 强 度 软 件 Inflow of a module 模 块 信 息 流 Information hiding 信 息 屏 蔽 Inheritance 继 承 base class 基 类 class hierarchy 类 继 承 层 次 multiple 多 种 的 nonstrict 不 受 限 strict 受 限 subclass 子 类 superclass 父 类 Inspection process 审 查 过 程 defect log 缺 陷 日 志 group review meeting 小 组 审 查 会 议 moderator 协 调 者

207 planning 规 划 self-preparation log 自 准 备 日 志 self-review 自 评 审 summary report 总 结 日 志 Integration testing 集 成 测 试 Interaction diagram 交 互 图 Internal documentation of programs 程 序 内 文 档 Iterative development 迭 代 开 发 iterative enhancement model 迭 代 增 强 模 型 timeboxing model 时 间 盒 模 型 Iterative enhancement model 迭 代 增 强 模 型 K Knot count Knot 计 数 L Leveled data flow diagram 标 准 数 据 流 图 Levels of testing 测 试 层 级 Life cycle of a defect 缺 陷 生 命 周 期 Liskov substitution principle 里 氏 替 换 原 则 Live variables 活 跃 变 量 Logic design of modules 模 块 的 逻 辑 设 计 M Maintainability 可 维 护 性 Maintenance 维 护 adaptive 自 适 应 corrective 修 改 costs 成 本 Manpower ramp-up in a project 项 目 中 人 力 资 源 产 能 提 升 Mean time to failure 平 均 失 效 时 间 Measurements 度 量 defects 缺 陷 effort 工 作 量 size 规 模 Metrics 度 量 指 标 complexity measures 复 杂 性 度 量 OOD 度 量 reliability 可 靠 性 size measures 代 码 长 度 度 量 span 跨 度 topological complexity 拓 扑 复 杂 性 度 量 Metrics for OOD 面 向 对 象 度 量 指 标 coupling between classes 类 间 耦 合

208 depth of inheritance tree 继 承 树 深 度 response for a class 类 的 响 应 weighted methods per class 类 按 方 法 加 权 Modularity 模 块 性 Module size 模 块 大 小 Monitoring and control 监 测 与 控 制 Most abstract inputs 最 抽 象 输 入 Most abstract outputs 最 抽 象 输 出 Multi-mode faults 多 点 失 效 Multiple inheritance 多 继 承 N Nesting of constructs 嵌 套 结 构 Nonfunctional requirements 非 功 能 需 求 O Object 对 象 behavior 行 为 interface 接 口 relationships between 关 联 state 状 态 Object modeling technique 对 象 建 模 技 术 Object-oriented analysis 面 向 对 象 分 析 Object-oriented design 面 向 对 象 设 计 aggregation 聚 合 association between objects 对 象 间 的 关 联 class hierarchy 类 层 次 defining internal classes and operations, 定 义 内 部 类 和 方 法 design pattern 设 计 模 式 functional modeling 功 能 建 模 identifying associations 识 别 关 联 identifying attributes 识 别 属 性 methodology 方 法 论 open-closed principle 开 闭 原 则 state modeling of classes 类 的 状 态 建 模 UML 统 一 建 模 语 言 Outflow of a module 模 块 输 出 流 P Pair programming 结 对 编 程 Path testing 路 径 测 试 Peak team size 最 大 团 队 规 模 Performance requirements 性 能 需 求

209 Polymorphism 多 态 Portability 可 移 植 Post-condition of programs 程 序 的 后 置 条 件 Postmortem analysis 事 后 分 析 Pre-condition of programs 程 序 的 前 置 条 件 Problem analysis 问 题 分 Problem partitioning 问 题 分 解 Process management 过 程 管 理 software engineering process group 软 件 工 程 过 程 小 组 Process model 过 程 模 型 Productivity 生 产 率 Programming practices 编 程 实 践 checking read return value 读 取 的 返 回 值 coding standards 编 码 标 准 control constructs 控 制 结 构 correlated parameters 相 关 参 数 importance of exceptions 异 常 的 重 要 性 robustness 健 壮 性 side effects 副 作 用 trusted data sources 可 信 的 数 据 源 use of user-defined types 用 户 定 义 类 型 Programming principles 编 程 原 则 Project management 项 目 管 理 cost estimation 成 本 估 计 monitoring and control 监 测 与 控 制 monitoring and control 监 测 与 控 制 planning 计 划 postmortem analysis 事 后 分 析 process 过 程 project monitoring 项 目 监 管 project tracking 项 目 跟 踪 quality 质 量 relationship with development process 开 发 过 程 关 系 risk management 风 险 管 理 scheduling 进 度 Project monitoring and control 项 目 监 管 与 控 制 activity-level monitoring 活 动 级 鉴 定 measurements 衡 量 milestone analysis 里 程 碑 status reports 状 态 报 告 Project planning 项 目 计 划 chief programmer team 主 要 程 序 员 组 effort estimation 工 作 量 估 计 manpower ramp-up 人 员 资 源 提 升

210 peak team size 最 大 团 队 规 模 quality plan 质 量 计 划 risk management 风 险 管 理 schedule 进 度 team structure 团 队 结 构 Project scheduling 项 目 进 度 detailed schedule 详 细 进 度 distribution among different phases, 不 同 阶 段 分 布 estimation 估 计 flexibility 灵 活 性 Microsoft project 微 软 project milestones 里 程 碑 overall schedule estimation 全 局 进 度 估 计 square root check 平 方 要 检 验 Project tracking 项 目 跟 踪 Projection 投 影 Prototyping 原 型 设 计 benefits 效 益 cost-cutting methods 成 本 削 减 方 法 process 过 程 throwaway 散 单 Psychology of testing 测 试 哲 学 Q Quality 质 量 defect injection and removal cycle 缺 陷 注 射 和 去 除 周 期 Quality and productivity, Q&P 质 量 和 生 产 率 Quality attributes 质 量 属 性 Quality plan 品 质 规 划 R Rational Unified Process 统 一 软 件 开 发 过 程 Rayleigh curve 瑞 利 曲 线 Refactoring 重 构 bad smells 坏 味 道 impact on design 对 设 计 的 影 响 risk mitigation 风 险 降 低 test suite 测 试 集 Regression testing 回 归 测 试 Reliability 可 靠 性 failure intensity 失 效 严 重 等 级 Requirement change 需 求 变 更 Requirement specification 需 求 规 范 components 组 件

211 design constraints 设 计 约 束 desired characteristics 所 需 要 的 特 征 document structure 文 档 结 构 external interface requirements 外 部 接 口 需 求 functional requirements 功 能 需 求 IEEE standards IEEE 标 准 performance requirements 性 能 需 求 specification language 规 范 语 言 use cases, see Use cases 用 例 Requirement validation 需 求 确 认 Requirements 需 求 Requirements review 需 求 审 核 Reviews 审 核 Risk management 风 险 管 理 a practical approach 一 个 实 际 的 方 法 an example 一 个 例 子 checklists of frequently occurring risks 多 发 风 险 清 单 risk 风 险 risk analysis 风 险 分 析 risk assessment 风 险 评 估 risk control 风 险 控 制 risk exposure 风 险 暴 露 risk identification 风 险 识 别 risk monitoring 风 险 监 控 risk prioritization 风 险 优 先 级 top 10 risks 十 大 风 险 Rule of composition 规 则 组 装 RUP Rational 统 一 过 程 S Scenario 场 景 Scenarios for modeling 需 要 建 模 的 场 景 Schedule 进 度 Security 安 全 Sequence diagram 顺 序 图 Single-entry single-exit constructs 单 入 口 单 出 口 结 构 Single-mode faults 单 模 失 效 Size 代 码 大 小 halstead's measure halstead' 度 量 lines of code (LOC) 代 码 行 数 Size estimation 代 码 大 小 估 计 Software 软 件 costs 开 销 industrial-strength software 工 业 强 度 软 件

212 productivity 生 产 率 Software architecture 软 件 体 系 结 构 allocation view 分 配 图 behaviour description 行 为 描 述 blackboard style 黑 板 风 格 combining views 组 合 视 图 Component and connector view 构 件 - 连 接 件 视 图 deployment view 配 置 图 element catalog 元 素 分 类 layered style 层 次 结 构 module view 模 块 视 图 primary view 主 视 图 quality attributes 质 量 属 性 relationship among views 视 图 间 关 系 relationship between elements 元 素 间 关 系 stakeholders 利 益 相 关 者 system context 系 统 上 下 文 views 视 图 Software architecture evaluation 体 系 结 构 评 估 Software configuration management 软 件 配 置 管 理, problem domain 问 题 域 Software engineering process group 软 件 工 程 过 程 组 Software inspections 软 件 审 查 Software process 软 件 过 程 components 构 件 development process 开 发 过 程 inspection process see Inspection process management 管 理 nonengineering processes 非 工 程 过 程 product engineering processes project management process see Project management 项 目 管 理 Software quality see Quality Software reliability see Reliability Software requirement process 39 Software requirement specification see Requirement specification Software requirements analysis see Analysis consistent 42 data flow diagram 59 definition 37 ER diagrams 61

213 error types 64 errors 64 impact on development cost 39 impact on quality 39 nonfunctional requirements 43 process 39 specification see Requirement specification use cases see Use cases validation see Requirement validation verifiable 42 Software size see Size Source code control 源 码 管 理 checkout 检 出 command types 命 令 类 型 conflicts 冲 突 version maintenance 版 本 维 护 Specification language 46 Standards compliance 45 State diagram 状 态 图 State-based testing 基 于 状 态 测 试 coverage criteria 覆 盖 率 准 则 state model 状 态 模 型 Statement coverage criterion 语 句 覆 盖 准 则 Structural testing 结 构 化 测 试 Structure chart 结 构 图 decision representation 133 iteration representation 133 Structured design methodology 结 构 化 设 计 方 法 论 central transforms 中 心 转 换 factoring 分 解 first-level factoring 第 一 层 分 解 steps 步 骤 Structured programming 结 构 化 编 程 System design 系 统 设 计 correctness 正 确 性 modularity 模 块 化 object-oriented design see Objectoriented design verification 验 证 System testing 系 统 测 试 Team structure 89 Test case design 测 试 用 例 设 计 Test case generation 测 试 用 例 生 成

214 Test case review 测 试 用 例 评 审 Test case specification 测 试 用 例 规 范 Test plan 测 试 计 划 Testing 测 试 black-box 黑 盒 deliverables 交 付 品 functional 黑 盒 测 试 integration testing 集 成 测 试 of object-oriented programs 面 向 对 象 程 序 的 集 成 测 试 regression 回 归 structural testing 结 构 化 测 试 test case execution and analysis 测 试 用 例 执 行 和 分 析 test case review 测 试 用 例 评 审 test case specification 测 试 用 例 规 范 test plan 测 试 计 划 white-box testing 白 盒 测 试 Testing process 测 试 过 程 Timeboxing model a time box 25 execution with three-stage time box, 26 iteration completion times 26 pipelined execution of iterations 25 stages in a time box 25 teams 26 teamwise activity 26 Tool support for testing 测 试 支 持 工 具 Top-down approach to coding 自 顶 向 下 编 码 UML 统 一 建 模 语 言 class diagram 类 图 class hierarchy representation 类 层 次 展 现 collaboration diagram 协 作 图 components subsystems packages, 构 件 子 系 统 包 interaction diagrams 交 互 图 part-whole relationship representation, 151 sequence diagram 顺 序 图 stereotype 衍 型 subtype 子 类 型 tagged values 标 记 值 use case diagrams 用 例 图 Usability 可 用 性

215 Use cases 用 例 actor 49 development 56 examples extension scenario 50 failure conditions 56 failure handling 56 level of detail 57 levels 56 main success scenario precondition 52 primary actor 49 refinement 精 化 scope 54 summary-level 55 use case diagram writing them 57 User-defined types 用 户 定 义 类 型 Verification 验 证 inspection 审 查 unit testing 单 元 测 试 Waterfall model 瀑 布 模 型 impact of linear ordering of phases 14 limitations 16 outputs 16 stages 14 Weinberg experiment 温 伯 格 实 验 White-box testing 白 盒 测 试 branch testing 分 支 测 试 statement coverage criterion 语 句 覆 盖 标 准 Work products 15 XP Extreme programming 极 限 编 程

18 UML UP 2.2 UP Software Engineering Process S E P w h o w h a t when h o w 2-2 S E P 2-2 Unified Software Development Process U S D P U M L S E P UP

18 UML UP 2.2 UP Software Engineering Process S E P w h o w h a t when h o w 2-2 S E P 2-2 Unified Software Development Process U S D P U M L S E P UP 2 2.1 U P U U P 2. 4 U P R U P Rational Unified Process 2. 5 U P U P O O [Jacobson 1] U P [Kroll 1] [Kruchten 2] [Ambler 1] [Ambler 2] [Ambler 3] R U P 2.3 UP 2.2 U P? U P R U P 2.4 UP R U P 2.5 U P 2.6

More information

Wy159.mps

Wy159.mps 第 章 系 统 开 发 方 法 管 理 信 息 系 统 开 发 的 效 率 质 量 成 本 及 用 户 的 满 意 程 度, 除 了 管 理 技 术 等 因 素 外, 还 与 系 统 开 发 方 法 密 切 相 关 管 理 信 息 系 统 从 产 生 到 现 在 已 经 发 展 了 许 多 开 发 方 法, 这 些 开 发 方 法 各 自 遵 循 一 定 的 基 本 思 想, 适 用 于 一 定 的

More information

Microsoft PowerPoint - DFD.PPT

Microsoft PowerPoint - DFD.PPT Data Flow Diagram 資 科 系 林 偉 川 DFD 一 般 的 軟 體, 最 基 本 上 可 分 為 輸 入 處 理 輸 出 三 部 份 DFD 圖 的 精 神 就 在 於 資 料 流 程 的 規 劃 各 處 理 單 元 的 動 作 並 且 可 以 作 更 深 一 步 的 切 分 2 1 DFD 之 定 義 DFD 圖 有 幾 個 符 號 : 外 部 儲 存 體 (External

More information

識 度 立 樓 不 立 不 參

識 度 立 樓 不 立 不 參 年 度 錄 樓 例 ç 林 良 年 識 度 立 樓 不 立 不 參 錄 錄 六 論 參 樓 年 來 了 不 了 樓 狀 不 狀 狀 狀 易 易 良 類 樓 樓 樓 狀 不 狀 不 了 見 惡 不 福 利 兩 類 不 不 不 例 數 例 數 不 不 度 樓 樓 年 例 來 類 度 年 樓 樓 樓 類 例 林 力 旅 館 旅 館 旅 館 宅 宅 類 樓 林 數 兩 六 列 利 率 林 力 利 率 力 利

More information

2015年第五届“华为杯”全国大学生智能设计竞赛通知

2015年第五届“华为杯”全国大学生智能设计竞赛通知 2016 年 第 六 届 华 为 杯 中 国 大 学 生 智 能 设 计 竞 赛 通 知 各 高 校 教 务 处 相 关 院 系 : 2016 年 第 六 届 华 为 杯 中 国 大 学 生 智 能 设 计 竞 赛 ( 以 下 简 称 竞 赛 ), 将 于 今 年 1 月 至 8 月 在 电 子 科 技 大 学 举 办 竞 赛 旨 在 展 示 和 锻 炼 大 学 生 采 用 智 能 科 学 技 术

More information

Microsoft Word - 檳榔A計畫

Microsoft Word - 檳榔A計畫 單元名稱 檳榔 A 計畫 教學節數 5 節 適用年級 三年級 一 課程架構圖 保健停看聽 省錢高手 愛我家鄉 己利利人 檳 榔 A 計 畫 二 設計理念與構想 檳榔在我們成長環境中是隨手可得的 食物 但是多少人介意它是 一級 致癌物 大部分嚼食找抱著僥倖的心理 認為應該沒有那麼嚴重 以致於 讓檳榔逐漸形成戕害國民健康的大敵 為了讓純白如紙的小學生 及早認清 檳榔對健康的危害 所以藉著教學的活動 來建立孩子正確的觀念

More information

2015年第五届“华为杯”全国大学生智能设计竞赛通知

2015年第五届“华为杯”全国大学生智能设计竞赛通知 2015 年 第 五 届 华 为 杯 中 国 大 学 生 智 能 设 计 竞 赛 通 知 各 高 校 : 为 了 普 及 智 能 科 学 知 识, 展 示 和 锻 炼 大 学 生 采 用 智 能 科 学 技 术 不 理 论 解 决 问 题 的 能 力, 提 高 大 学 生 的 综 合 设 计 能 力, 培 养 大 学 生 的 创 新 意 识 团 队 合 作 精 神, 促 进 高 等 学 校 智 能

More information

一 专 业 名 称 专 业 名 称 : 会 计 二 入 学 要 求 与 基 本 学 制 入 学 要 求 : 初 中 毕 业 生 基 本 学 制 : 三 年 ; 其 中 前 二 年 为 在 校 学 习 时 间, 最 后 一 年 为 企 业 实 习 时 间 层 次 : 中 职 三 培 养 目 标 本 专

一 专 业 名 称 专 业 名 称 : 会 计 二 入 学 要 求 与 基 本 学 制 入 学 要 求 : 初 中 毕 业 生 基 本 学 制 : 三 年 ; 其 中 前 二 年 为 在 校 学 习 时 间, 最 后 一 年 为 企 业 实 习 时 间 层 次 : 中 职 三 培 养 目 标 本 专 安 徽 省 滁 州 市 明 光 职 业 高 级 中 学 会 计 专 业 人 才 培 养 方 案 一 专 业 名 称 专 业 名 称 : 会 计 二 入 学 要 求 与 基 本 学 制 入 学 要 求 : 初 中 毕 业 生 基 本 学 制 : 三 年 ; 其 中 前 二 年 为 在 校 学 习 时 间, 最 后 一 年 为 企 业 实 习 时 间 层 次 : 中 职 三 培 养 目 标 本 专 业

More information

國立台灣師範大學

國立台灣師範大學 誰 來 救 救 我?-- 權 利 救 濟 壹 研 究 摘 要 : 本 研 究 主 要 是 想 了 解 透 過 創 新 教 學 活 動 的 設 計, 能 否 有 效 的 在 三 節 課 內 將 權 利 救 濟 的 基 本 律 概 念, 解 釋 清 楚 並 且 讓 學 生 能 在 生 活 中 印 證 因 此, 教 學 過 程 除 了 概 念 的 教 學 外, 必 須 準 備 社 會 時 事 案 例, 讓

More information

1811 1884 1847 1860 1862 1871 1875 1823 1884 1851 1876 1878 1879 1880 1884 20 1858 1861 1864 1862

1811 1884 1847 1860 1862 1871 1875 1823 1884 1851 1876 1878 1879 1880 1884 20 1858 1861 1864 1862 1768 1842 1788 1842 1766 1848 1805 1864 1853 1862 1811 1884 1847 1860 1862 1871 1875 1823 1884 1851 1876 1878 1879 1880 1884 20 1858 1861 1864 1862 1833 1884 1855 1861 500 1862 1864 1868 1875 1829 1888

More information

Microsoft Word - 雲林縣學校轉型優質計畫.docx

Microsoft Word - 雲林縣學校轉型優質計畫.docx 雲 林 縣 學 校 轉 型 優 質 計 畫 97.06.10 府 教 國 字 第 0970403986 號 函 102.05.23 府 教 國 字 第 1025413652 號 函 修 訂 壹 依 據 : 一 教 育 基 本 法 第 13 條 二 雲 林 縣 政 府 97.06.10 府 教 國 字 第 0970403986 號 函 頒 雲 林 縣 學 校 轉 型 優 質 實 施 計 畫 貳 目 標

More information

慈宗彌勒淨土法門的殊勝

慈宗彌勒淨土法門的殊勝 法 明 寺. 台 灣 慈 宗 學 會 印 贈 慈 宗 彌 勒 淨 土 法 門 的 殊 勝 2 目 錄 目 錄 作 者 簡 介 5 自 序 7 彌 勒 淨 土 法 門 初 探 11 彌 勒 淨 土 略 說 31 太 虛 大 師 的 彌 勒 淨 土 思 想 簡 說 -- 慈 宗 三 要 大 意 51 附 錄 印 度 佛 教 瑜 伽 學 之 綱 要 顯 揚 聖 教 論 結 構 試 析 79 太 虛 大 師

More information

5.1施工企业会计核算办法

5.1施工企业会计核算办法 法 规 标 题 : 施 工 企 业 会 计 核 算 办 法 文 号 : 财 会 [2003]27 号 发 文 单 位 : 财 政 部 发 文 日 期 :2003 年 9 月 25 日 实 施 日 期 :2004 年 1 月 1 日 财 政 部 关 于 印 发 施 工 企 业 会 计 核 算 办 法 的 通 知 财 会 (2003)27 号 国 务 院 有 关 部 委, 各 省 自 治 区 直 辖 市

More information

<4D6963726F736F667420576F7264202D20A2B0A1D0A2B0A1D0A2B0A240A6CBAA4FC554BC4DB7ABA240A7D6AA4FBD6DB2DF2E646F63>

<4D6963726F736F667420576F7264202D20A2B0A1D0A2B0A1D0A2B0A240A6CBAA4FC554BC4DB7ABA240A7D6AA4FBD6DB2DF2E646F63> 節 拍 與 文 字 的 遊 戲 \ 板 眼 旋 律 板 眼 : 傳 統 術 語, 即 節 拍 之 意 以 強 弱 區 別, 強 拍 叫 板, 弱 拍 叫 眼 在 板 書 類 的 曲 種 中, 以 前 半 拍 與 後 半 拍 組 成 一 拍, 結 合 文 字 數 唱, 形 成 各 種 板 式 為 了 學 習 的 方 便, 我 們 將 前 半 拍 叫 板, 後 半 拍 叫 眼 數 唱 : 傳 統 術 語,

More information

<4D6963726F736F667420576F7264202D2031303030353235B77CC4B3ACF6BFFD2DB0D3B77EC2B2B3F8C2BEBAD82E646F63>

<4D6963726F736F667420576F7264202D2031303030353235B77CC4B3ACF6BFFD2DB0D3B77EC2B2B3F8C2BEBAD82E646F63> 全 國 高 級 中 等 學 校 100 學 年 度 商 業 類 科 學 生 技 藝 競 賽 商 業 簡 報 職 種 競 賽 規 則 修 訂 會 議 紀 錄 壹 時 間 : 中 華 民 國 100 年 05 日 25 日 ( 星 期 三 ) 下 午 2 時 整 貳 地 點 : 豐 原 高 商 圖 書 館 一 樓 參 主 席 : 潘 教 授 偉 華 肆 出 席 單 位 及 人 員 :( 如 簽 到 表

More information

kidney GCT

kidney GCT 糖尿病肾病轻度症状 夜尿增多 如果糖尿病病人发现自己的尿液出现异常 如尿液泡沫过多 颜 色浑浊 应立刻到医院检查肾脏是否出现了问题 正常情况下 尿液泡沫在便池一会儿就会消失 颜色在喝水少的情况下 才有 发黄 浑浊的现象 假如不是这样 很有可能是肾脏疾病的早期 症状 糖尿病首先伤害的就是血管 而肾脏内血管密集 所以从 病人患上糖尿病的那一天开始 肾脏就被损及了 糖尿病患者都 有潜在的肾病 只不过有的人患病时间长

More information

Microsoft Word - 广州市番禺区2014年新型农村合作医疗管理办法实施细则.doc

Microsoft Word - 广州市番禺区2014年新型农村合作医疗管理办法实施细则.doc 广 州 市 番 禺 区 人 力 资 源 和 社 会 保 障 局 文 件 番 人 社 2014 2 号 广 州 市 番 禺 区 人 力 资 源 和 社 会 保 障 局 关 于 印 发 2014 年 新 型 农 村 合 作 医 疗 实 施 细 则 的 通 知 各 有 关 单 位 : 现 将 广 州 市 番 禺 区 2014 年 新 型 农 村 合 作 医 疗 实 施 细 则 印 发 给 你 们, 请 认

More information

<4D6963726F736F667420576F7264202D20C9FABBEED6D0C0B4B5C4BDA1BFB5CAD6B2E1A3A8D6D0A3A92E646F63>

<4D6963726F736F667420576F7264202D20C9FABBEED6D0C0B4B5C4BDA1BFB5CAD6B2E1A3A8D6D0A3A92E646F63> 生 活 中 来 的 健 康 手 册 ( 中 ) 黄 宁 斌 编 著 中 国 少 年 儿 童 出 版 社 书 名 生活中来的健康手册 中 作 者 黄宁斌 出 版 社 中国少年儿童出版社 发行许可证号 2006 第025396号 出版日期 2006年2月第1版 ISBN 7 5007 3317 4 G 2509 定 价 5 00元 目 录 第 二 篇 药 膳 与 食 疗 篇 一 药 膳 与 食 疗 原

More information

電機工程系認可證照清單 2011/7/1

電機工程系認可證照清單                  2011/7/1 南 台 科 技 大 學 電 機 工 程 系 專 業 證 照 課 程 實 施 要 點 96 年 10 月 05 日 系 務 會 議 通 過 100 年 06 月 30 日 系 務 會 議 修 正 通 過 101 年 06 月 21 日 系 務 會 議 修 正 通 過 一 本 系 為 提 升 學 生 的 專 業 技 能, 特 訂 定 本 辦 法 二 實 施 對 象 : 本 系 日 間 部 96 學 年

More information

信工学生工作简报 第四期.doc

信工学生工作简报 第四期.doc 首 都 师 范 大 学 信 息 工 程 学 院 学 生 工 作 简 报 信 工 学 院 学 生 工 作 办 公 室 2011 年 6 月 第 四 期 内 容 提 要 校 党 委 副 书 记 缪 劲 翔 到 信 工 学 院 调 研 信 工 学 院 举 办 党 史 知 识 竞 赛 纪 念 建 党 九 十 周 年 信 工 学 院 举 办 第 九 期 分 党 校 培 训 41 名 学 员 顺 利 结 业 信

More information

支撑材料4.4.doc

支撑材料4.4.doc 1. 2. ( ) 3. 4. 5. 6. 7. 8. 9. 10. 1.2.10 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. () 25. 4.3.12 26. 2.3.21 27. 1.2.22 28. ( 201465 ) ( 2010122 ) ( 201489 ) 1.

More information

2009杭州市小学地方课程

2009杭州市小学地方课程 2013 年 杭 州 市 校 本 课 程 建 设 与 实 施 研 讨 会 暨 江 干 区 精 品 校 本 课 程 推 介 会 资 料 主 办 : 杭 州 市 普 通 教 育 研 究 室 承 办 : 江 干 区 教 育 局 协 办 : 江 干 区 教 师 进 修 学 校 杭 州 师 范 大 学 附 属 丁 兰 实 验 学 校 2013 年 5 月 目 录 1. 会 议 日 程 安 排 3 2. 课 堂

More information

???h?????????W??????

???h?????????W?????? 主 題 : 愛 是 什 麼 樣 子 ㄧ 教 學 主 題 : 愛 是 什 麼 樣 子 設 計 緣 起 : 我 目 前 任 教 於 國 小 ㄧ 年 級, 班 上 有 ㄧ 位 多 重 障 礙 的 學 生, 同 儕 因 老 師 的 鼓 勵 與 指 導, 表 面 上 都 能 接 納 身 障 生, 但 因 該 名 身 障 生 表 達 友 誼 的 方 式 不 太 對, 常 會 故 意 把 口 水 滴 到 同 學

More information

天天星期三

天天星期三 康 軒 版 二 上 第 三 單 元 第 九 課 等 待 兔 子 的 農 夫 單 元 名 稱 第 三 單 元 好 聽 的 故 事 課 名 第 九 課 等 兔 子 的 農 夫 教 材 來 源 康 軒 版 第 三 冊 二 上 教 學 時 間 六 節 設 計 者 北 一 區 幸 曼 玲 教 授 團 隊 臺 北 市 西 園 國 小 主 任 林 淑 華 臺 北 市 濱 江 國 小 教 師 廖 瑞 珍 1. 背

More information

任 务 单 一 ~2: 文 具 书 本 摆 整 齐, 争 得 自 理 星 争 星 要 求 : 文 具 用 品 摆 放 好, 书 本 叠 叠 放 整 齐 探 秘 任 务 一 ~2: 文 具 书 本 摆 整 齐, 争 得 自 理 星 任 务 1: 跟 小 辅 导 员 一 起 参 观 高 年 级 的 教

任 务 单 一 ~2: 文 具 书 本 摆 整 齐, 争 得 自 理 星 争 星 要 求 : 文 具 用 品 摆 放 好, 书 本 叠 叠 放 整 齐 探 秘 任 务 一 ~2: 文 具 书 本 摆 整 齐, 争 得 自 理 星 任 务 1: 跟 小 辅 导 员 一 起 参 观 高 年 级 的 教 少 先 队 活 动 课 儿 童 团 团 前 教 育 之 一 苗 苗 章 启 动 课 学 校 : 闵 行 区 实 验 小 学 ( 景 城 校 区 ) 年 级 : 一 年 级 辅 导 员 : 胡 波 活 动 目 标 1 通 过 完 成 校 园 探 秘 行 动 一 级 任 务, 在 做 一 做 玩 一 玩 的 游 戏 闯 关 过 程 中 获 得 青 松 星 动 手 星 爱 心 星 五 宝 星 2 通 过

More information

考 試 日 期 :2016/04/24 教 室 名 稱 :602 電 腦 教 室 考 試 時 間 :09:50 25 26 27 28 29 30 31 32 33 34 35 36 二 技 企 管 一 胡 宗 兒 中 文 輸 入 四 技 企 四 甲 林 姿 瑄 中 文 輸 入 二 技 企 管 一

考 試 日 期 :2016/04/24 教 室 名 稱 :602 電 腦 教 室 考 試 時 間 :09:50 25 26 27 28 29 30 31 32 33 34 35 36 二 技 企 管 一 胡 宗 兒 中 文 輸 入 四 技 企 四 甲 林 姿 瑄 中 文 輸 入 二 技 企 管 一 考 試 日 期 :2016/04/24 教 室 名 稱 :602 電 腦 教 室 考 試 時 間 :09:50 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 五 專 企 二 乙 胡 哲 維 中 文 輸 入 五 專 企 二 乙 周 林 昜 中 文 輸 入 五 專 企 二 乙 賴 昱 樺 中 文 輸 入 五 專 企 二 乙

More information

Untitiled

Untitiled 地 方 建 设 篇 南 宁 市 一 城 市 规 划 与 建 设 [ 规 划 管 理 ]2007 年 度, 共 召 开 业 务 审 查 会 89 次, 共 组 织 各 种 方 案 评 审 会 466 次 共 办 理 建 设 工 程 审 批 业 务 7088 项, 办 理 新 开 工 面 积 993.6 万 平 方 米 ; 共 核 发 建 设 用 地 规 划 许 可 证 292 份, 审 批 建 设

More information

577 13681911 442 1019 1 120 107 155 60 1 4 8 1 4 209 1882 3 8 8 4 1 1987 154 18 1937 1983 1962 1978 1931 1933 1937 1979 1940 1941 1947 1948 1982 1985 1981 1984 6 20 1951 1981 5 IBM

More information

untitled

untitled 1 2,835,000,152.41 2,595,958,921.28 9.21 3,803,706,275.25 3,636,910,789.29 4.59 7,422,162,377.11 6,976,568,723.61 6.39 2,978,399,071.95 2,937,950,953.08 1.38 4.5127 4.4514 1.38 4.2429 4.2437-0.02 106,431,093.07

More information

資訊系統開發模式

資訊系統開發模式 第 二 章 資 訊 系 統 開 發 模 式 學 習 目 標 第 一 節 導 論 第 二 節 編 碼 與 修 正 模 式 第 三 節 階 段 模 式 第 四 節 瀑 布 模 式 第 五 節 漸 增 模 式 第 六 節 雛 型 模 式 第 七 節 螺 旋 模 式 第 八 節 同 步 模 式 第 九 節 RUP 模 式 第 十 節 結 論 內 容 大 綱 學 習 目 標 詳 讀 本 章, 你 至 少 能

More information

untitled

untitled Windows 2000 2500 1000 6500 1 , 2 , 3 3.DFD DFD 1. 2. 4 4. 5 5. 6. 6 10.1 10.1 1 1-4 0.5k 1 1-6 1-2k 2-5 1-2 5-20k 5-20 2-3 50-100k 100-1000 4-5 1M 2000-5000 5-10 1-10M 7 PMPYPD LOCPM LOC PM Halstead n1

More information

国 家 图 书 馆 年 鉴 0 重 点 文 化 工 程 一 中 华 古 籍 保 护 计 划 0 年, 国 家 图 书 馆 ( 国 家 古 籍 保 护 中 心 ) 根 据 文 化 部 要 求, 围 绕 习 近 平 总 书 记 关 于 弘 扬 中 华 优 秀 传 统 文 化 系 列 讲 话 精 神, 对

国 家 图 书 馆 年 鉴 0 重 点 文 化 工 程 一 中 华 古 籍 保 护 计 划 0 年, 国 家 图 书 馆 ( 国 家 古 籍 保 护 中 心 ) 根 据 文 化 部 要 求, 围 绕 习 近 平 总 书 记 关 于 弘 扬 中 华 优 秀 传 统 文 化 系 列 讲 话 精 神, 对 重点文化工程 中华古籍保护计划 数字图书馆推广工程 民国时期文献保护计划 年度掠影 国 家 图 书 馆 年 鉴 0 重 点 文 化 工 程 一 中 华 古 籍 保 护 计 划 0 年, 国 家 图 书 馆 ( 国 家 古 籍 保 护 中 心 ) 根 据 文 化 部 要 求, 围 绕 习 近 平 总 书 记 关 于 弘 扬 中 华 优 秀 传 统 文 化 系 列 讲 话 精 神, 对 中 华 古 籍

More information

银川一职服装设计与工艺专业教学计划

银川一职服装设计与工艺专业教学计划 银 川 职 业 技 术 学 院 电 子 工 程 部 现 代 物 流 专 业 2013 级 实 施 性 教 学 计 划 ( 专 业 代 码 :121900) 一 招 生 对 象 与 学 制 招 生 对 象 : 应 届 初 中 毕 业 生 学 制 : 全 日 制 3 年 (2+1, 第 五 六 学 期 顶 岗 实 习 ) 采 用 2+1 人 才 培 养 模 式, 即 两 年 在 校 学 习, 第 三 年

More information

ICS 01.040.35;35.040 L70 中 华 人 民 共 和 国 国 家 标 准 GB/T AAAA AAAA 智 能 终 端 软 件 平 台 测 试 规 范 操 作 系 统 Test specification for smart terminal software platform -- Operating system ( 征 求 意 见 稿 ) 在 提 交 反 馈 意 见 时,

More information

( 二 ) 拓 展 岗 位 ( 群 ) 1. 餐 厅 服 务 岗 位 群 在 大 中 型 餐 饮 企 业 星 级 饭 店 主 要 从 事 餐 饮 服 务 的 有 关 工 作, 如 服 务 员 点 菜 师 茶 艺 师 咖 啡 师 调 酒 师 等 2. 食 品 加 工 岗 位 群 主 要 从 事 餐 饮

( 二 ) 拓 展 岗 位 ( 群 ) 1. 餐 厅 服 务 岗 位 群 在 大 中 型 餐 饮 企 业 星 级 饭 店 主 要 从 事 餐 饮 服 务 的 有 关 工 作, 如 服 务 员 点 菜 师 茶 艺 师 咖 啡 师 调 酒 师 等 2. 食 品 加 工 岗 位 群 主 要 从 事 餐 饮 广 东 食 品 药 品 职 业 学 院 餐 饮 管 理 2016 级 人 才 培 养 方 案 专 业 名 称 : 餐 饮 管 理 专 业 代 码 :640201 招 生 对 象 : 高 中 毕 业 生 或 三 校 生 ( 职 高 中 专 技 校 毕 业 生 ) 学 制 : 三 年 全 日 制 高 职 学 历 : 专 科 第 一 部 分 主 体 部 分 一 培 养 目 标 为 大 中 型 餐 饮 企

More information

Microsoft Word - SPEC-20130418

Microsoft Word - SPEC-20130418 ( 初 稿 2013.04.18) 中 央 研 究 院 經 濟 研 究 所 全 球 資 訊 網 站 改 版 建 置 案 建 議 書 徵 求 說 明 文 件 目 次 壹 專 案 概 述... 2 一 專 案 名 稱... 2 二 專 案 目 標... 2 三 專 案 範 圍... 2 四 專 案 時 程... 2 五 現 況 說 明... 3 貳 專 案 需 求... 3 一 網 站 軟 體 開 發

More information

台北縣淡水鎮新興國民小學社區有教室課程教學活動表

台北縣淡水鎮新興國民小學社區有教室課程教學活動表 台 北 縣 淡 水 鎮 新 興 國 民 小 學 社 區 有 教 室 課 程 活 動 設 計 教 學 元 傳 統 寺 廟 彩 繪 教 材 來 源 自 編 教 學 年 級 六 年 級 教 學 設 計 者 劉 奕 甫 呂 詩 涵 李 姿 儀 盧 欣 暐 教 學 時 間 94 年 12 月 日 至 23 日 活 動 元 活 動 一 : 廟 廟 真 奇 妙 活 動 二 : 國 寶 級 大 師 活 動 三 :

More information

CH01.indd

CH01.indd 3D ios Android Windows 10 App Apple icloud Google Wi-Fi 4G 1 ( 3D ) 2 3 4 5 CPU / / 2 6 App UNIX OS X Windows Linux (ios Android Windows 8/8.1/10 BlackBerry OS) 7 ( ZigBee UWB) (IEEE 802.11/a/b/g/n/ad/ac

More information

(NTKOOFFICE

(NTKOOFFICE 陕 西 省 教 育 厅 文 件 陕 教 高 2015 14 号 关 于 公 布 2015 年 高 等 学 校 优 秀 教 材 获 奖 名 单 的 通 知 各 高 等 学 校 有 关 军 队 院 校 : 按 照 关 于 开 展 2015 年 高 等 学 校 优 秀 教 材 评 选 工 作 的 通 知 ( 陕 教 高 办 2015 2 号 ), 省 教 育 厅 组 织 开 展 了 2015 年 度 陕

More information

桃園縣中小學98年度教師創意教學獎工作坊

桃園縣中小學98年度教師創意教學獎工作坊 果 然 健 康 in 龍 源 主 要 領 域 : 健 康 與 體 育 參 賽 者 姓 名 : 羅 玫 玲 黃 美 華 廖 靜 君 劉 秀 琴 邱 欣 怡 學 校 名 稱 : 桃 園 縣 龍 潭 鄉 龍 源 國 民 小 學 壹 創 意 教 學 背 景 說 明 : 許 多 食 物 都 含 有 危 害 身 體 健 康 的 人 工 素 色, 舉 凡 飲 料 蜜 餞 餅 乾 零 食 麵 食 蛋 糕 冰 淇 淋

More information

“国家高等职业教育会计专业

“国家高等职业教育会计专业 高 等 职 业 教 育 会 计 专 业 教 学 资 源 库 项 目 可 行 性 研 究 报 告 国 家 示 范 性 高 职 院 校 会 计 专 业 课 程 开 发 与 教 学 资 源 建 设 项 目 组 二 〇 一 〇 年 六 月 十 一 日 目 录 一 项 目 概 况... 1 ( 一 ) 项 目 名 称... 1 ( 二 ) 建 设 目 标... 1 ( 三 ) 建 设 单 位... 4 二 项

More information

Microsoft Word - chapter1.doc

Microsoft Word - chapter1.doc 软 件 高 端 人 才 修 炼 系 列 企 业 级 应 用 软 件 架 构 开 发 过 程 与 实 践 第 一 章 版 本 0.8 胡 协 刚 首 席 软 件 架 构 师 [email protected] www.chinaarchitect.org 中 国 软 件 架 构 师 网, 2006 Page 1 of 31 目 录 第 一 章 软 件 与 软 件 的 特 性 从 业

More information

資訊系統開發模式

資訊系統開發模式 第 2 章 資 訊 系 統 開 發 模 式 學 習 目 標 2.1 導 論 2.2 瀑 布 模 式 2.3 漸 增 模 式 2.4 雛 型 模 式 2.5 螺 旋 模 式 2.6 同 步 模 式 2.7 Rational 統 一 流 程 模 式 2.8 敏 捷 軟 體 開 發 2.9 MDA 發 展 生 命 週 期 2.10 結 論 本 章 大 綱 學 習 目 標 詳 讀 本 章, 你 至 少 能

More information

6-7 6-8 6-9 Process Data flow Data store External entity 6-10 Context diagram Level 0 diagram Level 1 diagram Level 2 diagram 6-11 6-12

6-7 6-8 6-9 Process Data flow Data store External entity 6-10 Context diagram Level 0 diagram Level 1 diagram Level 2 diagram 6-11 6-12 6-1 6-2 6-3 6-4 6-5 6-6 6-7 6-8 6-9 Process Data flow Data store External entity 6-10 Context diagram Level 0 diagram Level 1 diagram Level 2 diagram 6-11 6-12 6-13 6-14 6-15 6-16 6-17 6-18 6-19 6-20 6-21

More information

重庆信~1

重庆信~1 1 重 庆 信 息 技 术 职 业 学 院 年 人 才 培 养 质 量 报 告 年 人 才 培 养 质 量 报 告 二 零 一 五 年 十 二 月 八 日 重 庆 信 息 技 术 职 业 学 院 年 人 才 培 养 质 量 报 告 目 录 1 学 校 基 本 情 况 1 1.1 办 学 基 本 情 况 及 年 度 变 化 2 1.2 举 办 方 履 责 2 1.3 生 源 质 量 分 析 4 2 学

More information

附表2:

附表2: 广 东 省 精 品 资 源 共 享 课 程 推 荐 表 ( 高 职 ) 课 程 学 校 清 远 职 业 技 术 学 院 课 程 名 称 数 据 库 应 用 技 术 课 程 类 型 公 共 基 础 课 专 业 课 其 他 所 属 专 业 大 类 名 称 所 属 专 业 类 名 称 电 子 信 息 计 算 机 所 属 专 业 名 称 ( 专 业 课 填 写 ) 计 算 机 应 用 技 术 课 程 负 责

More information

<4D6963726F736F667420506F776572506F696E74202D20545143BB7BC3D2A4CEBFECB27AA4E8A6A1BBA1A9FA205BACDBAE65BCD2A6A15D>

<4D6963726F736F667420506F776572506F696E74202D20545143BB7BC3D2A4CEBFECB27AA4E8A6A1BBA1A9FA205BACDBAE65BCD2A6A15D> Techficiency Quotient Certification 企 業 人 才 技 能 認 證 TQC 認 證 架 構 - 九 大 類 TQC-OS 作 業 系 統 TQC-OS TQC-OA 辦 作 公 業 軟 系 體 統 應 用 TQC-DA 資 料 庫 應 用 TQC-MD 多 媒 體 設 計 TQC-OS TQC-DK 專 作 業 業 知 系 識 統 領 域 TQC-PD 程 式 設

More information

Microsoft Word - 2011-030-1-1SRS - 軟體需求規格.doc

Microsoft Word - 2011-030-1-1SRS - 軟體需求規格.doc 快 樂 牧 場 主 人 軟 體 需 求 規 格 SRS-IM-2011-030-1-1 朝 陽 科 技 大 學 資 訊 管 理 系 指 導 老 師 : 范 揚 文 副 教 授 學 生 : 王 昱 尚 何 駿 青 陳 伯 誠 董 次 麟 許 閔 翔 中 華 民 國 一 百 年 十 二 月 五 日 目 錄 1. 簡 介... 4 1.1 目 的... 4 1.2 範 圍... 4 1.3 參 考 文 件...

More information

第 二 十 章 灸 法 拔 罐 法 设 计 首 页 课 程 名 称 中 医 传 统 康 复 疗 法 项 目 / 主 题 灸 法 拔 罐 法 课 类 理 论 课 课 序 1 学 时 2 班 级 / 小 组 13 级 体 育 保 健 与 康 复 地 点 819 时 间 11 月 12 日 能 力 ( 技

第 二 十 章 灸 法 拔 罐 法 设 计 首 页 课 程 名 称 中 医 传 统 康 复 疗 法 项 目 / 主 题 灸 法 拔 罐 法 课 类 理 论 课 课 序 1 学 时 2 班 级 / 小 组 13 级 体 育 保 健 与 康 复 地 点 819 时 间 11 月 12 日 能 力 ( 技 中 医 传 统 康 复 疗 法 课 程 教 案 ( 2014---2015 学 年 第 一 学 期 ) 授 课 类 型 ( 新 旧 课 ): 新 授 课 有 无 大 纲 : 有 理 论 : 36 学 时 实 验 : 0 学 时 复 习 : 0 学 时 课 内 实 操 : 18 学 时 参 观 : 0 学 时 其 他 : 0 学 时 目 的 要 求 : 本 授 课 计 划 以 党 的 教 育 方 针

More information