OOP: Nasıl bir Sanatçı kurmak istiyorum, Album &

11 Cevap php

Ben miras temellerini anlamak ancak bu biri bana kafa karıştırıcı. Nasıl diyerek gitmek istiyorum:

  • Bir albüm nesne bir veya daha fazla sanatçı nesneler vardır
  • Bir albüm nesne bir veya daha fazla şarkı nesneler vardır

Benim geçerli kod yalnızca nesnenin başına bir şarkı sağlayacaktır:

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

Ben önemli bir şey bakan eminim. Herhangi bir düşünce?

I'm doing this in PHP

11 Cevap

Bir albüm has, bir veya daha fazla sanatçı nesneler. Kalıtım bir albüm is bir sanatçı anlamına gelecektir. Ne gerek (EDIT) toplanmasıdır:

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

Toplama her Sanatçı ve Şarkı örneği diğer Albümler ait olabilir demektir. Kompozisyonu ile, bir sanatçı ya da şarkı bir tek Albüme ait olabilir.

Benim yorum birinde belirtildiği gibi OOP yoluyla modellemek için olsaydı, ben söyleyebilirim

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

class Album {
    Song[] tracks;
}

Lezzetli krema ile kızarmış ve dolu olduğunu tüm uğruna, ilişkinin bu tür devralma kullanmayın!

Bir şarkı bu albümün bir parçası, bir albümün bir uzantısı değildir. Aynı şekilde, bir albüm, bir sanatçının bir uzantısı değil, bir sanatçı tarafından oluşturulmuş bulunuyor. Üstelik bir şarkı birden fazla albümü görünebilir, ve tek bir albüm birden sanatçılar olabilir.

Bu durum için bir var-bir ilişki yerine mirasını kullanıyor olmalıdır. Örneğin, bir üye olarak, Song nesnelerinin bir dizi var bir Albüm nesne olabilir. Bu şarkılar uygun albümlere ait fikrini iletmek istiyorum.

Nesnelerin hangi özelliklere sahip olan terimlerle düşünme deneyin. Yani "Araba HAS bir renk" ya da "balon HAS bir dize".

Şarkı HAS Sanatçı

Albüm HAS Şarkılar

Yani Song sınıfı bir Sanatçı nesne olurdu, ve Albüm sınıfı, Song nesnelerinin bir koleksiyonu içerecektir.

Ben bu üç sınıfa herhangi bir miras olduğunu sanmıyorum. Bir Şarkı Bir Albüm mi? Hayır ben Şarkı Albüm devralan olmamalıdır çok olduğunu düşünmüyorum. Bir Albüm Bir Sanatçı mı? Hayır bunu da böylece Albüm Sanatçı devralan gerektiğini sanmıyorum.

Bunun yerine kapsülleme bakmak istiyorum. Bir Albüm sıfır veya daha fazla Sanatçılar başvuruyor. Bir Albüm sıfır cevher daha fazla şarkı içeriyor. Bir sanatçı sıfır veya daha fazla Albümler başvuruyor.

aradığınız ilişki HAS-A ise devralma ilişki "IS-A" adlandırılır

Sen böyle bir şey gerekiyor:

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

Bir çok 1 ila Albüm HAS (*) sanatçı (Sanatçı dizisi tarafından tanımlanan) ve 1 albüm 1'den birçok (*) şarkıları sahip olduğu, (Şarkı dizisi tarafından tanımlanan)

Miras üzerinden kompozisyon lehine.

Eğer gibi olmalıdır söylediklerinden:

Bir albüm nesne bir veya daha fazla sanatçı nesneler vardır. Bir albüm nesne bir veya daha fazla şarkı nesneler vardır

class Album { Artist[] Artists; Song[] Songs; }

Ancak ben bu tasavvur nasıl tam olarak bu değildi. Ben her Albüm bir veya birden fazla sanatçı tarafından gerçekleştirilen bir veya daha fazla şarkı olduğunu düşünüyorum. Ben gibi yapardı:

class Album { Songs[] Songs; // other album specific properties }

class Song { Artist[] Artists; // other song specific properties }

class Artist { // artist specific properties }

Ve ben son derece OOD ilkelerine bakarak öneririz.

İşte benim görüşüm bu.

Album contains Song(s) but a Song is not an Album.
Album is associated with Artist(s), but an Album is not an Artist.

Ilişkileri ile mirası karıştırma.

Bu bir veritabanı modelleme soru, değil OOP biri gibi geliyor. Büyük olasılıkla şarkı sanatçı ve albümlerin bir veritabanı olurdu çünkü bu. Bir sınıf hiyerarşisi.

Ben doğru OOP kullanılarak emin değilim. O ebeveyn aynı işlevselliği, ancak bazı ekstra (spesifik) işlevselliğe sahiptir Genellikle, bir nesne bir ebeveyn uzanır.

Örneğin, oto sanayi kullanmasına izin:

class Automobile {}

class Truck extends Automobile {}
class Car extends Automobile {}

class Lexus extends Car{}

Lexus en çok özeldir, bu nedenle yukarı gider gibi bir hiyerarşi oluşturur nasıl?

Ne isteyen bir Has_many ilişkiye benzer. Bir sanatçı, birçok albüm olan bir albüm, vb birçok şarkı var

Victor Nicollet Dediğim gibi Edit 1:, istediğiniz composition.

Edit 2: açıklamalarda belirtildiği gibi, gerçekten istediğiniz aggregation. Sağlanan makale ikisi arasındaki farkı açıklar.

Eğer bize başarmak isteyen bilmek izin verirseniz, o bize doğru cevap varmak yardımcı olabilir. Ancak, bu ilişkiler normalde veritabanında saklanır.