0

假设我有 A 类,分别与 X、Y 和 Z 类关联。我需要指出,对于任何给定的 A 类实例,只能实例化这些关联中的一个(因此,一个异或约束)。如果约束只是跨两个关联,我知道该怎么做。显然我可以制作三个单独的异或约束(XY,XZ,YZ),但我想知道是否有更好/更清洁/正确的方法来做到这一点?

编辑:各个关联的多重性约束不一样。使用抽象类或接口将不起作用。此外,一个注释是不够的。我需要使用某种形式化的结构,最好是标准化的(例如通过 OMG)来表达这一点,因为我正在以编程方式处理模型元素(即它不仅仅是一张图片)。我了解 UML 的底层模型是如何为这个工具提供的。它还指定(虽然有点模糊)它应该如何表示。事实上,我想我的主要问题是找到一个允许我制作这种符号的工具。我不认为 MagicDraw 这样做。我应该早点说明这些事情。

FWIW,我正在使用 MagicDraw。如果我能以 MagicDraw 真正理解的方式做到这一点,那将是一个很好的奖励。如果那是不可能的,我可以忍受它。

4

2 回答 2

2

对于 2-way 情况,xor 约束只是一个程式化的且指定不足的约束。

您可以将显式约束(在 Complete OCL 中)定义为:

context A
inv OnlyAorBorC: A->size() + B->Size() + C->size() <= 1

MagicDraw 可能允许您在 A 上指定类似的上下文约束。

于 2017-08-21T18:15:39.220 回答
2

如果“X”、“Y”和/或“Z”可以以某种方式概括(我的意思是,如果你不是为了条件流控制而这样做),你可以为“I”创建一个接口(或抽象类)例如,让“X”、“Y”和“Z”实现这个接口。然后,在 A 和接口 I 之间建立多重性 1 的关联。请参见下图:

在此处输入图像描述

编辑:上面的示例不适用于 A 在 X、Y 和 Z 之间具有不同基数的情况。对于这种情况,我能看到的唯一方法是使用 UML 约束来限制这些关系。您可以在 UML 中定义一个约束,在大括号之间放置一些 OCL 表达式。例如。

在此处输入图像描述

在这里,帐户所有者是个人或公司,这个 {xor} 是预定义的 UML 约束。

我不确定您的基数要求的详细信息,但是这个 {xor} 和我给出的接口示例之间的组合可能就足够了。至少它为您提供了更多选择,例如:

在此处输入图像描述

如果您需要了解更多关于 UML 约束主题的信息,我从 uml-diagrams.org 获得了这个示例:http ://www.uml-diagrams.org/constraint.html

于 2017-08-21T15:57:48.197 回答