Differenza tra associazione e dipendenza?


91

In un diagramma classi UML, qual è la differenza tra una relazione di associazione e una relazione di dipendenza?

Da quello che so, un'associazione è una relazione più forte di una dipendenza, ma non sono sicuro di come sia più forte.

Qualsiasi esempio sarebbe più che benvenuto :)

Risposte:


50

Qual è la differenza tra dipendenza e associazione? :

In generale, usi un'associazione per rappresentare qualcosa come un campo in una classe. Il link è sempre lì, in quanto puoi sempre chiedere un ordine per il suo cliente. Non è necessario che sia effettivamente un campo, se stai modellando da una prospettiva più interfaccia, può semplicemente indicare la presenza di un metodo che restituirà il cliente dell'ordine.

Per citare dalla 3a edizione di UML Distilled (appena uscito) "esiste una dipendenza tra due elementi se le modifiche alla definizione di un elemento (il fornitore) possono causare modifiche all'altro (il cliente)". Questa è una relazione molto vaga e generale, motivo per cui UML ha una miriade di stereotipi per diverse forme di dipendenza. In termini di codice, cose come nominare un tipo di parametro e creare un oggetto in una variabile temporanea implicano una dipendenza.

...


6
Perché rispondere, quando Martin lo fa molto meglio per te ?! +1
Randolpho

5
Non è ancora chiaro per me, ma una cosa che ho capito è che le dipendenze sono in qualche modo "più deboli" delle associazioni. Sembra che le associazioni siano un sottoinsieme di dipendenze, anche se a mio avviso, almeno, dipendenza è una parola più forte dell'associazione. Questa potrebbe essere stata la fonte della confusione.
Felipe

Quell'articolo lo dice bene. In effetti si allinea con i miei pensieri. Quindi estraendo alcuni punti da questo qui: (1) Non vuoi mostrare ogni dipendenza da un diagramma UML - ce ne sono troppe. Devi essere molto selettivo e mostrare solo quelli che sono importanti per qualunque cosa tu stia comunicando. (2) Se c'è un'associazione tra due classi, c'è anche una dipendenza. L'associazione lo implica, così come una generalizzazione. Così ovvio dedurre la dipendenza è in qualche modo una relazione superset di altre relazioni UML
Mahesha999

1
La tua spiegazione è troppo lontana dagli esempi del mondo reale, quindi non ha fornito una chiara comprensione nemmeno agli ingegneri del software.
softninja

@ softninja: vuoi dire che non hai capito. Tutti gli altri sembrano trovarlo accettabile. Oh e grazie per il voto negativo.
Mitch Wheat

74

Un'associazione implica quasi sempre che un oggetto ha l'altro oggetto come campo / proprietà / attributo (varia terminologia).

Una dipendenza in genere (ma non sempre) implica che un oggetto accetta un altro oggetto come parametro del metodo, crea un'istanza o utilizza un altro oggetto. Una dipendenza è molto implicita da un'associazione .


Questo è il più vicino al modo in cui generalmente decido la questione. Se l'altra classe contribuisce in modo sostanziale allo stato o al comportamento della mia classe, allora è un'associazione. Quindi le classi strategiche saranno associazioni anche se non hanno uno stato interno proprio. Se l'altra classe fornisce semplicemente un servizio alla mia classe, allora è una dipendenza.
Terrible Tadpole

49

In termini OOP:

Associazione -> Un oggetto has-a C (come variabile membro)

Dipendenza -> A fa riferimento a B (come parametro del metodo o tipo restituito)

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

C'è anche una risposta più dettagliata .


1
@Naruto_Uzumaki L'aggregazione è una relazione di parte intera. Una playlist e una canzone per esempio. Si prega di controllare la mia altra risposta per una più ampia differenziazione tra associazione, dipendenza e aggregazione stackoverflow.com/a/34069760/1998422
Ahmad Abdelghany

Dal libro UML Distilled di Martin Fowler : "Con le classi, esistono dipendenze per vari motivi: una classe invia un messaggio a un'altra; una classe ne ha un'altra come parte dei suoi dati; una classe ne menziona un'altra come parametro di un'operazione"
Ahmad Abdelghany

24

