Это агрегация или композиция? - PullRequest
1 голос
/ 07 декабря 2010

У меня есть класс Album и класс Track.Треки могут существовать независимо от альбома, но альбом не может существовать без каких-либо треков.

Я думаю, что это агрегирование, потому что треки не уничтожаются при уничтожении альбома.Но определенные треки, которые принадлежат определенному альбому, будут уничтожены вместе с альбомом ... так что, может, кто-то прояснит это?

Кроме того, это домашнее задание, но это не настоящий вопрос.Мы выполняем огромное упражнение по моделированию, и это единственная ссылка на ассоциацию.

Ответы [ 3 ]

6 голосов
/ 07 декабря 2010

В мире, не связанном с домашним заданием, именно здесь сценарии использования определяют дизайн.

Если треки являются независимыми объектами, а альбомы - сборниками треков, это нормально. Однако в такой системе удаление альбома не означает удаление треков.

... Если у вас не было опции "удалить треки с альбома"

... Или вы решили, что дорожка будет удалена, только если она больше не содержится во всех альбомах.

... И у вас был альбом "неклассифицированных треков", который нельзя удалить.

Похоже, вам нужно определить, как вы собираетесь использовать свое приложение, прежде чем решите, что модель данных поддерживает точный шаблон использования, который вы, возможно, захотите поддерживать.

4 голосов
/ 07 декабря 2010

Альбом - это коллекция треков.Трек связан с нулем или более альбомов.Существует такая вещь, как трек без альбома.Таким образом, альбом представляет собой совокупность треков.Трек может быть на нескольких альбомах (концептуально; рассмотрите коллекции Greatest Hits!), Поэтому явно неуместно уничтожать трек, потому что первый альбом, частью которого он был, был удален.

Если объект может существовать вболее чем одна коллекция одновременно, или может существовать независимо от этой коллекции, или не должна быть уничтожена, когда коллекция есть, это агрегация .

Почему вы хотите уничтожить дорожки, когдавы уничтожаете альбом?Если у дорожки есть ноль или один альбом, и он никогда не будет удален из альбома после добавления, композиция может быть более подходящей, но это выглядит гораздо больше, как агрегация, и ваши "дорожки, которые относятся кАльбом должен быть уничтожен вместе с альбомом "возможно, он не на правильном пути.

Композиция и агрегация разделены, главным образом, по этой причине: вам нужно знать, когда небезопасно предполагать, что объект просто не имеет ссылкипотому что коллекция, содержащая ее, была (небезопасно предполагать, что для агрегации, а не для композиции), и если вы хотите уничтожить что-то только потому, что ее коллекция ушла, это, вероятно, композиция, но если вы не такВы используете его, возможно, что-то где-то пошло не так.

2 голосов
/ 07 декабря 2010

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

Я бы даже усомнился в том, является ли это Агрегацией, но тогда это зависит от вашего конкретного определения Агрегации, поскольку оно так печально определено в спецификации UML.

Исходя из информации, которую вы предоставляете, я бы, скорее всего, назвал бинарную ассоциацию "многие из многих", исходя из того, что правила домена, которые вы пытаетесь захватить:

  1. Каждый альбом содержит один или несколько треков
  2. Каждая дорожка может появляться в одном или нескольких альбомах.

Однако есть немного вашего вопроса, который я не совсем понимаю:

Но определенные треки, которые принадлежат определенному альбому, будут уничтожены вместе с альбомом ...

Можете ли вы уточнить? Что отличает трек, который разрушен вместе с альбомом, от того, который не был?

НТН.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...