Автор Тема: Композиция, Агрегация  (Прочитано 1760 раз)

Максим

  • Newbie
  • *
  • Сообщений: 4
  • Рейтинг читателей: 0
    • Просмотр профиля
Композиция, Агрегация
« : 23 Октября 2014, 16:56:00 »
Здравствуйте, уважаемые форумчане. Разбираюсь с темой реализации в коде отношений композиции и агрегации. Из примеров найденных мною в интернете, я увидел, что в случае композиции необходимо в конструкторе класса-контейнера создать объекты и присвоить их полям этого класса. В случае агрегации объекты приходят извне, передаются конструктору контейнерного класса как аргументы и присваиваются полям этого класса. Я не могу понять, обязательно эти действия необходимо производить только в конструкторе класса или можно это делать и в других методах класса контейнера?


Григорий Печенкин

  • Member of CAR
  • Hero Member
  • *****
  • Сообщений: 1337
  • Рейтинг читателей: 58
    • Просмотр профиля
    • http://www.greesha.ru
Re: Композиция, Агрегация
« Ответ #1 : 24 Октября 2014, 13:32:34 »
Здравствуйте, уважаемые форумчане. Разбираюсь с темой реализации в коде отношений композиции и агрегации. Из примеров найденных мною в интернете, я увидел, что в случае композиции необходимо в конструкторе класса-контейнера создать объекты и присвоить их полям этого класса. В случае агрегации объекты приходят извне, передаются конструктору контейнерного класса как аргументы и присваиваются полям этого класса. Я не могу понять, обязательно эти действия необходимо производить только в конструкторе класса или можно это делать и в других методах класса контейнера?

Нет однозначного соответствия между отношениями и способом реализации в коде. И композицию, и агрегацию можно реализовать одним и тем же кодом.

Можно устанавливать связь в конструкторе и разрывать в деструкторе. Имеет смысл, если агрегируемый используется объект на всём протяжении жизни агрегатора.

Можно использовать отдельную функцию инициализации объекта, вызываемую после его создания.

Можно подключать и отключать агрегируемые объекты отдельными методами, например, при обработке событий. Имеет смысл, если в процессе жизни агрегатора агрегируемые объекты могут изменяться. Или если агрегатор может выполнять какие-то функции вообще без агрегируемых объектов.


Вообще, по моему мнению, однозначное соответствие между моделью отношений и кодом возможно только в самых примитивных проектах - по большей части учебных. В реальной жизни всегда находится компромисс между соответствием абстрактной модели, читаемостью, сопровождаемостью и универсальностью кода, совместимостью с существующими наработками и прочими нефункциональными требованиями, вроде требований к производительности.
greesha.ru

Реальность - это убийство прекрасной теории бандой мерзких фактов. (Роберт Гласс)

Максим

  • Newbie
  • *
  • Сообщений: 4
  • Рейтинг читателей: 0
    • Просмотр профиля
Re: Композиция, Агрегация
« Ответ #2 : 24 Октября 2014, 17:33:49 »
Получается, что связь между классом контейнером и включаемыми в него объектами можно установить как в теле конструктора, так и в любом другом методе этого класса, в любое время. Если объекты создаются в теле конструктора или любого другого метода, то это композиция. Если же объекты приходят извне и передаются как аргументы конструктора или метода, то это агрегация. Таким образом мы уже будем знать что произойдет с включаемыми объектами после уничтожения класса-контейнера. В случае ассоциации же, в классе просто объявляются объектные поля без уточнения как будет устанавливаться связь, т.е. откуда будут приходить включаемые объекты снаружи класса или создаваться в этом контейнере. Верно я понял реализацию этих трех отношений?

[прилетело НЛО и...]

  • Sr. Member
  • ****
  • Сообщений: 251
  • Рейтинг читателей: 26
    • Просмотр профиля
Re: Композиция, Агрегация
« Ответ #3 : 14 Сентября 2017, 22:00:11 »
Здравствуйте, уважаемые форумчане. Разбираюсь с темой реализации в коде отношений композиции и агрегации. Из примеров найденных мною в интернете, я увидел, что в случае композиции необходимо в конструкторе класса-контейнера создать объекты и присвоить их полям этого класса. В случае агрегации объекты приходят извне, передаются конструктору контейнерного класса как аргументы и присваиваются полям этого класса. Я не могу понять, обязательно эти действия необходимо производить только в конструкторе класса или можно это делать и в других методах класса контейнера?

