软件工程:第十章 面向对象设计
软件工程:第十章 面向对象设计
导学目标
- 了解面向对象设计的目的、设计准则以及启发式规则
- 掌握软件重用的三个层次、可重用的成分以及重用的好处
- 了解系统分解中的4个部分以及两种交互方式
第一节 面向对象设计的准则及启发式规则
- 分析:提取整理用户的需求,建立问题域精确模型(OOA)
- 设计:转变需求为系统实现方案,建立求解域模型(OOD)
- 在实际的软件开发中,分析和设计的界限是模糊的
- 分析和设计的活动是一个反复迭代的过程
- 面向对象方法学在概念和表示方法上的一致性,保证了在各项开发活动之间的平滑(无缝)过渡,领域专家和开发人员能够比较容易地跟踪整个系统开发过程,这是面向对象方法与传统方法比较起来所具有的一大优势
1、面向对象设计准则
-
模块化
- 对象就是模块
-
抽象
- 类抽象、提高可重用性
-
信息隐蔽
- 通过封装性实现、提高模块独立性
-
弱耦合
- 在面向对象方法中,耦合是指不同对象之间相互关联的紧密程度
- 对象间耦合分为两大类:交互耦合和继承耦合
- 交互耦合:对象间通过消息连接实现(松散)
- 降低消息连接复杂度(减少参数个数,降低参数复杂度
- 减少信息数
- 继承耦合:一般类和特殊类之间耦合(紧密)
- 有继承关系基类和派生类是系统中粒度更大模块
-
强内聚
- 服务内聚:只完成一个功能
- 类内聚:一个类只有一个用途,否则分解
- 一般特殊内聚:设计合理,是对领域知识正确抽取
-
可重用性
- 尽量利用已有类(类库、已创建类)
- 创建新类考虑以后可重用性
2、启发式规则
-
设计结果清晰易懂
- 用词一致
- 使用已有的协议
- 较少消息模式的数目
- 避免模糊的定义
-
一般-特殊结构的深度要适当
- 应该是类层级中包含的层次数适当
-
设计简单的类
- 避免包含过多的属性
- 有明确的定义
- 简化对象之间的合作关系
- 不要提供太多服务
-
使用简单的协议
- 经验表明,通过复杂消息相互关联的对象是紧耦合的,对一个对象的修改往往导致其他对象的修改
-
使用简单的服务
- 本类中的操纵尽可能简单
-
把设计变动减至最小
第二节 软件重用
重用也叫再用或复用,是指同一事物不做修改或稍加改动就多次重复使用
1、软件重用的三个层次
- 知识重用
- 方法和标准的重用
- 软件成分的重用
2、软件成分重用的三个层次
- 代码重用
- 调用库中的模块
- 设计重用
- 重用某个软件系统的设计模型
- 分析重用
- 重用某个系统的分析模型
3、典型的可重用软件的成分
- 项目计划
- 成本估计
- 体系结构
- 需求模型和规格说明
- 设计
- 源代码
- 用户文档和技术文档
- 用户界面
- 数据
- 测试用例
3、类构件重用的三种方式
- 实例重用
- 使用者无须了解实现细节就可以使用适当的构造函数创建类的实例
- 继承重用
- 提供了一种安全地修改已有类构件
- 多态重用
- 降低了消息连接的复杂程度,提供了简便可靠的软构件机制
4、软件重用的好处
- 质量
- 每一次重用,软件质量都会有所改善
- 生产率
- 软件开发全过程时间较少,带来生产率提高
- 成本
- 软件重用可以减少净成本
第三节 系统分解
1、系统分解的定义
把系统分解成若干个比较小的部分,然后在分别设计每个部分
系统的主要组成部分是子系统,各个子系统之间应该具有尽可能简单、明确的接口,再划分和设计子系统时,应当尽量减少子系统之间的依赖
2、面向对象设计模型,逻辑上由4大部分组成

- 问题域
- 直接负责实现客户需求子系统
- 人机交互
- 实现用户界面子系统包括可复用的GUI子系统
- 任务管理
- 确定各类任务,把任务分配给适当的硬件或软件去执行
- 数据管理
- 负责对象的存储和检索的子系统
3、子系统间交互方式
-
客户-供应商关系
-
“客户”子系统了解“供应商”子系统接口,反之则不能

-
-
平等伙伴关系
-
各子系统都有可能调用其它子系统,或为其它子系统提供服务。交互方式复杂,各子系统需要了解彼此接口

-
第四节 设计问题域子系统
1、设计基础
面向对象分析所得出的问题域模型
2、设计任务
对问题域模型做相应的补充或者修改
3、补充或者修改的内容
-
调整需求
- 用户需求或外部环境变化
- 分析模型不完整、不准确
-
重用已有的类
- 根据问题解决的需要,把从类库或其他来源得到既存类增加到问题解决方案中去
- 重用已有类的典型过程:
- 标出候选类中对本问题无用的属性和服务
- 在重用类和问题域类之间添加泛化关系
- 标出问题域类从已有类继承来的属性和服务
- 修改与问题域类的关联
-
把问题域类组合到一起
- 设计者往往通过引入一个根类而把问题域类组合到一起
-
添加一般化类
- 某些特殊类要求一组类似的服务,应加入一般化的类,定义为所有特殊类共用的一组服务名,服务都是虚函数;在特殊类中定义其实现
-
调整继承的层次
- 在OOA阶段建立的对象模型中可能包括多继承关系,但实现时使用程序设计语言可能只有单继承,需对分析结果修改
4、示例
ATM系统实例
-
ATM系统问题域子系统划分成三个更小的子系统,分别是ATM站子系统、中央计算机子系统、分行计算机子系统
-
星型拓扑结构
-
以专用电话线连接

第五节 设计人机交互子系统
1、设计基础
在面向对象分析过程中对用户需求做的初步分析
2、设计任务
确定人机交互细节,窗口报表形式,命令层次等
3、设计策略:
-
分类用户
- 通常可以按照技能水平、职位、所属集团进行分类
-
描述用户
- 应该将使用系统的每类用户情况详细的记录下来
-
设计命令的层次
- 研究现有的人机交互的含义和准则
- 确定初始的命令层次
- 精化命令层次
-
设计人机交互类
第六节 设计任务管理子系统
在实际系统中,许多对象之间往往存在相互依赖关系。设计工作的一项重要内容就是,确定哪些是必须同时动作的对象,哪些是相互排斥的对象。进一步设计任务管理子系统
系统总有许多并发行为,需按照各自行为的协调和通信关系,划分各种任务(进程),简化并发行为的设计和编码
确定各类任务,把任务分配给适当的硬件和软件去执行
根据动态模型去分析、定义
1、分析并发性
- 并发对象
- 无交互行为的对象
- 同时接受事件的对象
- 定义任务
- 检查各个对象的状态图,找没并发对象的路径(任何时候路径中只有单个对象是活跃的),称控制线
- 通过分离出控制线设计任务
- 并发任务分配
- 每个任务分配到独立的处理器
- 配到相同处理器,通过操作系统提供并发支持
2、设计任务管理子系统
- 确定事件驱动型任务
- 指睡眠任务(不占用cpu),某个事件发生,任务被触发,醒来做相应处理,又回到睡眠状态
- 确定时钟驱动型任务
- 按特定时间间隔去触发任务进行处理。如某些设备需要周期性获取数据
- 确定优先任务
- 高优先级任务分离出独立的任务,在规定时间内完成
- 确定关键任务
- 严格可靠性、精心设计和编码、严格测试
- 确定协调任务
- 三个以上任务,引入协调任务,控制封装任务间协调
- 尽量减少任务数
- 任务多,设计复杂、不易理解、难维护
- 确定资源需求
- 计算系统载荷,每秒处理业务数,处理一个业务花费时间,估算所需cpu (或其他固件)处理能力
- 综合考虑,确定哪些任务硬件实现,哪些任务软件实现
第七节 设计数据管理子系统
1、选择数据存储管理的模式
-
文件管理系统
- 成本低、简单
- 操作级别低,不同操作系统的文件系统差别大
-
关系数据库管理系统
- 优点:
- 提供了各种最基本的数据管理功能
- 为多种应用提供一致的接口
- 标准化的语言
- 缺点:
- 运行开销大
- 不能满足高级应用的需求
- 与程序设计语言连接不自然
- 优点:
-
面向对象数据库管理系统
- 扩展的关系型数据库:
- 增加抽象数据类型,继承等机制
- 增加了创建管理类和对象的通用服务
- 扩展的面向对象语言
- 扩充了面向对象程序设计语言的语法和功能
- 增加数据库存储和管理对象机制
- 扩展的关系型数据库:
2、设计数据管理子系统
- 设计数据格式
- 设计数据格式与数据存储管理模式密切相关
- 文件系统:达到第一范式、减少文件数量、减小存储空间
- 关系型数据库管理系统:达到第三范式、满足性能及存储需求
- 面向对象数据库管理系统:对于扩展性关系型数据库使用与关系型数据库相同的方法;对于扩展性面向对象程序设计语言,不需要规范化属性的步骤
- 设计相应的服务
- 文件系统:打开文件、记录定位、检索记录、更新
- 关系型数据库管理系统:访问那些数据库表、怎样访问所需要的行、怎样检索出旧值、怎样用现有值更新
- 面向对象数据库管理系统:对于扩展性关系型数据库使用与关系型数据库相同的方法;对于扩展性面向对象程序设计语言,不需要增加服务设计数据管理子系统
3、示例:ATM系统
- 永久性数据存储在分行计算机
- 保持数据一致性、完整性、满足并发性
- 用商品化关系数据库管理系统
- 每个事务不可分割,事务封锁账户
- ATM系统中需存储对象主要是账户类对象,两种方法
- 每个对象自己保存自己
- 账户类对象接到“存储自己”通知,把自身存储起来
- 由数据管理子系统负责存储对象
- 账户类对象接到“存储自己”通知,向数据管理子系统发消息,由数据管理子系统将状态保存起来
- 每个对象自己保存自己