一些常用术语总结2

35.关联角色(association role)
关联角色是合作中两个类元角色的连接,它只适用于在合作说明的特定情况下的两个类元之间的关联。
见关联(association),合作(collaboration)。
语义
关联角色是只在由合作所描述的情况下有意义和被定义的关联。它是作为合作的部分关系而在其他情况下不是固有的关系。关联角色是合作的关键结构部分。它们允许有关上下文关系的描述。
在合作中,类元角色表示一个类元的独立的出现,而区别于这个类元的其他出现和这个类元本身的声明。在基于合作的上下关系的情况下,它代表对基类元的使用的限制。同样地,关联角色代表了用于特殊关系中的关联,通常是对普通关联受限制的使用。关联角色将两个类元角色连接起来。当合作被实例化时,对象受限于类元角色而连接受限于关联角色。一个对象可以加入多个角色。
关联角色将两个或多个类元角色或是合作内的类元连接起来。它有对基关联的引用并且有着重复性,表示在一个合作的实例中可以有多少个连接扮演角色。在一些情况下,合作中的一些连接可以被看作是对参与的类之间普通关联的使用。合作表示了在合作内为了某种目的使用通用的关联的某种方法。
在其他情况下,类元角色被合作外非法的关联连接起来。如果一个关联角色没有明确的基关联,那么它就定义一个只在合作内合法的隐含关联。
表示法
关联角色与关联的表示法相同,也就是在两个类元角色符号间的一条实线。如图13-31

