Soru geçmişi:
Her iki terim — kompozisyon ve agregasyon — klasik nesne yönelimli tasarımdan gelmektedir. Nesneler arasındaki "bütün-parça" ilişkisini tanımlarlar, ancak nesnelerin bağlantı derecelerine göre farklılık gösterirler.
Sorun:
Büyük sistemlerde kodun okunabilirliği ve genişletilebilirliği önemlidir. Kompozisyon ve agregasyon, sınıflar arasında doğru bağımlılıkları oluşturmaya yardımcı olur. Farklılıklarını anlamak önemlidir; aksi takdirde mimari ya çok katı ya da çok belirsiz olabilir.
Çözüm:
Kompozisyon, "parça-bütün" ilişkisini güçlü bir şekilde ifade eder. Bir nesne, yalnızca başka bir nesne içinde bulunabilir ve onun dışında var olamaz. Python'da böyle bir nesne genellikle bir "kapsayıcı" sınıf içinde oluşturulup yönetilir.
Agregasyon ise daha zayıf bir bağdır. "Parça" nesnesi, "bütün" nesneden ayrı olarak var olabilir ve dışarıdan ona aktarılabilir.
Kod örneği:
class Engine: def start(self): print("Motor çalıştırıldı") class Car: # Kompozisyon: Motor Car içinde oluşturuluyor def __init__(self): self.engine = Engine() def drive(self): self.engine.start() my_car = Car() my_car.drive() class Wheel: pass class Bicycle: # Agregasyon: tekerlekler dışarıdan aktarılıyor def __init__(self, wheels): self.wheels = wheels w1, w2 = Wheel(), Wheel() bike = Bicycle([w1, w2])
Anahtar özellikler:
Kapsayıcı nesne (örneğin, Car) silinirse, Engine nesnesi de silinir mi?
Kompozisyonda, "parça" nesnesine başka hiç kimse atıfta bulunmuyorsa, çöp toplayıcı tarafından silinecektir. Ancak agregasyonda, "parça" nesnesi hala varlığını sürdürebilir (başka nesneler tarafından atıfta bulunulmaya devam edebilir).
Python'da diğer dillerde olduğu gibi agregasyon ve kompozisyon için özel bir sözdizimi var mı?
Python'da açık bir kompozisyon/agregasyon belirten anahtar kelimeler yoktur. Her şey, nesnelerin oluşturulma yöntemi ve yaşam döngüsüne bağlıdır.
Kompozisyonu agregasyona ve tersine, mantığı yeniden yazmadan değiştirmek mümkün mü?
Her zaman mümkün değildir. Eğer mantık "parça" nesnesi üzerinde tam kontrol ve benzersizlik gerektiriyorsa, basit bir şekilde kompozisyonu agregasyona değiştirmek hatalara yol açabilir (örneğin, farklı bisikletlerin tekerlekleri aynı sınıfın ortak örnekleri haline gelirse).
Artılar:
Olumsuz durumda: Bir projede her araç için dışarıdan bir motor nesnesi oluşturuldu ve buna agregasyon yoluyla araçlara verildi. Ancak daha sonra nesnelere olan referanslar karıştırıldı ve motorlar arasında keyfi değiştirildi — bu karmaşıklığa ve hatalara yol açtı.
Artılar: mimari esnek görünüyordu. Eksiler: hangi motorun hangi araca ait olduğu zor anlaşılıyordu.
Olumlu durumda: Başka bir projede motorlar, Car sınıfının içinde oluşturuldu (kompozisyon); araçlar motorları doğrudan yönetti, bu da güvenilirlik sağladı.
Artılar: bellek sızıntısı ve mantıksal karmaşanın olmaması. Eksiler: her aracın ve parçalarının yaşam döngüsünü yönetmek için biraz daha fazla kod yazmak gerekti.