第13章 术 语 大 全 (2)

类别:VC语言 点击:0 评论:0 推荐:
 

25. analysis(分析)
分析是系统捕捉需求和问题的阶段。分析着重于做什么,设计着重于如何去做。在一个迭代过程中,各个阶段不必连续地执行。这个阶段的这种效果由分析层模型(特别是用例视图和静态视图)来表示。对比:analysis,design,implementation和deployment。
见stages of modeling,development process。
26. analysis time(分析时间)
分析时间是软件开发过程中分析活动执行时的时间。不要假设一个系统的所有分析都在同一时刻或先于其他活动发生,如设计和实现。对于任何独立元素,各种活动是连续的,但是对整个系统不同的活动可以混合在一起。
见design time,modeling time。
27. ancestor(祖先)
祖先是通过一个或多个父关系路径建立起的元素。
见generation,parent。
28. architecture(构架)
构架是一个系统的组织结构,包括系统分解成的各个部分、它们的连接性、交互机制和通知系统设计的向导规则。
见package。
语义
构架是有关软件系统组织的重要决定的集合,它包括结构元素和将这些元素连接起来的接口的选择、结构元素的大规模组织和它们的连接的拓扑结构、在元素的协作中说明的行为、对整个系统都有效的重要的机制、指导它们的组织的构造风格。例如,决定建立一个系统,每一层包含一定数量的子系统,这些子系统以一种特殊的方式通信,而该决定即构架决定。软件构架不仅仅涉及到结构和行为,也涉及到使用、功能、实施、弹性、重用、可理解性、经济和技术约束以及综合、美学的考虑。
讨论
有关系统分解的构架决定可以通过模型、子系统、包和构件说明。这些元素间的依赖关系是构造适应性和修改系统难易程度的主要指标。
构架的另一个主要部分是它准备建立在其上的机制。这些可以通过协作和模式获得。
非结构化的决定可以用标记值说明。
29. argument(参量)
参量是对应于参数的具体的值。
见binding,参数parameter,substituablility principle。
语义
消息的运行实例有一张参量值表,其中每一个的类型都必须与信号或操作声明中的对应参数的声明类型相匹配。如果一个值的类或数据类型与参数的声明类型相同或是它的后代,那么这个值就是相容的。通过替代原理,一个后代的值可用在任何明声祖先类型声明的地方。一个值的实现取决于模拟器或它出现的执行环境。
在协作或状态机中,表达式为动作而出现。在这些表达式中,调用和消息发送需要参数说明。这些参数说明也是表达式。当在运行时计算这些表达式时,它们必须计算与它们匹配的声明参数一致的值。
然而在模板绑定中,UML模型中的参量在建模时间出现。在这种情况下,参量表示成用某种语言(通常是约束语言或编程语言)表示的表达式。模板参量不仅仅可以包括普通的数据值和对象,也可以包括类元本身。在后一种情况下,对应的参数类型必须是类元或其他的元类型。模板参量的值必须在建模时确定,它不能用来表示运行时的参量。如果参数没有在建模时间被限定则不要使用模板。
30. artifact(制品)
制品是被软件开发过程所利用或通过软件开发过程所生产的一段信息,如外部文档或工作产物。制品可以是一个模型、描述或软件。
31. association(关联)
如果几个类元的实例之间有联系,那么这几个类元之间的语义关系即关联。
见association class,association end,association generation,binary association,n-ary association。
语义
关联是两个或多个特定类元之间的关系,它描述了这些类元的实例的联系。参与其中的类元在关联内的位置有序。在一个关联中同一个类可以出现在多个位置上。关联的每个实例(链接)是引用对象的有序表,关联的外延即这种链接的一个集合。在链接集合中给定的对象可以出现多次,或者在关联的定义允许的情况下可以在同一个链中(在不同的位置)出现多次。关联将一个系统组织在一起,如果没有关联,那只有一个无连接类的集合。
结构
关联可以有一个名称,但是它的大部分描述建立在关联端点中,每个端点描述了关联中类对象的参与。关联端点只是关联描述的一部分,不是可区分的语义或可用符号表示的概念。
* 名称。关联可以有一个名称,在包含包的所有关联和类中它必须是唯一的(关联类既是一个关联又是一个类,所以关联和类分享同一个命名空间)。关联不是必须要有一个名称,它的端点的角色名称提供了在同一个类中辨别多个关联的另一种途径。按照习惯,名字以类在表中出现的顺序读出:Person为compry工作;Salesman卖Car给消费者。
* 关联端点。关联包含一张有多个关联端点的有序表(也就是说这些端点是可以被区分的并且是不可替换的)。每个关联端点定义了在关联中给定位置的一个类(角色)的参与。同一个类可以出现在多个位置上,而位置通常是不可交换的。每个关联端点指定了的应用于对应对象的参与特性,如在关联中一个独立的对象在链接中会出现多少次(多重性)。某些特性,如导航性只应用于二元关联,但是多数可以应用于n元关联。
见association ends。
实例化
链是关联的实例。它包含对于每个关联端点的槽,每个除对象表之外,槽包含对一个对象的引用,该对象是作为对应关联端点的类的(直接的或间接的)实例。链没有身份标识。关联外延中的链组成了一个集合,在这之中不会存在副本。一个对象在链集合中出现的次数必须与关联的每个端点的多重性相一致,例如,关联SoldTickets将多张票与一场演出连接起来,那么每张票在一个链中只出现一次,但是每场演出可以出现多次,每次对应不同的票。
链在系统执行过程中可以被创造和销毁,服从每个关联端点可修改性的限制。在某些情况下,链可以从关联端点一端的对象创建或改变而不能从另一端做同样的事。一个链从一组对象引用中创建。链没有自己的身份标识,所以讨论改变它的值是没有意义的。然而,它可以被销毁,可创建一个新的链来代替它。一个关联类的链,除了定义它的身份的一组对象外还有一个或多个属性值,而且属性值在保持参与对象的引用的情况下可以由操作来改变。
表示法
二元关联用连接两个类边界的实线路径表示(如图13-22),n元关联用菱形表示,菱形通过路径与每个参与到其中的类连接,见后文如图13-129 (在二元关联中菱形省略)。路径的多个端点可以连接到一个独立的类。
路径包含一个或多个相关的实线部分,通常是直线,但是也允许使用弧线和其他的曲线,尤其是在表示自关联(即一个类出现多次的关联)时。每个单独的部分没有语义含义。线的风格由用户选择。
见path。
路径的端点处有描述关联中类的参与情况的修饰符号。一些修饰符号位于路径的端点,线和类符号之间。如果有多个符号,那么它们被按照从线的端点到类符号的顺序摆放--导航箭头、聚合/组合菱形、限定符(如图13-23)。
其他修饰符,如名称标签,被放在靠近它们所确认的事物旁。角色名称被放置在靠近路径端点外。

