Różnica między skojarzeniem a zależnością?

91

Jaka jest różnica między relacją skojarzenia a relacją zależności na diagramie klas UML?

Z tego, co wiem, skojarzenie to silniejszy związek niż zależność, ale nie jestem pewien, dlaczego jest silniejszy.

Każdy przykład byłby więcej niż mile widziany :)

Charlie
źródło

Odpowiedzi:

50

Jaka jest różnica między zależnością a skojarzeniem? :

Ogólnie rzecz biorąc, asocjacji używa się do reprezentowania czegoś w rodzaju pola w klasie. Link jest zawsze dostępny, dzięki czemu zawsze możesz poprosić o zamówienie swojego klienta. W rzeczywistości nie musi to być pole, jeśli modelujesz z perspektywy bardziej interfejsu, może po prostu wskazywać na obecność metody, która zwróci klienta zamówienia.

Cytując z 3. edycji UML Distilled (teraz dopiero co) „istnieje zależność między dwoma elementami, jeśli zmiana definicji jednego elementu (dostawcy) może spowodować zmiany w drugim (klient)”. Jest to bardzo niejasna i ogólna zależność, dlatego w UML jest wiele stereotypów dotyczących różnych form zależności. W kategoriach kodu, takie rzeczy, jak nazwanie typu parametru i utworzenie obiektu w zmiennej tymczasowej, implikują zależność.

...

Mitch Wheat
źródło
6
Po co odpowiadać, skoro Martin robi to dla ciebie o wiele lepiej ?! +1
Randolpho
5
Nie jest to jeszcze dla mnie jasne, ale zrozumiałem, że zależności są nieco „słabsze” niż skojarzenia. Wydaje się, że skojarzenia są podzbiorem zależności, choć przynajmniej moim zdaniem zależność jest silniejszym słowem niż skojarzenie. To mogło być źródłem zamieszania.
Felipe
Ten artykuł dobrze to mówi. W rzeczywistości jest to zgodne z moimi myślami. A więc wyciągając z tego kilka punktów: (1) Nie chcesz pokazywać wszystkich zależności na diagramie UML - jest ich o wiele za dużo. Musisz być bardzo selektywny i pokazywać tylko te, które są ważne dla tego, co przekazujesz. (2) Jeśli istnieje powiązanie między dwiema klasami, istnieje również zależność. Skojarzenie to implikuje, podobnie jak uogólnienie. Tak oczywistym do wnioskowania o zależności jest nieco nadzbiór relacji innych relacji UML
Mahesha999
1
Twoje wyjaśnienie jest zbyt dalekie od rzeczywistych przykładów, więc nie dało jasnego zrozumienia nawet inżynierom oprogramowania.
softninja
@ softninja: masz na myśli, że nie zrozumiałeś. Wydaje się, że wszyscy inni uważają to za dopuszczalne. Aha i dzięki za głosy przeciw.
Mitch Wheat
74

Stowarzyszenie prawie zawsze oznacza, że jeden przedmiot ma inny obiekt jako pole / nieruchomość / atrybutu (zmienne terminologia).

Zależność zwykle (lecz nie zawsze) oznacza, że przedmiot przyjmuje inny obiekt jako parametr sposobu, wystąpienie lub korzysta z innego obiektu. Zależność jest bardzo dużo do zrozumienia przez stowarzyszenie .

Randolpho
źródło
Jest to najbliższe temu, w jaki sposób ogólnie decyduję o tej sprawie. Jeśli inna klasa ma istotny wpływ na stan lub zachowanie mojej klasy, to jest to skojarzenie. Zatem klasy strategii będą skojarzeniami, nawet jeśli nie mają własnego stanu wewnętrznego. Jeśli druga klasa jedynie świadczy usługę mojej klasie, to jest to zależność.
Straszna Kijanka,
49

W kategoriach OOP:

Skojarzenie -> A ma obiekt C (jako zmienna składowa)

Zależność -> A odwołuje się do B (jako parametr metody lub typ zwracany)

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

Jest też bardziej szczegółowa odpowiedź .

Ahmad Abdelghany
źródło
1
@Naruto_Uzumaki Agregacja jest relacją całoczęściową. Na przykład lista odtwarzania i utwór. Proszę sprawdzić moją drugą odpowiedź, aby uzyskać szersze rozróżnienie między powiązaniami, zależnością i agregacją stackoverflow.com/a/34069760/1998422
Ahmad Abdelghany
Z książki UML Distilled autorstwa Martina Fowlera : „W przypadku klas istnieją zależności z różnych powodów: jedna klasa wysyła wiadomość do drugiej; jedna klasa ma inną jako część swoich danych; jedna klasa wspomina o innej jako parametr operacji”
Ahmad Abdelghany
24

