面向对象的分析与设计
现已成为计算机科学研究的一个重要领域,并逐渐成为软件开发的一种主要方法。面向对象
方法以客观世界中的对象为中心,其分析和设计思想符合人们的思维方式,分析和设计的结
构与客观世界的实际比较接近,容易被人们接受。在面向对象方法中,分析和设计的界面并
不明显,它们采用相同的符号表示,能够方便地从分析阶段平滑地过渡到设计阶段。此外,
在现实生活中,用户的需求经常会发生变化,但客观世界的对象及对象间的关系比较稳定,
因此用面向对象方法分析和设计的结构也相对比较稳定。
8.4.1 面向对象的基本概念
1.对象和类
对象是系统中用来描述客观事物的一个实体,它由对象标识(名称)、属性(状态、数
据、成员变量)和服务(操作、行为、方法)三个要素组成,它们被封装为一个整体,以接
口的形式对外提供服务。
在现实世界中,每个实体都是对象,如学生、书籍、收音机等;每个对象都有它的操作,
例如书籍的页数,收音机的频道、按钮等属性,以及收音机的切换频道等操作。
而类则是对具有相同属性和服务的一个或一组对象的抽象。类与对象是抽象描述和具体
实例的关系,一个具体的对象被称为类的一个实例。在系统设计过程中,类可以分为三种类
型,分别是实体类、边界类和控制类。
(1)实体类:实体类映射需求中的每个实体,实体类保存需要存储在永久存储体中的
信息,例如,在线教育平台系统可以提取出学员类和课程类,它们都属于实体类。实体类通
常都是永久性的,它们所具有的属性和关系是长期需要的,有时甚至在系统的整个生存期都
需要。
实体类是对用户来说最有意义的类,通常采用业务领域术语命名,一般来说是一个名词,
在用例模型向领域模型的转化中,一个参与者一般对应于实体类。通常可以从 SRS 中的那
些与数据库表(需要持久存储)对应的名词着手来找寻实体类。通常情况下,实体类一定有
属性,但不一定有操作。
(2)控制类:控制类是用于控制用例工作的类,一般是由动宾结构的短语(“动词+名
词”或“名词+动词”)转化来的名词,例如,用例“身份验证”可以对应于一个控制类“身
份验证器”,它提供了与身份验证相关的所有操作。控制类用于对一个或几个用例所特有的
控制行为进行建模,控制对象(控制类的实例)通常控制其他对象,因此,它们的行为具有
协调性。
控制类将用例的特有行为进行封装,控制对象的行为与特定用例的实现密切相关,当系
统执行用例的时候,就产生了一个控制对象,控制对象经常在其对应的用例执行完毕后消亡。
通常情况下,控制类没有属性,但一定有方法。
(3)边界类:边界类用于封装在用例内、外流动的信息或数据流。边界类位于系统与
外界的交接处,包括所有窗体、报表、打印机和扫描仪等硬件的接口,以及与其他系统的接
口。要寻找和定义边界类,可以检查用例模型,每个参与者和用例交互至少要有一个边界类,
边界类使参与者能与系统交互。边界类是一种用于对系统外部环境与其内部运作之间的交互
进行建模的类。常见的边界类有窗口、通信协议、打印机接口、传感器和终端等。实际上,
在系统设计时,产生的报表都可以作为边界类来处理。
边界类用于系统接口与系统外部进行交互,边界对象将系统与其外部环境的变更(例如,
与其他系统的接口的变更、用户需求的变更等)分隔开,使这些变更不会对系统的其他部分
造成影响。通常情况下,边界类可以既有属性也有方法。
2.继承与泛化
继承是面向对象方法中重要的概念,用来说明特殊类(子类)与一般类(父类)的关系,
而通常用泛化来说明一般类与特殊类的关系,也就是说它们是一对多关系。
如图 8-11 所示,“交通工具”是“自行车”和“小轿车”的泛化;“自行车”和“小轿
车”从“交通工具”中继承。
3.多态与重载
多态(即多种形式)性是指一般类中定义的属性或服务被特殊类继承后,可以具有不同
的数据类型或表现出不同的行为,通常是使用重载和改写两项技术来实现的。一般有 4 种不
同形式的多态,如表 8-4 所示。
注 1:重载也称为过载、重置;
注 2:参数多态和包含多态称为通用多态,重载多态和强制多态称为特定
多态。
希赛教育专家提示:虽然重载和改写都是在多种潜在的函数体中,选择和调用某一个函
数或方法并对其进行执行,但它们的本质区别在于:重载是编译时执行的(静态绑定),而
改写则是运行时选择的(动态绑定)。
4.模板类
也称为类属类,它用来实现参数多态机制。一个类属类是关于一组类的一个特性抽象,
它强调的是这些类的成员特征中与具体类型无关的那些部分,而用变元来表示与具体类型有
关的那些部分。
5.消息和消息通信
消息就是向对象发出的服务请求,它通常包括提供服务的对象标识、消息名、输入信息
和回答信息。消息通信则是面向对象方法学中的一个重要原则,它与对象的封装原则密不可
分,为对象间提供了唯一合法的动态联系的途径。
8.4.2 面向对象分析
面向对象分析的目标是开发一系列模型,这些模型描述计算机软件,当它工作时以满足
一组客户定义的需求。对象技术的流行,演化出了数十种不同的 OOA 方法,每个方法都引
入了一个产品或系统分析的过程、一组过程演化的模型及使软件工程师能够以一致的方式创
建每个模型的符号体系。其中比较流行的方法包括 OMT、OOA、OOSE、Booch 方法等,而
OMT、OOSE、Booch 最后则统一成为 UML。
1.OOA/OOD 方法
这是由 Peter Coad 和 Edward Yourdon 提出的,
OOA 模型中包括主题、对象类、结构、
属性和服务 5 个层次,需经过标识对象类、标识结构与关联(包括继承、聚合、组合、实
例化等)、划分主题、定义属性、定义服务 5 个步骤来完成整个分析工作。
OOD 中将继续贯穿 OOA 中的 5 个层次和 5 个活动,它由人机交互部件、问题域部件、
任务管理部件、数据管理部件 4 个部分组成,其主要的活动就是这 4 个部件的设计工作。
设计问题域部分:OOA 的结果恰好是 OOD 的问题域部件,分析的结果在 OOD 中可以被
改动或增补,但基于问题域的总体组织框架是长时间稳定的;
设计人机交互部件:人机交互部件在上述结果中加入人机交互的设计和交互的细节,包括窗
口和输出报告的设计。可以用原型来帮助实际交互机制进行开发和选择;
设计任务管理部分:这部分主要是识别事件驱动任务,识别时钟驱动任务,识别优先任务和
关键任务,识别协调者,审查每个任务并定义每个任务。
设计数据管理部分:数据管理部分提供了在数据管理系统中存储和检索对象的基本结构,其
目的是隔离数据管理方法对其他部分的影响。
2.Booch 方法
Booch 认为软件开发是一个螺旋上升的过程,每个周期中包括标识类和对象、确定类和
对象的含义、标识关系、说明每个类的接口和实现 4 个步骤。它的模型中主要包括如表 8-5
所示的几种图形。
Booch 方法的开发过程是一个迭代的、渐进式的系统开发过程,它可以分为宏过程和微
过程两类。宏过程用于控制微过程,是覆盖几个月或几周所进行的活动,它包括负责建立核
心需求的概念化,为所期望的行为建立模型的分析,建立架构的设计,形成实现的进化,以
及管理软件交付使用的维护等 5 个主要活动。
而微过程则基本上代表了开发人员的日常活动,它由 4 个重要、没有顺序关系的步骤
组成:在给定的抽象层次上识别出类和对象,识别出这些类和对象的语义,识别出类间和对
象间的关系,实现类和对象。
3.OMT 方法
OMT 是对象建模技术的缩写,它是由 Jam Rambaugh 及其同事合作开发的,它主要用
于分析、系统设计和对象设计。包括对象模型(静态的、结构化的系统的“数据”性质,通
常采用类图)、动态模型(瞬时的、行为化的系统“控制”性质,通常使用状态图)和功能
模型(表示变化的系统的“功能”性质,通常使用数据流图)。OMT 方法的三大模型如表 8-6
所示。