图13-31 关联角色
标准元素
新(new),暂时(transient)。
36.异步动作(asynchronous action)
异步动作不要求发送对象暂停去等待结果,它是一个发送。
见发送(send),同步动作(synchronous action)。
37.原子(atomic)
一个动作或操作,它们的执行必须作为一个单元被完成,原子也不能被部分地执行或被外部事件中断。通常,原子操作是小规模的且简单的,例如,赋值和简单的算术或字符串计算。一个原子计算出现在执行序列的确定点上。
见动作(action),活动(activity),运行到完成(run to completion)。
语义
整个系统可以同时执行多个动作。如果我们说动作是原子的,这并不意味着整个系统是原子的。系统可以在几个动作之间处理硬件中断和分时操作。一个动作在它自己的控制线程内是原子的。被激发后它必须完成执行并且不能与其他同时存在的活动动作相互作用。系统可以处理中断和事件,但是不能影响原子动作。但是动作不能用作一个很长的处理机制。相对于对外部事件的反应时间来说,它们的持续时间应该是短暂的。否则,系统就不能实时地做出反应。
38.属性(attribute)
属性是类中特定类型的命名存储槽的描述,类的每个对象独立拥有类型的值。
语义
类元中的属性描述类元实例可能拥有的值。类元的每个实例或它们的后代拥有包含给定类型的值的位置。所有的位置是不同的,并且互相独立(类作用域属性除外,将会在下面描述它)。如果属性是可修改的,那么当执行进行时,实例内位置所拥有的值可以被类型的不同值取代。
类元为它的属性组成了一个命名空间。包含在命名空间中的是伪属性,比如离开类元的关联角色名和包含类元的泛化判别式。
结构
属性有下面的几个组成部分,详述见下:
可修改性(changeability)
判定在初始化后位置中的值是否可以改变,是枚举值。缺省情况下是changeable。可能的值有:
changeable 对修改没有限制。(缺省值)
addonly 附加值可以加到属性值的集合中。但是一旦被创建,值就不能被移动或改变。(只在最大多重性大于一时有意义)
frozen 在对象被初始化后值不能被改变。没有多余的值可以加入到值集合中。
初始值(initial value)
初始值是说明值的表达式,在对象被初始化后被对象中的属性所拥有。表达式是一个文字字符串,包括用来计算表达式的语言的名字。当对象被实例化时表达式通过语言的上下文计算。参看表达式可得到更多详细资料。初始值是可选的。如果它是空的,那么静态模型不会说明由新的对象拥有的这个值,但是模型的其他部分会提供这个信息。
请注意到一个明确的初始化过程,比如构造函数,会替换初始值表达式。
类作用域属性的初始值在执行开始时初始化一次。UML没有说明不同类作用域属性初始化的相对顺序。
多重性(multiplicity)
可以同时存在的属性值的可能数量。最通常的值"只有一个"表示了一个标量属性。值"零或一个"表示了一个有可选择值的属性。在属性值的作用域中缺少的值与其他的值是有区别的。即值的缺少与值零是不同的,它是一个空集合。其他多重性表示了潜在的多值属性。如果多重性不是一个单一的整数,那么由属性所拥有的值的数量可以改变。多重性"许多"表示了一个无限制的值的集合。
名字(name)
属性的名字,一个字符串,在类和它的祖先内必须是唯一的。它必须在类可到达的关联角色名中也是唯一的。
所有者作用域 (owner scope)
由属性所描述的这个值在类的每个对象中可能是不同的或是由类的所有对象所分享。前者是实例作用域属性,后者是类作用域属性。大多数属性是实例作用域的;它们持有一个特定对象的状态信息。类作用域属性持有一个完整类的信息;有一个独立的位置对应整个类。然而一个实例作用域属性是对一个值的描述,这个值直到对象被实例化后才存在。一个类作用域属性代表一个独立抽象值的声明,该值在系统整个生命周期存在。
目标作用域(target scope)
由属性所持有的这个值可能是一个实例或是类本身。前者是实例作用域,它是缺省的。后者是类作用域,它不常见并且通常涉及一些元建模。
类型(type)
指定一个类或数据类型,位置中的值是它们的实例。值可能是给定类或数据类型的后代的实例。
可见性(visibility)
判定属性是否能被其他类看见,枚举值有public、private和protected。建模特定编程语言时附加值可以被加入。
表示法
属性可以表示成一个字符串,它可以从语法上分析成不同的特性。缺省语法是:
《stereotype》opt visibilityopt name multiplicityopt:typeopt=initial_-valueopt{property-string}opt
可见性(Visibility)。可见性表示成一个标点符号。而在特性字符串中可见性可以表示成关键字。后一种形式必须用于用户定义或基于语言的选择中。已定义的选择是:
+(public)公有的 能够看见类的任何类可以看见属性。
#(protected)受保护的 类本身或它的任何后代可以看到属性。
-(private)私有的 只有类本身可以看到属性。
名字(Name)。名字表示成一个标识符字符串。
类型(Type)。类型表示成一个指明类元的表达式字符串。类或数据类型的名字是合法的表达式字符串,它表明属性的值必须是给定的类型。附加类型语法依赖于表达式的语言。每种语言有从简单数据类型构造出新数据类型的语法。比如,C++有指针,数组和函数的语法。Ada也有子范围的语法。表达式的语言是内部模型的一部分,但是它通常不在图中表示出来。假设它对于整个图是已知的或从它的语法上能明显看出。
类型字符串可以被隐藏,但是它仍然存在于模型中。
多重性(Multiplicity)。多重性表示成一个包含于方括弧中的多重性表达式,它位于属性名后。如果多重性是"只有一个",那么表达式,包括方括弧,可以被省略。这表示每个对象只有一个保持给定类型值的位置。否则,多重性必须表示出来。见多重性以了解有关它的语法的详细表示。例如:
colors[3]:Saturation An array of 3 saturations
points[2..*]:point An array of 2 or more points
请注意0..1的多重性提供了空值的可能性--缺少值,相对于范围中的一个特定值。在多数数据类型域中空值不是一个值;它用一个域外的特殊值扩充了这个域。然而,对指针来说,空值通常是实现的一部分。下面的声明允许了空值和空字符串之间的区别,有C++和其他一些语言所支持的区别。
Name[0..1]:String 若名字缺省则为空值
初始值(Initial value)。初始值表示成一个字符串。赋值的语言通常不明确表示出来,但是它存在于模型中。如果没有初始值,那么字符串和相同的标志都被省略。如果属性多重性包括值0(可选的)并且没有给定明确的初始值,那么属性始于一个空值(零复制)。
可修改性(Changeability)。可修改性表示为一个关键字,如果没有选择给出,那么缺省值是changeable。
标签值(Tagged value)。零个或多个标签值可以附属于一个属性。每个标签值表示成tag = value的形式,tag是标签的名字,value是一个文字值。标签值包含特性关键字,它是一个由括号所包括的由逗号分隔的特性表。
作用域(Scope)。类作用域属性表示成在名字和类型表达式字符串下有一条下划线;否则这个属性是实例作用域的。这样表示的理由是类作用域属性是在执行系统中的值,就像一个对象是一个实例值,所以都必须加下划线指明。
class-scope-attribute
图13-32表示了一些属性的声明。

