2009-11-12 65 views
0

我正在研究UML中的分析模型,当试图在类图中的几个属性上表示约束时,我有点卡住了。在下面的类:如何在UML中建模互斥属性?

+-----------+ 
| SomeClass | 
+-----------+ 
| isFoo  | 
| isBar  | 
| isBaz  | 
| isQuux | 
+-----------+ 

列出的所有属性都是布尔类型,最后两个,isBazisQuux,是互斥的。我如何表明这一点?我宁愿不使用临时备忘录 - 更混乱。

我能找到的有关UML约束的一切似乎将它们应用于关联,而不是属性。我可以打破的属性伸到相关的类,但他们简单的布尔类型,所以这样的事情似乎有点小题大做:

+-----------+ 
| SomeClass | 
+-----------+ 0..1 isBaz 1 +-------------------+ 
| isFoo  |------------------| ThereCanBeOnlyOne | 
| isBar  |  |   +-------------------+ 
|   |  |{NAND}  | isBaz    | 
|   |------------------| isQuux   | 
+-----------+  isQuux +-------------------+ 

什么是“正确”的方式在UML相互排斥的属性模型?

回答

1

只有两个选项,将属性建模为与布尔数据类型的关联或使用OCL约束。

简化和纠正(只用一个“=”等于OCL云)可能是:上下文SomeClassinv不isBaz = isQuux

顺便说一句,我不知道确切意思为你的概念“相互排斥“。这通常会执行XOR(对标准中关联的预定义约束),但是您使用NAND。在你的模型中是否有可能这两个属性都有错误的值? (我假设这在我的OCL约束中是不可能的)

+0

谢谢,很好的说明。是的,在我的模型中,isBaz和isQuux实际上是“运营费用”和“主要运营费用”父合同对象可以分为一种,另一种或两种都不是(都是假的),但不是两种。 – Val

1

我会研究使用对象约束语言来描述它。

我从来没有真正使用它超过了几次讲座,但我相当肯定,这是你所需要的。

像这样的东西可以表达你想要的条件:

{context SomeClass 
inv isBaz==True implies isQuux==False 
inv isQuux==True implies isBaz==False} 

presentation可能会给你一个很好的起点。

+0

是的 - 我的第二个图中的{NAND}是OCL约束的简写; Scott Ambler在一个例子中使用它。我扫描了你链接到的preso。大多数情况下,这些约束是针对关联而应用的,但是在一些地方它们只是浮动并引用属性。我想我可以把你提出的表达式放在一个指向类的注释中。 – Val