UML关联理解问题

8
我已经使用UML有一段时间了,也阅读了一些关于它的文章、书籍和论坛,但我仍然不太明白两个类何时应该用关联线连接(简单线或箭头(或者这些不是同一个东西吗?))。我提供三个例子 - 你能告诉我哪一个会导致这两个类之间存在关系吗?

1.

//a field of OtherClass
    public class MainClass
    {
        private OtherClass other;
    }

2.

//method argument
    public class MainClass
    {
        public void Action(OtherClass other)
        { }
    }

3.

//method return value
    public class MainClass
    {
        public OtherClass Action()
        { }
    }

4.

//used inside a method
    public class MainClass
    {
        private Something something;

        public void Action()
        {
            OtherClass other = something.GetOtherClass();
        }
    }
4个回答

6
首先,箭头代表关联的可导航性。单向箭头表示单向关系,在这种情况下,只有源类知道目标类。两端都有箭头表示双向关系,两个类都知道彼此。如果没有箭头,则关联可以默认为双向或为了可读性而被抑制。在实践中,您应该仅在想强调关联方向时绘制箭头。
至于您的第二个问题,只有第一个案例描述了MainClassOtherClass之间的(单向)关联。参数和返回值都不意味着UML意义上的关联(尽管两者都意味着依赖关系)。在最后一个示例中,通过something属性,MainClassSomething类之间存在关联。作为经验法则,您应该在属性中寻找关联。
请注意,UML中有“依赖”概念,用虚线表示。
祝一切顺利!

这基本上就是总结了。+1 - Randolpho

4

编辑:根据评论讨论重新撰写答案(感谢Chimp指出我在示例4中忽略的内容)

示例1:OtherClass是MainClass的属性,因此被建模为一种关联。

示例2和3:OtherClass在类定义中被引用,尽管没有存储在属性中,因此是一种依赖关系。

示例4:Something类是一个属性,因此是一种关联,而被引用的OtherClass没有存储在属性中,因此是一种依赖关系。

在UML中,依赖关系和关联都是关系类型,它们并没有严格的关联(除了通过共同的超类型),尽管我认为关联意味着依赖关系。

关联使用两个类之间的线表示,并在每端显示多重性。导航性通过箭头显示哪个类意识到哪个类(例如,A类 ___> B类意味着A意识到B,但反之不然)。双向导航性通过两端的箭头显示。如果没有箭头,则通常最好不要假设导航性,除非在其他地方说明。

依赖关系由虚线表示,从依赖类(客户端)指向被依赖的类(供应商)(例如,A ----> B表示A依赖于B)。依赖关系表明某个时刻引用了类,并且因此客户端依赖于供应商提供的操作,但它不指示如何引用它(与暗示存储在属性中的关联不同)。


好的,但是这个类不知道作为参数提供的类吗?你确定你说的是正确的吗?因为我正在寻找一个回答“这就是理论所说的,话题结束”? - agnieszka
嗯,我可以稍微重新表达一下:从头脑到键盘的旅程并不总是容易的,我想我在途中失去了一些意义。关联用属性表示。在UML中以与基本数据类型相同的方式显示关联是可以接受的,但使用连接线通常更具信息性。我恐怕无法想出一个解释来说明为什么方法参数不构成关联(除了“因为它们不是”之外,这根本不是一个解释)。但是,无论如何,我确信这是正确的。 - chrisbunney
顺便提一下,当我使用UML进行工作时,我总是手边备有《UML精解》的副本,我发现它是一个非常好的参考资料: http://www.martinfowler.com/books.html#uml - chrisbunney
抱歉,我不得不对这个答案进行负投票。只有示例1是关联;2、3和4是依赖关系。 - chimp
1
只是为了明确:在示例4中,从MainClass到OtherClass的关系是依赖关系;从MainClass到Something的关系是关联关系。 - chimp
显示剩余3条评论

1

一个关联表示两个或多个相关的属性。

在示例1中,MainClass具有类型为OtherClass的属性。如果OtherClass具有类型为MainClass的显式属性,则类之间将存在双向关联;如果OtherClass具有类型为MainClass的隐式属性(即没有属性,但可以通过在另一个方向上工作来推导出关系),则从MainClass到OtherClass将存在单向关联。

在示例2、3和4中,MainClass没有任何类型为OtherClass的属性。虽然它依赖于OtherClass,但从MainClass到OtherClass将存在依赖关系。在代码中,这通过using#include表示。


0

我通常在UML中使用两种不同的连接器:

  1. 当一个类依赖于另一个类的实现时。这意味着一个类正在创建或处理另一个类的实例。因此,调用类依赖于实现类。这将在您所有的示例中都很明显。

  2. 当一个类扩展或实现另一个类时。


那么,在每种情况下,您使用哪些连接器? - John Saunders

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接