关联和依赖之间的区别?


91

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

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

任何例子都将不胜感激:)

Answers:


50

依赖和关联之间有什么区别?

通常,您使用关联来表示类中的字段之类的内容。该链接始终存在,因为您可以随时为其客户索取订单。它实际上不必是一个字段,如果您从更多界面的角度进行建模,它仅表明存在一种可以返回订单客户的方法。

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

...


6
当马丁为您做得更好时,为什么要回答呢?+1
Randolpho

5
对于我来说还不是很清楚,但是我确实了解的一件事是,依赖关系比关联要稍微“弱化”。似乎关联是依赖性的子集,尽管至少在我看来,依赖性比关联是一个更强的词。这很可能是造成混乱的根源。
菲利普

那篇文章说得很好。实际上,这符合我的想法。因此,请从这里获取一些要点:(1)您不想显示对UML图的每个依赖关系-太多了。您需要非常有选择性,只显示对您正在交流的内容至关重要的那些内容。(2)如果两个类之间存在关联,则也存在依赖关系。关联暗示了它,泛化也是如此。 如此明显地推断出依赖关系是其他UML关系的某种超集关系
Mahesha999,2014年

1
您的解释与实际示例相距太远,因此甚至软件工程师也没有清楚地理解。
softninja

// @ softninja:你的意思是你听不懂。其他人似乎都觉得可以接受。哦,谢谢你的反对。
米奇·

72

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

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


这与我通常决定问题的方式最接近。如果另一个班级为我班级的状态或行为做出了实质性贡献,那就是一个关联。因此,即使策略类没有自己的内部状态,它们也将是关联。如果另一个类仅向我的类提供服务,则它是一个依赖项。
可怕的d

49

用OOP术语:

协会- > 具有-一个Ç对象(作为成员变量)

依赖关系-> A引用B(作为方法参数或返回类型)

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

还有一个更详细的答案


1
@Naruto_Uzumaki聚合是一个整体的关系。例如播放列表和歌曲。请检查我的其他答案,以更广泛地区分关联,依赖性和聚合stackoverflow.com/a/34069760/1998422
Ahmad Abdelghany

摘自Martin Fowler撰写的UML Distilled书:“使用类,依赖存在的原因多种多样:一个类向另一个消息发送消息;一个类将另一消息作为数据的一部分;一个类将另一个消息作为操作的参数”
Ahmad Abdelghany

24

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

关联就像在类中将字符串声明为属性时一样。然后您的代码与字符串类相关联。

String name = null //: is a association.

“关联就像当您在类中将字符串声明为属性时。然后您的代码将与字符串类关联。” 如果真是这样,那么联想和合成有什么区别?
Dean P

16

依赖-类中的更改会影响其类中的更改。示例-圆取决于形状(界面)。如果更改Shape,它也会影响Circle。因此,Circle依赖于Shape。

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

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

协会有2种类型-

  1. 组成
  2. 聚合

    1)组合-2个对象之间的关联或关系更强。您正在另一个A中创建B类的对象

 public class A {
       B b;
       public void setB(){
         this.b= new B();
        }
     }

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

另一个示例-Body&Liver .Liver不能存在于Body外部。

2)聚合-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。人有汽车,但人与汽车独立存在。


依赖关系是局部作用域,关联是类作用域。
dimpiax

10

在这里:“关联性,依赖性,聚合性和组合性”,您会发现带有uml类图和代码段的强大优势。作者为我们提供了一系列关系:一个地方的关联,依赖性,聚合,组成。


1
我喜欢这个定义。关联是:我(引用另一个类的类)仅持有对对象的引用,我不使用它,并且该类的成员对我而言并不有趣。依赖关系是:我使用一些成员,因此,如果引用的类发生更改,可能会对我产生影响。如果我做对了,那很容易理解!
robsch 2014年

1
当我阅读您的评论时想到的第一个问题是:在关联的情况下-为什么人们会持有对对象的引用而不使用它?您是说参考只是一个字段,仅在客户想了解参考时才返回吗?
H.Rabiee

3

依赖关系非常笼统,而降低复杂性就是尽可能减少依赖关系。

关联是强(静态)依赖性。聚合和组合甚至更强大。


-1

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

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方法将被更改或重命名,则我们的从属用户类也需要更改。


您能否指出您从何处获得此信息?我认为UML规范中没有规定说关联的一侧不使用另一侧的方法的规则。通常,关联是比依赖更强的关系。
Geert Bellekens

@GeertBellekens据我了解,依赖关系需要表明,对供应商类别的更改将要求对客户类别的更改。在编程中,这仅在您使用供应商的接口时(或显示另一个原因)。从您的角度来看,该箭头没有区别。他们不是在指出代码实现,而只是在概念上。
stopanko

恐怕这是您的个人理解,而不是UML规范中对它的描述。从UML 2.5§7.8.4.1起:依赖关系是一种关系,表示单个模型元素或一组模型元素需要其他模型元素来进行规范或实现。这意味着clientElement的完整语义在语义上或结构上取决于供应商Element的定义。
Geert Bellekens
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.