UML配置文件中扩展构造型的约束

问题描述

假设您有一个较大的汽车摘要

Profile Excerpt for Cars

现在,我想为汽车定义一些约束,例如约束条件之一,如果attrAtrue,那么attrB必须是false使用OCL:

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

我的问题是:如果Mercedes构造型专门用于汽车构造型,我是否要遵循相同的约束条件,换句话说:构造型Car是否仍适用于具有{{1} }使用定型观念?

如果应用的构造型为Mercedes,我想self.stereotype.name='Car'返回false

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

解决方法

如果应用的原型是梅赛德斯,我假设self.stereotype.name ='Car'返回false。

是的,对。

Mercedes 照原样继承了约束,所以对于{E1)刻板的 Mercedes 而不是 Car 的类,self.stereotype.name='Car'为false,因为'梅赛德斯”和“汽车”是两个不同的字符串。


如果您希望直接或间接地使专门针对 Car 的元类的第一个 implies 有效,则可以获取更多的构造型本身的概括,以搜索一个命名的“汽车”,还会检查构造型的配置文件的名称,并且可以是其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):

enter image description here

,

考虑一下,您的要求是不合理的。

假设您的系统已经过度热情地限制了Car的FuelType为PETROL。您很难定义燃料类型为DIESEL的派生汽车;不会是汽车的建模定义的汽车。

您可以尝试解决使用mixins的问题,但是对于任何实际生产的Car,排列的数量都是无法忍受的。

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

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