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= '...'
- 在你的图表中,箭头是错误的,因为它必须是一个填充的三角形,而不是
。我很困惑。您的答案似乎表明,FuelType可能是一个有意义的刻板印象属性。刻板印象定义了一个语言概念,比如类和关联。虽然我可能会说我的车型中的某些级别的奔驰,但我想知道说它的燃料类型是汽油意味着什么?原型的实例仍然是模型元素(在m1上),而不是汽车(在m0上)。。如果你仔细想想,你的要求是不合理的 假设您的系统已经存在过度热情的约束,即汽车的燃料类型是汽油。你在试图定义一辆燃料类型为柴油的衍生汽车时遇到了大麻烦;这将不是一辆符合汽车模型定义的汽车 您可以尝试解决混音器的问题,但是对于任何实际生产的汽车来说,排列的数量都是无法忍受的 相反,您可以采用UML规范采用的漏洞方法,以Namespace.isDistinguishable助手为例,确定是否需要唯一名称(允许多个未命名的约束)
因此,对于Car,您可以定义getAcceptableFuelTypes()帮助程序,该帮助程序可以被重写,从而为派生类创建漏洞;将基本约束实现为getAcceptableFuelTypes()->includes(fuelType)。是梅赛德斯(也)继承了来自Car@bruno问题是
是否对self.stereotype.name='Car'
评估为Mercedes
(我想是的,但我不知道)。@qwerty\u so啊,是的,我读了这篇文章来快速回答这个问题。对我来说,评估结果为true
,我给出了一个答案我不知道你的业务领域,但创建一个实际上是汽车品牌的刻板印象似乎很奇怪,至少可以这么说。详细答案请点击Thx。我想知道,当查看UML的元模型时,我发现原型与使用扩展关联的类相关联(UML2.5.1参考CHP12.3.2)。扩展到extensioned,extensioned到原型。那么,在OCL中获得刻板印象的合适方法不是浏览这些关联吗?也许值得开始一个新的问题。@TilmanZuckmantel我不确定是否理解你,就像我一样,你做了错误
要访问xx的stereotype,这种方式在§12.5中也使用了4次。1@TilmanZuckmantel我还从同一文档第32页顶部给出的定义(如果您对此有疑问),计算出了包含一个原型及其所有泛化的集合,ocl规范本身可能会这样做,但不幸的是,它没有定义这一机制。事实上,这是行不通的。每个元素都可以有多个应用的原型。那么,自我刻板印象的含义是什么?这将是一套刻板印象。然后self.stereotype.name=“Car”无法计算,因为两侧的元素类型不兼容。所以我想,唯一的方法是通过扩展端(它有自己的问题)或者一些特定于工具的增强。找到一个原型的所有泛化是没有必要的。因为约束是继承的,所以它适用于所有的专门化。如果你不想把第一行的内容限制在“Car”上,那就删除self.stereotype.name=“Car”xx.stereotype
self.stereotype.name='Car' and self.stereotype.profile.name='Cars' -- and self.stereotype.profile.URI= '...'