图13-32属性
表示选项(Presentation options)。
编程语言语法(Programming-language syntax)属性字符串的语法可以是一种编程语言的,比如C++或Smalltalk。特定的标签属性可以包含在字符串内。
风格指导
属性名字以普通的类型界面表示。
讨论
类似的语法用于说明限制符、模板参数、操作参数等等。
请注意:属性在语义上等同于一个组成关联。然而,意图和用途通常是不同的。对数据类型使用属性,即对没有身份的值使用属性。对类使用关联,即对有身份的值使用关联。原因是对有身份的对象,看清两个方向上的关系是重要的;对数据类型来说,数据类型通常附属于对象并且不了解它。
标准元素
持久性(persistence)。
39.背景信息(background information)
在同一个图中或在不同图中的类符号的出现可以有它本身的表示选择。例如,一个类的符号可以表示属性和操作而同一个类的另一个符号可以隐藏它们。工具可以提供依附于每个符号或整个图的风格表单。风格表单可以说明表示选择,而且它们可以适用于大多数的符号,而不仅仅是类。
不是所有的建模信息都可以用图形符号很好地表示。有些信息最好用文字或表格形式表示。比如,详细的编程信息最好用文字表表示。UML并不假定模型中的所有信息都可以表示成图,有一些信息只适用于表格。这篇文章并不试图规定这种表格的格式或用于访问它们的形式。这是因为潜在的信息已经在UML元模型中充分描述了,而且表示表格信息也是工具的任务。然而假定隐藏连接可以在图形和表格中都存在。
40.变成(become)
变成是用于交互作用中的一种流依赖关系,在它当中目标对象代表源对象的一种新的形式,并且随后取代了源对象。
见状态类(class-in-state),复制(copy),位置(location)。
语义
变成依赖关系是一种流依赖关系,它表示在交互中一个对象从另一个对象的派生。它表示了一个转换对象的动作。在一个变成流执行后,在计算中一个新对象替代原始对象的位置。如果只用来表示一个对象值的改变那么不必用这个关系。相反地,这个关系用来表示对象中的质变,比如状态的改变、类的改变或位置的改变。在这种情况下,模型包括对象的两个版本,但是变成关系表明它们的确是同一个对象不同时间的两个版本,即它们有着同样的身份。
交互中的变成转换有一个顺序号,用来表明相对于其他动作它什么时候发生。
表示法
变成流表示成一个虚箭头,它的尾部位于对象的早期版本而头部位于较晚的版本,箭头持有构造型关键字《become》。箭头可以有一个交互中的序列号,用来表示相对于其他动作什么时候发生。变成转换可以出现于合作图中,顺序图中,活动图中。
在活动图中,变成转换可以表示成一个向着或来自对象流符号的虚箭头。《become》关键字可以被省略。
举例
图13-33表示了一个命令,用来打开桌面上的一个关闭的目录图标,它后面是一个命令,它用来整理现在打开的目录中的选项。目录作为状态类对象表示两次,变成转换在两个版本之间。
图13-132表示了一个部署图中一个对象在两个节点间迁移。

