【软件工程】第六章 面向对象方法

6.1 面向对象方法的概念

6.1.2 主要特点

  1. 用对象作为对事物的抽象表示,并以此作为系统的基本构成单位。
  2. 事物的静态特征用对象的属性表示。
  3. 事物的动态特征(即事物的行为)用对象的操作表示。
  4. 对象的属性和操作结合为一体,构成独立且对外屏蔽细节的实体。
  5. 对事物分类,将具有相同属性和操作的对象归为一类。
  6. 通过在不同程度上运用抽象的原则(或多或少地忽略事物之间的差异),得到较一般的类和特殊的类,通过继承关系简化系统的构造过程及文档。
  7. 复杂的对象可以用简单的对象作为其构成部分(聚合)。
  8. 对象间只能通过消息进行通信(不允许一个对象直接使用另一个对象的属性),以实现对象间的动态联系。
  9. 用关联表达类之间的静态关系。

6.1.3 基本思想

  1. 从现实世界中客观存在的事物出发建立软件系统。
  2. 充分运用人类日常的思维方法。

6.1.4 学习范围

  1. 基本知识
  2. 面向对象分析(OOA)
  3. 面向对象设计(OOD)
  4. 面向对象程序设计(OOP)

6.2 UML

6.2.1 概述

  • 一种可视化语言。
  • 是规约系统的制品:UML适用于对所有重要的分析、设计和实现决策进行详细概述。
  • 是构造系统的制品:UML描述的模型可与各种编程语言直接相关联。

6.2.2 面向对象方法术语/符号

提供了两种术语:

  1. 结构化地表达客观事物的术语
  2. 表达客观事物之间关系(相互作用\相互影响)的术语

除此之外还有:

  1. 为了控制信息组织的复杂性,还引入了用于组织特定对象结构的包。
  2. 为了使建造的系统模型容易理解,引入了注解。

6.3 结构化表达客观事物的术语

6.3.1 类与对象

  • 类(Class):一组具有相同属性、操作、关系和语义的对象的描述。
  • 对象(object):对象是类的一个实例。

类的结构:

【软件工程】第六章 面向对象方法

类的简化表示:

【软件工程】第六章 面向对象方法

【软件工程】第六章 面向对象方法

【软件工程】第六章 面向对象方法

抽象类用斜体表示:

【软件工程】第六章 面向对象方法

类名:

  1. 类名使用黑体字,第一个字母通常大写,并位于第一栏的中间。
  2. 类名往往是从正被建模系统的词汇表中提取的简单名词或名词短语。

属性:

【软件工程】第六章 面向对象方法
  1. 一个属性往往具有所属的类型、用于描述该特性的实例可以取值的范围。
  2. 类的一个对象对每个属性赢有特定的值。
  3. 一个类可以有多个属性,也可以没有属性。

属性的作用范围:

【软件工程】第六章 面向对象方法
  • 实例范围的属性:属性的其他方面相同,但属性值随程序的执行而变化。
  • 类范围的属性:对于任何对象实例属性值都相同,即“静态”。

定义属性的格式:

[可见性] 属性名 [:类型] [多重性] [=初始值] [{特性串}]

① 可见性:

  • +公有的(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 接口

  1. 是一组操作的集合,其中每个操作描述了类或构件的一个服务。
  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引入了术语“包”。
  • 包是模型元素的一个分组。一个包本身可以被嵌套在其他包中,并且可以含有子包和其他种类的模型元素。

表示:

【软件工程】第六章 面向对象方法
  • 在大矩形中描述包的内容,而把该包的名字放在左上角的矩形中。
【软件工程】第六章 面向对象方法
  • 可以把所包含的元素画在包的外面,将元素与该包相连。这时可把该包的名字放在大矩形中。

包之间的关系:

  • 两种依赖:访问依赖和引入依赖。
  • 作用:使一个包可以访问和引入其他包。
  • 包间的依赖通常隐含了各包中元素间存在的一个或多个依赖。
  1. 引入依赖
  • 从源包到目标包的引入依赖表明:目标包中有适当可见性的内容被加入到源包的公共命名空间,相当于源包对它们做了声明(即,不需要一个路径名)。
  1. 访问依赖
  • 从源包到目标包的访问依赖表示:目标包中具有可见性的内容增加到源包的私有命名空间里(即,源包可以不带限定名来引用目标包中的内容,但不可以输出之,如果第三个包引入源包,就不能再输出已经被引入的目标包元素)。

对成组的元素建模策略:

  • 浏览特定体系结构,视图里面的建模元素,找出概念和语义上相近的元素所定义的组块, 把这样的一些块放到一个包里。
  • 对每个包判别哪些元素要在包外访问, 把这些元素标记为公共的,把其他元素标记为受保护的或者私有的。
  • 用引入依赖关系显式地连接建立在其他包之上的包。
  • 在包的家族里面,用泛化关系把特殊包连接到一般包里面。

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 静态建模-类图

定义:

  • 类图显示了类(及其接口)、类的内部结构以及与其他类的联系,是面向对象分析和设计所得到的最重要的模型,用于可视化的表达系统的静态结构模型。

类图包含的内容:

  • 通常包含:类、接口、依赖、泛化、和关联关系等。
  • 特殊情况下可包含注解和约束,以及包或子系统,甚至,可包含一个实例,以便使其可视化。

示例:

【软件工程】第六章 面向对象方法

创建类图四步骤:

① 对系统中的概念(词汇)建模,形成类图中的基本元素。

  • 使用术语“类”来抽象系统的各个组成部分、系统环境,而后确定每一个类的责任,最终形成类图中的模型元素。

② 对待建系统中的各种关系建模。

  • 使用表达关系的术语,例如关联、泛化和依赖等抽象系统中各成分之间的关系,形成该系统的初始类图。
  1. 当需要从一个类的对象到另一个类的对象导航时,就建立“关联”,如下:
【软件工程】第六章 面向对象方法
  1. 当一个类的对象要与另一个类的对象相互交互,而后者不作为前者的过程局部变量或操作参数,就建立“关联”。
  1. 如果关联中的一个类与另一端的类相比,前者在结构或者组织上是一个整体,后者看来像它的部分,则在靠近整体的一端用一个菱形对关联修饰,表示“聚合”。
【软件工程】第六章 面向对象方法
  1. 对于每一个关联,都要说明其多重性(特别当多重性不为*时,星号是默认的多重性)。

③ 模型化系统中的协作,给出该系统的最终类图。

泛化与依赖:

  • 依赖关系是使用关系,常见的依赖关系是两个类之间的连接,其中一个类只是使用另一个类作为它的操作参数。
【软件工程】第六章 面向对象方法
  • 泛化关系是“is a kind of”关系,在对系统的词汇建模中,经常遇到结构或行为上与其他类相似的类,可以提取所有共同的结构特征和行为特征,并把它们提升到一般的类中,特殊类继承这些特征。
【软件工程】第六章 面向对象方法

6.6.2 动态建模-用况图

示例:

【软件工程】第六章 面向对象方法

6.6.3 系统行为(交互)建模-顺序图

定义:

  • 顺序图是一种交互图,即由一组对象以及这些对象之间的关系(通信)组成,其中还包含这些对象之间被发送的消息。

示例:

【软件工程】第六章 面向对象方法

6.6.4 系统行为(生存周期)建模-状态图

定义:

  • 状态图是显示一个状态机的图,其中强调了从一个状态到另一状态的控制流。规约了一个对象在其生存期间因响应事件并作出响应而经历的状态。

示例:

【软件工程】第六章 面向对象方法

(未完待续)