我很难弄清楚如何将某个场景建模为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建模这样的东西?
我想到了类似的东西:
但后来我被告知这违反了面向对象建模的原则,所以我做到了这一点:
但它根本不能说服我。另外,我正在阅读有关设计模式的内容,并在阅读单身人士时参与了这个UML设计:
这让我觉得我最初的做法恰到好处。另外,如果我将它作为一个C ++程序,我能够看到我的第一种方法是正常的。但是在java中,我仍然需要通过在CLine的构造函数中执行new CPoint(0, 0)
来创建对象。我对此感到很困惑。
那么,我该如何模拟这种情况呢?当我试图模拟这种情况时,我是否可能过于具体了?
提前致谢!这不是让我晚上睡觉
答案 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)。