UML关联和依赖

时间:2011-10-10 20:05:56

标签: uml

关联和依赖之间有什么区别?你能给出代码示例吗? A级和B级之间有什么关系?

class A
{
    B *b;

    void f ()
    {
        b = new B ();
        b->f();
        delete b;
    }
}

5 个答案:

答案 0 :(得分:12)

简短的回答是:如何在UML中表示任何特定的源语言结构并不是严格定义的。这将是所讨论语言的标准化UML配置文件的一部分,但遗憾的是这些很少见。接下来是答案。

在你的例子中,我恐怕不得不说“不”,只是为了困难。 A有一个类型为B的成员变量,因此该关系实际上是一个聚合或一个组合......或一个有向关联。在UML中,与命名目标角色的定向关联在语义上等同于具有相应名称的属性。

enter image description here

根据经验,如果在b的构造函数中初始化A,它就是一个聚合;它是一个组合,如果它也在B的析构函数(共享生命周期)中被销毁。如果两者都不适用,则它是属性/定向关联。

如果b不是A中的成员变量,并且本地变量b未被操作(没有调用任何方法),那么我将其表示为依赖:A需要B,但它没有该类型的属性。

但是f()实际上调用了B中定义的方法。这对我来说是正确的关系<<use>>,这是一种更特殊的依赖形式。

最后,(无向)关联是两个类之间最薄弱的联系形式,因此我倾向于在描述源构造时不使用它们。当我这样做时,我通常在没有直接的源代码关系时使用它们,但这两个类仍然以某种方式相关。这方面的一个例子可能是两个人负责同一个较大算法的不同部分,但第三个类同时使用它们。

答案 1 :(得分:4)

看到我问的这个问题可能很有用:does an association imply a dependency in UML

我的理解是:

<强>协会

public class SchoolClass{
    /** This field, of type Bar, represents an association, a conceptual link
     *  between SchoolClass and Student. (Yes, this should probably be
     *  a List<Student>, but the array notation is clearer for the explanation)
     */
    private Student[] students;
}

<强>依赖

public class SchoolClass{

    private Timetable classTimetable;

    public void generateTimetable(){
        /* 
         * Here, SchoolClass depends on TimetableGenerator to function, 
         * but this doesn't represent a conceptual relationship. It's more of
         * a logical implementation detail.
         */
        TimetableGenerator timetableGen = new TimetableGenerator();

        /*
         * Timetable, however, is an association, as it is a conceptual 
         * relationship that describes some aspect of the data that the 
         * class holds (Remember OOP101? Objects consist of data and operations
         * upon that data, associations are UMLs way or representing that data)
         */
        classTimetable = timetableGen.generateTimetable();
    }

}

答案 2 :(得分:1)

如果你想在“代码级别”看到差异,在A和B之间的关联中,在OO lang中实现A(或B或两者取决于基数,导航性......)将包括类型B的属性。

相反,在一个依赖项中,A可能会有一个方法,其中一个参数是B类型。所以A和B没有链接但是改变B会影响依赖类A,因为可能是A方法操纵对象的方式B不再有效(例如B已更改方法的签名,这会在A类中引发编译错误)

答案 3 :(得分:1)

从Wiki获取它:依赖关系是一种较弱的关系形式,表明一个类依赖于另一个类,因为它在某个时间点使用它。如果后者是参数变量或前者方法的局部变量,则一个类依赖于另一个类。这与关联不同,前者的属性是后者的实例。

所以我认为这里的情况是关联,如果B是A的方法的参数变量或局部变量,那么它们就是依赖关系。

答案 4 :(得分:0)

依赖关系确实非常松散。所以没有代码表示。

Wiki:依赖是一种语义关系,其中对流入或独立建模元素的更改可能会影响依赖建模元素的语义。[1]

来自OMG Spec:依赖关系是一种关系,表示单个或一组模型元素需要其他模型元素用于其规范或实现。这意味着依赖元素的完整语义在语义上或结构上依赖于供应商元素的定义。