Bileşim yoluyla sorumluluk devretme, bir sınıfın nesnesinin başka bir sınıfın (veya sınıfların) nesnesini içerdiği ve bu nesneleri kendi mantığını gerçekleştirmek için kullandığı bir yazılım pratiğidir; arayüzünü miras almak yerine.
OOP'nin erken versiyonları mirasa vurgu yaptı; ancak zamanla pratik gösterdi ki, bileşim genellikle daha fazla esneklik, genişletilebilirlik ve bileşenler arasındaki bağlılığın azalmasını sağlar.
Miras alma, nesneleri katı bir şekilde bağlar: temel sınıftaki değişiklikler tüm miras alanları etkiler, hiyerarşiler karmaşık hale gelir ve mimarinin kırılganlığı artar. Bileşim bu sorunları giderir ve daha güvenilir ve sürdürülebilir sistemler inşa etmeye olanak tanır.
C++'da sorumluluk devretme, bir sınıfın nesnesini diğer bir sınıfın üyesi olarak dahil ederek gerçekleştirilir. Sarıcı sınıfta iç nesnenin yöntemleri çağrılır.
Kod örneği:
class Logger { public: void log(const std::string& msg) { std::cout << msg << std::endl; } }; class FileProcessor { Logger logger; // Bileşim public: void process(const std::string& filename) { logger.log("İşleniyor dosya: " + filename); // ... } };
Ana özellikler:
Bileşim mirası tamamen ikame edebilir mi?
Hayır, miras, "şu anlama gelir" (is-a) ilişkisini gerektiren durumlar için gereklidir; bileşim, "şuna sahiptir" (has-a) durumlarında kullanılır. Örneğin, Button, Widget'tan miras alır, ancak Car "şuna sahiptir" Engine (bileşim).
Bileşim içinde delegasyon yönteminin davranışını değiştirmek mümkün mü?
Evet, delegasyon yöntemleri orijinal sınıfı değiştirmeden uyarlanabilir. Ayrıca, delegasyon nesnesi dinamik olarak değiştirilebilir (örneğin, bir işaretçi veya benzersiz işaretçi aracılığıyla).
Bileşim mirastan daha yavaş mıdır?
Hayır, çoğu durumda performans farkı yoktur. Bazen miras, sanal çağrılar (vtable) nedeniyle maliyetler ekler, bileşim ise sadece nesnenin boyutunu artırır.
Projede tüm diyalog kutuları ortak bir DialogWindow'dan miras alıyordu. Yeni iş mantığı eklemek, tüm miras alanlarda çalışmayan koda yol açıyordu.
Artılar:
Eksiler:
Ortak işlevler, her diyaloga bileşim yoluyla entegre edilen ayrı sınıflara (loglama, doğrulama) taşınmıştır.
Artılar:
Eksiler: