【软件工程】第六章 面向对象方法
6.1 面向对象方法的概念
6.1.2 主要特点
- 用对象作为对事物的抽象表示,并以此作为系统的基本构成单位。
- 事物的静态特征用对象的属性表示。
- 事物的动态特征(即事物的行为)用对象的操作表示。
- 对象的属性和操作结合为一体,构成独立且对外屏蔽细节的实体。
- 对事物分类,将具有相同属性和操作的对象归为一类。
- 通过在不同程度上运用抽象的原则(或多或少地忽略事物之间的差异),得到较一般的类和特殊的类,通过继承关系简化系统的构造过程及文档。
- 复杂的对象可以用简单的对象作为其构成部分(聚合)。
- 对象间只能通过消息进行通信(不允许一个对象直接使用另一个对象的属性),以实现对象间的动态联系。
- 用关联表达类之间的静态关系。
6.1.3 基本思想
- 从现实世界中客观存在的事物出发建立软件系统。
- 充分运用人类日常的思维方法。
6.1.4 学习范围
- 基本知识
- 面向对象分析(OOA)
- 面向对象设计(OOD)
- 面向对象程序设计(OOP)
6.2 UML
6.2.1 概述
- 一种可视化语言。
- 是规约系统的制品:UML适用于对所有重要的分析、设计和实现决策进行详细概述。
- 是构造系统的制品:UML描述的模型可与各种编程语言直接相关联。
6.2.2 面向对象方法术语/符号
提供了两种术语:
- 结构化地表达客观事物的术语
- 表达客观事物之间关系(相互作用\相互影响)的术语
除此之外还有:
- 为了控制信息组织的复杂性,还引入了用于组织特定对象结构的包。
- 为了使建造的系统模型容易理解,引入了注解。
6.3 结构化表达客观事物的术语
6.3.1 类与对象
- 类(Class):一组具有相同属性、操作、关系和语义的对象的描述。
- 对象(object):对象是类的一个实例。
类的结构:
类的简化表示:
①
②
③
抽象类用斜体表示:
类名:
- 类名使用黑体字,第一个字母通常大写,并位于第一栏的中间。
- 类名往往是从正被建模系统的词汇表中提取的简单名词或名词短语。
属性:
- 一个属性往往具有所属的类型、用于描述该特性的实例可以取值的范围。
- 类的一个对象对每个属性赢有特定的值。
- 一个类可以有多个属性,也可以没有属性。
属性的作用范围:
- 实例范围的属性:属性的其他方面相同,但属性值随程序的执行而变化。
- 类范围的属性:对于任何对象实例属性值都相同,即“静态”。
定义属性的格式:
① 可见性:
- +公有的(public):可供其他类使用。
- #受保护的(protected):其子类可使用。
- -私有的(private):只有本类的操作才能使用。
- ~包内的(package):只有在同一包中声名的类才能使用。
② 属性名:
- 通常以小写字母开头,左对齐。
③ 类型:
- 与具体实现语言有关,如 name: string,表示name这个属性名的类型为字符串string
④ 多重性:
- 表示属性值的数目,如 points[2…*]:Point
⑤ 初始值:
- 用于为新建立的对象赋予初始值,如 origin:Point=(0,0)
⑥ 特性串:
- 表达该属性所具有的性质,如 a:integer=1{frozen},表示属性不可改变
操作:
① 一个类可以有多个操作,也可以没有操作。
② 操作名除第一个词外,其他每个词的第一个字母要大写。
③ 操作名往往是描述其所在类的行为动词或动词短语。
④ 也可以通过给出操作的特征标记进一步描述之,如参数名、类型、默认值,返回类型等。
⑤ 可以是抽象操作,即没有给出实现的操作,用斜体表示(即C++中的纯虚操作)。
⑥ 调用一个对象上的操作可能会改变该对象的数据或状态。
⑦ 操作的作用范围分为类范围操作和实例范围操作。
定义操作的格式:
① 可见性:
- +公有的(public):可供其他类使用。
- #受保护的(protected):其子类可使用。
- -私有的(private):只有本类的操作才能使用。
- ~包内的(package):只有在同一包中声名的类才能使用。
② 操作名:
- 一般为动词或动词短语,以小写字母开头,左对齐。
- 如果是动词短语,除第一个词外,其余首字母均大写。
- 抽象操作用斜体表示。
③ 参数表:
- 方向:in(输入参数,不能修改)、inout(输入参数,用于与调用者进行信息通讯,可能要更改)、out(输出参数,用于与调用者进行信息通讯,可能要更改)。
- 类型:用最终的目标语言表示。
- 默认值:用最终的目标语言表示。
④ 返回类型:
- 与具体的实现语言有关,如果没有返回值(void),就省略冒号和返回类型。
- 需要多个返回值时,可使用表达式列表。
操作的多态性:
6.3.2 接口
- 是一组操作的集合,其中每个操作描述了类或构件的一个服务。
- 作用:模型化系统中的“接缝”。
表示:
- 用带有分栏和关键字interface的矩形符号<<>>来表示。
- 在操作分栏中给出接口支持的操作列表。
- 接口的属性分栏总是空的。
用小圆圈来表示接口:
举例:
- “销售”接口是“商品”类的供接口,是“售货员”类的需接口。
- “商品”类实现了“销售”接口,“售货员”类使用“销售”接口。
6.3.3 协作
- 协作是一组类、接口和其他元素的群体,他们共同工作以提供比各组成部分的总和和更强的合作行为。
表示:
6.3.4 用况
- 体现了功能抽象,是对一组动作序列的描述,系统执行这些动作产生对特定的参与者一个有值得、可观察的结果。
表示:
6.3.5 主动类
- 体现并发行为抽象,是一种至少具有一个进程或线程的类,因此它能够启动控制活动。
表示:
6.3.6 构件
- 是系统中逻辑的并且可替换的成分,它遵循并提供了一组接口的实现。
表示:
6.3.7 制品
- 是系统中物理的、可替代的部件,其中包含物理信息(比特)。
表示:
6.3.8 节点
- 是在运行时存在的物理元素,通常它表示一种具有记忆能力和处理能力的计算机资源。
表示:
6.4 控制复杂性的术语
6.4.1 包
目的和语义:
- 为了组织类目,控制信息组织和文档组织的复杂性,UML引入了术语“包”。
- 包是模型元素的一个分组。一个包本身可以被嵌套在其他包中,并且可以含有子包和其他种类的模型元素。
表示:
- 在大矩形中描述包的内容,而把该包的名字放在左上角的矩形中。
- 可以把所包含的元素画在包的外面,将元素与该包相连。这时可把该包的名字放在大矩形中。
包之间的关系:
- 两种依赖:访问依赖和引入依赖。
- 作用:使一个包可以访问和引入其他包。
- 包间的依赖通常隐含了各包中元素间存在的一个或多个依赖。
- 引入依赖
- 从源包到目标包的引入依赖表明:目标包中有适当可见性的内容被加入到源包的公共命名空间,相当于源包对它们做了声明(即,不需要一个路径名)。
- 访问依赖
- 从源包到目标包的访问依赖表示:目标包中具有可见性的内容增加到源包的私有命名空间里(即,源包可以不带限定名来引用目标包中的内容,但不可以输出之,如果第三个包引入源包,就不能再输出已经被引入的目标包元素)。
对成组的元素建模策略:
- 浏览特定体系结构,视图里面的建模元素,找出概念和语义上相近的元素所定义的组块, 把这样的一些块放到一个包里。
- 对每个包判别哪些元素要在包外访问, 把这些元素标记为公共的,把其他元素标记为受保护的或者私有的。
- 用引入依赖关系显式地连接建立在其他包之上的包。
- 在包的家族里面,用泛化关系把特殊包连接到一般包里面。
6.5 表达关系的术语
6.5.1 关联
定义:
- 关联是类目之间的结构关系,描述了一组具有相同结构、相同语义的链。
- 连接两个类目的关联称为二元关联,连接n个类目的关联称为n元关联。
多重性:
- 类中对象参与一个关联的数目,称为该关联角色的多重性。
聚合:
- 一种特殊形式的关联,表达一种“整体/部分”关系。即一个类表示了一个大的事物,它是由一些小的事物(部分)组成。
组合:
- 如果整体类的实例和部分类的实例具有相同的生命周期,这样的聚合称为组合。
限定符:
- 一个限定符是一个关联的属性或属性表,这些属性的值将对该关联对象集做了一个划分。
关联类:
- 它有关联和类的特性。一个关联类,可以被看做是一个关联,但还有类的特性;或被看做是一个类,但有关联的特性。
6.5.2 泛化
定义:
- 一个类可以有0个,1个或多个父类。
- 没有父类且最少有一个子类的类被称为根类或基类。
- 没有子类的类称为叶子类。
- 如果一个类只有一个父类,则说明它使用了单继承,如果一个类有多个父类,则说它使用了多继承。
表示方法:
6.5.3 实现
定义:
- 实现是类目之间的一种语义关系,其中一个类目规约了保证另一个类目执行的契约。
使用地方:
- 借口与实现它们的类和构建之间。
- 用况与实现它们的协作之间。
表示:
6.5.4 依赖
定义:
- 依赖是一种使用关系,用于描述一个事物(如类Windows)使用另一事物(如类Event)的信息和服务。
6.6 UML模型表达工具
6.6.1 静态建模-类图
定义:
- 类图显示了类(及其接口)、类的内部结构以及与其他类的联系,是面向对象分析和设计所得到的最重要的模型,用于可视化的表达系统的静态结构模型。
类图包含的内容:
- 通常包含:类、接口、依赖、泛化、和关联关系等。
- 特殊情况下可包含注解和约束,以及包或子系统,甚至,可包含一个实例,以便使其可视化。
示例:
创建类图四步骤:
① 对系统中的概念(词汇)建模,形成类图中的基本元素。
- 使用术语“类”来抽象系统的各个组成部分、系统环境,而后确定每一个类的责任,最终形成类图中的模型元素。
② 对待建系统中的各种关系建模。
- 使用表达关系的术语,例如关联、泛化和依赖等抽象系统中各成分之间的关系,形成该系统的初始类图。
- 当需要从一个类的对象到另一个类的对象导航时,就建立“关联”,如下:
- 当一个类的对象要与另一个类的对象相互交互,而后者不作为前者的过程局部变量或操作参数,就建立“关联”。
- 如果关联中的一个类与另一端的类相比,前者在结构或者组织上是一个整体,后者看来像它的部分,则在靠近整体的一端用一个菱形对关联修饰,表示“聚合”。
- 对于每一个关联,都要说明其多重性(特别当多重性不为*时,星号是默认的多重性)。
③ 模型化系统中的协作,给出该系统的最终类图。
泛化与依赖:
- 依赖关系是使用关系,常见的依赖关系是两个类之间的连接,其中一个类只是使用另一个类作为它的操作参数。
- 泛化关系是“is a kind of”关系,在对系统的词汇建模中,经常遇到结构或行为上与其他类相似的类,可以提取所有共同的结构特征和行为特征,并把它们提升到一般的类中,特殊类继承这些特征。
6.6.2 动态建模-用况图
示例:
6.6.3 系统行为(交互)建模-顺序图
定义:
- 顺序图是一种交互图,即由一组对象以及这些对象之间的关系(通信)组成,其中还包含这些对象之间被发送的消息。
示例:
6.6.4 系统行为(生存周期)建模-状态图
定义:
- 状态图是显示一个状态机的图,其中强调了从一个状态到另一状态的控制流。规约了一个对象在其生存期间因响应事件并作出响应而经历的状态。
示例:
(未完待续)