图13-33 变成流
41.行为(behavior)
一个操作或一个事件的可见的影响,包括它的结果。
42.行为特征(behavioral feature)
表示动态行为的模型元素,比如操作或方法,它可以是类元的一部分。一个类元处理一个信号的声明也是一个行为特征。
标准元素
创建(create),销毁(destroy),叶(leaf)。
43.行为视图(behavioral view)
行为视图是一个模型的视图,它强调系统中实例的行为,包括它们的方法、合作和状态历史。
44.二元关联(binary association)
两个类间的关联。
见关联(association),n元关联(n-ary association)。
语义
二元关联是有着两个关联端点的关联,它是最常见的一种关联。因为二元关联的一个端点有一个唯一的另一端,所以二元关联对说明从对象到对象的导航路径是特别有用的。如果一个关联可以横越指定的方向,那么这个关联在指定方向上是可导航的。有一些属性对n元关联定义,例如多重性,但是它们对二元关联更直观和有用。
表示法
一个二元关联表示成一个连接两个类符号的实线路径。修饰符号可符在端点端,关联名可以放置在靠近实线处,离每一个端点有一定距离,这样不会误解成角色名。除了隐藏中心菱形符号,二元关联的表示符号与n元关联的相同。但二元关联有不适用于n元关联的修饰符号,例如导航性。
详见关联(association)。
45.绑定(bind)
在表示符号中绑定依赖关系的关键字。
见绑定(binding)。
46.绑定(binding)
绑定是向参数赋值从而由一个参数化元素创建一个独立元素。绑定关系是一种依赖关系。它用来绑定模板以创建新的模型元素。
见边界元素(bound element),模板(template)。
语义
一个参数化的定义,例如操作、信号或模板,定义了一个元素的形式。然而,一个参数化的元素不能直接使用,因为它的参数没有确切的值。绑定是一种依赖关系,它代表向参数赋值以创建一个新的、可用的元素。绑定表现在操作上产生调用,表现在信号上产生发送信号,表现在模板上产生新的模型元素。头两个在执行时绑定以产生运行时间实体。除了作为例子或模拟结果它们通常不在模型中设置。参量值在执行系统内定义。
然而,模板在建模时绑定以创建用于模型中的新的模型元素。比如类,除了数据值之外,比如字符串和整数,参量值可以是其他的模型元素,如类。绑定关系将值绑定到模版上,产生一个可以直接用于模型内的实际模型元素。
绑定关系有一个提供者元素(模板),一个客户元素(新生成的绑定元素),和一张绑定到模板参量的数值表。绑定元素通过在模板体的拷贝中将每个参数值替换为对应的参数来定义。每个参量的类元必须与它的参数的已声明的类元或其后代相同。
绑定并不影响模板本身。每个模板可以绑定多次,每次产生一个新的绑定元素。
表示法
绑定用连到一个虚箭头的关键字《bind》表示,这个虚箭头将生成元素(在箭头的尾部)和模板(在箭头的头部)连接起来。实际参量值表示成一个位于《bind》关键字后由圆括弧包含的由逗号分隔的正文表达式表。
另一种更简洁的绑定表示法用名字配对避免了箭头的使用。为了表示绑定元素,模板的名字后是一个用尖括弧括起来的逗号分开的正文表达式表(<参量list,>)。
在每一种情况下,每个参量被表述为在模型建立时静态赋值的正文字符串。它不像操作或信号参量一样动态赋值。
在图13-34中,用箭头的显式形式声明了一个新的类AddressList,它的名字可以用在模型或表达式中。隐含形式Varray〈Point,3〉声明了一个没有自己名字的匿名类。它可以在用隐含语法的表达式中使用。在这两种情况下都可以声明附加的属性或操作。如果需要扩展那么也可以声明子类。
标准元素
绑定(bind)。

