UML 概要文件中扩展构造型的约束

Constraints on extended stereotype in UML profile

假设您有一个较大的汽车配置文件的摘录:

现在我想为汽车定义一些约束,比如其中一个约束状态,如果 attrAtrue,那么 attrB 必须是 false像这样使用 OCL:

Context UML::Core::Class inv:
self
  .stereotype
  .name='Car'
implies
  self.attrA=true
  implies
    self.attrB=false

我的问题是:如果 Mercedes 刻板印象专用于 Car 刻板印象,我是否坚持相同的约束,换句话说:刻板印象 Car 是否仍然适用于 类是否应用了 Mercedes 刻板印象?

我假设 self.stereotype.name='Car' return false 如果应用的刻板印象是 Mercedes.

这很有趣,因为我想在梅赛德斯上拥有与在汽车上相同的属性,但我想更改先前声明的约束条件。

I would suppose that self.stereotype.name='Car' return false if the applied stereotype is Mercedes.

是的,你是对的。

Mercedes 照原样继承约束,因此 self.stereotype.name='Car' 对于 class 构造型 Mercedes 是假的而不是 Car 因为 'Mercedes' 和 'Car' 是两个不同的字符串。


如果你想让第一个 implies 直接或间接地为 metaclasses 专门化 Car 激活,你可以获取原型的所有概括更多本身以搜索名为 'Car' 的名称,同时检查原型配置文件的名称,并且可能是其 URI。因此,例如将 self.stereotype.name='Car' 替换为 :

self.stereotype.profile.name = 'Cars' and
-- self.stereotype.profile.URI= '...' and
self.stereotype.generalization()
  ->closure(general.generalization).general()
    ->including(self.stereotype)
      ->select(name = 'Car')
        ->notEmpty()

或者有一个名为 Cars 的单独配置文件和一个名为 Car 的单独构造型:

self.stereotype.oclIsKindOf(Profile.allInstances()
                              ->any(name = 'Cars') -- may be check also URI
                                 .ownedStereotype->any(name = 'Car'))

补充说明:

  • 在您的提案中,您假设在所有配置文件的所有刻板印象中只有您的刻板印象被命名为 Car,当然这可能是错误的。您还可以检查配置文件的名称,可能是它的 URI,例如:

    self.stereotype.name='Car'
    and self.stereotype.profile.name='Cars'
    -- and self.stereotype.profile.URI= '...'
    
  • 在你的图表中,箭头是错误的,因为它必须是一个实心三角形而不是 <(可能你使用 PlantUML):

想想看,你问的不合理

假设您的系统已经具有 over-enthusiastic 约束,即汽车的 FuelType 是 PETROL。您在尝试定义 FuelType 为 DIESEL 的派生 Car 时遇到了大麻烦;根据 Car 的建模定义,它不会是 Car。

您可以尝试使用 mixins 来解决这个问题,但是排列的数量对于任何实际的量产车来说都是无法容忍的。

相反,您可以采用 UML 规范采用的漏洞方法,例如 Namespace.isDistinguishable 帮助器确定是否需要唯一名称(允许多个未命名约束)。

因此,对于 Car,您可以定义 getAcceptableFuelTypes() 帮助器,它可以被重写,从而为派生 类 创建一个漏洞;将基本约束实现为 getAcceptableFuelTypes()->includes(fuelType).