第十一章 面向对象设计
? 面向对象设计的准则
? 启发规则
? 软件重用
? 系统分解
? 设计问题域子系统
? 设计人 — 机交互子系统
? 设计任务管理子系统
? 设计数据库管理子系统
? 设计类中的服务
? 设计关联
? 设计优化
面向对象设计的准则
? 11.1.1 模块化
? 11.1.2 抽象
? 11.1.3 信息隐藏
? 11.1.4 弱耦合
? 11.1.5 强内聚
? 11.1.6 可重用
面向对象设计的准则
? 模块化
? 抽象
? 抽出事物的本质特性,暂不考虑其细节,使设计从具体
实现方法中超脱
? 信息隐藏
? 弱耦合
? 交互耦合 (interactive coupling):通过传递
message发生
? 继承耦合
面向对象设计的准则
? 强内聚
? 服务内聚 (service cohesion),一个服务只完成一
个功能
? 类内聚 (class cohesion),一个类只有一个用途,
否则分解之
? 一般 -特殊内聚
? 可重用
启发规则
? 11.2.1 设计结果应该清晰易懂
? 11.2.2 一般 ----特殊结构的深度应适当
? 11.2.3 设计简单的类
? 11.2.4 使用简单的协议
? 11.2.5 使用简单的服务
? 11.2.6 把设计变动减至最小
启发规则
? 设计结果应该清晰易懂
? 用词一致 —— 按习惯用法命名
? 使用已有的 protocol
? 尽量减少 message模式的数目
? 避免模糊定义
? 一般 ----特殊结构的深度应适当
? 设计简单的类
? 避免过多 attributes
? 能用简单的语句描述一个 class的任务
? objects之间合作关系要简单
? 避免过多 methods(? 7个 )
启发规则
? 使用简单的协议
? 使用简单的服务
? 把设计变动减至最小
软件重用
? 11.3.1 概念
? 11.3.2 软件重用的效果
? 11.3.3 软件重用技术
? 11.3.4 类构件
软件重用
? 概念
? 知识重用(例如软件工程知识的重用)
? 方法和标准重用
? 软件成分的重用
?代码重用
?设计重用
?分析重用
软件重用
? 软件重用的效果
? 额外代价:
? 创建可重用成分的专门投资
? 多花 2~4倍时间测试以保证质量
? 构件库的建立与维护需要投资
? 重用率 (Reusability)与生产率 (Productivity)
开发代码的 生产率
n
n
n E
LC ? 重用新代码的 生产率
r
r
r E
LC ?
)R/CC(11
CP
rn
n
????
软件重用
? 软件重用技术
? 指利用可重用的构件开发软件的技术,及开发可重用
软件的技术
? 软件组合技术
? 底层部件库法 (Bottom-up compositional reuse),
从可重用的代码部件库 (reuse repository)中选用部件,组合
成软件
? 软件生成技术
? 按照形式化的软件功能描述和一定的生成机理,由生成器系统
(generator system)自动生成目标程序。重用的是 generator
的代码规则
? 面向对象的重用技术
软件重用
? 类构件
? 独立、可塑、接口清晰(文档详尽)
? 实例重用:
? 创建 class的不同 instances,通过 messages完成
? 不同的任务。是最基本的重用方式
? 用几个简单的 objects创建出更复杂的 class
? 是实例重用的另一种形式
软件重用
? 类构件
? 继承重用:
? 是一种 安全地 裁剪已有的 class component的方式。
? 多态重用:
?Parent class与 child class有相同的对外接口,使
消息连接的复杂度降低
系统分解
? 11.4.1 子系统之间的两种交互方式
? 11.4.2 组织系统的两种方案
? 11.4.3 设计系统的拓扑结构
系统分解
? 子系统之间的两种交互方式
? 客户 -供应商 (client-server)关系
? 平等伙伴 (peer-to-peer)关系
? 组织系统的两种方案
? 水平层次组织:
? 将系统组织成 hierarchy,同一层中的 objects相互独立,而上、
下层间有 client-server关系
? 垂直块组织:
? 将系统垂直分解成若干独立的子系统,一个子系统相当于
一块,每块提供一种类型的服务
? 设计系统的拓扑结构
设计问题域子系统
? 11.5.1 调整需求
? 11.5.2 重用已有的类
? 11.5.3 把问题域类组合在一起
? 11.5.4 增添一般化类以建立协议
? 11.5.5 调整继承层次
? 11.5.6 ATM系统之例
设计问题域子系统
? 调整需求
? 重用已有的类
? 选出可用的 class,标出与本问题无关 的 attributes 和
methods
? 派生出 child class,标出继承的 attributes 和 methods
? 修改关联
? 把问题域类组合在一起
? 通过引入根类完成,用于建立公共协议
? 增添一般化类以建立协议
? 调整继承层次
? ATM系统之例
设计人 — 机交互子系统
? 11.6.1 设计人 — 机交互子界面的准则
? 11.6.2 设计人 — 机交互子系统的策略
设计人 — 机交互子系统
? 设计人 — 机交互子界面的准则
? 一致性
? 减少步骤
? 及时提供反馈信息
? 提供撤销 (undo)命令
? 无须记忆
? 易学
? 富有吸引力
? 联机参考
? 11.6.2 设计人 — 机交互子系统的策略
设计人 — 机交互子系统
? 设计人 — 机交互子系统的策略
? 将用户分类
? 描述用户的类型、水平、使用目的、其它特征
(如年龄、性别、习惯等 ),写出操作脚本
? 设计命令层次
? 设计人机交互类
设计任务管理子系统
? 11.7.1 分析并发性
? 11.7.2 设计任务管理子系统
设计任务管理子系统
? 分析并发性
? 若两个 objects之间无交互行为,或它们同时接
受 events,则它们本质上是 并发的
? 考察事件流图,找出没有并发对象的路径(称
为 控制线 ),每条对应一个 任务 (task,亦称
process)
? 不同的 tasks对应必须同时发生的不同行为
? 11.7.2 设计任务管理子系统
设计任务管理子系统
? 设计任务管理子系统
? 事件驱动型
? 时钟驱动型
? 优先型
? 关键任务
? 协调任务
设计数据库管理子系统
? 11.8.1 选择数据存储管理模式
? 11.8.2 设计数据管理子系统
? 11.8.3 例子
设计数据库管理子系统
? 选择数据存储管理模式
? 文件管理 (file manager)系统
? 关系数据库 (Relational Data Base)管理系统
? 面向对象数据库 (OODB)管理系统
? 设计数据管理子系统
设计类中的服务
? 11.9.1 确定类中应有的服务
? 11.9.2 设计实现服务的方法
设计类中的服务
? 确定类中应有的服务
? 设计实现服务的方法
? 设计实现服务的算法
? 算法复杂度
? 容易理解与容易实现
? 易修改
? 选择数据结构
? 定义内部类和内部操作
设计关联
? 11.10.1 关联的遍历
? 11.10.2 实现单向关联
? 11.10.3 实现双向关联
? 11.10.4 链属性的实现
设计关联
? 关联的遍历
? 实现单向关联
雇 员 公 司
被雇用
1+ 雇 员雇主 公 司
由雇员找其所属公司,则设雇主为其属性,即一单向指
针
设计关联
? 实现双向关联
? 链属性的实现
方法 1:将上述两种单向关联结合
使用
雇 员
雇主
公 司
雇员
指针集 雇 员
公 司
关联类
雇主
雇员
工资
方法 2:另设关联类 ( 特别适用于
链属性 )
设计优化
? 11.11.1 确定优先级
? 11.11.2 提高效率的几项技术
? 11.11.3 调整继承关系
设计优化
? 确定优先级
? 必须站在 全局 高度确定各项质量指标的优先级,
在优化设计时制定折衷方案。切忌各子系统自
以为是,导致最终优化目标对立。
? 最常见的情况是在 效率 与 清晰性 之间的折衷
? 提高效率的几项技术
? 增加关联(类)
? 调整继承关系
? 向上归纳、向下派生、利用委托
? 面向对象设计的准则
? 启发规则
? 软件重用
? 系统分解
? 设计问题域子系统
? 设计人 — 机交互子系统
? 设计任务管理子系统
? 设计数据库管理子系统
? 设计类中的服务
? 设计关联
? 设计优化
面向对象设计的准则
? 11.1.1 模块化
? 11.1.2 抽象
? 11.1.3 信息隐藏
? 11.1.4 弱耦合
? 11.1.5 强内聚
? 11.1.6 可重用
面向对象设计的准则
? 模块化
? 抽象
? 抽出事物的本质特性,暂不考虑其细节,使设计从具体
实现方法中超脱
? 信息隐藏
? 弱耦合
? 交互耦合 (interactive coupling):通过传递
message发生
? 继承耦合
面向对象设计的准则
? 强内聚
? 服务内聚 (service cohesion),一个服务只完成一
个功能
? 类内聚 (class cohesion),一个类只有一个用途,
否则分解之
? 一般 -特殊内聚
? 可重用
启发规则
? 11.2.1 设计结果应该清晰易懂
? 11.2.2 一般 ----特殊结构的深度应适当
? 11.2.3 设计简单的类
? 11.2.4 使用简单的协议
? 11.2.5 使用简单的服务
? 11.2.6 把设计变动减至最小
启发规则
? 设计结果应该清晰易懂
? 用词一致 —— 按习惯用法命名
? 使用已有的 protocol
? 尽量减少 message模式的数目
? 避免模糊定义
? 一般 ----特殊结构的深度应适当
? 设计简单的类
? 避免过多 attributes
? 能用简单的语句描述一个 class的任务
? objects之间合作关系要简单
? 避免过多 methods(? 7个 )
启发规则
? 使用简单的协议
? 使用简单的服务
? 把设计变动减至最小
软件重用
? 11.3.1 概念
? 11.3.2 软件重用的效果
? 11.3.3 软件重用技术
? 11.3.4 类构件
软件重用
? 概念
? 知识重用(例如软件工程知识的重用)
? 方法和标准重用
? 软件成分的重用
?代码重用
?设计重用
?分析重用
软件重用
? 软件重用的效果
? 额外代价:
? 创建可重用成分的专门投资
? 多花 2~4倍时间测试以保证质量
? 构件库的建立与维护需要投资
? 重用率 (Reusability)与生产率 (Productivity)
开发代码的 生产率
n
n
n E
LC ? 重用新代码的 生产率
r
r
r E
LC ?
)R/CC(11
CP
rn
n
????
软件重用
? 软件重用技术
? 指利用可重用的构件开发软件的技术,及开发可重用
软件的技术
? 软件组合技术
? 底层部件库法 (Bottom-up compositional reuse),
从可重用的代码部件库 (reuse repository)中选用部件,组合
成软件
? 软件生成技术
? 按照形式化的软件功能描述和一定的生成机理,由生成器系统
(generator system)自动生成目标程序。重用的是 generator
的代码规则
? 面向对象的重用技术
软件重用
? 类构件
? 独立、可塑、接口清晰(文档详尽)
? 实例重用:
? 创建 class的不同 instances,通过 messages完成
? 不同的任务。是最基本的重用方式
? 用几个简单的 objects创建出更复杂的 class
? 是实例重用的另一种形式
软件重用
? 类构件
? 继承重用:
? 是一种 安全地 裁剪已有的 class component的方式。
? 多态重用:
?Parent class与 child class有相同的对外接口,使
消息连接的复杂度降低
系统分解
? 11.4.1 子系统之间的两种交互方式
? 11.4.2 组织系统的两种方案
? 11.4.3 设计系统的拓扑结构
系统分解
? 子系统之间的两种交互方式
? 客户 -供应商 (client-server)关系
? 平等伙伴 (peer-to-peer)关系
? 组织系统的两种方案
? 水平层次组织:
? 将系统组织成 hierarchy,同一层中的 objects相互独立,而上、
下层间有 client-server关系
? 垂直块组织:
? 将系统垂直分解成若干独立的子系统,一个子系统相当于
一块,每块提供一种类型的服务
? 设计系统的拓扑结构
设计问题域子系统
? 11.5.1 调整需求
? 11.5.2 重用已有的类
? 11.5.3 把问题域类组合在一起
? 11.5.4 增添一般化类以建立协议
? 11.5.5 调整继承层次
? 11.5.6 ATM系统之例
设计问题域子系统
? 调整需求
? 重用已有的类
? 选出可用的 class,标出与本问题无关 的 attributes 和
methods
? 派生出 child class,标出继承的 attributes 和 methods
? 修改关联
? 把问题域类组合在一起
? 通过引入根类完成,用于建立公共协议
? 增添一般化类以建立协议
? 调整继承层次
? ATM系统之例
设计人 — 机交互子系统
? 11.6.1 设计人 — 机交互子界面的准则
? 11.6.2 设计人 — 机交互子系统的策略
设计人 — 机交互子系统
? 设计人 — 机交互子界面的准则
? 一致性
? 减少步骤
? 及时提供反馈信息
? 提供撤销 (undo)命令
? 无须记忆
? 易学
? 富有吸引力
? 联机参考
? 11.6.2 设计人 — 机交互子系统的策略
设计人 — 机交互子系统
? 设计人 — 机交互子系统的策略
? 将用户分类
? 描述用户的类型、水平、使用目的、其它特征
(如年龄、性别、习惯等 ),写出操作脚本
? 设计命令层次
? 设计人机交互类
设计任务管理子系统
? 11.7.1 分析并发性
? 11.7.2 设计任务管理子系统
设计任务管理子系统
? 分析并发性
? 若两个 objects之间无交互行为,或它们同时接
受 events,则它们本质上是 并发的
? 考察事件流图,找出没有并发对象的路径(称
为 控制线 ),每条对应一个 任务 (task,亦称
process)
? 不同的 tasks对应必须同时发生的不同行为
? 11.7.2 设计任务管理子系统
设计任务管理子系统
? 设计任务管理子系统
? 事件驱动型
? 时钟驱动型
? 优先型
? 关键任务
? 协调任务
设计数据库管理子系统
? 11.8.1 选择数据存储管理模式
? 11.8.2 设计数据管理子系统
? 11.8.3 例子
设计数据库管理子系统
? 选择数据存储管理模式
? 文件管理 (file manager)系统
? 关系数据库 (Relational Data Base)管理系统
? 面向对象数据库 (OODB)管理系统
? 设计数据管理子系统
设计类中的服务
? 11.9.1 确定类中应有的服务
? 11.9.2 设计实现服务的方法
设计类中的服务
? 确定类中应有的服务
? 设计实现服务的方法
? 设计实现服务的算法
? 算法复杂度
? 容易理解与容易实现
? 易修改
? 选择数据结构
? 定义内部类和内部操作
设计关联
? 11.10.1 关联的遍历
? 11.10.2 实现单向关联
? 11.10.3 实现双向关联
? 11.10.4 链属性的实现
设计关联
? 关联的遍历
? 实现单向关联
雇 员 公 司
被雇用
1+ 雇 员雇主 公 司
由雇员找其所属公司,则设雇主为其属性,即一单向指
针
设计关联
? 实现双向关联
? 链属性的实现
方法 1:将上述两种单向关联结合
使用
雇 员
雇主
公 司
雇员
指针集 雇 员
公 司
关联类
雇主
雇员
工资
方法 2:另设关联类 ( 特别适用于
链属性 )
设计优化
? 11.11.1 确定优先级
? 11.11.2 提高效率的几项技术
? 11.11.3 调整继承关系
设计优化
? 确定优先级
? 必须站在 全局 高度确定各项质量指标的优先级,
在优化设计时制定折衷方案。切忌各子系统自
以为是,导致最终优化目标对立。
? 最常见的情况是在 效率 与 清晰性 之间的折衷
? 提高效率的几项技术
? 增加关联(类)
? 调整继承关系
? 向上归纳、向下派生、利用委托