UML关联和依赖

raf*_*fal 5 uml

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

class A
{
    B *b;

    void f ()
    {
        b = new B ();
        b->f();
        delete b;
    }
}
Run Code Online (Sandbox Code Playgroud)

Uff*_*ffe 12

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

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

在此输入图像描述

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

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

f()实际上调用了一个定义的方法B.这对我来说是正确的关系a <<use>>,这是一种更专业的依赖形式.

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


Jor*_*bot 1

如果您想查看“代码级别”的差异,在 A 和 B 之间的关联中,OO 语言中 A(或 B 或两者,取决于基数、可导航性等)的实现将包含以下属性: B型。

相反,在依赖项中,A 可能有一个方法,其中一个参数的类型为 B。因此 A 和 B 没有链接,但更改 B 会影响依赖类 A,因为 A 方法操作对象 B 的方式可能不一样。更长的有效时间(例如,B 更改了方法的签名,这会导致 A 类中出现编译错误)