ООП: Как бы вы установили отношения Исполнитель, Альбом и Песня в ООП? - PullRequest
5 голосов
/ 08 января 2010

Я понимаю основы наследования, но это меня смущает. Как бы вы сказали:

  • Объект альбома содержит один или несколько объектов художника
  • Объект альбома имеет один или несколько объектов песни

Мой текущий код допускает только одну песню на объект:

class Song extends Album{}
class Album extends Artist{}

Я уверен, что пропускаю что-то важное. Есть мысли?

Я делаю это на PHP

Ответы [ 11 ]

24 голосов
/ 08 января 2010

Альбом содержит один или несколько объектов художника. Наследование означало бы, что альбом является артистом. Что вам нужно, это (РЕДАКТИРОВАТЬ) агрегирование:

class Album
{
  public $artists = array(); // Array of Artist instances
  public $songs   = array(); // Array of Song instances
}

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

12 голосов
/ 08 января 2010

Как я уже упоминал в одном из моих комментариев, если бы вам нужно было смоделировать его с помощью ООП, я бы сказал,

class Song {
    string[] artists;
    string title;
    int genre;
}

class Album {
    Song[] tracks;
}
5 голосов
/ 08 января 2010

Не используйте наследство для такого рода отношений, ради всего, что жарено и наполнено вкусными сливками!

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

Для этой ситуации вы должны использовать отношение has-a вместо наследования. Например, у вас может быть объект Album, который имеет массив объектов Song в качестве члена. Это дало бы представление о том, что песни принадлежат альбомам соответствующим образом.

3 голосов
/ 08 января 2010

Попробуйте подумать об этом с точки зрения того, какие объекты имеют какие свойства. То есть «Машина ХАС цвет» или «Шарик ХАС струна».

Song HAS Artist

Альбом ИМЕЕТ Песни

Таким образом, ваш класс Song будет иметь объект Artist, а ваш класс Album будет содержать коллекцию объектов Song.

2 голосов
/ 08 января 2010

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

Вместо этого вы хотите посмотреть на инкапсуляцию. Альбом ссылается на ноль или более исполнителей. Альбом содержит ноль или больше песен. Художник ссылается на ноль или более альбомов.

1 голос
/ 08 января 2010

Пользуйся композицией по наследству.

То, что вы сказали, должно быть:

Объект альбома имеет один или несколько объектов исполнителя. Объект альбома имеет один или несколько объектов песни

Альбом класса { Artist [] Художники; Песни [] песни; }

Однако я не совсем это представляю. Я думаю, что в каждом альбоме есть одна или несколько песен, исполняемых одним или несколькими исполнителями. Я бы сделал это так:

Альбом класса { Песни [] песни; // другие специфичные для альбома свойства }

класс песни { Artist [] Художники; // другие специфичные для песни свойства }

класс Исполнитель { // специфичные для художника свойства }

И я настоятельно рекомендую взглянуть на принципы OOD.

1 голос
/ 08 января 2010

наследственные отношения называются "IS-A" , в то время как искомые отношения: HAS-A

Вам нужно что-то вроде этого:

Album
    artists: Artist[1..*]
    songs  : Song[1..*]

Где альбом HAS от 1 до многих (*) исполнителей (определяется массивом Artist) и 1 альбом содержит от 1 до многих (*) песен (определяется массивом Song)

0 голосов
/ 08 января 2010

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

0 голосов
/ 08 января 2010

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

0 голосов
/ 08 января 2010

Вот мой взгляд.

Альбом содержит композицию (и), но композиция не является альбомом.
Альбом связан с исполнителем (ями), но альбом не является исполнителем.

Вы смешиваете наследование с отношениями.

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