"Kompozisyon Hiyerarşisi" bir şey değilse özür dilerim, ama soruda ne demek istediğimi açıklayacağım.
"Kalıtım hiyerarşilerini düz tut" veya "Kompozisyonu kalıtım yerine tercih et" gibi bir varyasyonla karşılaşmamış hiçbir OO programcısı yoktur. Bununla birlikte, derin kompozisyon hiyerarşileri de sorunlu görünmektedir.
Diyelim ki bir deneyin sonuçlarını ayrıntılandıran bir rapor koleksiyonuna ihtiyacımız var:
class Model {
// ... interface
Array<Result> m_results;
}
Her sonucun belirli özellikleri vardır. Bunlar, deneyin zamanının yanı sıra deneyin her aşamasından bazı meta verileri içerir:
enum Stage {
Pre = 1,
Post
};
class Result {
// ... interface
Epoch m_epoch;
Map<Stage, ExperimentModules> m_modules;
}
Tamam harika. Şimdi, her deney modülünde, deneyin sonucunu açıklayan bir dizenin yanı sıra deneysel örnek setlerine referansların bir koleksiyonu bulunmaktadır:
class ExperimentalModules {
// ... interface
String m_reportText;
Array<Sample> m_entities;
}
Ve sonra her numunenin ... iyi, resmi elde.
Sorun şu ki, benim uygulama etki alanından nesneleri modelleme, bu çok doğal bir uyum gibi görünüyor, ama günün sonunda, bir Result
sadece aptal veri kapsayıcısı! Bunun için büyük bir sınıf grubu oluşturmak faydalı görünmüyor.
Yukarıda gösterilen veri yapıları ve sınıflarının uygulama alanındaki ilişkileri doğru bir şekilde modellediğini varsayarsak, derin bir kompozisyon hiyerarşisine başvurmadan böyle bir "sonucu" modellemek için daha iyi bir yol var mı? Böyle bir tasarımın iyi olup olmadığını belirlemenize yardımcı olacak herhangi bir dış bağlam var mı?