Zależność jest taka, jak w przypadku definiowania metody, która przyjmuje String (w języku Java, C #, ponieważ ciąg jest w nich obiektem) jako parametr, a Twoja klasa jest zależna od klasy String.

Skojarzenie jest podobne do deklarowania ciągu znaków jako atrybutu w klasie. wtedy twój kod jest powiązany z klasą string.

String name = null //: is a association.
Shrikant Mali
źródło
„Skojarzenie jest podobne do deklarowania ciągu znaków jako atrybutu w klasie. Wtedy kod jest powiązany z klasą ciągu”. Jeśli tak, to jaka jest różnica między skojarzeniem a kompozycją?
Dean P
16

Zależność - zmiana w klasie wpływa na zmianę w klasie zależnej. Przykład - Okrąg jest zależny od kształtu (interfejsu). Jeśli zmienisz Shape, wpłynie to również na Circle. Zatem Circle jest zależny od Shape.

Skojarzenie - oznacza, że ​​istnieje pewien związek między 2 obiektami

(jeden-jeden, jeden-wiele, wiele-wiele)

Skojarzenie jest dwojakiego rodzaju-

  1. Kompozycja
  2. Zbiór

    1) Kompozycja - silniejsze skojarzenie lub związek między 2 obiektami. Tworzysz obiekt klasy B wewnątrz innej klasy A.

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

Jeśli usuniemy klasę A, B nie będzie istnieć (obiekt B jest tworzony tylko wewnątrz A).

Inny przykład - Ciało i wątroba. Wątroba nie może istnieć poza ciałem.

2) Agregacja - słabszy typ asocjacji między 2 obiektami.

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

Nawet jeśli usuniesz klasę A, B będzie istnieć na zewnątrz (B jest tworzony na zewnątrz i przekazywany do klasy A)

Inny przykład - Man & Car. Człowiek ma samochód, ale człowiek i samochód istnieją niezależnie.

Deen John
źródło
Zależność to zakres lokalny, gdzie skojarzenie to zakres klasy.
dimpiax
10

Tutaj: „Asocjacja a zależność a agregacja a kompozycja” - masz świetny vade mecum z diagramami klas uml i fragmentami kodu. Autor podaje nam listę relacji: skojarzenie, zależność, agregacja, skład w jednym miejscu.

Raf
źródło
1
Podoba mi się ta definicja. Skojarzenie to: ja (klasa, która odwołuje się do innej klasy) po prostu posiadam odniesienie do obiektu, nie używam go, a członkowie tej klasy nie są dla mnie interesujący. Zależność jest następująca: używam niektórych członków, więc jeśli klasa, do której się odwołujemy, zmieni się, może to mieć wpływ na mnie. Jeśli dobrze zrozumiałem, było to łatwe do zrozumienia!
robsch
1
Pierwsze pytanie, które przyszło mi do głowy, gdy przeczytałem Pański komentarz: w przypadku skojarzenia - po co mieć odniesienie do przedmiotu i go nie używać? Czy masz na myśli to, że referencja jest tylko polem, które ma zostać zwrócone tylko wtedy, gdy klient chce wiedzieć o referencji?
H.Rabiee,
3

Zależność jest bardzo ogólna, a zmniejszenie złożoności polega na maksymalnym zmniejszaniu zależności.

Powiązanie jest silną (statyczną) zależnością. Agregacja i kompozycja są jeszcze silniejsze.

programmernovice
źródło
-1

Skojarzenie ma miejsce, gdy jeden obiekt ma łącze do innego i nie używa metod obiektów relacyjnych. Na przykład dla rubinu

class User
  has_one :profile
end

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

Oznacza to, że możesz pobrać obiekt profilu od użytkownika, ale użytkownik nie używa w sobie metod profilu (nie ma zależności od interfejsu profilu).

Zależność oznacza, że ​​użytkownik ma łącze do innego obiektu i wywołuje w sobie metody tego obiektu

class User
  has_one :profile

  def personal_info
    profile.info
  end
end

Tutaj, jeśli metoda informacji profilu zostanie zmieniona lub zostanie zmieniona nazwa, nasza klasa zależnego użytkownika również musi zostać zmieniona.

stopanko
źródło
Czy możesz wskazać, skąd masz te informacje? Nie sądzę, by istniała reguła w specyfikacjach UML, która mówi, że jedna strona skojarzenia nie używa metod drugiej strony. Ogólnie skojarzenie jest silniejszym związkiem niż zależnością.
Geert Bellekens
@GeertBellekens Jak rozumiem, Zależność musi pokazać, że zmiany w klasie dostawcy będą wymagały zmian w klasie klienta. W programowaniu dzieje się tak tylko wtedy, gdy używasz interfejsu dostawcy (lub Pokaż mi inny powód). Z twojego punktu widzenia nie ma różnicy w tych strzałkach. Nie wskazują na implementację kodu, a jedynie koncepcyjne.
stopanko
Obawiam się, że to twoje osobiste zrozumienie, ale nie tak, jak jest to opisane w specyfikacjach UML. Od UML 2.5 § 7.8.4.1: Zależność to relacja, która oznacza, że ​​pojedynczy element modelu lub zestaw elementów modelu wymaga innych elementów modelu do specyfikacji lub implementacji. Oznacza to, że pełna semantyka elementu clientElement (elementów) jest semantycznie lub strukturalnie zależna od definicji elementu (elementów) dostawcy.
Geert Bellekens