软件工程导论第11章 面向对象设计
张海藩《软件工程导论》(第6版)(章节题库 第11章 面向对象设计)【圣才出品】

第11章面向对象设计一、选择题1.()是不需要接收消息就能主动执行的服务。
A.内部服务B.外部服务C.内嵌服务D.上层服务【答案】B【解析】主动服务是不需要接收消息就能主动执行的服务,它在程序实现中是一个主动的程序成分,而外部服务属于主动服务,所以答案选B项。
2.火车是一种陆上交通工具,火车和陆上交通工具之间的关系是()关系。
A.组装B.整体与部分C.has aD.一般与具体【答案】D【解析】火车是一种陆上交通工具,而陆上交通工具不一定是火车,还可以是汽车、自行车等,说明火车是陆上交通工具的具体化,而陆上交通工具是火车的一般化,所以它们之间的关系是一般与具体的关系。
3.()只供对象内部的其他服务使用,不对外提供。
A.外部服务B.内部服务C.内嵌服务D.上层服务【答案】B【解析】对象的服务分为外部服务和内部服务两种,其中,内部服务只供内部的其它服务使用,不对外提供,外部服务只供对象外部的其它服务使用,不对内提供。
4.对象标识是分配给每个对象的永久性标识(又称作“柄”),它不符合下述条件()。
A.在一定的范围或领域(例如一个应用系统)中是唯一的B.与对象实例的特征、状态及分类(可能是动态的)无关C.在对象存在期间保持一致D.在对象存在之后保持一致【答案】D【解析】对象标识符合如下几个条件:①在一定的范围或领域中是唯一的;②与对象实例的特征、状态及分类无关;③在对象期间保持一致。
5.对象或者类的整体行为(例如响应消息)的某些规则所不能适应的(对象或类的)()。
A.状况B.情态C.条件D.问题【答案】D【解析】对象或者类的整体行为(例如响应消息)的某些规则所能适应的(对象或类的)状况、情况、条件、形式或生存周期阶段。
二、填空题1.对象的服务可分为_____、_____。
【答案】外部服务;内部服务2._____不同取值所构成的组合都可看作对象的一种新的状态。
【答案】对象的每个属性3.如果在一个服务中包括了多项可独立定义的功能,则它是_____,应尝试把它分解为多个服务。
软件工程第十一章面向对象设计

THANKS
感谢观看
01
抽象类是一种不能被实例化的 类,它只能被其他类继承。
02
抽象类可以包含抽象方法和具 体方法。抽象方法是没有具体 实现的方法,需要在继承抽象 类的子类中实现。
03
通过继承抽象类,子类可以继 承抽象类的属性和方法,并且 可以重写或实现抽象类中的方 法。
接口与抽象类的选择
在设计软件时,选择使用接口还是抽象类取决于具体需求和设计目标。
关系
关系描述了对象之间的交互和联系。 常见的关系包括关联、聚合和继承。
继承与多态的设计
继承
继承是一种实现代码重用的方式,子类可以继承父类的属性和方法,并可以扩展或覆盖它们。通过继承,可以建 立类之间的层次结构,使得代码更加清晰和易于维护。
多态
多态是指一个接口可以有多种实现方式,或者一个对象可以有多种形态。多态可以提高代码的灵活性和可扩展性, 使得程序更加易于维护和修改。
02
类与对象的设计
类的定义与属性
类的定义
类是对象的抽象,它描述了一组具有相同属性和行为的对象。类定义了对象的结构、行为和关系。
属性
属性是类中用于描述对象状态的变量。每个对象都有其自己的属性值,这些属性值决定了对象的状态 。
对象的行为与关系
行为
行为是类中定义的方法,用于描述对 象可以执行的操作。方法定义了对象 的行为和功能。
高层模块不应该依赖于低层模块,它们都应 该依赖于抽象。
面向对象设计的优势
提高代码可重用性
通过类和继承实现代码重用,减少重 复代码。
提高代码可维护性
面向对象设计使得代码结构更加清晰, 易于理解和维护。
提高开发效率
通过快速原型开发,快速构建软件系 统。
西安工业大学《软件工程》第十一章 面向对象设计

