首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >UML关联和依赖

UML关联和依赖
EN

Stack Overflow用户
提问于 2011-10-11 04:05:56
回答 5查看 12.8K关注 0票数 5

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

代码语言:javascript
复制
class A
{
    B *b;

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

回答 5

Stack Overflow用户

发布于 2011-10-11 18:37:14

简短的答案是:任何特定的源语言构造应该如何在UML中表示,并没有严格的定义。这将是相关语言的标准化UML概要文件的一部分,但遗憾的是,这些概要文件很少。下面是长长的答案。

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

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

如果b不是A中的成员变量,并且没有对局部变量b进行操作(没有对其调用任何方法),那么我会将其表示为一个依赖项:A需要B,但它没有该类型的属性。

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

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

票数 13
EN

Stack Overflow用户

发布于 2011-10-11 06:53:29

看看我问的这个问题可能会有帮助:does an association imply a dependency in UML

我的理解是:

关联

代码语言:javascript
复制
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;
}

依赖项

代码语言:javascript
复制
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();
    }

}
票数 4
EN

Stack Overflow用户

发布于 2011-10-11 05:20:14

如果你想在“代码级别”上看到区别,在A和B之间的关联中,A的实现(或者B,或者两者都有,取决于基数,可导航性,...)在OO中,lang将包含一个类型为B的属性。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7718035

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档