Разница между ассоциацией и зависимостью?

91

В чем разница между отношением ассоциации и отношением зависимости на диаграмме классов UML?

Насколько я знаю, ассоциация - это более сильные отношения, чем зависимость, но я не уверен, насколько она сильнее.

Любой пример был бы более чем приветствуем :)

Чарли
источник

Ответы:

50

В чем разница между зависимостью и ассоциацией? :

Как правило, вы используете ассоциацию для представления чего-то вроде поля в классе. Ссылка всегда есть, так что вы всегда можете сделать заказ для своего клиента. На самом деле это не обязательно должно быть поле, если вы моделируете с точки зрения интерфейса, это может просто указывать на наличие метода, который вернет клиента заказа.

Процитируя 3-е издание UML Distilled (сейчас только что вышедшего), «существует зависимость между двумя элементами, если изменения в определении одного элемента (поставщика) могут вызвать изменения в другом (клиенте)». Это очень расплывчатая и общая взаимосвязь, поэтому в UML существует множество стереотипов для различных форм зависимости. С точки зрения кода, такие вещи, как присвоение имени типу параметра и создание объекта во временной переменной, подразумевают зависимость.

...

Митч Уит
источник
6
Зачем отвечать, если Мартин делает это для тебя намного лучше ?! +1
Randolpho
5
Для меня это пока не совсем ясно, но я понял одну вещь: зависимости несколько «слабее», чем ассоциации. Кажется, что ассоциации - это подмножество зависимостей, хотя, по крайней мере, на мой взгляд, зависимость - более сильное слово, чем ассоциация. Это вполне могло быть источником путаницы.
Фелипе
В этой статье об этом хорошо сказано. Фактически, это согласуется с моими мыслями. Итак, выделим некоторые моменты из этого: (1) Вы не хотите показывать все зависимости на диаграмме UML - их слишком много. Вам нужно быть очень избирательным и показывать только то, что важно для того, о чем вы говорите. (2) Если существует связь между двумя классами, существует также и зависимость. Это подразумевает ассоциация, как и обобщение. Таким очевидным для вывода зависимости является несколько надмножество отношений других отношений UML
Mahesha999,
1
Ваше объяснение слишком далеко от реальных примеров, поэтому оно не дало четкого понимания даже разработчикам программного обеспечения.
softninja
@ softninja: ты хочешь сказать, что не поняла. Все остальные, кажется, считают это приемлемым. Ох, и спасибо за отрицательный голос.
Mitch Wheat
74

Объединение почти всегда подразумевает , что один объект имеет другой объект в качестве поля / свойства / атрибута (терминология отличается).

Зависимость , как правило (но не всегда) означает , что объект принимает другой объект в качестве параметра метода, конкретизирует, или использует другой объект. Зависимость очень сильно подразумевается в ассоциации .

Randolpho
источник
Это наиболее похоже на то, как я обычно решаю вопрос. Если другой класс вносит существенный вклад в состояние или поведение моего класса, то это ассоциация. Таким образом, классы стратегий будут ассоциациями, даже если у них нет собственного внутреннего состояния. Если другой класс просто предоставляет услугу моему классу, то это зависимость.
Ужасный головастик
49

В терминах ООП:

Ассоциация -> A имеет объект C (как переменная-член)

Зависимость -> A ссылается на B (как параметр метода или возвращаемый тип)

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

Есть и более развернутый ответ .

Ахмад Абдельгани
источник
1
@Naruto_Uzumaki Агрегация - это отношение целых частей. Например, список воспроизведения и песня. Пожалуйста, проверьте мой другой ответ, чтобы увидеть более широкое различие между ассоциацией, зависимостью и агрегацией stackoverflow.com/a/34069760/1998422
Ахмад Абдельгани
Из книги Мартина Фаулера UML Distilled : «В классах зависимости существуют по разным причинам: один класс отправляет сообщение другому; один класс имеет другой как часть своих данных; один класс упоминает другой как параметр операции»
Ахмад Абдельгани
24

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

Ассоциация похожа на объявление строки как атрибута в своем классе. тогда ваш код связан со строковым классом.

String name = null //: is a association.
Шрикант Мали
источник
«Ассоциация похожа на объявление строки как атрибута в своем классе. Тогда ваш код связан с классом строки». Если это так, то в чем разница между ассоциацией и композицией?
Дин П.
16

Зависимость - изменение класса влияет на изменение зависимого класса. Пример. Круг зависит от формы (интерфейса). Если вы измените форму, это также повлияет на круг. Итак, Circle зависит от формы.

Ассоциация - означает, что между двумя объектами существует определенная связь.

(один-один, один-много, много-много)

Ассоциация бывает 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. У человека есть машина, но человек и машина существуют независимо.

Дин Джон
источник
Зависимость - это локальная область видимости, где Ассоциация - это область действия класса.
dimpiax 02
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 Насколько я понимаю, Dependency должна показать, что изменения в классе поставщика потребуют изменений в классе клиента. В программировании это только тогда, когда вы используете интерфейс поставщика (или Покажите мне другую причину). С вашей точки зрения разницы в этих стрелках нет. Они не указывают на реализацию кода, а просто концептуальны.
стопанко
Боюсь, это ваше личное понимание, но не то, как это описано в спецификациях UML. Из UML 2.5 § 7.8.4.1: Зависимость - это Отношение, которое означает, что один элемент модели или набор элементов модели требуют других элементов модели для их спецификации или реализации. Это означает, что полная семантика clientElement (ов) либо семантически, либо структурно зависит от определения элемента (ов) поставщика.
Герт Беллекенс,