UML关联和依赖

5
什么是关联(association)和依赖(dependency)之间的区别?你能给出代码示例吗?类A和B之间有什么关系?
class A
{
    B *b;

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

1
可能是关联和依赖之间的区别?的重复问题。 - Ahmad Abdelghany
5个回答

13
短答案是:如何在UML中表示特定源语言结构并没有严格的定义。这将成为相关语言的标准化UML配置文件的一部分,但这些配置文件很少。长答案如下。
在您的示例中,恐怕我必须说“都不是”,只是为了难为情。A具有类型为B的成员变量,因此关系实际上是聚合或组合...或有向关联。在UML中,带有命名目标角色的有向关联在语义上等同于具有相应名称的属性。

enter image description here

作为经验法则,如果bA的构造函数中初始化,则是聚合; 如果它也在B的析构函数中被销毁(共享生命周期),则是组合。如果两者都不适用,则是属性/有向关联。
如果b不是A的成员变量,并且未对局部变量b进行操作(未调用任何方法),那么我会将其表示为依赖项:A需要B,但它没有该类型的属性。
但是,f()实际上调用了B中定义的方法。这对我来说使正确的关系成为<<use>>,这是依赖性的更专业形式。
最后,(无向)关联是两个类之间最弱的链接形式,正因为如此,我通常不在描述源构造时使用它们。当我这样做时,通常是在没有直接源代码关系的情况下使用它们,但两个类仍然以某种方式相关。其中一个例子可能是这样一种情况:两者负责同一大型算法的不同部分,但第三个类同时使用它们。

4
这里有一个我提出的问题可能会对你有用:在UML中,关联是否意味着依赖 我的理解是: 关联(Association)
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();
    }

}

1

从维基百科获取:依赖关系是一种较弱的关系形式,它表示一个类在某个时刻使用另一个类而依赖于它。如果一个类是另一个类的方法的参数变量或局部变量,则一个类依赖于另一个类。这与关联不同,其中前者的属性是后者的实例。

因此,我认为这里的情况是关联,如果B是A的方法的参数变量或局部变量,则它们是依赖关系。


1

如果您想在“代码级别”上查看A和B之间的关联差异,在面向对象编程语言中,A(或B或两者都取决于基数、可导航性等)的实现将包括一个类型为B的属性。

相反,在依赖关系中,A可能会有一个方法,其中一个参数是类型为B。因此,A和B没有直接联系,但更改B会影响到依赖类A,因为也许A方法操作对象B的方式不再有效(例如,B已更改了方法的签名,这导致类A编译错误)。


0

依赖关系的定义非常宽泛,因此没有代码表示。

维基百科:依赖关系是一种语义关系,其中对受影响或独立建模元素的更改可能会影响依赖建模元素的语义[1]

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


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