【问题标题】:Difference between association and dependency?关联和依赖的区别?
【发布时间】:2010-11-16 21:12:22
【问题描述】:

在UML类图中,关联关系和依赖关系有什么区别?

据我所知,关联是比依赖关系更强的关系,但我不确定它是如何更强的。

任何例子都会受到欢迎:)

【问题讨论】:

    标签: uml


    【解决方案1】:

    关联几乎总是意味着一个对象具有另一个对象作为字段/属性/属性(术语不同)。

    依赖通常(但不总是)意味着一个对象接受另一个对象作为方法参数、实例化或使用另一个对象。 依赖关系非常隐含在关联中。

    【讨论】:

    • 这是最接近我通常决定问题的方式。如果另一个班级对我班级的状态或行为有实质性的贡献,那么它就是一个关联。因此,即使策略类没有自己的内部状态,它们也将是关联。如果另一个类只是为我的类提供服务,那么它就是一个依赖项。
    【解决方案2】:

    在 OOP 术语中:

    Association --> A has-a C 对象(作为成员变量)

    依赖 --> A references B(作为方法参数或返回类型)

    public class A {
        private C c;
        public void myMethod(B b) {
            b.callMethod();
        }
    }
    

    还有一个more detailed answer

    【讨论】:

    • @Naruto_Uzumaki 聚合是一个整体关系。例如播放列表和歌曲。请查看我的其他答案,了解关联、依赖和聚合stackoverflow.com/a/34069760/1998422 之间的更广泛区别
    • 来自 Martin FowlerUML Distilled 书:“对于类,存在依赖关系的原因有很多:一个类向另一个类发送消息;一个类有另一个作为其数据的一部分;一个类提到另一个作为操作的参数"
    【解决方案3】:

    What is the difference between dependency and association?:

    一般来说,您使用关联来表示类似字段的内容 在一个班级。链接始终存在,因为您可以随时询问 为其客户订购。它实际上不必是一个字段,如果你是 从更界面的角度建模,它可以仅仅表明 存在将返回订单客户的方法。

    引用 UML Distilled 的第 3 版(现在刚刚出版)“a 如果更改定义,则两个元素之间存在依赖关系 一个元素(供应商)可能会导致另一个元素(供应商)发生变化 客户)”。这是一个非常模糊和笼统的关系,这就是为什么 UML 有许多用于不同形式的依赖的原型。 在代码术语中,诸如命名参数类型和创建 临时变量中的对象意味着依赖。

    ...

    【讨论】:

    • 为什么要回答,Martin 为您做得这么好?! +1
    • 对我来说还不是很清楚,但我确实理解的一件事是依赖关系比关联更“弱”。似乎关联是依赖的一个子集,尽管至少在我看来,依赖是一个比关联更强的词。这很可能是造成混乱的根源。
    • 那篇文章说得很好。其实和我的想法是一致的。因此,从这里引出一些观点:(1) 您不想在 UML 图上显示每个依赖项 - 太多了。你需要非常有选择性,只展示那些对你正在交流的东西很重要的东西。 (2) 如果两个类之间存在关联,则也存在依赖关系。该关联暗示了这一点,概括也暗示了这一点。 如此明显地推断出依赖关系在某种程度上是其他 UML 关系的超集关系
    • 你的解释离现实世界的例子太远了,所以即使是软件工程师也没有清楚地理解。
    • @softninja:你的意思是你不明白。其他人似乎都觉得可以接受。哦,谢谢你的反对。
    【解决方案4】:

    依赖关系就像当你定义一个以String(在Java,C#中,因为string是其中的对象)作为参数的方法时,你的类依赖于String类。

    关联就像你在你的类中声明一个字符串作为一个属性。 那么您的代码与字符串类相关联。

    String name = null //: is a association.
    

    【讨论】:

    • "关联就像您在类中声明一个字符串作为属性。然后您的代码与该字符串类关联。"如果是这样,那么联想和组合有什么区别?
    【解决方案5】:

    依赖关系 - 类的变化会影响其依赖类的变化。示例 - Circle 依赖于 Shape(一个接口)。如果你改变 Shape ,它也会影响 Circle。所以,Circle 依赖于 Shape。

    关联-表示2个对象之间存在一定的关系

    (一对一,一对多,多对多)

    联想有两种类型-

    1. 作文
    2. 聚合

      1) 组合-更强的关联或两个对象之间的关系。您正在另一个 class A

      中创建一个 class B 的对象
     public class A {
           B b;
           public void setB(){
             this.b= new B();
            }
         }
    

    如果我们删除类 A ,B 将不存在(B 对象仅在 A 内部创建)。

    另一个例子 - 身体和肝脏。肝脏不能存在于身体之外。

    2) 聚合 - 两个对象之间较弱的关联类型。

    public class A {       
                 B b;
                 public void setB(B b_ref){
                     this.b= b_ref;   
                    /* object B is passed as an argument of a method */
                  }
       }
    

    即使你删除A类,B也会存在外面(B在外面创建并传递给A类)

    另一个例子 - Man & Car 。人有车,但人与车是独立存在的。

    【讨论】:

    • Dependency 是本地作用域,Association 是类作用域。
    【解决方案6】:

    这里:"Association vs. Dependency vs. Aggregation vs. Composition",你有一个很棒的 uml 类图和代码 sn-ps。 作者给了我们一个关系列表:关联、依赖、聚合、组合在一个地方。

    【讨论】:

    • 我喜欢这个定义。关联是:我(引用另一个类的类)只是持有对一个对象的引用,我不使用它,并且该类的成员对我不感兴趣。依赖性是:我使用了一些成员,所以如果引用的类发生变化,它可能会对我产生影响。如果我做对了那就很容易理解了!
    • 阅读您的评论时想到的第一个问题:在关联的情况下 - 为什么要持有对对象的引用而不使用它?你的意思是引用只是一个字段,只有在客户想知道引用时才返回?
    【解决方案7】:

    依赖是非常普遍的,降低复杂性就是尽可能地减少依赖。

    关联是一种强(静态)依赖。聚合和组合更加强大。

    【讨论】:

      【解决方案8】:

      我一直在检查这个答案,因为它并没有留在我的脑海中。阅读the accepted answer 后,我发现这一篇更有帮助

      【讨论】:

        【解决方案9】:

        关联是指一个对象仅具有到另一个对象的链接并且不使用关系对象方法。以红宝石为例

        class User
          has_one :profile
        end
        
        user = User.first
        profile = user.profile
        profile.sign_out
        

        这意味着你可以从用户那里得到一个配置文件对象,但用户不要在自己内部使用配置文件的方法(不依赖于配置文件的接口)。

        依赖表示用户链接到另一个对象并在自己内部调用该对象的方法

        class User
          has_one :profile
        
          def personal_info
            profile.info
          end
        end
        

        这里如果 Profile 的 info 方法将被更改或重命名,我们的 Dependent User 类也需要更改。

        【讨论】:

        • 您能否指出您从何处获得此信息?我不认为 UML 规范中有一条规则说关联的一方不使用另一方的方法。一般来说,关联比依赖关系更牢固。
        • @GeertBellekens 据我了解,依赖关系需要表明供应商类中的更改将需要客户类中的更改。在编程中,这仅在您使用供应商接口时(或告诉我另一个原因)。从您的角度来看,这个箭头没有区别。他们没有指向代码实现,只是概念性的。
        • 恐怕这是您个人的理解,而不是 UML 规范中的描述。从 UML 2.5 § 7.8.4.1:依赖关系是一种关系,它表示单个模型元素或一组模型元素需要其他模型元素的规范或实现。这意味着 clientElement(s) 的完整语义在语义上或结构上取决于供应商 Element(s) 的定义。
        猜你喜欢
        • 1970-01-01
        • 2021-11-02
        • 2018-10-20
        • 2011-12-04
        • 1970-01-01
        • 2019-01-11
        • 2020-05-06
        • 1970-01-01
        • 2014-12-09
        相关资源
        最近更新 更多