Différence entre association et dépendance?

91

Dans un diagramme de classes UML, quelle est la différence entre une relation d'association et une relation de dépendance?

D'après ce que je sais, une association est une relation plus forte qu'une dépendance, mais je ne sais pas en quoi elle est plus forte.

Tout exemple serait plus que bienvenu :)

Charlie
la source

Réponses:

50

Quelle est la différence entre la dépendance et l'association? :

En général, vous utilisez une association pour représenter quelque chose comme un champ dans une classe. Le lien est toujours là, en ce sens que vous pouvez toujours demander une commande pour son client. Il n'est pas nécessaire que ce soit réellement un champ, si vous modélisez dans une perspective plus interface, cela peut simplement indiquer la présence d'une méthode qui retournera le client de la commande.

Pour citer la 3ème édition d'UML Distilled (maintenant juste sortie) "une dépendance existe entre deux éléments si des changements dans la définition d'un élément (le fournisseur) peuvent provoquer des changements sur l'autre (le client)". Il s'agit d'une relation très vague et générale, c'est pourquoi l'UML a une foule de stéréotypes pour différentes formes de dépendance. En termes de code, des choses telles que nommer un type de paramètre et créer un objet dans une variable temporaire impliquent une dépendance.

...

Blé Mitch
la source
6
Pourquoi répondre, alors que Martin fait tellement mieux pour toi?! +1
Randolpho
5
Ce n'est pas encore clair pour moi, mais une chose que j'ai comprise est que les dépendances sont un peu plus «faibles» que les associations. Il semble que les associations sont un sous-ensemble de dépendances, même si à mon avis du moins, la dépendance est un mot plus fort que l'association. Cela a peut-être été la source de la confusion.
Felipe
Cet article le dit bien. En fait, cela correspond à mes pensées. Donc, en tirant quelques points ici: (1) Vous ne voulez pas montrer toutes les dépendances sur un diagramme UML - il y en a beaucoup trop. Vous devez être très sélectif et ne montrer que ceux qui sont importants pour ce que vous communiquez. (2) S'il y a une association entre deux classes, il y a aussi une dépendance. L'association l'implique, de même qu'une généralisation. La relation de sur-ensemble des autres relations UML est si évidente pour inférer une dépendance
Mahesha999
1
Votre explication est trop éloignée des exemples du monde réel, elle n'a donc pas donné une compréhension claire, même aux ingénieurs en logiciel.
softninja
@ softninja: vous voulez dire que vous n'avez pas compris. Tout le monde semble trouver cela acceptable. Oh et merci pour le vote défavorable.
Mitch Wheat
74

Une association implique presque toujours qu'un objet a l'autre objet comme champ / propriété / attribut (la terminologie diffère).

Une dépendance implique généralement (mais pas toujours) qu'un objet accepte un autre objet comme paramètre de méthode, instancie ou utilise un autre objet. Une dépendance est fortement impliquée par une association .

Randolpho
la source
C'est plus proche de la façon dont je décide généralement de la question. Si l'autre classe contribue de manière substantielle à l'état ou au comportement de ma classe, alors c'est une association. Ainsi, les classes de stratégie seront des associations même si elles n'ont pas d'état interne propre. Si l'autre classe fournit simplement un service à ma classe, alors c'est une dépendance.
Terrible Tadpole
49

En termes de POO:

Association -> Un objet has-a C (en tant que variable membre)

Dépendance -> A fait référence à B (en tant que paramètre de méthode ou type de retour)

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

Il y a aussi une réponse plus détaillée .

Ahmad Abdelghany
la source
1
@Naruto_Uzumaki L'agrégation est une relation intégrale. Une liste de lecture et une chanson par exemple. Veuillez vérifier mon autre réponse pour une différenciation plus large entre association, dépendance et agrégation stackoverflow.com/a/34069760/1998422
Ahmad Abdelghany
Tiré du livre UML Distilled de Martin Fowler : "Avec les classes, les dépendances existent pour diverses raisons: une classe envoie un message à une autre; une classe en a une autre dans ses données; une classe en mentionne une autre comme paramètre d'une opération"
Ahmad Abdelghany
24

