【概述】
设计阶段的任务,是及时把分析阶段得到的需求转变成符合各项要求的系统实现方案
面向对象的方法不强调需求分析和软件设计的严格区分,实际上,面向对象的需求分析和面向对象的设计活动是一个反复迭代的过程,从分析到设计的过渡,是一个逐渐扩充、细化和完善分析阶段所得到的各种模型的过程
严格的意义上来讲,从面向对象分析到面向对象设计不存在转换问题,而是同一种表示方法在不同范围的运用
面向对象设计也不仅仅是对面向对象分析模型进行细化。面向对象分析建立系统的问题域对象模型,而面向对象设计是建立求解域的对象模型
【面向对象设计的过程】
面向对象的设计过程一般进行以下几个步骤:
- 建立软件体系结构环境图
- 软件体系结构设计
- 对各个子系统进行设计
- 对象设计及优化
建立软件体系结构环境图
在软件体系结构设计开始的时候,设计应该定义与软件进行交互的外部实体以及交互的特性
一般在分析建模阶段可以获得这些信息,并使用软件体系结构环境图对环境进行建模,描述系统的出人信息流、用户界面和相关的支持处理
一旦建立了软件体系结构的环境图,描述出所有的外部软件接口,软件架构师就可以通过定义和求精实现软件体系结构的构件来描述系统的结构
这个过程可一直迭代,直到获得一个完善的软件体系结构。而在设计的初始阶段,系统设计师用系统环境图对软件与外部实体交互的方式进行建模
软件体系结构设计
软件构环境图建立之后,对所有的外部软件接口进行了描述,就可以进行软件体系结构设计
软件体系结构设计可以自底向上进行,先为系统中最底层细节编程,然后逐步在更高层累计细节直至最终满足系统需求,如将关系紧密的对象组织成子系统或层
也可以自顶向下进行,通过分解功能来解决问题,尤其是使用设计模式或遗留系统时,会从子系统的划分入手
还可以自中向上下进行,先开始做系统中看来容易做的,再向相应的高层或底层扩展
对各个子系统进行设计
大多数系统的面向对象设计模型,在逻辑上都由 4 大部分组成,这 4 大部分对应于组成目标系统的 4 个子系统:
- 问题域子系统
- 人—机交互子系统
- 任务管理子系统
- 数据管理子系统
在不同的软件系统中,这 4 个子系统的重要程度和规模可能相差很大,规模过大的在设计过程中应该进一步划分成更小的子系统,规模过小的可合并在其他子系统中
对象设计及优化
对象设计是细化原有的分析对象,确定一些新的对象、对每一个子 系统接口和类进行准确详细的说明。
【面向对象设计的原则】
面向对象的设计原则基本遵循传统软件设计应该遵循的基本原理,同时还要考虑面向对象的特点
设计原则具体有:
- 模块化
- 抽象化
- 信息隐藏
- 低耦合
- 高内聚
- 复用性
在长期的基于面向对象思想的软件开发实践中,遵循面向对象设计原则,人们总结出来一些经验,有利于提高开发人员进行软件设计的质量
启发规则具体如下:
- 设计结果应该清晰易懂:用词一致、使用已有的协议、避免模糊的定义
- 类等级深度应该适当:继承层次不要太深
- 尽量设计简单的类:避免包含过多属性、简化对象间的合作关系、不提供太多的方法
- 使用简单的协议
- 使用简单的操作
- 把设计的变动减至最小
【系统设计】
一般来说,常用的系统设计步骤如下:
- 将系统分解为子系统
- 设计问题域子系统
- 设计人机交互子系统
- 设计任务管理子系统
- 设计数据管理子系统
系统分解
把系统分解成若干个比较小的部分,然后再分别设计每个部分,这 样做不仅能降低设计的难度,还有利于软件开发人员的分工协作、维护人员对系统理解和维护。
系统的主要组成部分称为子系统,通常根据所提供的功能来划分,各个子系统之间接口应尽可能简单、明确,同时减少子系统彼此间的依赖性
问题域子系统
问题域子系统的设计基础是在分析阶段精确问题域模型,通过从实现角度补充、修改问题域模型来完成该阶段的设计任务
可能做出的补充或修改如下:
- 调整需求:用户需求或外部环境变化、分析模型不完整或不准确
- 复用已有的类:将从类库或其他来源的既存类增加到问题解决方案中
- 把问题域类组合在一起:设计时,在类库中引进一个根类,作为包容类,将所有与问题域有关的类关联到一起,建立类的层次
- 增添一般化类:所有的类组织在一起提供全系统通用的协议,比如创建、复制、删除等操作
- 调整继承层:在建立的对象模型中可能包含多继承关系,但实现时使用程序设计语言可能只有单继承,需对分析结果进行修改
人机交互子系统
人机交互子系统强调人如何命令系统,以及系统如何向用户提交信息, 人们在使用计算机过程中的感受直接影响其对系统的接受程度、评价
在现在的大型软件系统中,人机交互对象通常是窗口或报告,软件设计者至少要考虑以下 3 种窗口:
- 安全/登录窗口,其是用户访问系统的必经之路
- 设置窗口,其具有以下功能:
- 创建或初始化系统运行必需的对象
- 系统管理功能
- 启动或关闭设备
- 业务功能窗口,这种窗口用来帮助完成那些由信息系统和其用户所进行的业务交互所必要的功能
任务管理子系统
在实际系统中,许多对象之间往往存在相互依赖关系,设计工作的一项重要内容就是,确定哪些是必须同时动作的对象,哪些是相互排斥的对象,进一步设计任务管理子系统
设计任务管理子系统,包括确定各类任务并把任务分配给适当的硬件或软件去执行,其前置工作是分析并发性
并发对象有两种,一种是无交互行为的对象,另一种是同时接受事件的对象
在找出并发对象后,检查各个对象的状态图,找出未并发对象的路径(控制线),之后,通过分离出控制线设计任务
任务有多种类型:
- 事件驱动型任务:这类任务可能主要完成通信工作,如与设备、屏幕窗口、其他任务、子系统、另一个处理器或其他系统通信
- 时钟驱动型任务:某些任务每隔一定时间间隔就被触发以执行某些处理,如某些设备需要周期性地获得数据或通信
- 优先任务:优先任务可以满足高优先级或低优先级的处理需求
- 关键任务:关键任务是有关系统成功或失败的关键处理,这类处理都有严格的可靠性要求
- 协调任务:当系统中存在 3 个以上任务时,就应该增加一个任务,用它作为协调任务
在确定任务类型后,需要进行以下工作:
- 审查每个任务:对任务的性质进行仔细审查,去掉人为的、不必要的任务,使系统中包含的任务数保持到最少
- 确定资源需求:设计者在决定到底采用软件还是硬件的时候,必须综合权衡一致性、成本、性能等多种因素,还要考虑未来的可扩充性和可修改性
- 定义任务:说明任务的名称,描述任务的功能、优先级,包含此任务的服务、任务与其他任务的协同方式以及任务的通信方式
最后综合考虑,确定哪些任务硬件实现,哪些任务软件实现
数据管理子系统
数据管理子系统是系统存储或检索对象的基本设施,它建立在某种数据存储管理系统之上,并且隔离了数据存储管理模式的影响,但实现细节集中在数据管理子系统中
这样既有利于软件的扩充、移植和维护,又简化了软件设计、编码和测试的过程。
设计数据管理子系统的核心在于设计数据格式,数据格式与数据存储管理模式密切相关:
- 文件系统:达到第一范式,减少文件数,编码减少文件中的属性值
- 关系型数据库:达到第三范式,满足性能和存储需求
- 面向对象数据库:达到第三范式,满足性能和存储需求
【对象设计】
概述
对象设计以问题域的对象设计为核心,其结果是一个详细的对象模型
经过多次反复的分析和系统设计之后,设计者通常会发现有些内容没有考虑到,这些没有考虑到的内容,会在对象设计的过程中被发现
这个设计过程包括标识新的解决方案对象、调整购买到的商业化构件、对每个子系统接口的精确说明和类的详细说明等
面向对象分析得出的对象模型,通常并不详细描述类中的服务;面向对象设计则是扩充、完善和细化面向对象分析模型的过程,设计类中的服务、实现服务的算法是面向对象设计的重要任务,还要设计类的关联、接口形式以及设计的优化
对象设计的内容包括:
- 对象中对属性和操作的详细描述
- 对象之间发送消息的协议
- 类之间的各种关系的定义
- 对象之间的动态交互行为
设计类的服务
在功能模型的数据处理中,当一个处理涉及多个对象时,可参考如 下规则帮助确定服务的归属类
对于被修改的类,如果处理影响或修改了一个对象,则最好把该处理与处理目标联系在一起
对于关联中心的类,考查处理涉及的对象类以及这些类之间的关联,找到处于中心地位的类
设计类的关联
使用关联有两种可能的方式:单向遍历和双向遍历,单向遍历相对简单,仅需考虑一方到另一方;双向遍历较为复杂,要考虑双方的关系
对于关联对象来说,有以下三种情况:
- 一对一:与任一个对象合并,如学生证和准考证
- 一对多:与多端合并,如学生和班级
- 多对多:使用独立的关联类,如学生和选修课
对象设计优化
系统的各项质量指标并不是同等重要的,设计人员必须确定各项质量指标的相对重要性,此外,优化目标之间还可能存在冲突,因此要确定质量指标优先级
可以采用增加冗余关联、调整查询次序、保留派生属性等方法来提高效率
此外,建立良好的继承关系是优化设计的一项重要内容,为保证继承关系的清晰性,经常需要调整以下三个方面:
- 抽象与具体:归纳和具体化是一个持续不断的演化过程
- 提高继承程度:确保现有类的协议不变的情况下,不违背领域知识和常识
- 利用委托实现行为共享:把一类对象作为另一类对象的属性,从而在两类对象之间 建立组合关系的一种方法