图13-22 关联

图13-23 关联端的修饰符的顺序

图13-24 关联名
关联名称
关联的名称放置在路径的旁边,但远离关联的一端,这样就不会引起混淆(混淆的危险对人类而言纯粹是视觉上的,在一个图形工具内,相关的符号可以用清晰的内部超链接相互连接)。关联名称可以在多段连接中从一个部分拖到另一个部分而没有语义冲突。关联名称可以用一个小的实心三角形表示表中类的顺序。直观地,名称箭头表示如何去读名字。在图13-24中,类Person和类Company之间的关联 Works For 有一个从Person指向Company的名称三角形,该关联可以读成"人为公司工作"。请注意名称旁的次序三角形纯粹是一个符号化的装置,它用来指明关联端点的顺序。在模型中,端点本质上是有序的,所以模型中的名字不需要次序特性。
关联上的构造型通过将构造型名字放在小双尖括号内表示,它放在关联名称前或替代关联名称。特性表可以放置在关联名称的后面或下面。
关联类
我们将类符号用虚线连接到关联路径上来表示关联类。对n元关联来说,虚线连接到关联菱形上。关联中有关类的特性表示在类的符号中,而有关关联的特性则表示在路径上。然而,即使图形由两个图构成,基本的建模结构也是单个元素。
详association class。
异或约束
{xor}约束将两个或多个关联连接起来,这些关联在某一端连接到一个独立的类(基类)。基类的一个实例可以参与到通过约束连接的关联中的一个。必须注意到所选择关联的多重性。如果任何关联多重性包括基数0,那么基类的一个实例可能不会有关于关联的连接,否则,它必定有一个。
异或约束用连接两个或多个关联的虚线表示,所有关联必须有一个公共类,约束字符串{xor}标识在虚线旁(如图13-25)。远离公共类一端的角色名必须是不同的(这仅是一种通过使用标准约束重叠实现好的约束表示法的预定义用法)。

