16.6.3 语义

LinkAction读取、创建和销毁Association(可能是AssociationClass)的links。要操作的links使用LinkEndData来鉴别,它们指明了links所期望的端值(参见16.5)。一个LinkAction的LinkEndData元素的所有ends必须是相同Association的memberEnds。LinkAction的LinkEndData元素所指明的所有InputPins必须是该LinkAction的inputValue InputPins。具有isStatic=true的Association的语义未定义。

ReadLinkAction读取Association一端的值,并把它们置于result OutputPin。所读取的端称作open end。ReadLinkAction只能有1个endData元素不能具有所指定的value InputPin,相应的end就是open end。对于open end不可导航(navigable)的,或在上下文Classifier、或从属Behavior(如果没有上下文Classifier)不可见的link,其读取语义是未定义的。

当ReadLinkAction执行时,它鉴别出与endData对象值和限定符值(open end和open end的限定符值除外)相匹配的现有links的一个集合。置于result OutputPin处的值是这个links集合的open end上的值。如果open end有序,那么这些值被有序的放置在result OutputPin。如果没有匹配的links,那么ReadLinkAction产生一个空的token并将其置于result OutputPin。

ReadLinkAction的result OutputPin必须与open end具有相同的类型和值序。open end的multiplicity必须与OutputPin的是相容的,必须是相同的。举个例子,建模者可以设置result Pin的multiplicity支持多值即使open data只允许一个单值。

CreateLinkAction用于创建links。它没有OutputPin,因为links不是Actions之间必须要传输的值。CreateLinkAction也可以用来创建一个link object,即使这种情况下也没有输出值。(如果Association变成了AssociationClass,CreateLinkAction不必进行改变,反过来也一样。)CreateLinkObjectAction的语义适用于利用CreateLinkAction创建link objects(参见16.7)。

CreateLinkAction使用LinkEndCreationData,后者是LinkEndData的一个的特化。它支持把新link所链接的对象上已有links进行销毁。当link创建后,isReplaceAll选项可以以end-by-end的方式按照所指定的ends把全部的links进行销毁(??到底是在新link创建之前还是之后)。如果要创建的link已经存在,那么这种情况下不会被销毁。如果所有的Association ends是无序的并且唯一,创建一个对象间已经有相同Association链接的link没有效果。

具有有序ends的Associations可以通过在运行时在LinkEndCreationData上额外的insertAt InputPin来指明插入点位置,这对有序Association ends在isReplaceAll为假时是必须的,对于无序的ends,则省略。

注意. 即使multiplicity的上限是1,Association ends也有可能是有序的。

insertAt Pin的type是UnlimitedNatural,multiplicity是1..1。小于或等于当前links数量的正整数插入点意味着把新link插入到现有links序列的那个位置,1表示序列的头。值"*"表示插入到序列的尾部。值为0或大于当前links数目的整数值的情况下语义是未定义的。在一个有序唯一的序列中重新插入一个已有的link相当于把它移到那个位置。

创建一个抽象Association的link是未定义的。创建一个违反Association ends的multiplicity上限约束的link是未定义的。

创建一个具有Association end isReadOnly=true(在另一端的对象初始化后)的link是为定义的,除非正在创建的link早已存在(此种情形下CreateLinkAction没有效果)。只要参与到新links的对象(通过只读ends)仍然正在初始化,那么links就可能被创建。这意味着具有两个或更多只读ends的Associations不能有links,除非要链接的所有objects都在初始化中。

DestroyLinkAction销毁与指定的LinkEndData匹配的links。如果没有匹配的links,那么该Action没有效果。

DestroyLinkAction也可以用来销毁link objects,

DestroyLinkAction使用LinkEndDestrucitonData,后者是LinkEndData的一个特化。它支持把Association非唯一ends的重复links销毁。isDestroyDuplicates选项工作在端到端的基础上,会导致所指定端上所有重复的links被销毁。

具有有序、非唯一ends的Association可以通过在LinkEndDestructionData上额外的的destroyAt InputPin来指定运行时要删除的位置,这对于有序、非唯一ends在isDestroyDuplicates为false情况下是必须的。destroyAt Pin类型为UnlimitedNatrual,multiplicity为1..1。删除的位置是一个正整数且小于或等于当前links的数目,表明删除在该位置上的link,1代笔序列的第一个link。对于值为0、大于当前links数目的整数、“*”的情况语义未定义。

对于isReadOnly=true的Association end,如果对端对象已经初始化,那么销毁这样一个link是语义未定义的,除非没有与endData匹配的link(此种情形下,DestroyLinkAction无效果)。只要只读端的对象仍在初始化中,那么对象间的links就可以被销毁。这意味者具有两个或更多只读端的links不能被销毁,除非所有参与的对象都正在被初始化。

Clear Association Actions

ClearAssociationAction销毁某个特定对象所参与的Association的所有links,包括AssociationClass的link objects。要清除的Associaiton是静态指定的。ClearAssociationAction有一个InputPin,用于指定运行时对象,它必须是Association的某一个memberEnds类型或其特化类型。所有与给定对象相连的Association的links都要被销毁,即使违反了Association ends的multiplicity下限的约束。DestroyObjectAction适用于ClearAssociationAction销毁link objects。

results matching ""

    No results matching ""