La dipendenza è come quando si definisce un metodo che accetta una stringa (in Java, C #, poiché la stringa è un oggetto in essi) come parametro, quindi la classe dipende dalla classe String.

L'associazione è come quando dichiari una stringa come attributo nella tua classe. quindi il tuo codice è associato alla classe stringa.

String name = null //: is a association.

"L'associazione è come quando dichiari una stringa come attributo nella tua classe. Il tuo codice è associato alla classe stringa." Se è così, qual è la differenza tra associazione e composizione?
Dean P

16

Dipendenza : una modifica in una classe influisce sulla modifica nella sua classe dipendente. Esempio: Circle dipende da Shape (un'interfaccia). Se cambi forma, influisce anche sul cerchio. Quindi, Circle ha una dipendenza da Shape.

Associazione : significa che esiste una certa relazione tra 2 oggetti

(uno-uno, uno-molti, molti-molti)

L'associazione è di 2 tipi:

  1. Composizione
  2. Aggregazione

    1) Composizione : associazione o relazione più forte tra 2 oggetti. Stai creando un oggetto di una classe B all'interno di un'altra classe A.

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

Se cancelliamo la classe A, B non esisterà (l'oggetto B viene creato solo all'interno di A).

Un altro esempio: corpo e fegato. Il fegato non può esistere al di fuori del corpo.

2) Aggregazione : tipo più debole di associazione tra 2 oggetti.

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

Anche se elimini la classe A, B esisterà all'esterno (B viene creato all'esterno e passato alla classe A)

Un altro esempio di questo: Man & Car. L'uomo ha un'auto ma l'uomo e l'auto esistono indipendentemente.


La dipendenza è l'ambito locale, dove Associazione è l'ambito della classe.
dimpiax

10

Qui: "Associazione vs dipendenza vs aggregazione vs composizione" , hai un ottimo vademecum con diagrammi classi uml e frammenti di codice. L'autore ci fornisce un elenco di relazioni: associazione, dipendenza, aggregazione, composizione in un unico punto.


1
Mi piace questa definizione. L'associazione è: io (la classe che fa riferimento a un'altra classe) tengo solo un riferimento a un oggetto, non lo uso ei membri di quella classe non mi interessano. La dipendenza è: utilizzo alcuni membri, quindi se la classe di riferimento cambia potrebbe avere un impatto su di me. Se avessi capito bene, sarebbe stato facile da capire!
robsch

1
Prima domanda che mi è venuta in mente quando ho letto il tuo commento: nel caso dell'associazione, perché si dovrebbe tenere un riferimento a un oggetto e non usarlo? Intendi dire che il riferimento è solo un campo, da restituire solo se un cliente vuole sapere del riferimento?
H.Rabiee

3

Una dipendenza è molto generale e abbassare la complessità significa diminuire il più possibile le dipendenze.

Un'associazione è una forte dipendenza (statica). L'aggregazione e la composizione sono ancora più forti.


-1

L'associazione è quando un oggetto ha solo un collegamento a un altro e non utilizza metodi di oggetti relazionali. Per il rubino, ad esempio

class User
  has_one :profile
end

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

Significa che puoi ottenere un oggetto profilo dall'utente ma l'utente non usa i metodi del profilo all'interno di se stesso (non ha alcuna dipendenza dall'interfaccia di un profilo).

Dipendenza significa che l'utente ha un collegamento a un altro oggetto e chiama i metodi di quell'oggetto dentro di sé

class User
  has_one :profile

  def personal_info
    profile.info
  end
end

Qui, se il metodo di informazioni del profilo verrà modificato o rinominato, sarà necessario modificare anche la nostra classe Utente dipendente.


Puoi per favore indicare da dove hai ottenuto queste informazioni? Non credo che ci sia una regola nelle specifiche UML che dice che un lato di un'associazione non utilizza i metodi dell'altro lato. In generale un'associazione è una relazione più forte di una dipendenza.
Geert Bellekens

@GeertBellekens Da quanto ho capito, la dipendenza deve mostrare che i cambiamenti in una classe fornitore richiederanno cambiamenti in una classe cliente. Nella programmazione questo è solo quando si utilizza un'interfaccia del fornitore (o Mostrami un altro motivo). Dal tuo punto di vista non c'è differenza in queste frecce. Non puntano all'implementazione del codice e sono solo concettuali.
stopanko

Temo che questa sia la tua comprensione personale, ma non come è descritta nelle specifiche UML. Da UML 2.5 § 7.8.4.1: Una dipendenza è una relazione che significa che un singolo elemento del modello o un insieme di elementi del modello richiede altri elementi del modello per la loro specifica o implementazione. Ciò significa che la semantica completa del clientElement (s) dipende semanticamente o strutturalmente dalla definizione del fornitore Element (s).
Geert Bellekens
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.