图13-34模板声明和绑定
47.布尔型(Boolean)
布尔型是值为true和false的枚举类型。
48.布尔型表达式(Boolean expression)
赋值给布尔值的表达式,在监护条件中有用。
49.绑定元素(bound element)
通过将参量值绑定到模板参数而产生的模型元素。
见绑定(binding)、模板(template)。
语义
模板是一组可能元素的参数化描述。为了得到实际元素,模板参量必须绑定于实际值。每个参量的实际值是由绑定出现的作用域所提供的表达式。大多数参量是类或整数。
如果作用域本身是一个模板,那么外层模板的参数在绑定原始模板时可用作参量,得到重新参量化的效果。但是一个模版的参数名在它的主体外没有意义。在两个模板中的参数名不能仅仅因为它们有相同的名字就假定它们等同,不过子过程参数仅可以依据它们的名字而对应。
绑定元素完全由它的模板说明。所以,它的内容不能扩展。例如,不允许声明类的新属性和操作,但是一个绑定类可以被子类化而且子类以通常方式扩展。
举例
图13-35表示了一个模板的再绑定。PointArray是一个有着一个属性的模板--大小为n。我们想从存在的模板Farray中得到它,Farray由两个参数--元素类型T,大小k。为了得到它,Farray模板的参数k绑定于PointArray模板的参数n。Farray模板的参数T绑定于类Point。这样可以产生将一个参数从原始模板中移走的效果。为了用PointArray模板生成一个Triangle类,将大小属性n绑定于值3。为了生成一个Quadrilateral类,将大小属性n绑定于值4。
图13-35也表示将模板Polygon作为类Shape的孩子。这表示任何与模板Polygon绑定的都是Shape的子类,Triangle和Quadrilateral都是Shape的子类。

图13-35 模板再绑定
表示法
绑定元素可以用一个从模板指向绑定元素的虚箭头表示,箭头连有关键字《bind》。它也可以用正文语法TemplateName<参量list,>表示,用名字匹配确定模板。正文形式避免了表示模板或画出指向它的箭头。当绑定元素被用作一个属性或操作参数的类元时,这种形式特别有用。
详见绑定(binding)。图13-36显示了一个例子。

图13-36关联中绑定模板模板的使用
在一个绑定类中通常压缩属性和操作分隔区,因为它们不能在一个绑定元素中改变。
绑定元素名(使用尖括号的隐含匿名形式或使用"绑定箭头"的显式形式)可以用在任何一个参数化模板的元素名可用的地方。例如,绑定名字可以用在类图上类符号中属性类型或一部分操作特征。图13-36表示了一个例子。
讨论
类元是参数化的明显候选。它们的属性的类型、操作或关联类元是模板中的一般参数。参数化的合作是模式。从某种意义上说,操作本质上是参数化的。其他元素的参数化用途不那么明显,但是很可能进一步找到用途。
50.分支(branch)
分支是状态机中的一个元素,在它当中一个独立的触发可能导致多个可能结果,每个结果有它自己的监护条件。
见分叉(fork),结合(join),结合状态(junction state),合并(merge)。
语义
如果同一个事件可以依据不同的监护条件有不同的影响,那么它们可以建模成有着相同事件触发的分离转换。然而,在实际情况中允许一个独立的触发驱动多个转换是很方便的。在通常情况下常常是监护条件覆盖每种可能,这样一个事件的发生保证能触发一个转换。分支是转换的一部分,它将转换路径分成多个部分,每一部分有单独的监护条件。事件触发放在转换前面的公共部分。分支的输出部分可以与另一个分支的输入部分连接而组成一棵树。通过树的每个路径代表一个不同的转换。转换中一个路径上所有条件的结合与概念上在转换激发之前被赋值的一个独立条件相同。转换在一个独立步骤激发,而不管它作为有分支的树出现。树仅仅是为了建模的方便。
在一个活动图内,离开一个活动状态的分支通常是完成转换--即它们缺少明显的事件触发,它们是在状态内活动完成时隐含触发的。如果有监护条件和分支,那么它们覆盖所有种可能是很重要的,因为这样可以保证一些转换激发。否则,会因为输出转换不再重新激发而使活动图冻结。
表示法
分支可以表示成以不同的监护条件在多个转换弧上重复一个事件触发。这也可以通过完成转换表示,就像在一个活动图中。
然而,方便起见,转换箭头的头部可以连接到一个菱形符号,这个菱形符号表示了一个分支。转换箭头标记上触发事件,但是不能有动作在上面。任何动作都走到转换的最后部分。
一个菱形符号可以有一个或多个离开它的箭头。每个箭头用一个监护条件标记。保留字else可以用作一个监护条件。如果其他的(明确的)监护条件为假,那么它的值就为真。每个箭头的头部可以连接到另一个分支或状态。连接到状态的箭头可以有一个相关的动作标记。
分支树的作用与将树扩展成对应于树的每个分支的分离转换弧的作用相同,它们分享同一个触发事件但是每一个有着它们自己的监护条件的结合、动作和目标状态。图13-37是表示分支的两种方法。
请注意到菱形符号也可以表示合并,与分支相反,这时两个不同的路径合并在一起,如图13-38所示。在合并的情况下,有两个或更多的输入箭头和一个单独的输出箭头,不需要监护条件。