[Трёпа ради прилечу.]
Если композиция такова, что объект-целое обязателен, и объект-часть обязателен, и объект-часть не может существовать сам по себе, например, Здание◆-1---1..*-Этаж, то обязательный этаж здания должен создаваться в конструкторе здания. Любой строитель подтвердит. (Экзотику, когда берут этаж от одного здания и передают в другое, не рассматриваем.)
Если композиция такова, что объект-целое необязателен, , а объект-часть обязателен, и объект часть может существовать сам по себе, например, Авто◆-0..1---3..8-Колесо, то три обязательных колёса можно создавать раньше авто и передавать ему при вызове конструктора.
Т. е. исходный вопрос не про композицию/агрегацию, а про композицию со специфическими мощностями.
[...и улетело НЛО.]

Galogen

  • Member of CAR
  • Hero Member
  • *****
  • Сообщений: 6103
  • Рейтинг читателей: 194
  • Аксакал
    • Просмотр профиля
    • Профиль в Моем Круге
Re: Композиция, Агрегация
« Ответ #4 : 15 Сентября 2017, 23:10:21 »
[Трёпа ради прилечу.]
Если композиция такова, что объект-целое необязателен, , а объект-часть обязателен, и объект часть может существовать сам по себе, например, Авто◆-0..1---3..8-Колесо, то три обязательных колёса можно создавать раньше авто и передавать ему при вызове конструктора.
Простите, но это же агрегация, а не композиция. Колесо же не может быть произведено как часть необязательной композиции. Это нонсенс, но может быть произведено само себе и употреблено как часть автомобиля. Другое дело, что автомобиль накладывает определенные ограничения на вид такого колеса

[прилетело НЛО и...]

  • Sr. Member
  • ****
  • Сообщений: 251
  • Рейтинг читателей: 26
    • Просмотр профиля
Re: Композиция, Агрегация
« Ответ #5 : 16 Сентября 2017, 13:03:02 »
Про колесо придумал Конрад Бок: http://www.jot.fm/issues/issue_2004_11/column5/
Это один из "друзей" "3-х друзей" -- в смысле, разработчик стандарта.
[...и улетело НЛО.]

Galogen

  • Member of CAR
  • Hero Member
  • *****
  • Сообщений: 6103
  • Рейтинг читателей: 194
  • Аксакал
    • Просмотр профиля
    • Профиль в Моем Круге
Re: Композиция, Агрегация
« Ответ #6 : 17 Сентября 2017, 00:51:01 »
Про колесо придумал Конрад Бок: http://www.jot.fm/issues/issue_2004_11/column5/
Это один из "друзей" "3-х друзей" -- в смысле, разработчик стандарта.
И что. Мне следует пасть ниц? Если нелогично, почему нужно следовать авторитету?

[прилетело НЛО и...]

  • Sr. Member
  • ****
  • Сообщений: 251
  • Рейтинг читателей: 26
    • Просмотр профиля
Re: Композиция, Агрегация
« Ответ #7 : 17 Сентября 2017, 02:13:13 »
Я лишь попыталось пояснить свой ответ.
[...и улетело НЛО.]

Galogen

  • Member of CAR
  • Hero Member
  • *****
  • Сообщений: 6103
  • Рейтинг читателей: 194
  • Аксакал
    • Просмотр профиля
    • Профиль в Моем Круге
Re: Композиция, Агрегация
« Ответ #8 : 17 Сентября 2017, 19:45:08 »
Я лишь попыталось пояснить свой ответ.
Тогда нужно прояснить семантику понятия композиция и семантику понятия агрегация. Ведь еще Конфуция замечал, что все непорядки от неточно данного понятия или неправильно понимаемого понятия.

Давайте по понятиям?? Пройдемся ...

[прилетело НЛО и...]

  • Sr. Member
  • ****
  • Сообщений: 251
  • Рейтинг читателей: 26
    • Просмотр профиля
Re: Композиция, Агрегация
« Ответ #9 : 17 Сентября 2017, 22:52:49 »
Семантика umlьная. Другой на моей планете нет, не завезли.
[...и улетело НЛО.]