Belki de son birkaç ay içinde bunu söyleyen insanları fark ettiniz, ancak bundan daha uzun süredir iyi programcılar tarafından biliniyor. Ben kesinlikle yaklaşık on yıldır uygun olan yerlerde söylüyorum.
Konseptin amacı, kalıtımın üstünde büyük bir kavramsal yük olduğudur. Kalıtım kullanıyorsanız, her bir yöntem çağrısının içinde gizli bir gönderme olur. Derin bir miras ağacınız veya birden fazla gönderiminiz varsa (veya daha da kötüsü) varsa, belirli bir çağrıda belirli bir yöntemin nereye gönderileceğini bulmak, kraliyet PITA'sına dönüşebilir. Kod hakkında doğru muhakeme yapmayı daha karmaşık hale getirir ve hata ayıklamayı zorlaştırır.
Göstermek için basit bir örnek vereyim. Bir miras ağacının derinliklerinde, birinin yöntem olarak adlandırıldığını varsayalım foo
. Sonra bir başkası gelir ve foo
ağacın tepesine ekler , ancak farklı bir şey yapıyor. (Bu durum çoklu mirasta daha yaygındır.) Artık kök sınıfta çalışan kişi belirsiz çocuk sınıfını kırmıştır ve muhtemelen bunu anlamamıştır. Ünite testleri ile% 100 kapsama sahip olabilirsiniz ve bu kırılmayı fark edemezsiniz; çünkü üstteki kişi çocuk sınıfını test etmeyi düşünmezdi ve çocuk sınıfının testleri üstte yaratılan yeni yöntemleri test etmeyi düşünmüyor. . (Kuşkusuz, bunu yakalayacak birim testleri yazmanın yolları vardır, ancak bu şekilde testleri kolayca yazamayacağınız durumlar da vardır.)
Aksine, kompozisyon kullandığınızda, her aramada, aramayı neye gönderdiğiniz genellikle daha açıktır. (Tamam, örneğin bağımlılık enjeksiyonuyla kontrolün tersini kullanıyorsanız, o zaman aramanın nereye gittiğini bulmak da sorunlu olabilir. Ancak, genellikle bunu anlamak daha kolaydır.) Bu, mantıklı olmayı kolaylaştırır. Bir bonus olarak, kompozisyon birbirinden ayrılmış metotlara yol açar. Yukarıdaki örnek orada olmamalıdır çünkü çocuk sınıfı belirsiz bir bileşene taşınır ve çağrının foo
belirsiz bileşen için mi yoksa ana nesne için mi yapıldığına dair hiçbir soru yoktur .
Şimdi miras ve kompozisyonun iki farklı şeye hizmet eden iki farklı araç olduğu konusunda kesinlikle haklısın. Elbette kalıtım kavramsal yükü taşır, ancak iş için doğru araç olduğunda, kullanmaya çalışmaktan ve sizin için ne yaptığını elden yapmaya çalışmaktan daha az kavramsal yük taşır. Ne yaptıklarını bilen hiç kimse, asla miras almamanız gerektiğini söyleyemez. Ancak yapılacak doğru şey olduğundan emin olun.
Maalesef birçok geliştirici nesne yönelimli yazılımları öğrenir, kalıtım hakkında bilgi edinir ve ardından yeni baltalarını mümkün olduğunca sık kullanmaya gider. Bu, kompozisyonun doğru araç olduğu kalıtımı kullanmaya çalıştıkları anlamına gelir. Umarım zamanla daha iyi öğreneceklerdir, ancak sık sık bu, birkaç kaldırılmış uzuv vb.