第13章 术 语 大 全
216.多继承(multiple inheritance)
泛化的一种语义变体,其中元素可以有多个父。这是U/NL 中的默认设置,在多数情况下
是必须的,建模者也可以对使用的元素进行某种设置。对比:单继承。
217.多重性(multiplicity)
说明允许侯选值范围,如集合可以设定的大小。多重性说明可能用于关联端、组成类中
的部分、消息的迭代次数和其他目的等。本质上讲,多重性是非负整数的一个子集(可
能无限)。对比:集合的基数。
见关联的多重性(multiplicityof association)、类的多重性(multiplicity of class
)。
语义
多重性是对集合大小的说明。概念上,它是非负整数的子集。实际上,它是一个有限的
整数集合,是最大值和最小值之间的区域。任何集合必须有限,但上界可以是有限值或
者无界(无界的多重性称为"许多")。上界必须大于0;否则多重性就为0。0多重性的用
处不大,因为它仅允许空集。多重性用字符串表示。
通常,多重性是一个整数范围--有最大值和最小值。但它通常又是不连续的非负整数的
集合。整数集合可能是无限的--即上界可能无限(但集合中的每个特定基数是有限的)
。
在实际中,这一整数集合可以声明为几个互斥,不相连的整数区域。区域是指最大值和
最小值之间的连续的整数。有些无限集合不能这样表示,如偶数集合,但这种简化表示
不会丢失太多信息。设计中,通常只用有上下限的一个整数区域来描述多重性,因为多
重性只用于定义可能需要的最大存储空间。
见关联的多重性和类的多重性,以进一步了解这些元素多重性的使用细节。
表示法
多重性表示为用逗号隔开的整数区域列表的文本形式,区域格式为:
最小值..最大值
其中最小值和最大值是整数,或者最大值为"*",表示无上界。表达式2..*读做"两个
或以上"。
区域的格式还可以为:
数字
数字是表示单个大小区域的整数。
包含单个星的多重性表达式
*
与0..*等价,表示不限制数目("0个或多个,无限制")。这种常见的多重性被称为"
许多"。
举例
0..1
1
0..*
*
1..*
1..6
1..3,7,10,15,19..*
风格指南
* 建议使用递增顺序的区域。如:1..3,7,10比7,10,1..3好。
* 2个相连的区域被连成1个。例如0..1比0,1好。
讨论
多重性表达式可以含有变量,但模型完成后必须替换为整数--必须是参数或常数。多重
性与动态数组边界不同,在运行时不能改变。它用于说明集合中可能出现的值的范围(
最坏情况),应用程序的数据结构和操作应与之相符合。它是建模时的常数,如果运行
时边界可变,应选的多重性为"许多"(0..*)。
图中可能省略多重性,但它隐含存在于模型中。完成的模型里,未说明的多重性没有意
义。不知道多重性和将它声明为"许多"是一样的,因为此时的待选值可以有任意多个,
这与"许多"的定义一样。
见未说明的值(unspecified value)。
218.关联的多重性(multiplicity of association)
关联端声明的多重性。
见多重性(multiplicity)。
语义
定义在关联端的多重性,说明该位置上可以有多少个对象。
对于二元关联,目标端的多重性限制了源端的一个对象可以与目标类的多少个对象之间
有关联。多重性作为一个整数区域给出(见多重性)。常见的多重性有1、0或1、0
个或多个无限制、1个或多个无限制。"0个或多个无限制"被称为"许多"。
n元关联中,多重性在每个n-1维端上定义。例如,给定类(A,B,C)之间的三元关
联,C端的多重性分别说明C可以有多少个对象参与A和B的关联。如果多重性为(许
多,许多,1)则对每个(A,B)对,只有一个C值;对每个(B,C)对可以有许
多个A值,但A、B、C的许多值可以参与关联。
见n元关联中对n维多重性的讨论。
表示法
多重性标注在使用它的路径边上
(图13-126)数字范围n1..n2。
见多重性,以进一步了解语法和规范说明(可能比多数实际应用所需的内容更广泛)。
219.(属性的)多重性(multiplicity (of attribute))
每个对象可能有的属性值。
语义
属性的多重性说明有该属性的对象可以有多少个值。
常见的多重性为(1..1),即每个对象的属性有1个值,其他还有0或1(可选或空
值)、0个或多个无限制(值的集合)、1个或多个无限制(非空集合)。"0个或多个
,无限制"称为"许多"。
表示法
多重性标在分格中的属性名字之后的括号中,后面有冒号(图13-127),如果没
有标出,多重性就为1(默认值)。
220.(类的)多重性(multiplicity (of class))
类的实例可能的数目范围--同时可以存在多少个实例。
语义
对于类,多重性说明类可以有多少个实例,默认值是无限多个,但有时确定数目也很有
用。特别是在声明单个类--只有1个实例的类时,需要用多重性建立整个系统的内容和
参数。
合作中也用到类的多重性,它说明类元角色在一个合作实例中可以有多少绑实例。
表示法
类或类元的多重性是标在矩形右上角的字符串(图13-128)。多重性为许多(无
限)时,字符串可以省略。
图13-128 类的多重性
221.n元关联(n-ary association)
3个以上类之间的关联。对比:二元关联。
语义
每个关联的实例是来自于相应类的n元组值。一个类可以在关联的多个位置中出现。二元
关联是一种特例,有简化的表示法和特有的属性(如导航性),这些属性对n元关联没有
意义(至少是相当复杂)。
n元关联可以声明多重性,但不像二元关联那么容易理解。关联端的多重性说明了当另外
n-1端的值确定时,本端值的数目。这种定义也适用于二元关联。
聚集(包括组成)只对二元关联有意义,n元关联的角色不能有组成或聚集。
二元关联和只有两端的n元关联没有什么语义区别。有2端的关联被认为是二元关联,有
两个以上端的关联被视为n元关联。
表示法
n元关联表示为一个大菱形(大是相对路径端点而言),以及由菱形引出通向各个参与类
的路径。关联的名字(如果有),标在菱形边上。修饰与二元关联一样标在每条路径的
端点上。可以有多重性,但不能有资格限定和聚集。
可以用虚线将关联类符号与菱形符号相连,以此表示有属性、操作和/或关联的n元关联
。
举例
图13-129表示一支球队每个赛季的最高记录保持者。记录保持者在赛季期间可以转会,
在其他队中留下记录。记录本上,每个连接是独立的。
风格指南
通常,线从菱形顶点或某边的中点开始画。
讨论
n元关联中,多重性的定义是按其他n-1维进行的。例如,类之间的三元关联(A,B,C)
,C端的多重性说明 C与每个A、B对之间的关联中可以有多少个C对象。如果多重性为(
许多,许多,1),则对每个可能的(A,B)对只有一个C值。对给定的一个(B,C)对
,可以有多个A值。A,B,C各自的许多值参与关联。二元关联中,定义简化为一个关联
端对另一端的多重性。
只对一端定义多重性没有意义(正如某些作者所提议)。因为对任何有意义的n元关联端
,多重性都是许多。否则,n元关联可以化简为一个类和一个包含其他类的关联类之间的
二元关联,这样更容易实现。因为二元关联更易实现,且宜导航,最好避免n元关联。只
有当需要所有值来确定一条连接时,n元关联才有用。通常,n元关联实现为一个类,类
的属性中含有指向参与对象的指针。将它表示元关联是因为关联中没有迭代的连接。
考虑学生在学期之内选修某个教授的课程的例子(图13-130)。
学生不会多次选修一个教授的同一门课程,但是可以从同一名教授处选修几门不同的课
程。一个教授可以教多门课程。图中表示了多重性。Professor的多重性是(0..1),其
他多重性是许多(0..*)。
每个多重性值是相对于其他端对象对而言。对于(课程,学生)对,可以有0个或1个教
授。对(学生,教授)对,可以有许多课程。对(课程,教授)对,有许多学生。
注意:如果关联化为类,就可能有多个相同(学生,教授,课程)组成,这是不希望出
现的情况。
222.名字
用于标识模型元素的字符串。
见命名空间(namespace)。
语义
名字是一种标识符--用某种程序设计语言预先定义的有限的字符序列。实现方法可以规
定名字的格式,例如不得包含某种符号(如标点符号),还可以规定初始规则等等。特
别是,认为名字是在不同数据集合中可以用于查找、搜索的主键。例如,罗马字体通常
有大写和小写、数字、分隔符(如下划线连字符),而其他标点符号依赖于具体实现。
工具和程序设计语言可以规定名字的长度和使用的字符范围,这些限制比对于注释的限
制更严格。
名字是在命名空间内定义的,如包或者类。命名空间中,名字在其所在的语义组内必须
是唯一的,如类元、状态、属性等;不同组内的名字可以迭代(但是也应该避免)。每
个命名空间属于更大的命名空间。嵌套的名字及其外部名字以至最外层元素的名字可以
用一个名字路径串表示。
表示法
名字表示为字符串。名字通常单独列为一行。规范的名字格式包括字符、数字、下划线
。如果某个实现允许其他字符,则某些字符可能要编码显示以防止混淆。这是工具实现
的责任。
用双斜线分隔的不同层次命名空间的名字可以构成路径名。
223.命名空间(namespace)
模型的一部分,名字在此处定义并使用。命名空间内,每个名字有特有的意义。
语义
所有有名字的元素都在命名空间内声明,它们名字的范围也是该命名空间。顶级的命名
空间是包(包含子系统)或者包含者,包含者的目的主要是将元素组织为易于人类理解
并访问的组,并在开发中将模型组成为易于计算机存储、维护的组。基本的模型元素,
包括类、关联、状态机、合作都是它们各自内容(如属性、关联端、状态机、合作角色
)的命名空间。每个模型元素的范围在各自的介绍中说明。每种模型元素有各自的命名
空间。
命名空间内定义的名字必须唯一(这正是使用名字的目的)。给出命名空间和名字,可
以找到具体的模型元素(如果它有名字--有些元素是匿名的,必须通过有名字的元素与
它的关联来查找)。命名空间可以嵌套,给出嵌套的命名空间名称,就可以向内查找。
包可以访问或者导入另一个包,从而访问它的命名空间。
系统自身定义了最外层的命名空间,它是所有名字的基础。它是一个包,通常还带有几
层嵌套的包,直到得到最终基本元素的名字为止。
表示法
路径名(穿过几个嵌套命名空间的路径)的表现由用双分号(::)隔开的命名空间(
如包或类)的名字连接而成。
UserInterface::HelpFacility::HelpScreen
224.导航性(navigability)
说明是否可以穿过类的表达式中的二元关联得到与类的实例相关联的一个或几个对象。
此概念不适用于n元关联(见文本)。导航性是枚举类型,值可以是true(可导航),fal
se(不可导航)。
见导航效率(navigation effciency)。
语义
导航性说明角色名可否用于表达式,以穿过有此角色名的对象的关联,到达另一个关联
端的对象。如果有导航性,关联定义了该角色名的另一个关联端的类的伪属性--即角色
名可以向属性一样用于类的表达式,并得到值。角色名还用于表达约束。
没有导航性说明关联另一端的类"看不到"关联,因此不能用它构成表达式。没有导航性
的关联不会创建源类到目标类之间的依赖关系,但是可能有其他子句创建这样的依赖关
系。
没有导航性不是说没有穿过关联的方法。如果可能从其他方向穿过关联,可以在其他类
的实例中进行搜索,找出指向对象的类,从而穿越关联。这种方法仅仅在小范围内适用
。
n元关联不能定义导航性,因为这需要对类的集合一一定义导航性。这是可以实现的,但
是作为一种基本属性就太复杂了。这不是说n元关联不能穿过,而是这样的规则过于复杂
,难以用布尔值定义。
导航性通常与导航效率相关,但是UML规则中没有严格的要求。
表示法
导航关联表示为目标类上关联路径上的箭头。箭头说明穿越的方向(图13-131)。导航
性的修饰属性可以省略(对于图中所有的关联)。箭头可以画在0个、1个或者两个关联
端上。
为了方便,对于双向导航的关联可以将省略箭头。理论上,这可能会与两个方向都不能
导航的关联混淆,但是实际上很少有这种关联,因此出现时可以特别表明。
没有必要标注"未确定"的导航性。如果没有确定导航性,也可以归入常见的状态。关于
导航性的讨论只是对它作或者不作限制。
图13-131 导航性
225.可导航的(navigable)
一种可以用于表达式中穿越的关联或者连结。它的可导航属性为true。这种连结通常用
一个或者几个箭头实现。
见导航性(navigability)、导航效率(navigation efficiency)。
226.导航(navigation)
在图中穿越连接,特别是对象模型中的二元链接和对象模型中的属性,从而得到对象的
映射值。在后一种情况下,导航路径可以表示为属性名或者角色名的序列。
见导航性(navigability)。
227.导航效率(navigation effciency)
表明是否可能有效地穿越一个对象到另为一个或几个对象的二元关联。这个概念不适用
于n元关联。导航效率与导航性相关,但不是它定义的属性。
见导航性(navigability)。
语义
可以用常规方法定义导航效率,以便符合抽象设计和各种程序设计语言的要求。如果得
到关联的对象集合的花费正比于集合中对象的数目(不是集合的上界,那可能是无穷)
加上某个常数相等,就认为可以有效地进行导航。计算复杂性时,花费是O(n)。如果多
重性是1,或者0、1,访问的花费必须为常数,可以查变量长度列表得到。一种较松导航
效率定义允许的最小花费为log(n)。
虽然通常用嵌入到包含对象属性的块中的指针来实现多重性为1的可导航关联,也可以用
哈希表来达到外部实现,表中带有平均访问花费。这样,关联可以被实现为参与类之外
的外部对象的查表操作。(某些实时情况下,应该规定最环情况下的花费,而不是平均
花费。不必改变基本的定义,只要换上最坏情况下的花费,但是不能再使用哈希表等算
法了)。
如果给定方向上不能进行导航,并不是说完全无法穿越,而是穿越的开销将是很大的--
例如要在更大的表中查找。如果某个方向上的访问不经常出现,则查表是合理的选择。
导航效率是设计概念,它允许设计者了解访问的开销。通常,导航隐含导航效率。
可能(如果很少)有在两个方向上都不能高效导航的关联。这种关联可能实现为连接的
集合,在进行任何方向的导航时必须对该集合进行搜索。这是可以穿越的,但是效率很
低。总之,这种关联的使用范围很小。
讨论
导航效率说明得到与给定对象相关的对象集合的效率。多重性为0..1或者1时,实现显然
是源对象的指针。多重性为"许多"时,通常实现为包含许多指针的包含类。包含类自身
可能驻留在类的对象的数据记录上。这由它是否可以通过开销常数(指针访问的常规情
况)得到来决定。包含类必须是可以高效导航的。例如,所有关联的列表不是高效的,
因为对象的连接和许多无用的连接混在了一起,需要查找。按照元素类元的列表是高效
的,因为避免了不必要的查找。
在限定资格的关联中,从资格限定的元素出发设置导航性表示可以通过源元素和限定值
高效地得到对象或者对象集合。这和用哈希表或按限定值(这是将资格限定作为模型概
念的目的)索引二叉树查找的实现是一致的。
228.节点(node)
节点是运行时的物理对象,代表一个计算资源。通常至少有存储空间和执行能力。运行
时对象和运行时构件实例可以驻留在节点上。
见位置(location)。
语义
节点包括计算设备和(至少商业模型中的)人力资源或者机械处理资源。节点可以用描
述符或实例代表。节点定义了运行时可计算实例驻留的位置,可计算实例包括对象和构
件实例。
物理节点有更多的特性,如能力、吞吐量、可靠性。UML没有预定义这些属性,但它们可
以在UML模型中用构造类型或标签值建立。
用关联连接节点表示通信路径。这些关联可以有构造类型,以区分不同的通讯和通讯的
不同实现。
节点是实现视图中的继承部分,不属于分析视图。配置模型中表示节点实例而不是节点
类型。虽然节点类型有重要意义,但是各个节点的类型通常是匿名的。
节点是一种类元,可以有属性。通常,节点实例在部署图中表示。节点的描述符用处很
小。
表示法
节点的表示看起来象立方体的偏方向投影。
节点描述符的语法是:
节点类型
其中节点类型是类元名字。
节点实例有名字和类型名字。节点带有下划线的名字表在节点中,或者节点下方。名字
字符串的语法:
名字:节点类型
其中名字是各个节点的名字(如果有)。节点类型说明它是何种类型的节点。两个元素
都是可选择的。
依赖箭头(箭头指向构件的虚线箭头)用于表示节点类型支持构件类型的能力。可以使
用构造类型来声明依赖关系。
构件实例和对象可以表示在节点实例符号中。这说明该元素驻留在节点实例上。还可以
用聚集和组成关联路径表示包含关系。
节点之间用关联符号相连。两个节点之间的关联说明它们之间的通讯路径。关联可以有
构造类型,说明通讯路径的特性(例如信道或者网络的种类)。
举例
图13-123表示了包含一个对象(族)的两个节点,该对象从一个节点的构件向另一个节
点移动。
图13-132 节点之间的移动
229.注释(note)
表示备注或者其他文本信息的符号,例如方法体或者约束。
表示法
注释表示为右上角向下折的矩形。其中有不能有UML翻译的文本,或者文本的扩展(如嵌
入文件)。注释可以为不同的模型元素提供信息,如备注、约束、方法等。注释通常不
会明确说明其解说的元素的类型,但是可以从格式和使用中看出来。注释可以用虚线与
元素相连。如果注释解释多个元素,虚线指向每个元素。
注释可以有关键字来说明其意义,如关键字《constraint》说明这是约束。
举例
图13-133表示了各种注释,包括操作的约束、类的约束和备注。
图13-133 注释
130.对象(object)
封装了状态和行为的具有良好定义界面和身份的离散实体;即对象实例。
见类(class)、标识(identity)、实例(instance)。
语义
一个对象是类的实例,类描述了存在的可能对象集。一个对象可从两个相关视点来观察
:作为一个实体,它在某个时刻有明确的值;作为一个身份持有者,不同时刻有不同的
值。一个对象的快照有一个位置(在分布系统中),且每一个属性都有值。一个对象通
过链集和其他对象相联系。
每一个对象拥有唯一的身份且可通过唯一的句柄引用,句柄可标识对象和提供对对象的
访问。把对象作为一个身份是与合作实例相对应的,在合作实例中对象通过与其他对象
交换消息在运行时进行联系。
在对象的完整描述中,每一个属性都有一个属性槽---即,每一个属性在它的直属类和每
一个祖先类中都进行了声明。当对象的实例化和初始化完成后,每个槽都有了一个值,
它是所声明属性类型的一个实例。当系统运行时,属性槽中的值可以改变,除非属性的
可变性被隐藏。在操作执行的任何时刻,对象的值必须满足模型所施加的所有隐式和显
式的限制。操作执行的过程中,限制可以暂时忽略。
如果执行环境允许多重类元,则一个对象可以是多个类的直接实例。在对象的直属类中
和对象的任何祖先中声明的每一个属性在对象中都有一个属性槽。相同属性不可以多次
出现,但如果两个直属类是同一祖先的子孙,则不论通过何种路径到达该属性,该祖先
的每个属性只有一个备份被继承。
如果执行环境允许动态类元,则在执行期间对象可以改变它的直属类。如果可在过程中
获得属性,则它们的值必须通过更改直属类操作指明。
如果执行环境允许多类元和动态类元,则在执行过程中可以获得和失去直属类。然而,
直属类的数目不能少于一(类必须有结构,即使它是暂时的)。
可以调用对象去执行任何直属类的完整描述中的任何操作---即,对象拥有的直属和继承
操作。
对象可以作为变量和参数的值,变量和参数的类型被声明为与对象相同的类或该对象直
属类的一个祖先。换句话说,类的任何子孙的实例可以是变量的值,该变量的类型被声
明为该类。这是替代原则。这个原则不仅有逻辑必要性,而且它的存在可简化编程语言
的完整性。
表示法
对象是类的实例。实例符号的总原则是用相同的几何符号作为描述符,但用带有下划线
的实例名将它作为个体区分开来。所有的值在实例中显示,但所有实例共享的特性在描
述符中标注。
对象的规范符号包含两个分格的长方形。顶部包含对象的名和类,底部包含属性名和值
的列表(图13-134)。
作者:hongzhouzhang【我爱风信子】
※ 来源: 网易虚拟社区 北京站. |