umlprofile中扩展原型的约束

umlprofile中扩展原型的约束,uml,ocl,stereotype,Uml,Ocl,Stereotype,假设您有一个更大的汽车简介摘录: 现在我想为一辆汽车定义一些约束,比如其中一个约束状态,如果attrA是true,那么attrB必须是false,使用OCL如下: Context UML::Core::Class inv: self .stereotype .name='Car' implies self.attrA=true implies self.attrB=false 我的问题是:如果Mercedes原型专门用于汽车原型,我是否坚持相同的约束条件,换句话说:原

假设您有一个更大的汽车简介摘录:

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

Context UML::Core::Class inv:
self
  .stereotype
  .name='Car'
implies
  self.attrA=true
  implies
    self.attrB=false
我的问题是:如果
Mercedes
原型专门用于汽车原型,我是否坚持相同的约束条件,换句话说:原型
Car
是否仍然应用于应用了
Mercedes
原型的类

如果应用的原型是
Mercedes
,我会假设
self.stereotype.name='Car'
返回
false

这很有趣,因为我希望梅赛德斯的属性与汽车的属性相同,但我希望更改之前声明的约束

如果应用的原型是Mercedes,我会假设self.stereotype.name='Car'返回false

是的,你是对的

Mercedes继承了原有的约束,因此对于原型为Mercedes而不是Car的类,
self.stereotype.name='Car'
为false,因为“Mercedes”和“Car”是两个不同的字符串


如果你想让第一个暗示直接或间接地为专门化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的单独原型:


补充说明:

  • 在你的提议中,你假设在所有概要文件的所有原型中,只有你的原型被命名为Car,当然这可能是错误的。您还可以检查配置文件的名称,可能是其URI,如:

    self.stereotype.name='Car'
    and self.stereotype.profile.name='Cars'
    -- and self.stereotype.profile.URI= '...'
    

  • 在你的图表中,箭头是错误的,因为它必须是一个填充的三角形,而不是
    。如果你仔细想想,你的要求是不合理的

    假设您的系统已经存在过度热情的约束,即汽车的燃料类型是汽油。你在试图定义一辆燃料类型为柴油的衍生汽车时遇到了大麻烦;这将不是一辆符合汽车模型定义的汽车

    您可以尝试解决混音器的问题,但是对于任何实际生产的汽车来说,排列的数量都是无法忍受的

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


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

    是梅赛德斯(也)继承了来自Car@bruno问题是
    self.stereotype.name='Car'
    是否对
    Mercedes
    评估为
    true
    (我想是的,但我不知道)。@qwerty\u so啊,是的,我读了这篇文章来快速回答这个问题。对我来说,评估结果为
    错误
    ,我给出了一个答案我不知道你的业务领域,但创建一个实际上是汽车品牌的刻板印象似乎很奇怪,至少可以这么说。详细答案请点击Thx。我想知道,当查看UML的元模型时,我发现原型与使用扩展关联的类相关联(UML2.5.1参考CHP12.3.2)。扩展到extensioned,extensioned到原型。那么,在OCL中获得刻板印象的合适方法不是浏览这些关联吗?也许值得开始一个新的问题。@TilmanZuckmantel我不确定是否理解你,就像我一样,你做了
    xx.stereotype
    要访问xx的stereotype,这种方式在§12.5中也使用了4次。1@TilmanZuckmantel我还从同一文档第32页顶部给出的定义(如果您对此有疑问),计算出了包含一个原型及其所有泛化的集合,ocl规范本身可能会这样做,但不幸的是,它没有定义这一机制。事实上,这是行不通的。每个元素都可以有多个应用的原型。那么,自我刻板印象的含义是什么?这将是一套刻板印象。然后self.stereotype.name=“Car”无法计算,因为两侧的元素类型不兼容。所以我想,唯一的方法是通过扩展端(它有自己的问题)或者一些特定于工具的增强。找到一个原型的所有泛化是没有必要的。因为约束是继承的,所以它适用于所有的专门化。如果你不想把第一行的内容限制在“Car”上,那就删除self.stereotype.name=“Car”
    。我很困惑。您的答案似乎表明,FuelType可能是一个有意义的刻板印象属性。刻板印象定义了一个语言概念,比如类和关联。虽然我可能会说我的车型中的某些级别的奔驰,但我想知道说它的燃料类型是汽油意味着什么?原型的实例仍然是模型元素(在m1上),而不是汽车(在m0上)。
    self.stereotype.name='Car'
    and self.stereotype.profile.name='Cars'
    -- and self.stereotype.profile.URI= '...'