如何用UML表示彼此引用的2个类?

时间:2018-01-13 18:44:41

标签: uml

我试图用UML图表示我的程序。我有两个课程如下:

Mesh.h

class Mesh
{
public:
    Mesh();
    ~Mesh();
    VertexArrayObject* vao;
};

VertexArrayObject.h

class VertexArrayObject
{
public:
    VertexArrayObject(Mesh* mesh);
    ~VertexArrayObject();
    Mesh* mesh;
};

我想它会被画成这样:

uml diagram

然而,这看起来并不正确。如何最好地表示两个类使用UML相互引用的关系?

2 个答案:

答案 0 :(得分:2)

没有。这是完全错误的。复合聚合只能在一侧。 (想象一下汽车/车轮的例子:每一个聚合另一个都是无稽之谈。)去掉钻石,你就完成了。

你可以更进一步,用点而不是钻石。这意味着双方都有参与另一方课程的属性。请参阅this answer

enter image description here

答案 1 :(得分:0)

这很大程度上取决于您想要表示的逻辑结构。您可以通过多种方式指定Mesh和Vertex之间的关系并获取消息;我从您发布的模型中了解到,您认为构图可能是这种关系的一个重要方面,例如: Vertex是Mesh的复合部分(反之亦然)。

在UML中你不能真正拥有双向组合,因为这会导致逻辑悖论 - 即。你不能同时拥有两个同时是彼此复合部分的类。如果构图很重要,那么你需要选择哪个由哪个组成。

鉴于我对3D的理解很差(我猜这是你的程序的意思),我会假设Mesh包含一个Verticies集合,因此组合将从Vertex类型运行到Mesh类型与实体网眼末端的钻石。您可能还想添加多重性(这样很明显,Mesh中可能存在多个Vertex)并且还要考虑关系是复合关系还是共享聚合(顶点是否可以存在于网格外?如果是共享聚合(白色)钻石)是需要的。)

您可能不需要表示从Mesh到Vertex的关系,因为这是一个可以在UML中安全地抽象出来的实现细节。您使用指向数组的指针的事实可能与Mesh由许多Vertex组成的逻辑无关。

也就是说,如果您确实希望在代码中精确指定所拥有的内容,那么可以在UML中完成。我建议从顶点抽象出顶点数组 - 你的代码中有三种逻辑类型 - Mesh,Vertex和VertexArray。您可以说明Mesh与VertexArray具有基本关联(带有箭头以标识参考方向),而这又由Vertex(VertexArray端的黑色菱形)组成。

当然,我假设VertexArray代表一个Vertex对象数组,而不是一个顶点!