У діаграмі класів UML, в чому різниця між зв'язком асоціації та залежністю?
Наскільки я знаю, асоціація - це міцніші стосунки, ніж залежність, але я не впевнений, наскільки це сильніше.
Будь-який приклад був би більш ніж вітається :)
Відповіді:
Яка різниця між залежністю та асоціацією? :
Взагалі, ви використовуєте асоціацію, щоб представляти щось на зразок поля в класі. Посилання завжди є, тому що ви завжди можете запитати замовлення у свого клієнта. Насправді це не повинно бути полем, якщо ви моделюєте з більш перспективної точки зору, це може просто вказувати на наявність методу, який поверне клієнта замовлення.
Цитуючи 3-е видання UML Distilated (тепер просто поза), "існує залежність між двома елементами, якщо зміни у визначенні одного елемента (постачальник) можуть спричинити зміни для іншого (клієнта)". Це дуже туманне та загальне співвідношення, саме тому UML має безліч стереотипів щодо різних форм залежності. У термінах коду такі речі, як іменування типу параметра та створення об’єкта в тимчасовій змінній, передбачають залежність.
...
Об'єднання майже завжди має на увазі , що один об'єкт має інший об'єкт в якості поля / властивості / атрибута (термінологія відрізняється).
Залежність , як правило (але не завжди) означає , що об'єкт приймає інший об'єкт в якості параметра методу, конкретизує, чи використовує інший об'єкт. Залежність дуже сильно мається на увазі в асоціації .
У термінах ООП:
Асоціація -> A has-a C об'єкт (як змінна-член)
Залежність -> A посилання B (як параметр методу або тип повернення)
public class A {
private C c;
public void myMethod(B b) {
b.callMethod();
}
}
Є також більш детальна відповідь .
Залежність подібна, коли ви визначаєте метод, який приймає String (у Java, C #, оскільки рядок є в них об’єктом) як параметр, тоді ваш клас залежить від класу String.
Асоціація подібна, коли ви оголошуєте рядок як атрибут у своєму класі. тоді ваш код пов'язаний із класом рядків.
String name = null //: is a association.
Залежність - зміна класу впливає на зміну його залежного класу. Приклад - коло залежить від форми (інтерфейсу). Якщо ви зміните форму, це також вплине на коло. Отже, Circle має залежність від Shape.
Асоціація - означає, що існує певний взаємозв'язок між 2 об'єктами
(один-один, один-багато, багато-багато)
Асоціація буває 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 існують незалежно.
Тут: "Асоціація проти залежності проти агрегації проти композиції" , у вас є чудова вакуум-схема з діаграмами класів uml та фрагментами коду. Автор дає нам список взаємозв’язків: асоціація, залежність, агрегація, склад в одному місці.
Залежність є дуже загальною, і зниження складності полягає у зменшенні залежностей, наскільки це можливо.
Асоціація - це сильна (статична) залежність. Агрегація та склад ще сильніші.
Асоціація - це коли один об’єкт просто має посилання на інший і не використовує реляційні методи об’єкта. Наприклад, для рубіну
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
Тут, якщо інформаційний метод профілю буде змінено або перейменовано, клас залежних користувачів також потрібно змінити.