图13-37表示分支的两个方法

图13-38分支和合并
51.调用(call)
用于激活一个操作。
见激活(activation),调用事件(call event),发送(send)。
语义
调用是在一个过程的执行点上激发一个操作。它将一个控制线程暂时从调用过程转换到被调用过程。调用过程的执行在调用时被阻断。在操作执行中调用者放弃控制并且在操作返回时重新获得控制。被调用过程从调用者那里得到一张参量表和对调用过程的一个隐含返回点,就是调用点的下一条命令。被调用过程返回时,提供一张返回值表。
通常,调用在调用者的地址空间中执行,但是调用的语义并不局限于这一点。实际上,在一个分布式系统中这是不可能的,因为调用的接收者物理上是与调用者分开的。更重要的在于对调用过程位置和环境的隐含返回连接的建立,它使得控制重新返回到调用者。调用过程位置在正文子过程中描述成正文,在状态机中描述成状态。调用环境可以建模成激活。
调用使用依赖关系建模一种情况,在这个情况中一个客户类的操作(或操作本身)调用提供者类的操作(或操作本身)。它用《call》构造型表示。
表示法
在顺序图或合作图上,调用表示成指向目标对象或类的文字消息。
调用依赖关系表示成从调用者指向调用类或操作的含有构造型《call》的虚线箭头。 在编程语言中,大多数的调用可以表示成文本过程的一部分。
52.调用事件(call event)
调用事件是接收一个操作的调用,它在状态机转换上实现为动作。
见调用(call),信号(signal)。
语义
调用事件是实现操作的一种方法,它是过程执行的另一种方式。如果一个类将一个操作的实现说明为一个调用事件,那么操作的调用将被看作触发类的状态机中转换的一个事件。这允许实现比单一方法过程更加分散的操作。
如果一个类用调用事件去实现一个操作,那么它的状态机必须有由调用事件触发的转换。调用事件的特征与操作的相同:它们的名字和参数都相同。
一个操作的调用发生时,引用目标对象的状态机,如果调用事件符合一个活动转换(不同于当前活动状态)上的触发事件,那么它就触发该转换。如果转换激发,就实现了实际效果。实际效果包括任何动作序列,包括return(value)动作,其目的是将值返回给调用者。
当转换执行结束时,调用者重新获得控制并且可以继续执行。如果操作需要一个返回值而调用者没有接收到,或接收到不符合声明类型的返回值,说明模型有问题。如果操作不需要一个返回值,说明没有问题。请注意,如果没有转换被调用事件触发,则控制立即返回到调用者。如果操作需要一个返回值,说明模型有问题。否则,调用者仅仅立即继续执行。
如果接收者是一个主动对象,那么当接收者的状态机是静止的时候,即从运行到完成的所有步骤都已实现时,调用事件被处理。
表示法
调用事件表示成状态图中匹配对应类上操作的事件触发。转换上的动作序列可以有一个return声明,如果是这样的话,声明表示返回值。
举例
图13-39表示了一个可以被锁住(Locked) 和解锁(Unlocked)的账户。Deposit操作总是向账户里加钱,而不管它的状态。如果账户是打开的,那么withdraw操作取走所有的钱;如果账户是锁着的,则取不走钱。Withdraw操作被作为一个调用事件实现,它触发每个状态的内部转换。当调用发生时,根据活动状态,执行一个或其他动作序列。如果系统是锁住的,返回零;如果系统是打开的,账户中的所有钱返回并且重新计数为零。

你可能感兴趣的:(数据结构,编程,活动,UML,smalltalk)