假设我有类Foo,它与某些事物有关联,可以完成一个角色。这个角色可以通过(严格地)一个条形x或任意数量的Baz来实现。类似地,角色可以通过任何数字或条形x或任意数量的Baz来实现(但混合集合是不可容忍的)。有没有合理的方法只使用关联,类和接口在类图中表示这些?我(真的)想避免使用OCL或约束元素。
(我想避免这些的原因是因为我们正在从UML生成代码。我们已经实现了处理关联,类和接口的生成。处理OCL将是非常重要的任务。约束元素不会太糟糕了,但还是做了很多工作。)
答案 0 :(得分:2)
我将从下面的图片开始,创建几个不同的版本,然后决定哪一个生成最佳代码(junior-40)。
黄色块表示根据您的其他要求理顺您的示例所需的必要“胶水代码”
答案 1 :(得分:0)
您是否正在考虑以下内容:
XOR between classes http://www.uml-diagrams.org/class-diagrams/class-constraint-dashed.png
如果账户是你的Foo,那么Person就是你的Bar,而公司就是你的Baz。
然后,您可以在两个关联中指定多重性:Bar(Person)为[1],Baz(Corporation)为[1 .. *]。
答案 2 :(得分:0)
考虑创建一个抽象类 Thing 并从中派生Bar和Baz。它抽象整个角色,如果需要可以包含一些自己的注意和方法,并且非常灵活和可扩展。
现在,Account只与AccountOwner建立关联(角色"角色",正如Jim L.在他的评论中解释的那样,角色名称在此上下文中必须是唯一的)。
请注意,这并不需要额外的限制。例如,所有链接的"角色"应该是同一类型。有时删除所有限制并不容易(甚至可能)。否则,我们会在类图之外制作完整的系统。我同意,尽可能多的信息应该包含在课程,分类和特征(atts,assocs和methods)中。
示例:强>
示例2(评论后):
此版本克服了使用OCL ant的需要,同时保持了简单性和灵活性:
现在还为每个具体的角色"衍生和改进了多重性。不需要OCL。 :)
答案 3 :(得分:0)
在OCL中为类添加约束:
(self.role->exists(r|r.oclIsType(Bar)) and self.role->notexists(r|r.oclIsType(Baz)) ) or
(self.role->exists(r|r.oclIsType(Baz)) and self.role->notexists(r|r.oclIsType(Bar)))
您可以使用MDriven Designer进行尝试。
在UML规范中引入OCL(对象约束语言)的原因就在于此;能够通过简单的基数和类型信息添加不可能或不实用的约束
答案 4 :(得分:0)