2013-02-17 15 views
6

Basit bir oyun yazıyorum ve oyun nesneleri bir çok özelliği paylaşıyor. Bunun için iki potansiyel uygulama var. Aşağıdaki resimde belirtildiği gibi Bu durumda Kalıtım veya Kompozisyon kullanmalı mıyım?

ilk

devralma kullanıyor:

Class Hierarchy

kalın sınıfları soyut sınıflar vardır, tahmin edebileceğiniz gibi. Dallar, fiilen kullanılan türetilmiş sınıflardır. Bu sınıfların nesneler hakkında veri tuttuğunu ve bunlarla ilişkili hiçbir işlevsellik olmadığını not etmek önemlidir. Örneğin, Troop ve Aracın her ikisi de attack() ve move() gibi şeyler yapmak için kullandıkları ortak bir arayüze sahiptir. Yukarıda özetlenen sınıf hiyerarşisi sadece ham istatistiklerdir. Dahası, hepsi gerçek ISA ilişkileridir.

İkinci uygulama bileşimi kullanır. Yukarıdaki sınıf hiyerarşisi yerine, soyut sınıfların her biri, belirli veri üyelerini tutan 'modüller' dir. Bu nedenle SpecialAbility'nin, PointsValueObject adlı bir veri üyesi vardır (her ne kadar soyutlanmamasına rağmen, artık soyutlanmamasına rağmen, modüler/özniteliklerini yansıtacak şekilde). Ve Troop'un veri üyeleri vardır: PointsValueObject, PhysicalObject, PhysicalAttackObject ve BattleOBject, bunların her biri, birlik hakkında veri barındıran modüllerdir. Yine, bu modüllerdeki hiçbir işlevsellik mevcut değildir, bunlar sadece verileri depolamak için kullanılır. Davranış ve işlevsellik hala Arayüz sınıfları ile uygulanır.

Soruma göre soru şudur: insanlar genellikle kalıtım üzerinden bileşimi tercih ederler, ancak bu durumda, ISA ilişkileri tutulduğu ve hiyerarşinin yalnızca veri içeren davranış içermediği için mirasa bağlı kalmaya eğilimliyim. Bu hiyerarşi iyi OOD mu yoksa 'modülleri' özniteliğini kullanarak sınıfları daha iyi mi yapıyor?

+1

'Modüller' yaklaşımı, bileşen tabanlı bir [varlık sistemi] ile benzerdir (http://t-machine.org/index.php/2007/09/03/entity-systems-are-the-future-of -mmog-development-part-1 /) oyun geliştirmede genellikle kullanılır. Ekstra karmaşıklığı beraberinde getirir, ancak yeniden kullanılabilirlik ve genişletilebilirlik için gerçekten iyidir. Hangisinin daha iyi olacağını bilmiyorum, her yaklaşımın artıları ve eksileri var, ama onları dengelemek ve probleminize en uygun yaklaşıma karar vermek size kalmış. – asermax

cevap

4

Yeniden kullanılmakta olan bir kod yoksa, miras kullanımında hangi avantajı görüyorsunuz? Davranış aynı olduğunda DRY (Kendinizi Tekrar Etmeyin) için yararlıdır, ancak davranışsız tüm yapmanız gereken potansiyel olarak kendini sınırlamaktır - daha sonra daha az veri gerektiren bir alt hiyerarşiniz olduğuna karar verirseniz, iyi bir çözüm yoktur. bunu yapmak için.

+0

Üzgünüz, DRY ne anlama geliyor? – Slims

+0

Kendinizi Tekrarlama – KidTempo