资源描述
第 十 一 章 面 向 对 象 设 计(Object-Oriented Design) 1. OOD准 则 : 优 秀 软 件 设 计 的 一 个 重 要 特 点 是容 易 维 护回 顾 : SD准 则 包 括 Modularization Abstraction Information hiding Module independence对 于 OOD有 类 似 的 准 则 : 1、 Module = Object 1. OOD准 则 Procedure abstraction: 在 SD中 已 讨 论 Data abstraction: Class即 是 一 种 抽 象 数 据 类 型 。 外 界 无 须知 道 实 现 方 法 就 可 按 照 类 协 议 (class description protocol)* 使 用 class中 定 义 的 数 据 。 Parameter abstraction: 将 数 据 类 型 作 为 参 数 处 理 。* Class description protocol : The complete definition of all properties, features, and methods that are descriptive of any object that is an instance of a class. Timothy Budd An Introduction to Object-Oriented Programming Addison-Wesley Publishing Company, Inc. 1991 2、 Abstraction: 抽 出 事 物 的 本 质 特 性 , 暂 不 考 虑其 细 节 , 使 设 计 从 具 体 实 现 方 法 中 超 脱 。 1. OOD准 则例 : C+ 中 的 “ 模 板 ” (template)template class array_n private : T items n ; / 定 义 了 T类 型 的 向 量 元 素 共 n个 ;main ( ) array_n w ; /w是 有 1000个 元 素 的 复 向 量 1. OOD准 则3、 Information hiding = Encapsulation of object4、 Coupling: 交 互 耦 合 (interactive coupling):通 过 传 递 message发 生要 求 降 低 参 数 个 数 和 参 数 复 杂 性 减 少 objects发 送 接 收 message的 个 数 as loose as possible 继 承 耦 合 (inheritance coupling): 要 求 Parent class IS_A child class as high as possible 1. OOD准 则 一 般 -特 殊 内 聚 ( general-particular cohesion): High g-p cohesion High inheritance coupling5、 Cohesion: 服 务 内 聚 (service cohesion): 一 个 服 务 只 完 成 一 个 功 能 。 类 内 聚 (class cohesion): 一 个 类 只 有 一 个 用 途 , 否 则 分解 之 。6、 Reusability(详 见 3) 2. 启 发 式 规 则1、 设 计 结 果 清 晰 易 懂 , 应 做 到 : 用 词 一 致 按 习 惯 用 法 命 名 。 不 同 classes中相 似 的 methods最 好 取 同 一 名 字 。 使 用 已 有 的 protocol。 尽 量 减 少 message模 式 的 数 目 。 避 免 模 糊 定 义 。2、 一 般 -特 殊 结 构 的 深 度 应 适 当 ( 约 100个 classes,则设 计 7 2层 ) 2. 启 发 式 规 则3、 设 计 简 单 的 class( 定 义 不 超 过 一 页 纸 或 两 屏 ) 。应 注 意 : 避 免 过 多 attributes; 能 用 简 单 的 语 句 描 述 一 个 class的 任 务 ; objects之 间 合 作 关 系 要 简 单 ; 避 免 过 多 methods( 7个 )。问 题 : 设 计 出 大 量 的 classes, 使 结 构 复 杂 度 增 加 。解 决 : 划 分 主 题 , 提 高 可 理 解 性 。4、 使 用 简 单 的 protocol, 减 少 message 中 传 递 的 parameters5、 使 用 简 单 的 method(CASE 可 考 虑 用 inheritance替 代 )。6、 把 设 计 变 动 减 至 最 小 。 1、 概 念 : 知 识 重 用 ( 例 如 软 件 工 程 知 识 的 重 用 ) 方 法 和 标 准 重 用 ( 例 如 OO方 法 和 国 家 规 定的 软 件 开 发 规 范 的 重 用 ) 软 件 成 分 的 重 用 3. 软 件 重 用 (Software Reuse) 知 识工 程 源 码 剪 贴 无 法 溯 源 , 无 配 置 管 理 Include 修 改 后 所 有 包 含 了 此 段 代 码 的 程序 都 须 重 新 编 译 。 Inheritance 无 须 改 动 原 有 代 码 想 象 一 下 , stdio.h 被 改 动 之 后 重 用 软 件 成 分 有 三 个 级 别 : 代 码 重 用 : 3. 软 件 重 用 设 计 重 用 当 移 植 系 统 时 分 析 重 用 当 需 求 未 变 , 而 系 统 结 构 改 变时 ( 例 如 将 HDIS改 为 OO实 现 )2、 重 用 效 果 的 衡 量 : 额 外 代 价 : 创 建 可 重 用 成 分 的 专 门 投 资 多 花 2 4倍 时 间 测 试 以 保 证 质 量 构 件 库 的 建 立 与 维 护 需 要 投 资 以 上 投 资 将 分 摊 到 重 用 这 些 构 件 的 新 系 统 成本 中 。 重 用 次 数 越 多 , 分 摊 成 本 越 少 。 3. 软 件 重 用记 : Lt = Total length of code ( # of lines) Ln = Length of new code Lr = Length of reused code Et 、 En、 Er are the corresponding efforts ( # of m-d) 重 用 率 (Reusability)与 生 产 率 (Productivity) rn rntt EE LLEL Productivity Reusability = trLL开 发 代 码 的 生 产 率 nnn ELC 重 用 新 代 码 的 生 产 率 rrr ELC )R/CC(11 CP rnn 3. 软 件 重 用 重 用 技 术 : 指 利 用 可 重 用 的 构 件 开 发 软 件 的 技术 , 及 开 发 可 重 用 软 件 的 技 术 。 软 件 组 合 技 术 : 底 层 部 件 库 法 (Bottom-up compositional reuse) :从 可 重 用 的 代 码 部 件 库 (reuse repository)中 选 用部 件 , 组 合 成 软 件 。A: 是 , 前 提 条 件 为 CnCr ,即 重 用 比 新 开 发 效 率 高 。Q: 是 否 R 越 高 P就 越 高 ? Lucent Technologies initiated a companywide program to reuse software components (McClure 1997). As a consequence, the Workstation Software Development Department formed a Reuse Council to devise a strategy for selecting candidate components for its reuse repository. The Council was comprised of seven people, representing all groups in the department. The Council created an inventory of components and formed a matrix with the features of all past and planned projects. Then, each feature was rated in terms of whether it had been implemented and was still needed, had been implemented but was no longer needed, or had not been implemented but was still needed. Those features that were needed and were common to more than one project were targeted for reuse. In fact, some were redesigned to make them more reusable.The Council met every week for 2 hours to make component selections, inspect design documentation for those components already in the repository, and to monitor the levels of reuse in the departments projects. 3. 软 件 重 用例 : 上 层 组 合 法 : 完 整 程 序 的 组 合 3. 软 件 重 用 软 件 生 成 技 术 : 按 照 形 式 化 的 软 件 功 能 描 述 和 一 定 的 生 成 机理 , 由 生 成 器 系 统 (generator system)自 动 生 成 目 标 程 序 。重 用 的 是 generator 的 代 码 规 则 OO重 用 技 术 : Class component的 重 用 ( 详 见 下 文 ) 类 构 件 (Class component): 可 重 用 的 软 构 件 应 具 备 的 特 点 : 独 立 、 可 塑 、 接 口 清 晰 ( 文 档 详 尽 ) 3. 软 件 重 用 重 用 方 式 : 实 例 重 用 (instance reuse black-box reuse): 创 建 class的 不 同 instances, 通 过 messages完 成 不 同 的 任 务 。 是 最 基 本 的 重 用 方 式 。 用 几 个 简 单 的 objects创 建 出 更 复 杂 的 class, 是 实 例 重 用 的 另 一 种 形 式 继 承 重 用 (inheritance reuse):是 一 种 安 全 地 裁 剪 已 有 的 class component的 方 式 。 多 态 重 用 (polymorphism reuse): Parent class与 child class有 相 同 的 对 外 接 口 , 使 消 息 连 接 的 复 杂 度 降 低 。 3. 软 件 重 用注 意 : 有 些 操 作 可 能 会 妨 碍 class component的 重 用 , 如 与 表 示 方 法 有 关 的 操 作 与 数 据 结 构 、 大 小 有 关 的 操 作 与 外 部 设 备 有 关 的 操 作 实 现 算 法 在 将 来 可 能 会 改 进 改 变 的 核 心 操 作解 决 方 法 : 将 这 些 操 作 分 离 出 来 , 作 为 适 配 接 口(adaptive interface), 使 class中 其 它 操作 通 过 调 用 AI而 实 现 。 在 不 同 应 用 环境 下 , 用 户 只 须 重 新 定 义 AI操 作 就 可以 重 用 class。 3. 软 件 重 用Adaptive Interface还 可 进 一 步 细 分 为 转 换 接 口 (transition interface): 重 用 时 必 须 重 定义 与 表 示 方 法 、 数 据 结 构 、 硬 件 等 有 关 的 操 作( 例 如 C+中 class 里 的 pure virtual function) 扩 充 接 口 (expansion interface): 一 个 操 作 可 由 多种 算 法 实 现 , 若 无 新 算 法 则 继 承 老 算 法 。 I P O问 题 域Application Domain 人 机 交 互Human-ComputerInterface(HCI) 任 务 管 理TaskManagement 数 据 管 理DataManagement MethodAttributeStructureClass- 接 受 message 的 object 必 有 对 应 的 method; Method 改 变 status( 即 attributes) , 并 完 成 action。 5. 设 计 类 中 的 服 务Event Status 1 do: Action 1 Status 2 do: Action 2 则 算 法 应 有 DO_CASE型 控 制 从 function model出 发 :DFD的 一 般 结 构 是 I P O注 意 : Action ( 即 算 法 )与 status 有 关 。 例如 : 不 同 status接受 同 一 个 event 时 ,其 action不 同 Input FlowClassProcess I O ClassProcess 5. 设 计 类 中 的 服 务 若 Process=从 Input Flow中 抽 取 一 个 值 , 则I O 若 和 类 型 相 同 , 而 output实 质 上 是input的 另 一 个 状 态 , 则 IO是 一 类 , 有 若 则I1I2I 3 P O Output Flow ClassProcess 5. 设 计 类 中 的 服 务 若 则 Process Storage Storage ClassProcess 对 照 DFD与 Class-&-Object图 , 若 一 个 process涉 及多 个 classes, 则 必 须 判 断 它 属 于 哪 一 个 class。 例 如 : Activator ReceiverProcess若 Process 改 变 了 Receiver, 则 Receiver Class Process又 如 : 从 关 联 上 看 , process所 涉 及 的 所 有 classes中 ,处 于 中 心 地 位 的 class,一 般 拥 有 该 process。 5. 设 计 类 中 的 服 务2、 设 计 实 现 方 法 算 法 设 计 : 要 求 做 到 易 修 改 , 并 且 复 杂 度 低 ( 即效 率 高 ) 易 理 解 , 易 实 现 。 数 据 结 构 设 计 : 需 要 考 虑 具 体 的 物 理 结 构 的 选 择 。 新 添 用 于 存 放 内 部 处 理 中 间 结 果 的 class; 引 入 新的 低 层 操 作 , 进 一 步 细 化 。 6. 设 计 关 联1、 单 向 关 联 例 : 雇 员 公 司被 雇 用1+ 由 雇 员 找 其 所 属 公 司 ,则 设 雇 主 为 其 属 性 ,即 一 单 向 指 针 雇 员雇 主 公 司 由 公 司 找 其 下 属 某 一 雇 员 , 则 有 两 种 方 法 :方 法 1: 遍 历 所 有 雇 员 , 找 雇 主 匹 配 且 满 足 特 征 的 雇员 。 ( 省 空 间 ) 6. 设 计 关 联方 法 2: 设 公 司的 属 性 雇 员 为一 指 针 集 。( 快 速 ) 雇 员 公 司雇 员指 针 集2、 双 向 关 联方 法 1: 将 上 述 两 种 单 向关 联 结 合 使 用雇 员 雇 主 公 司雇 员指 针 集 雇 员公 司关 联 类雇 主雇 员工 资方 法 2: 另 设 关 联 类 ( 特别 适 用 于 链 属 性 ) 雇 员公 司find_skill 雇 用1+ 技 能具 有 技 能1+1+ 7. 优 化1、 确 定 优 先 级 : 必 须 站 在 全 局 高 度 确 定 各 项 质 量 指 标 的 优 先 级 ,在 优 化 设 计 时 制 定 折 衷 方 案 。 切 忌 各 子 系 统 自 以 为是 , 导 致 最 终 优 化 目 标 对 立 。 最 常 见 的 情 况 是 在 效 率 与 清 晰 性 之 间 的 折 衷 。 2、 提 高 效 率 的 技 术 增 加 关 联 ( 类 )例 : 设 某 公 司 有 2000名 雇 员 , 平 均 每 名 雇 员 会10种 技 能 , 其 中 有 5人 精 通 日 语 , 现 要 查 询公 司 中 会 讲 日 语 的 雇 员 是 哪 些 人 雇 员公 司 精 通 语 言1+语言 1+ 7. 优 化方 法 1: 嵌 套 查 询 遍 历 雇 员 2000次 , 而 对 每 个雇 员 遍 历 技 能 10次 。 命 中 率 为 1/4000。方 法 2: 用 Hash Table实 现 技 能 , 使 “ 会 讲 日 语 ” 对应 唯 一 的 技 能 对 象 , 则 命 中 率 上 升 为 1/400。方 法 3: 增 加 一 个 额 外 的 限 定 关 联 “ 精 通 语 言 ” ,即 可 立 刻 查 得 结 果 。 7. 优 化 调 整 查 询 次 序 , 优 化 算 法 例 如 公 司 有 5名 会 日 语 的 雇 员 , 有 200名 会 法 语的 雇 员 。 现 要 找 日 、 法 语 均 会 的 雇 员 , 则 应 先 找的 雇 员 , 再 从 中 找 的 雇 员 。会 日 语 会 法 语 保 留 内 部 中 间 过 程 产 生 的 派 生 属 性 。3、 调 整 继 承 关 系 向 上 归 纳 向 下 派 生建 立 这 样 的 索 引 必 然 多 占 空 间 , 而 且 基 关 联 改变 时 也 必 须 相 应 地 修 改 索 引 。 因 此 , 应 只 给 那 些 经常 执 行 并 且 开 销 大 、 命 中 率 低 的 查 询 建 立 索 引 。 7. 优 化例 : 实 现 Stack方 法 1: 从 List 派 生 push = last + add pop = last + remove问 题 : Stack.first 也 是 合 法 的 。 ListaddremovefirstlastStackpush popInheritance 利 用 委 托 (commitment)方 法 2: 把 List 作 为 Stack 的 一 个 attribute , 称 为 commitment。 这 种 方 法 比较 安 全 (Stack.first 为 非 法 )。 ListaddremovefirstlastStackList 1pushpopCommitment作 业 : 自 习 第 十 二 章 OOP, 并 回 答 问 题 P.275 #3, #5. Project Part HDIS 期 末 合 并 版 首 次 面 世 验 收 截 止 日 期 : 1月 16日 验 收 地 点 : 各 组 自 定 验 收 内 容 : 数 据 库 合 并 情 况 ; 用 户 界 面 合 并 情 况 。
展开阅读全文