Різниця між асоціацією та залежністю?


91

У діаграмі класів UML, в чому різниця між зв'язком асоціації та залежністю?

Наскільки я знаю, асоціація - це міцніші стосунки, ніж залежність, але я не впевнений, наскільки це сильніше.

Будь-який приклад був би більш ніж вітається :)

Відповіді:


50

Яка різниця між залежністю та асоціацією? :

Взагалі, ви використовуєте асоціацію, щоб представляти щось на зразок поля в класі. Посилання завжди є, тому що ви завжди можете запитати замовлення у свого клієнта. Насправді це не повинно бути полем, якщо ви моделюєте з більш перспективної точки зору, це може просто вказувати на наявність методу, який поверне клієнта замовлення.

Цитуючи 3-е видання UML Distilated (тепер просто поза), "існує залежність між двома елементами, якщо зміни у визначенні одного елемента (постачальник) можуть спричинити зміни для іншого (клієнта)". Це дуже туманне та загальне співвідношення, саме тому UML має безліч стереотипів щодо різних форм залежності. У термінах коду такі речі, як іменування типу параметра та створення об’єкта в тимчасовій змінній, передбачають залежність.

...


6
Навіщо відповідати, коли Мартін робить це набагато краще для вас ?! +1
Рандольфо

5
Для мене це поки не кристально ясно, але одне, що я зрозумів, це те, що залежності дещо `` слабкіші '', ніж асоціації. Здається, що асоціації є підмножиною залежностей, хоча, на мою думку, залежність є сильнішим словом, ніж асоціація. Це могло бути причиною плутанини.
Феліпе

Ця стаття це добре говорить. Насправді це узгоджується з моїми думками. Отже, витягуючи з цього деякі моменти тут: (1) Ви не хочете показувати кожну залежність від діаграми UML - їх занадто багато. Вам потрібно бути дуже вибірковим і показувати лише ті, які важливі для того, що б ви не спілкувались. (2) Якщо існує зв'язок між двома класами, існує також залежність. Асоціація передбачає це, як і узагальнення. Настільки очевидним для висновку про залежність є дещо надмірна взаємозв'язок інших відносин UML
Mahesha999,

1
Ваше пояснення занадто далеке від реальних прикладів, тому воно не дало чіткого розуміння навіть інженерам програмного забезпечення.
softninja

@ softninja: ти маєш на увазі, що ти не зрозумів. Всім іншим здається, що це прийнятно. О, і дякую за голос проти.
Mitch Wheat

72

Об'єднання майже завжди має на увазі , що один об'єкт має інший об'єкт в якості поля / властивості / атрибута (термінологія відрізняється).

Залежність , як правило (але не завжди) означає , що об'єкт приймає інший об'єкт в якості параметра методу, конкретизує, чи використовує інший об'єкт. Залежність дуже сильно мається на увазі в асоціації .


Це найближче до того, як я загалом вирішую питання. Якщо інший клас суттєво сприяє стану чи поведінці мого класу, то це асоціація. Таким чином, класи стратегії будуть асоціаціями, навіть якщо вони не мають власного внутрішнього стану. Якщо інший клас просто надає послугу моєму класу, то це залежність.
Жахливий

49

У термінах ООП:

Асоціація -> A has-a C об'єкт (як змінна-член)

Залежність -> A посилання B (як параметр методу або тип повернення)

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

Є також більш детальна відповідь .


1
Агрегація @Naruto_Uzumaki - це цілеспрямоване відношення. Наприклад, список відтворення та пісня. Будь ласка , перевірте мій інший відповідь для більш широкої диференціації між Асоціацією, утриманства і Aggregation stackoverflow.com/a/34069760/1998422
Ахмад Abdelghany

З книги " Дистильована UML" Мартіна Фаулера : "У класів залежності існують з різних причин: один клас надсилає повідомлення іншому; один клас має інший як частину своїх даних; один клас згадує інший як параметр для операції"
Ахмад Абдельгані

24

Залежність подібна, коли ви визначаєте метод, який приймає String (у Java, C #, оскільки рядок є в них об’єктом) як параметр, тоді ваш клас залежить від класу String.

Асоціація подібна, коли ви оголошуєте рядок як атрибут у своєму класі. тоді ваш код пов'язаний із класом рядків.

String name = null //: is a association.

"Асоціація подібна до того, як ви оголошуєте рядок як атрибут у своєму класі. Тоді ваш код пов'язаний із класом рядків." Якщо це так, то в чому різниця між асоціацією та складом?
Дін П,

16

Залежність - зміна класу впливає на зміну його залежного класу. Приклад - коло залежить від форми (інтерфейсу). Якщо ви зміните форму, це також вплине на коло. Отже, Circle має залежність від Shape.

Асоціація - означає, що існує певний взаємозв'язок між 2 об'єктами

(один-один, один-багато, багато-багато)

Асоціація буває 2 типів

  1. Склад
  2. Агрегація

    1) Композиція - сильніша асоціація або взаємозв'язок між 2 об'єктами. Ви створюєте об'єкт класу B всередині іншого класу A

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

Якщо ми видалимо клас A, B не буде існувати (об’єкт B створюється лише всередині A).

Інший приклад - тіло і печінка. Печінка не може існувати поза тілом.

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. У людини є автомобіль, але Man & Car існують незалежно.


Залежність - це локальний обсяг, де Асоціація - це обсяг класу.
dimpiax 02.03.18

10

Тут: "Асоціація проти залежності проти агрегації проти композиції" , у вас є чудова вакуум-схема з діаграмами класів uml та фрагментами коду. Автор дає нам список взаємозв’язків: асоціація, залежність, агрегація, склад в одному місці.


1
Мені подобається це визначення. Асоціація така: я (клас, що посилається на інший клас) просто тримаю посилання на об’єкт, я не використовую його, і члени цього класу мені нецікаві. Залежність полягає в тому, що я використовую деякі члени, тому, якщо вказаний клас зміниться, це може вплинути на мене. Якби я все зрозумів, це було легко зрозуміти!
Робш

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

Тут, якщо інформаційний метод профілю буде змінено або перейменовано, клас залежних користувачів також потрібно змінити.


Ви можете вказати, звідки Ви взяли цю інформацію? Я не думаю, що в специфікаціях UML існує правило, яке говорить, що одна сторона асоціації не використовує методи іншої сторони. Загалом асоціація - це сильніші стосунки, ніж залежність.
Герт Белкенс,

@GeertBellekens Як я розумію, залежність повинна показати, що зміни в класі постачальника потребують змін у класі клієнта. У програмуванні це лише тоді, коли ви використовуєте інтерфейс постачальника (або Покажіть іншу причину). З вашої точки зору, в цих стрілках немає різниці. Вони не вказують на реалізацію коду, а лише концептуально.
stopanko

Боюся, це ваше особисте розуміння, але не те, як це описано в специфікаціях UML. З UML 2.5 § 7.8.4.1: Залежність - це взаємозв'язок, який означає, що для єдиного елемента моделі або набору елементів моделі потрібні інші елементи моделі для їх специфікації або реалізації. Це означає, що повна семантика clientElement (s) залежать або семантично, або структурно від визначення елемента (-ів) постачальника.
Герт Белкенс,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.