(1) 最小化各构件间的通信:应使得在子系统的各个高层构件之间的通信量应当达到最小。
个用户界面应当能够自行处理交互、改正错误和控制硬件,而不需打扰主应用。
仅当通过界面输入一个请求的时候,才需要把它转送到应用的其余部分。
(2) 隐藏复杂性:子系统应当把那些成组的类打包,形成高度的内聚。
例如,一个框架在它的类中间就存在高度的交互。
事实上,它自己就是一个子系统。
(3)逻辑功能分组:虽然输入和输出设备可能相互间不通信,但逻辑上把它们归组到一个处理输入/输出的子系统中,这样就提供了一个单元,它很容易识别并定位问题论域中的事件。
类与通过概念封装的子系统十分类似。
事实上,每个子系统都可以被当做一个类来实现,这个类聚集了它的构件,提供了一组操作。
类和子系统的结构是正交的,一个类的实例可能不止一个子系统的一部分。
高层设计标识在计算机环境中实现问题解决所需要的概念,并增加了一批必要的类。
这些类包括那些可使应用软件与系统的外部世界交互的类。
这些交互则包括与其他软件系统(如数据库管理系统、鼠标和键盘)的界面,与收集数据或者负责控制的硬件设备的界面等。
此阶段的输出是适合应用软件要求的类、类间的联系以及应用的子系统视图规格说明。
高层设计可以表征为标识和定义模块的过程。
但这种模块可以是一个单个的类,还可以是由一些类组合成的子系统,定义过程职责驱动的。
Wirfs-Brock和Helm等人使用了术语“契约”来描述类接口的协议,因为对象双方必须满足契约的条款,因此需要契约类比。
需方提出的请求必须列在协议表中,供方则必须提供所有协议的服务。
如果设计师安全遵循规范,高层设计和类设计这两个阶段是相对封闭的。
在这种情况下,应用软件中的每一个事物都是一个对象,包括应用软件自身在内。
根据这种思想,这两个阶段又是关联的。
应用软件的设计是大类的设计,这种类设计考察应用软件所期望的每个行为,并利用这些行为形成应用类的界面。
在进行应用类的内部设计时,使用了一些提供了某些行为的类的实例,它们相应于高层设计中所标识的子系统。
软件工程 第十一章面向对象设计

第十一章面向对象设计
(3) 一般-特殊内聚。设计出的一般-特殊结 构,应该符合多数人的概念,更准确地说,这 种结构应该是对相应的领域知识的正确抽取。 一般说来,紧密的继承耦合与高度的一般-特 殊内聚是一致的。
第十一章面向对象设计
6. 可重用 •软件重用是提高软件生产率和质量的重要途 径。在面向对象设计中,重用占有非常重要 的地位。 •重用从设计阶段开始。 •重用有两方面的含义: 一.是尽量使用已有的类(包括开发环境提 供的类库,及以往开发类似系统时创建的类), 二.是如果确实需要创建新类,则在设计 这些新类的协议时,应该考虑将来的可重复 使用性。
第十一章面向对象设计
(4) 避免模糊的定义。一个类的用途应该 是有限的,而且应该从类名可以较容易地推 想出它的用途。 2. 一般-特殊结构的深度应适当 •类等级中包含的层次数要适当。 •一般说来,在一个中等规模(大约包含100个 类)的系统中,类等级层次数应保持为7±2。 •不应该仅仅从方便编码的角度出发随意创建 派生类,应该使一般-特殊结构与领域知识或 常识保持一致。
第十一章面向对象设计
第11章 面向对象设计
第十一章面向对象设计
11.1 11.2 11.3 11.4 11.5 11.6
面向对象设计的准则 启发规则 软件重用 系统分解 设计问题域子系统 设计人机交互子系统
第十一章面向对象设计
11.7 设计任务管理子系统 11.8 设计数据管理子系统 11.9 设计类中的服务 11.10 设计关联 11.11 设计优化
第十一章面向对象设计
4. 弱耦合 •耦合指一个软件结构内不同模块之间互连的 紧密程度。 •在面向对象方法中,对象是最基本的模块, 因此,耦合主要指不同对象之间相互关联的 紧密程度。 •弱耦合是优秀设计的一个重要标准,低耦合 使得系统中某一部分的变化对其他部分的影 响降到最低程度。在理想情况下,对某一部 分的理解、测试或修改,无须涉及系统的其 他部分。
第十一章 软件工程 面向对象设计

