Composition ile inheritance arasındaki fark nedir? Neden "composition over inheritance" denir?
Cevap
- Inheritance (kalıtım): "is-a" ilişkisi.
Car extends Vehicle. Alt sınıf üst sınıfın uygulamasını devralır. - Composition (bileşim): "has-a" ilişkisi.
CarbirEnginenesnesine sahiptir ve işi ona devreder.
Kalıtımın sorunları
- Sıkı bağlılık: üst sınıftaki değişiklik tüm alt sınıfları etkiler (fragile base class).
- Sınıf patlaması:
FlyingDuck,SwimmingDuck,FlyingSwimmingDuck,RubberDuck... Her davranış kombinasyonu için yeni sınıf. - Davranış derleme zamanında sabittir, çalışırken değiştirilemez.
- Çoğu dilde tekli kalıtım vardır.
Composition ile
class FlyWithWings:
def fly(self): return "Kanatlarla uçuyor"
class NoFly:
def fly(self): return "Uçamıyor"
class Duck:
def __init__(self, name, fly_behavior):
self.name = name
self.fly_behavior = fly_behavior # davranış enjekte edilir
def fly(self):
return self.fly_behavior.fly()
mallard = Duck("Yaban ördeği", FlyWithWings())
rubber = Duck("Lastik ördek", NoFly())
rubber.fly_behavior = FlyWithWings() # çalışma zamanında değişebilirFaydaları: gevşek bağlılık, davranışların yeniden kullanımı, kolay test (mock bileşen verilebilir).
Kalıtım ne zaman doğru?
- Gerçek bir "is-a" ilişkisi var ve Liskov prensibi sağlanıyorsa.
- Çerçevenin beklediği genişletme noktalarında (ör.
Exceptionsınıfından türetmek). - Hiyerarşi sığ ve kararlıysa.
Kural: kod tekrarını önlemek için kalıtımı ilk araç olarak seçmeyin; önce composition'ı düşünün.
İlgili OOP & Tasarım Desenleri soruları
- Clean code nedir? Yaygın code smell'ler nelerdir?
- Dependency Injection nedir? IoC container ne işe yarar?
- Strategy deseni nedir? if/else zincirlerini nasıl ortadan kaldırır?
- Observer deseni nedir? Gerçek hayatta nerelerde karşımıza çıkar?
- Factory deseni nedir? Ne zaman kullanılır?
- Singleton deseni nedir? Neden bazen anti-pattern olarak görülür?
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.