La dépendance est comme lorsque vous définissez une méthode qui prend une String (en Java, C #, car string est un objet en eux) comme paramètre, alors votre classe dépend de la classe String.

L'association est comme lorsque vous déclarez une chaîne comme attribut dans votre classe. alors votre code est associé à la classe de chaîne.

String name = null //: is a association.
Shrikant Mali
la source
"L'association est comme lorsque vous déclarez une chaîne comme attribut dans votre classe. Alors votre code est associé à la classe de chaînes." Si tel est le cas, quelle est la différence entre l'association et la composition?
Dean P
16

Dépendance - Un changement dans une classe affecte le changement dans sa classe dépendante. Exemple - Le cercle dépend de la forme (une interface). Si vous changez de forme, cela affecte également Circle. Ainsi, Circle a une dépendance sur Shape.

Association - signifie qu'il existe une certaine relation entre 2 objets

(un-un, un-plusieurs, plusieurs-plusieurs)

L'association est de 2 types-

  1. Composition
  2. Agrégation

    1) Composition - Association ou relation plus forte entre 2 objets. Vous créez un objet d'une classe B dans une autre classe A

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

Si nous supprimons la classe A, B n'existera pas (l'objet B est créé à l'intérieur de A uniquement).

Un autre exemple -Body & Liver .Liver ne peut pas exister en dehors du corps.

2) Agrégation - type d' association plus faible entre 2 objets.

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 */
              }
   }

Même si vous supprimez la classe A, B existera à l'extérieur (B est créé à l'extérieur et passé à la classe A)

Un autre exemple de ceci - Man & Car. L'homme a une voiture, mais l'homme et la voiture existent indépendamment.

Deen John
la source
La dépendance est une portée locale, où Association est une portée de classe.
dimpiax
10

Ici: "Association vs dépendance vs agrégation vs composition" , vous avez un grand vade mecum avec des diagrammes de classes uml et des extraits de code. L'auteur nous donne une liste de relations: Association, Dépendance, Agrégation, Composition en un seul endroit.

Raf
la source
1
J'aime cette définition. L'association est la suivante: je (la classe qui fait référence à une autre classe) détient simplement une référence à un objet, je ne l'utilise pas et les membres de cette classe ne m'intéressent pas. La dépendance est: J'utilise certains membres, donc si la classe référencée change, cela pourrait avoir un impact sur moi. Si j'avais raison, c'était facile à comprendre!
robsch
1
Première question qui m'est venue à l'esprit en lisant votre commentaire: dans le cas de l'association - pourquoi garderait-on une référence à un objet et ne pas l'utiliser? Voulez-vous dire que la référence n'est qu'un champ, à renvoyer uniquement si un client veut connaître la référence?
H.Rabiee
3

Une dépendance est très générale et la réduction de la complexité consiste à réduire autant que possible les dépendances.

Une association est une forte dépendance (statique). L'agrégation et la composition sont encore plus fortes.

programmernovice
la source
-1

L'association se produit lorsqu'un objet a juste un lien vers un autre et n'utilise pas de méthodes d'objet relationnel. Pour le rubis par exemple

class User
  has_one :profile
end

user = User.first
profile = user.profile
profile.sign_out

Cela signifie que vous pouvez obtenir un objet de profil de l'utilisateur mais que l'utilisateur n'utilise pas les méthodes du profil à l'intérieur de lui-même (n'a aucune dépendance sur l'interface d'un profil).

La dépendance signifie que l'utilisateur a un lien vers un autre objet et appelle les méthodes de cet objet en lui-même

class User
  has_one :profile

  def personal_info
    profile.info
  end
end

Ici, si la méthode d'information de Profile est modifiée ou renommée, notre classe d'utilisateurs dépendants doit également être modifiée.

stopanko
la source
Pouvez-vous s'il vous plaît indiquer d'où vous avez obtenu ces informations? Je ne pense pas qu'il y ait une règle dans les spécifications UML qui dit qu'un côté d'une association n'utilise pas les méthodes de l'autre côté. En général, une association est une relation plus forte qu'une dépendance.
Geert Bellekens le
@GeertBellekens Si je comprends bien, la dépendance doit montrer que les changements dans une classe de fournisseur nécessiteront des changements dans une classe de client. En programmation, ce n'est que lorsque vous utilisez une interface de fournisseur (ou montrez-moi une autre raison). De votre point de vue, il n'y a aucune différence entre ces flèches. Ils ne pointent pas vers l'implémentation du code et simplement conceptuels.
stopanko le
J'ai bien peur que ce soit votre compréhension personnelle, mais pas la manière dont elle est décrite dans les spécifications UML. D'après UML 2.5 § 7.8.4.1: Une dépendance est une relation qui signifie qu'un élément de modèle unique ou un ensemble d'éléments de modèle nécessite d'autres éléments de modèle pour leur spécification ou leur mise en œuvre. Cela signifie que la sémantique complète du (des) élément (s) clientElement dépend sémantiquement ou structurellement de la définition du ou des éléments fournisseurs.
Geert Bellekens