16.8.3 语义

Structural Feature Actions

静态给定StructuralFeatureAction一个Classifier的StructuralFeature和一个目标对象(通过object InputPin)。该对象要么是拥有该StructuralFeature 的Classifier的实例(直接或间接),要么如果该StructruralFeature是一个二元Association的ownedEnd,则是该Association对端类型的实例。如果该StructuralFeature是一个Association end,那么StructuralFeatureAction具有与Association(以StructurealFeature为一个end)上的LinkAction具有相同的语义。如果该StructuralFeature在StructuralFeatureAction的上下文Classifier或从属的Behaivor(如果没有上下文Classifier)中不可见,或者该StructuralFeature的isStatic=true,那么语义是未定的。

StructuralFeatures和对象参与的Associations可能随时间发生变化(动态再分类,参见16.4中的ReclassifyObjectAction)。然而,StructuralFeatureAction的object InputPin的类型是一个单一Classifier,只有在Action接收到它时它符合那个Classifier 的情况下语义才有定义。从StructuralFeatureAction引用的StructuralFeature是一个模型元素,因此它是唯一可鉴别的,即使其它Classifiers也有相同名字的其它StructrualFeatures。

ReadStructuralFeatureAction读取一个StructuralFeature的值并将其置于result OutputPin。其它类型的StructuralFeatureActions,WriteStructuralFeatureAction(包括AddStructuralFeatureValueActions和RemoveStructuralFeatureValueActions)和ClearStructuralFeatureActions修改一个StructuralFeature的值。这些Actions可以有一个result OutputPin。如果提供了result Output,那么如果输入的对象被修改,它就会被置于这个OutputPin。如果输入的对象是一个数据值(DataType的实例),那么输入数据的一个拷贝被置于这个输出pin,其结构化feature可能被修改。由于数据值没有独立标识,获取修改数据值的唯一方法就是使用这个result OutputPin。

Read Structural Feature Actions

ReadStructuralFeatureAction读取一个StructuralFeature的值并将其置于result OutputPin。如果该StructuralFeature是有序的,那么值以有序的方式被置于这个OutputPin。如果StructuralFeature是一个Association end,那么其语义与ReadLinkAction读取一个作为open end(参见16.6)的StructuralFeature是一样的。如果没有读到值(即StructuralFeature为空),那么ReadStructuralFeatureAction在result OutputPin产生一个空token。

result OutputPin的类型和次序同于StructuralFeature。StructuralFeature的mulplicity必须与result OutputPin的mulplicity兼容,但不必相同。举个例子,建模者可以设置OutputPin的multiplicity以支持多值,即使StructuralFeature只允许一个单值(这种情况下,ReadStructuralFeatureAction不会由于StructuralFeature的multiplicity的改变而带来影响)。

Add Structural Feature Value Actions

AddStructuralFeatureValueAction用于为对象添加一个StructuralFeature的值。要添加的值通过value InputPin给定,这是必须的。该InputPin与StructuralFeature具有相同的类型并且mulplicity为1..1(即一个单值)。如果StructuralFeature是一个Association end,那么其语义与CreateLinkAction(参见16.6)相同,其中link的参与者就是目标对象和要添加的新值。

如果isReplaceAll为真,那么StructuralFeature的现有值将在新值添加之前被移除,除非StructuralFeature已经包含了该新值,此种情况下它(笔者注:指的是与新值相同的那个值)不移除。当Action完成后,StructuralFeature总是具有一个单值,即使其multiplicity下限约束大于1。如果isReplaceAll为假并且StructuralFeature是无序且唯一的,那么添加一个已经包含在StructuralFeature中的值没有效果。

向有序的StructuralFeature添加一个值需要通过insertAt InputPin指定插入点,这对有序StructuralFeature在isReplaceAll为假的时候是必须的,对于无序的StructuralFeatures则省略。

注意. 即使StructuralFeature的multiplicity上限为1,它的值也可以是有序的。

如果提供了insertAt InputPin,它的类型是UnlimitedNatural且multiplicity为1..1。小于或等于当前值数目的正整数插入点给定了在序列中要插入的位置,整数1表示序列的第一个元素。值“*”表示序列的末尾。对于值为0或大于现有值数目的整数,语义是未定义的。向有序的、唯一的StructuralFeature中再插入一个已有的值相当于将其移动到指定的位置。当isReplaceAll=true时,插入点被忽略。

如果添加一个值导致违反StructuralFeature的multiplicity上限,或者在对象初始化后向一个isReadonly=true的StructuralFeature添加一个新值都是语义未定义。

Remove Structural Feature Value Actions

RemoveStructuralFeatureValueAction用于从对象的某个StructuralFeature移除一个值。如果SturcturalFeature是一个Association end,那么它的语义与DestroyLinkAction相同,其中link的参与者就是要移除的对象值。

要移除的值通过value InputPin给定,它与StructuralFeature具有相同的类型且multiplicity为1..1。即使结果会违反StructuralFeature的multiplicity下限,该值也会被移除。移除一个并不包含在StructuralFeature内的值没有效果。isRemoveDuplicates选项指示是否移除一个非唯一StructuralFeature中给定值的所有重复值。

如果isRemoveDuplicates为假且StructuralFeature有序且非唯一,那么不会给定value InputPin,而是通过removeAt InputPin指定要移除的值位置,它的类型是Unlimitednatrual且multiplicity为1..1。对于小于或等于当前值数目的正整数指明了要移除值在序列中的位置,整数1表示序列中的第一个值。0、大于当前值数目的整数,以及“*”,语义都是未定义。

在宿主对象初始化后移除readOnly=true的StructuralFeature的一个现有值是语义未定义的。

Clear Structural Feature Actions

ClearSructuralFeatureAction用于移除一个StructuralFeature的所有值,即使StructuralFeature的下限约束要求大于0。如果StructuralFeature没有值,则该Action没有效果。如果StructuralFeature是一个Association end,那么它与给定对象的ClearAssociationAction具有相同的语义。

在宿主对象初始化后操作一个isReadOnly=true的StructuralFeature是语义未定义的,除非该StructuralFeature没有值。

results matching ""

    No results matching ""