Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
跨三个关联的UML约束?_Uml_Ocl_Magic Draw - Fatal编程技术网

跨三个关联的UML约束?

跨三个关联的UML约束?,uml,ocl,magic-draw,Uml,Ocl,Magic Draw,假设我有一个类A,它分别与类X、Y和Z关联。我需要指出的是,对于类A的任何给定实例,只能实例化其中一个关联(因此,xor约束)。如果约束正好跨越两个关联,我知道如何执行此操作。显然,我可以只做三个单独的异或约束(X-Y,X-Z,Y-Z),但我想知道是否有更好的/更干净的/正确的方法来做 编辑:各个关联上的多重性约束不同。使用抽象类或接口将不起作用。此外,一份说明是不够的。我需要使用某种形式化的结构,最好是标准化的结构(例如OMG)来表达这一点,因为我正在以编程方式处理模型元素(即,它不仅仅是一张

假设我有一个类A,它分别与类X、Y和Z关联。我需要指出的是,对于类A的任何给定实例,只能实例化其中一个关联(因此,xor约束)。如果约束正好跨越两个关联,我知道如何执行此操作。显然,我可以只做三个单独的异或约束(X-Y,X-Z,Y-Z),但我想知道是否有更好的/更干净的/正确的方法来做

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

FWIW,我在用MagicDraw。如果我能以MagicDraw真正理解的方式做到这一点,那将是一个很好的奖励。如果“X”、“Y”和/或“Z”可以以某种方式进行广义化(我的意思是,如果您不为条件流控件执行此操作),您可以创建一个接口(或抽象类)“I”,例如,并使“X”、“Y”和“Z”实现此接口。然后,将多重性为1的关联放在A和接口I之间。 见下图:

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

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

我不确定基数需求的细节,但是,将这个{xor}和我给出的接口示例结合起来可能就足够了。至少它给了你更多的选择,比如:

如果您需要更多地了解UML约束主题,我从UML-diagrams.org获得了这个示例:

如果“X”、“Y”和/或“Z”可以以某种方式进行广义化(我的意思是,如果您不为条件流控制执行此操作),您可以创建一个接口(或抽象类)“I”,例如,并创建“X”、“Y”和“Z”实现这个接口。然后,将多重性为1的关联放在A和接口I之间。 见下图:

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

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

我不确定基数需求的细节,但是,将这个{xor}和我给出的接口示例结合起来可能就足够了。至少它给了你更多的选择,比如:


如果您需要更多地了解UML约束主题,我从UML-diagrams.org获得了这个示例:

xor约束只是一个样式化的约束,而不是双向情况下的指定约束

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

context A

inv ONLYYAORBROC:A->size()+B->size()+C->size()对于双向情况,xor约束只是一个样式化的约束,而不是指定的约束

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

context A

仅库存RBORC:A->size()+B->size()+C->size()这不包括所有情况。请参阅编辑后的问题。“接口”是一种构造,用于为支持接口的平台/语言(如Java和C#)创建实现模型,但不用于逻辑设计建模,这是所要求的模型类型。因此,你最好删除你答案的这一部分。我同意你的观点,专业化不应纯粹用于模型逻辑条件,但是,由于问题没有具体说明a、X、Z和Y在现实世界中是什么,我认为这对他来说是有用的,因为,可能,X、Y和/或Z可能是广义的。在任何情况下,我都会更新我的答案,以澄清这一点。这并不包括所有的情况。请参阅编辑后的问题。“接口”是一种构造,用于为支持接口的平台/语言(如Java和C#)创建实现模型,但不用于逻辑设计建模,这是所要求的模型类型。因此,你最好删除你答案的这一部分。我同意你的观点,专业化不应纯粹用于模型逻辑条件,但是,由于问题没有具体说明a、X、Z和Y在现实世界中是什么,我认为这对他来说是有用的,因为,可能,X、Y和/或Z可能是广义的。无论如何,我会更新我的答案,以明确这一点。
context A
inv OnlyAorBorC: A->size() + B->Size() + C->size() <= 1