图13-25 异或关联
讨论
关联不需要有名字。通常角色名更方便一些,因为它们为导航和编码生成提供了名字,并且避免了如何读名字的问题。如果它有名字,那么名字在它的包内必须是唯一的。如果在两个类之间只有一个关联,那么类名对于确定关联来说就足够了。
当真实世界的概念有一个名字时,关联名更有用一些,如Marriage 或Job。当关联名被指定依照给定方向读出,仅仅用角色名更好一些,这样读起来不会有歧义。
参看暂时连接我们可得到有关建模只在过程执行时存在的实例关系的讨论。
见组成部分的有关涉及两个关联的泛化的例子。
标准元素
隐含(implicit),永久性(persistence),异或(xor)。
关联(二元) association(binary)
见二元关联(binary association)。
关联(n维) association(n-ary)
见n元关联(n-ary association)。
32.关联类(association class)
关联类既是关联又是类。关联类有着关联和类的特性。它的实例是有属性值的连接和对其他对象的引用。尽管它的符号包括关联和类的符号,但是它的确是一个独立的模型元素。
见关联(association),类(class)。
语义
关联类有着关联和类的特性,它将多个类连接起来又有着属性和操作。当每个链必须有它自己的属性值、操作或对对象的引用时,关联类就有用了。它可以被看作有着对每个关联端点有着特殊类引用的类,对于实现它而言这是一条明显和通常的途径。每个关联类的实例有对象引用和通过类部分说明的属性值。
连接类A和类B的关联类C不同于与A和B有二元关联关系的类D,(见讨论部分)。与所有的连接一样,像C这样的关联类的一个连接从对象引用中得到它的身份。属性值没有涉及到提供身份上。所以即使它们的属性值有区别,两个连接不能有同样的(a,b)对象对,因为它们不会有同样的身份。也就是说,给定的属性E,不允许(a、b、e1)和(a、b、e2)都是C的实例,因为它们分享同一个身份(a、b)。然而,对象有固有的身份,所以两个对象可以有同样的属性值或对相同对象的连接。也就是说,一个关联包括像C这样的关联类,是一个有序表集合并且它的对象引用中没有副本;然而,像D这样的隐含关系更像一个包,它可以有副本。见讨论。
关联类可以有操作,这些操作可以改变连接的属性或者增加连接本身和移走它。因为关联类也是一个类,它也可以参与到关联本身。
关联类可以不把它自己作为参与类中的一个(虽然有些人能够确切地找到这种递归结构的意义。

图13-26关联类
表示法
关联类表示成一个类符号(矩形),由一条虚线与关联路径连接(如图13-26)。类符号的名字和附着在关联路经上的名字字符串是冗余的。关联路径可以有通常的关联端符号。类符号可以有属性和操作,作为类它参与到自己的关联中。在虚线上没有符号,它不是一个关系而仅仅是整体的关联类符号的一部分。
风格指导
连接点不应该太靠近路径的两端,这样就不会使它看起来像连接在路径的端点上或连接到任何角色符号上。
请注意关联路径和关联类是独立的模型元素,所以有着独立的名字。名字可以表示在路径上或类符号上或在两者上。如果关联类只有属性但是没有操作或其他的关联,那么名字可以在关联路径上表示出来,并且为了突出它的"关联自然性"而从关联类符号中省略。如果它有操作和其他的关联,那么名字会从路径上忽略并且为了突出"类自然性"而放在类矩形中。在两个情况中,实际的语义都没有区别。
讨论
图13-26表示了代表雇用关系的关联类。公司与个人之间的雇用关系是多对多的。一个人可以有多个工作,但只有一个工作是对指定的公司的。薪水既不是公司又不是个人的属性,因为关联是多对多的。它必须是关系本身的属性。
老板-工人的关系不仅仅是两种人之间的关系,它是处于某种职业的人与处于另一种职业的人之间的关系,它是关联类和它自己之间的关联。
下面的例子表示关联类和建模成类的具体化关系之间的区别。在图13-27中,股票的所有者被建模成人与公司之间的关联。关联类属性quantity表示了拥有股份的数量。这个关系建模成关联类是因为对任何person-company对只有一个入口。
如图13-28所示,为了建模购买股票,我们没有用关联类,因为对同一个人和公司来说可以有多个购买。然而,它们必须是可区别的,因为每次购买是不同的而且有它自己的日期和价格以及数量。这个关系必须是具体化的,即形成有着自己的身份证明的可区别的对象。一个普通的类是建模这种情况的正确的方式,因为每次购买有着它们自己的身份证明,独立于与它联系的Person和Company类。

图13-27 带属性的关联类

图13-28 具体化的关联
33.关联端点(association end)
关联端点是关联的一个结构部分,它定义了在关联中类的参与。在同一个关联中一个类可以连接到多个端点。在关联中的关联端点有不同的位置而且有名字,并且通常是不可互换的。关联端点一旦脱离它的关联独立存在也不再有含义。
语义
结构
关联端点保持一个目标类元的引用。它定义了在关联中类元的参与。关联的实例(链)必须在指定位置含有给定类或它的一个后代的实例。类的后代继承关联的参与。
一个关联端点有如下的特性:
聚集(aggregation)
判定相关对象是聚集还是组成,有枚举值{none,aggregate, composite}。如果值是none,那么关联就叫做一个聚集或一个组成。缺省情况是none。只有二元关联才能是聚集或组成,并且只有一端能是聚集或组成。
可修改性(changeability)
判定与对象有关的连接集合是否可修改,有枚举值{changeable,frozen,addOnly}。缺省情况下是changeable。
接口说明(interface specifier)
对相关对象,类元中的说明类型的可选择的限制。
多重性(multiplicity)
与一个对象相关的对象的可能的数量,通常指定为整数范围。
导航性(navigability)
一个布尔值,表示是否可能将一个二元关联转化以得到有关一个类实例的对象或对象集合。缺省是真。
定序(ordering)
判定一组不相关对象是否是有序的,枚举值有{unordered,ordered}。为了设计的目的,sorted值也可以被用到。
限定符(qualifier)
一组属性用来选择关联联系起来的对象。
角色名字(rolename)
关联断点的名字,一个标识符字符串。这个名字确定关联内对应类的特定角色。角色名在关联中和在源类的直接和继承的伪属性中必须是唯一的。
目标范围(target scope)
判定连接与对象或整个类是否相关,枚举值有{instance,classifier}。缺省是instance。
可见性(visibility)
连接是否可访问类而不能访问关联中相反的一端。可见性位于连接到目标类的一端。转换的每个方向有它自己的可见性值。
表示法
关联路径的端点连接到对应类符号的矩形边缘上。关联端点特性表示成在路径端点上或旁边的符号,这条路径连接到一个类元符号(如图13-29)。下面的表是对每个特性的符号的简要的总结。要了解详细资料见独立的章节。
聚集 (aggregation)
位于聚集端的一个空的菱形,对于组成来说是一个实菱形。
可修改性(changeability)
在目标端的文字属性{frozen}或{addOnly},通常省略{changeable}。
接口说明(interface specifier)
角色名上的名字后缀,形式是:typename。
多重性(multiplicity)
靠近路径端点的文字标记,形式是:min..max。
导航性(navigability)
路径端点上的箭头表示了导航的方向。如果两个端点都没有箭头,就是假设关联在两个方向上都是可导航的。
定序 (ordering)
靠近目标端点的文字属性{ordered},有目标类实例的有序表。
限定符(qualifier)
在路径端点和源类之间的一个小矩形。矩形内包含了一个或多个关联的属性。
角色名(rolename)
靠近目标端的一个名字标签。
目标范围(target scope)
类范围角色名是加下划线的,除非它是实例范围。
可见性(visibility)
可见性符号{+ # -}位于角色名前。
如果在一个独立的角色上有多个符号,那么它们以如下顺序表示,从连接类的路径的一端读起(如图13-23)
限定符
聚集或组成符号
导航箭头
角色名和多重性应该放置在靠近路径的一端,这样它们不会与别的关联混淆。它们可以放置在线的任何一端。把它们总是放在线的一端更好一些,但是有时明确性更重要。角色名和多重性可以放在同一个角色相对的两边,或者它们也可以放在一起。

图3-29
标准元素
关联(association),全局(global),局部(local),参数(parameter),自身(self)。
34.关联泛化(association generalization)
关联泛化是两个关联之间的泛化关系。
见关联(association),泛化(generation)。
语义
关联之间的泛化是允许的,虽然这有点不太常见。与其他的泛化关系一样,后代元素必须加入到父的内容中(定义规则),并且作为父的外延(实例的集合)的子集。加入到内容中意味着加入附加的限制,一个子关联比它的父有更多的约束。比如,在图13-30中,如果父关联将类Subject和Symbol连接起来,那么子关联可以将类Order和OrderSymbol连接起来,在这里面Order是Subject的子,OrderSymbol是Symbol的子。作为外延的子集意味着子关联的每个连接是父关联的一个连接,而反之却不能。上面的例子遵循了这条规则,任何连接Order和OrderSymbol的连接也可以连接Subject和Symbol,但是不是所有连接Subject和Symbol的连接都可以连接Order和OrderSymbol。
表示法
泛化箭头符号(实线、空三角形箭头)将子泛化和父泛化连接起来。箭头在父泛化一方。由于线段连接到其他的线段,关联泛化符号可能造成混淆所以应该小心使用。
举例
图13-30表示了Subject和Symbol之间普通model-view关联的两个特举例:Order和OrderSymbol之间的关联是一个特例,另一个是Customer和CustomerSymbol之间的关联。它们都将一个Subject类和一个Symbol类连接起来。Subject-Symbol关联可以看作是抽象的关联,而两个子关联是具体的。
这种由关联连接的成对类层次模式相当普遍。
标准元素
被销毁的(destroyed)。

图13-30关联泛化
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操作被作为一个调用事件实现,它触发每个状态的内部转换。当调用发生时,根据活动状态,执行一个或其他动作序列。如果系统是锁住的,返回零;如果系统是打开的,账户中的所有钱返回并且重新计数为零。

图13-39调用事件

本文地址:http://com.8s8s.com/it/it2078.htm