Kompozisyon, bir sınıfın söz konusu sınıftan miras almak yerine, zaten bu işlevselliği uygulayan bir (muhtemelen dahili) sınıfı somutlaştırarak bazı işlevler sunmasıdır.
Yani, örneğin, bir gemiyi modelleyen bir sınıfınız varsa ve şimdi geminize bir helikopter pisti sunması gerektiği söylendiyse, geminizi bir helikopter pistinden (duh!) Türetmek doğal değildir. geminiz bir helikopter pisti sınıfı içerir ve bir yöntemle ortaya koyar Ship.getHelipad()
.
Yıllarca (on yıl kadar önce) insanlar mirasçılığı işlevselliği bir araya getirmenin hızlı ve kolay bir yolu olarak görürlerdi, bu yüzden elbette çok topal olan "helipaddan miras gemi" türünün birçok örneği vardı.
Ancak "Miras Üzerindeki Kompozisyonu İyileştirme" ifadesi, bunun bir kural değil, sadece bir öneri olduğunu açıkça ortaya koyacak şekilde dikkatle ifade edilmiştir. Dictum'un yazarı, " asla miras değil, sadece kompozisyon kullanamazsın " gibi bir şey söylemekten kaçınacak kadar dikkatliydi . Bu temel olarak, yazılım mühendisliği topluluğunun dikkatini kalıtımın aşırı kullanılmış olduğu gerçeği haline getirirken, birçok durumda kompozisyon, kalıtımdan daha net, zarif ve sürdürülebilir tasarımlar üretir.
Yani, esasen, "Miras Üzerindeki Kompozisyonu İyileştirme" ifadesi, "miras almak veya bestelemek?" soru, en uygun stratejinin ne olduğunu çok düşünmelisiniz ve en fazla şansın en uygun stratejinin kalıtım değil kompozisyon olduğu ortaya çıkmasıdır.
Ancak bu bir kural olmadığından, mirasın daha doğal olduğu birçok durum olduğunu da unutmamalısınız. Orada miras kullanmanız gereken bir kompozisyon kullanırsanız, birçok kötülük kodunuzun başına gelir.
Gemi örneğine geri dönmek için, geminizin a ile etkileşim için bir arayüz sunması gerekiyorsa FloatingMachine
, o zaman onu soyut bir FloatingMachine
sınıftan türetmek daha doğaldır , bu da muhtemelen başka bir soyut Machine
sınıftan türetilebilir .
Kompozisyona ve miras sorusuna cevap için temel kural:
Sınıfımın göstermesi gereken arayüzle "is" ilişkisi var mı? Evetse, kalıtım kullanın. Değilse, kompozisyon kullanın.
Bir gemi "bir" yüzen makine ve bir yüzen makine "bir" makine. Yani, kalıtım onlar için gayet iyi. Ancak bir gemi elbette bir helikopter pisti değildir. Bu yüzden helikopter pistinin işlevselliğini daha iyi oluşturur.