11.1 面向对象设计的准则
强内聚—— 服务内聚:一个服务应该完成一个且仅完成一个功能。 类内聚:一个类应该只有一个用途,它的属性和服务应该
是高内聚的,也就是说,类的属性和服务应该全都是完成 该类对象的任务所必需的,其中不包含无用的属性或服务 。实际上,对于面向对象软件来说,最佳的内聚是信息型 内聚:一个模块可以完成许多相关的操作,每个操作都有 各自的入口点,它们的代码相对独立,而且所有操作都在 相同的数据结构上完成 。 一般-特殊内聚:设计出的一般-特殊结构应该是对相应的 领域知识的正确抽取。一般说来,紧密的继承耦合与高度 的一般-特殊内聚是一致的。
7
11.1 面向对象设计的准则
可重用——重用是提高软件开发生产率和目标系统质量的
重要途径。
重用基本上从设计阶段开始。
重用有两方面的含义:
尽量使用已有的类(包括开发环境提供的类库,及以往开
发类是系统是创建的类)
如果确实需要创建新类,则在设计这些新类的协议时,应
该考虑将来的可重复使用性
8
11.2 启发规则
各开发活动之间的平滑过渡,这是面向对象方法的一大优 点。
3
概述
数据 客观世界的 对象和操作 程序员对 问题的表达 问题空间 客观世界的算法空间 结果
客观世界 的对象
程序设计语言 的对象和操作
计算机算法 解空间 输出数据
•对象、操作、消息 类、实例和继承 •对象描述(对象名及所属对象类,私有数据结构的每一 数据项及类型,每个操作的过程描述或指向该过程描述 的指针)
2
概述
设计是把分析阶段得到的对目标系统的需求转变成符合成
本和质量要求的、抽象的系统实现方案的过程。
从面向对象分析到面向对象设计,是一个逐渐扩充模型的
高级软件工程第十一章面向对象设计方法课件

