2013-03-20 54 views
1

假设有一个容器C可以包含类型A和B的对象。 C不能为空,并且只能包含每种类型的1个对象。这意味着,C含有下列之一:类型UML映射:带有两种类型的对象的容器类

  • 1对象B
  • 1类型A的对象+ B 1个型对象

类型的

  • 1对象要映射UML类图这个问题我想这些......

    enter image description here

    ...但非因为在左图中容器C可以是空的,并且在右图中容器C可以包含两个A(或B)类型的对象。

    所以我的问题是:怎么可能映射这个问题?

  • 回答

    1

    你的问题的解决方案确实使用UML约束哈维尔解释。但在这种特殊情况下,有一个预定义的UML约束,称为{or},它完全符合你的要求。 “或”约束在UML中预定义,并可以在关联之间以图形方式写入。注意如何从多重性中删除0,因为{or}意味着其中一个聚合可能完全不存在。

    enter image description here

    P.S 1:有关{xor}的类似示例见302页和303 UML 2.0 Toolkit by OMG Press Book。第2页:据我所知,你使用分支聚合的符号是不正确的UML符号(或者至少有不同的含义)。将多个关系结合在一起是适用于泛化的备选符号。

    第3页:当然,如果您发现它更具描述性,您可以使用OCL或自然语言进行约束。

    1

    在左侧图中,基数允许 - 型的1个对象A - B 1型对象 - 1类型A的对象+ B 类型的1个对象 - 没有对象

    基数只影响关联的多样性在他们所应用的地方结束。您需要将条件的最后部分(至少一个A或至少一个B)写为约束(不变)。不变量是总是对于该类的每个实例都成立的条件。

    如果您将约束条件写为伪代码,则足以说明a!=null or b!=null。 您将不变量作为附注到约束类的刻板标签«invariant»来绘制。

    Constraint

    在OCL(用于约束的非模糊描述语言):

    inv: not a.oclIsUndefined() or not b.oclIsUndefined() 
    

    (可以进一步了解OCL here

    右图示引入一个超级类Object这不是你的问题描述的一部分。可能会有另外的课程专门针对Object(例如C),您不希望在您的关联中使用这些课程。在这种情况下,不变的是更为复杂,因为你需要要求:

    • 存在着一个
    • 最多一个实例还有就是在B的最多一个实例
    • 没有其他实例类。

    (如果你写自然语言的不变量,这就足以提及上述项目)。

    在OCL,假设关联端被命名为x,不变写着:

    inv: x->select(oclIsKindOf(A))->size()<=1 and 
        x->select(oclIsKindOf(B))->size()<=1 and 
        x->select(not oclIsKindOf(A) and not oclIsKindOf(B))->isEmpty() 
    

    inv: let a:Integer = x->select(oclIsKindOf(A))->size() in 
        let b:Integer = x->select(oclIsKindOf(B))->size() in 
        a<=1 and b<=1 and x->size()=a+b 
    
    相关问题