UML设计类图:具有另一个类作为属性的类?

时间:2014-11-29 19:05:55

标签: oop uml class-diagram

我很难弄清楚如何将某个场景建模为UML设计类图。

假设我有以下情况:

我有一个名为CPoint的类,它有两个属性:x和y(R2平面中的坐标)。另一方面,我有一个名为CLine的类,它应该有两个CPoint作为属性。

这对代码非常简单(我将在我的示例中使用C ++):

class CPoint{
    float x;
    float y;
    //Constructor, gets and sets here
}

对于CLine:

class CLine{
    CPoint p1;
    CPoint p2;
    //Constructor, gets and sets here
}

现在我的问题是:我如何用UML建模这样的东西?

我想到了类似的东西:

Attempt 1

但后来我被告知这违反了面向对象建模的原则,所以我做到了这一点:

Attempt 2

但它根本不能说服我。另外,我正在阅读有关设计模式的内容,并在阅读单身人士时参与了这个UML设计:

Singleton design pattern

这让我觉得我最初的做法恰到好处。另外,如果我将它作为一个C ++程序,我能够看到我的第一种方法是正常的。但是在java中,我仍然需要通过在CLine的构造函数中执行new CPoint(0, 0)来创建对象。我对此感到很困惑。

那么,我该如何模拟这种情况呢?当我试图模拟这种情况时,我是否可能过于具体了?

提前致谢!这不是让我晚上睡觉

3 个答案:

答案 0 :(得分:5)

在UML中,关联或属性(属性)或多或少是相同的,所以它们都是正确的。

在大多数UML 工具中,它们是不同的东西。

这里没有真正的规则,但有最好的做法。 我的UML Best Practice: Attribute or Association说:

  

为数据类型使用类和属性的关联

答案 1 :(得分:2)

如果您的CLine恰好有两个以point表示的结尾,那么您可以在UML中将其定义为具有属性的CLine类(就像第一个示例中的CLine一样好但没有关联"有")或者你可以将它设计为CLine类,与CPoint有两个关联。 CPoint的多重性为1,第一个角色为p1,CPoint侧为第二个角色为p2。

答案 2 :(得分:2)

没有一个最好的解决方案。这取决于上下文和您想要建模的内容。我同意弗拉基米尔的观点,你将与角色p1和p2有两个关系。成员x和y应该是私密的,我猜(-x, -y)而不是公开(+x, +y)。此外,您可以将关系建模为聚合或复合(开放或闭合菱形符号),但如果单个点可以是两条线的端点,那么这是不合适的。同样,这取决于您想要建模的内容。如果在问题中所述的行构造函数中构造一个新点,那么你可能想要使用一个组合关系,因为这些点在没有该行的情况下不存在。

(顺便说一句,在代码中,坐标是浮点数,在图中是int)。