由一个用例的实现接着一个用例的实现完成的。 ➢用例的实现:对每个用例的详细系统过程的说
明。
3
病 原 体 侵 入 机体, 消弱机 体防御 机能, 破坏机 体内环 境的相 对稳定 性,且 在一定 部位生 长繁殖 ,引起 不同程 度的病 理生理 过程
提取边界类、实体类和控制类
➢一个用例通常对应一个控制类。 ➢如果不同用例的任务有较多类似之处,也可以
考虑在多个用例的实现方案中共享同一控制类 ,此种情况应审慎对待,不同用例所需要的控 制、协调行为往往会有差异。 ➢对于那些事件流非常简单的用例,可以不设独 立的控制类,直接在边界类中设置控制、协调 功能,边界类在实体类的帮助下完成用例要求 的功能及行为。
顺序图初步设计的规则
➢接受每个输入消息并确定由这个输入消息产生 的所有的内部消息。
➢在处理每个消息的时候,一定要辨别出受之影 响的类的完整集合,即从领域类图中找到需要 的所有对象。
➢充实消息的结构。添加迭代、真/假条件、返 回值和传递参数。
21
病 原 体 侵 入 机体, 消弱机 体防御 机能, 破坏机 体内环 境的相 对稳定 性,且 在一定 部位生 长繁殖 ,引起 不同程 度的病 理生理 过程
22
病 原 体 侵 入 机体, 消弱机 体防御 机能, 破坏机 体内环 境的相 对稳定 性,且 在一定 部位生 长繁殖 ,引起 不同程 度的病 理生理 过程
精化类图
➢ 在UML交互图中,对每个类的对象都规定了它必须响应的消息 以及类的对象之间的消息传递通道。前者对应于类的操作, 后者则对应于类之间的连接关系。因此,可以利用交互图精 化分析模型中的类图,将交互图中出现的新类添加到原有类 图中,并且对相关的类进行精化,定义其属性和操作。
软件工程第十一章面向对象设计
Client
request
subsystem
Server subsystem
contract
② 平等伙伴(peer-to-peer)关系:
Peer subsystem
contract
request request
Peer subsystem
contract
2、系统组织方案
① 水平层次组织: 将系统组织成hierarchy,同一层中的objects相
sses中相似的methods最好取同一名字。 ② 使用已有的protocol。 ③ 尽量减少message模式的数目。 ④ 避免模糊定义。
2、一般-特殊结构的深度应适当 (约100个classes,则设计7±2层)
3、设计简单的class(定义不超过一页纸或两屏)。 应注意:
① 避免过多attributes; ② 能用简单的语句描述一个class的任务; ③ objects之间合作关系要简单; ④避免过多methods( 7个)。 问题:设计出大量的classes,使结构复杂度增加。 解决:划分主题,提高可理解性。
4、使用简单的protocol,减少message 中传递的 parameters
5、使用简单的method(CASE 可考虑用 inheritance替代)。
6、把设计变动减至最小。
11.3 软件重用
概念: 知识重用(例如软件工程知识的重用)
方法和标准重用(例如OO方法和国家规定 的软件开发规范的重用)
知识 工程
软件成分的重用
重用软件成分有三个级别: ① 代码重用:
• 源码剪贴 —— 无法溯源,无配置管理
• Include —— 修改后所有包含了此段代码的程 序都须重新编译。
软件工程导论第11章
2、实现单向关联 1)用指针可以方便地实现单向关联。 2)如果关联的阶是一元的,则实现关联的指
针是一个简单指针;如果阶是多元的,则 需要用一个指针集合实现关联。
39
3、实现双向关联
实现双向关联有下列三种方法:
1. 只用属性实现一个方向的关联,当需要反向 遍历时就执行一次正向查找。
2. 两个方向的关联都用属性实现,这种方法能 实现快速访问。
2、提供一种简便可靠的软构件组合机制。 3、设计类时,应注意以下可能影响重用性的操作:
? 与表示方法有关的操作。例如,不同实例的比较、显 示、擦除等等。
? 与数据结构、数据大小等有关的操作。 ? 与外部设备有关的操作。例如,设备控制。 ? 实现算法在将来可能会改进(或改变)的核心操作 19
11.3.3 软件重用的效益
)、(
)和(
)。
2、软件重用是提高软件(
)和目标系统(
)的重要
途径,它基本上始于设计。其中软件成分重用可划分成以下 3个
级别即代码重用、设计成果重用和分析结果重用。
3、面向对象设计的 6个准则:( )、( )、( )、弱耦合 、( )和( )。
4、一般来说,对象之间的耦合分为两大类:( )和( )。
2. 一般—特殊结构的深度应适当 中等规模的系统中,类等级层次数应保持
为7±2。不是必要情况,不应该随意创建派生类;
3. 设计简单的类:设计小而简单的类,便于 开发和管理; 1)避免包含过多的属性; 2)有明确的定义; 3)尽量简化对象之间的合作关系; 4)不要提供太多服务。
4. 使用简单的协议:设计简单的类接口,发送 的消息中参数要少。
5. 使用简单的服务:编写实现每一个服务时, 避免复杂的语句和结构;
软件工程面向对象设计
运用提取方法、移动方法、重命名等重构手法,提高代码质量。
版本控制工具使用
利用Git等版本控制工具管理代码变更,确保团队协作顺畅进行。
测试驱动开发与自动化测试
01
测试驱动开发实践
先编写测试用例,再实现功能代码,以确保代码质量和可测试性。
02
自动化测试框架选择
根据项目需求选择合适的自动化测试框架,如JUnit、TestNG等。
方法(Method)
方法是对象的行为或操作,用于改变对象的状态或与其他对象交互。
封装与继承
封装(Encapsulation)
封装是将对象的属性和方法结合成一个独立的单元,并隐藏内部实现细节。封装提供了安全性和数据 隐藏,只允许通过对象的方法来访问和修改其状态。
继承(Inheritance)
继承是一种允许类继承另一个类的属性和方法的机制。子类(派生类)可以继承父类(基类)的属性 和方法,并可以添加新的属性和方法或覆盖父类的方法。继承实现了代码重用和层次化的类结构。
数据库设计与ORM技术
数据库设计
根据领域模型和业务需求,设计数据库表结构、索引和约束等。
ORM技术
使用对象关系映射(ORM)技术,实现数据库表与程序中的类之 间的映射,简化数据访问操作。
数据库操作优化
针对数据库操作的性能瓶颈,进行优化设计,如使用连接池、缓存 等技术。
界面设计与交互体验优化
界面设计
03
单元测试与集成测试
编写高质量的单元测试和集成测试,提高代码覆盖率,降低缺陷率。
团队协作与敏捷开发方法
编码规范与代码审查
制定统一的编码规范,进行定期的代码审查, 提高代码质量。
任务分解与优先级排序
软件工程-第11章-面向对象设计
设计任务管理子系统
设计任务管理子系统:确定各类任务并把任务分 配给适当的硬件或软件去执行。
确定事件驱动型任务:由事件驱动完成通信工作的任 务。
确执定行时某钟些驱处动理型的任任务务:。每隔一表定明时某间些间数隔据就到被达触的发信以号 确定优先任务和关键任务:有关系统成功或失败的关
在面向对象分析中,只涉及到问题论域部分, 其余3部分是在面向对象设计中加进来的。
图11.2 典型的面向对象设计模型
设计问题域子系统(一)
面向对象设计通常仅需从实现角度对问题域模 型作一些补充或修改,主要是增添、合并或分 解类-&-对象、属性及服务,调整继承关系 等。
调整需求:修改分析结果,再把修改反映到问题域 子系统中
*11.3 软件重用(一)
概念
重用:也叫再用或复用,是指同一事物不 作修改或稍加改动就多次重复使用。包括 知识重用、方法和标准的重用、软件成分 的重用3个层次。
1. 软件成分的重用级别
代码重用:调用库中的模块,
源代码剪贴:存在配置管理问题,无法跟踪 原始代码块的修改
源代码包含:提供包含(include)库中源代 码,修改库中源代码之后,所有包含它的程 序都必须重新编译
和继承机制,增加了创建及管理类和对象的通用服务 2)扩展的面向对象程序设计语言:增加了在数据库中
存贮和管理对象的机制
设计数据管理子系统
设计数据格式 设计相应的服务
设计类中的服务
确定类中应有的服务 设计实现服务的方法
设计实现服务的算法
算法复杂度 容易理解与容易实现 易修改
选择数据结构 定义内部类和内部操作
设计关联
关联的遍历 实现单向关联 实现双向关联 链属性的实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
使用方便,欠标准
11.8.2 设计数据管理子系统
设计数据格式和相应的服务。 1. 设计数据格式 (1) 文件系统:属性表规范成第一范式=纪录。 (2) 关系数据库:类的第三范式属性表=数据库表。 (3) 面向对象数据库:不必
2. 设计相应的服务
在需要存储类中增加一个属性和服务用于完成存 储对象自身的工作。 在某个基类中定义这样的属性和服务。需要存储 类的对象就从此基类中继承此属性和服务。
11.9 设计类中的服务
11.9.1 确定类中应有的服务
面向对象分析得出的对象模型只列出及功能模型 中的数据处理,转换成由适当的类所提供的服务。
11.9.2 设计实现服务的方法
1. 设计实现服务的算法考虑的因素: (1) 选用复杂度较低的算法,不要过分追求高效率。 (2) 容易理解与容易实现:往往与高效率有矛盾。 (3) 易修改: 预测并准备可能的修改。
(3) 多态重用 利用多态性可简化对象的对外接口 (基类与派生类 相同的对外接口),从而降低了消息的复杂程度。 运行时,接收消息的对象由多态性机制启动自己特 定的方法,去响应一个一般化的消息,从而简化了 消息界面。
11.3.3 软件重用的效益
1. 质量:重用构件错误较少 2. 生产率:30~50%的重用导致生产率提高25~40% 3. 成本节省
面向对象设计
设计则是把分析阶段得到的需求转变成符合成本 和质量要求的、抽象的系统实现方案的过程。 从面向对象分析到面向对象设计(OOD),是一个 逐渐扩充模型的过程。 许多分析结果可以直接映射成设计结果,而在设 计过程中又往往会加深和补充对系统需求的理解, 从而进一步完善分析结果。 面向对象方法的一大优势就是分析和设计活动之 间的平滑(无缝)过渡。
11.3.2 类构件
1. 可重用软构件应具备的特点
(1) 模块独立性强:具有单一、完整的功能,且经 过反复测试被确认是正确的。 (2) 具有高度可塑性:必须提供为适应特定需求而 扩充或修改已有构件的机制,且使用起来非常简单 方便。 (3) 接口清晰、简明、可靠,详尽的文档说明。 精心设计的“类”基本上能满足上述要求。
11.1 面向对象设计的准则
优秀设计就是使得系统在其整个生命周期中的总开 销最小的设计, 其主要特点就是容易维护。 结合面向对象方法的特点, 下面重温本书第5章讲 述的指导软件设计的几条基本原理。 它们在进行 面向对象设计时仍然成立。
1. 模块化 面向对象软件开发模式,很自然地支持模块的设计 原理:对象就是模块。 2. 抽象 面向对象方法支持过程和数据抽象。 类是一种抽象数据类型。使用者无须知道类中数据 元素的具体表示方法,就可以通过接口使用类中定 义的数据。 这类抽象称为规格说明抽象。 3. 信息隐藏 对象的封装性实现支持了信息隐藏。
定义一个ObjectServer(对象服务器)类,并创建 它的实例。
11.8.3 例子
ATM系统中,永久性数据存储放在分行计算机中。 因为必须保持数据的一致性和完整性,而且有多个 并发事务同时访问这些数据,因此,采用成熟的商 品化关系数据库管理系统存储数据。 每个事务/更新作为一个不可分割的批操作来处理, 由事务/更新封锁账户直到该事务结束为止。
3. 10种典型的可重用软件成分 (1) 项目计划:软件质量保证计划。 (2) 成本估计:不同项目中类似功能的成本估算。 (3) 体系结构:事务类处理体系结构。 (4) 需求模型/规格说明:对象模型,数据流图。 (5) 设计:体系结构、数据、接口和过程设计。 (6) 源代码:兼容的程序构件。 (7) 用户文档和技术文档:部分重用。 (8) 用户界面:GUI 可占应用程序的60%代码量。 (9) 数据: 记录结构,文件和完整的数据库。 (10 测试用例:与重用设计或代码相关的用例。
由于对象包含了程序和数据,面向对象的数据管理 子系统比面向过程的系统更必需更复杂。
11.8.1 选择数据存储管理模式
1. OS文件:成本低,简单,效率低 2. 关系数据库:标准, 通用,成熟,开销大 3. 面向对象数据库管理系统:专门管理对象的新 技术:扩展的关系数据库或面向对象程序设计语言。
(1) RDBM+OO
(2) 平等伙伴关系(peer-to-peer)关系
每个子系统都可能调用其他子系统,因此,每个子 系统都必须了解其他子系统的接口。这种组织系统 的方案比起客户-供应商方案来,交互更复杂,从 而使系统难于理解,容易发生不易察觉的设计错误。
3. 设计(分布式)系统的拓扑结构 由子系统组成完整的系统时,典型的拓扑结构有管 道形、树形、星形等。设计者应该采用与问题结构 相适应的、尽可能简单的拓扑结构,以减少子系统 之间的交互数量。
11.4 系统分解
解决复杂问题的普遍策略:“分而治之,各个击破” 系统的主要组成部分称为子系统, 根据所提供的功 能来划分。 子系统之间应该具有尽可能简单、明确的接口。 相对独立地设计各个子系统, 减少子系统彼此间 的依赖性。 在逻辑上都有4个子系统: 问题域子系统、人机交 互子系统、任务管理子系统和数据管理子系统。
6. 把设计变动减至最小(稳定性) 设计的质量越高,设计结果越稳定。 随着时间推移,设计方案日趋成熟,改动越来越小。
11.3 软件重用
11.3.1 概述
1. 重用 重用也叫再用或复用,是指同一事物不作修改或稍 加改动就多次重复使用。软件重用可分为3个层次: (1) 知识重用(例如,软件工程知识的重用)。
1. 调整需求 一是用户需求或外部环境发生了变化; 二是对象分析模型不能完整、准确地反映用户的真 实需求。
2. 重用已有的类 重用已有类的典型过程如下: (1) 选择重用最相似的已有类。 (2) 从被重用的已有类派生出问题域类。 (3) 增加或修改问题域类中需要的属性和服务。 (4) 修改与问题域类相关的关联。
不同的软件系统中,这四个子系统的重要程度和规 模可能相差很大: 某些系统仅有3个(甚至少于3个) 子系统。
1. 子系统之间的两种交互方式 (1) 客户-供应商关系 (Client-supplier)
“客户”的子系统调用作为“供应商”的子系 统,后者完成某些服务工作并返回结果。使用 这种交互方案,作为客户的子系统必须了解作 为供应商的子系统的接口,然而后者却无须了 解前者的接口,因为任何交互行为都是由前者 驱动的。 尽量使用客户-供应商关系。
(2) 方法和标准的重用(例如,面向对象方法或国家 制定的软件开发规范的重用)。
(3) 软件成分的重用。
2. 软件成分的重用级别 软件成分的重用的3个级别: (1)几种形式的代码重用 源代码剪贴:几乎无法跟踪原始代码块的修改 源代码包含#include :重新编译都用最新源代码 继承:可扩充或修改库中的类而不影响原有的代 码 (2) 设计结果重用 重用某个软件系统的设计模型。 (3) 分析结果重用 重用分析模型, 例如,把一个应用系统移植到完 全不同的软硬件平台上。
2. 一般-特殊结构的深度应适当 一个中等规模(大约包含100个类)的系统中,类等级 层次数应保持为7±2。 不应该仅仅从方便编码的角度出发随意创建派生类, 应该使一般-特殊结构与领域知识或常识保持一致。
3. 设计简单的类
小而简单的类便于开发和管理(高内聚)。为使类保 持简单,应该注意以下几点。 (1) 避免包含过多的属性:完成的功能可能太多了。 (2) 有明确的定义:任务应该简单。
2. 设计任务管理子系统 任务分类: 事件驱动型任务、时钟驱动型任务、 优先任务、关键任务和协调任务。
设计任务管理子系统,包括确定各类任务并把任 务分配给适当的硬件或软件去执行。 OOD:可能增加新类或用已有类来实现任务管 理。
11.8 设计数据管理子系统
数据管理子系统是系统存储或检索对象的基本设施。 它建立在某种数据存储管理模式(文件、关系数据 库或面向对象数据库)之上而隔离了数据存储管理 模式对对象存储或检索的影响。
3. 增添一般化类以建立协议 一些类需要有一个公共的协议:类似的服务, 共 同接口。可以引入一个根类以便建立这个协议。
11.6 设计人机交互子系统
人机交互子系统设计确定人机交互的细节,包括指 定窗口和报表的形式、设计命令层次等。 原型是成功地设计人机交互的常用手段。
11.7 设计任务管理子系统
ATM系统的星型结构实例
11.5 设计问题域子系统
设计受具体实现环境的约束: 本项目预计要使用的编程语言 可用的软构件库(主要是类库) 程序员的编程经验。 注意:分析模型为设计奠定了基础, 应尽可能保留。 设计仅需从实现角度对模型做一些补充或修改: 增添、合并或分解类与对象、属性及服务,调整继 承关系等。
6. 可重用 重用有两方面的含义: 一是尽量使用已有的类。 二是在设计新类的协议时考虑将来的可重用性。
11.2 启发规则
1. 设计结果应该清晰易懂 保证设计结果清晰易懂的主要因素如下: (1) 用词一致:一词一用。 (2) 使用已有的协议。 (3) 减少消息模式的数目。 (4) 避免模糊的定义:类的用途有限,名清晰
(3) 简化对象之间的合作关系:如果需要多个对象 协同配合才能做好一件事,则破坏了类的简明性和 清晰性。
(4) 不要提供太多服务:典型地,一个类提供的公 共服务不超过7个。
4. 使用简单的协议
消息中的参数最好不要超过3个。 复杂消息导致对象紧耦合。 5. 使用简单的服务(模块复杂性)
类中的服务小为好,3~5行源程序语句,可用一个 简单句子描述它的功能。
2. 类构件的重用方式 (1) 实例重用 按照需要创建类的实例。然后向它发送消息,启动 相应的服务,完成需要完成的工作。 还可以用几个简单实例/类创建出一个更复杂的类, 见继承重用。类提供的服务过少,则难被重用。 (2) 继承重用 提高继承重用的关键是设计合理的、具有一定深度 的类构件继承层次结构: 每个子类只加入少量新属性和新服务,而降低其接 口复杂度,表现出一个清晰的进化过程,提高可理 解性;也为多态重用奠定了良好基础。