Diamond Problem Nedir?

Diamond Problem nesne tabanlı programlamada C++ dilindeki çoklu kalıtım özelliğinden kaynaklanan bir problemdir. Diamond Problem aynı zamanda “deadly diamond of death” olarak da karşınıza gelebilir. Bu problemi en akılda kalıcı şekilde anlamak için bir örnek yapalım.

Hatırlarsanız Yazılımda Kalıtım Nedir yazımızda robot üreten bir firmadan bahsetmiştik. O yazımızı hatırlayacak olursak bizden ilk bir adet robot üretilmesini istemişti. Buna şimdilik birinci seri robot diyelim. Ardından firma birinci seri robotun özelliklerine ek olarak birer özellik alan ikinci ve üçüncü seri robotlar üretilmesini istedi. Son olarak ise dördüncü seri robotta bugüne kadarki tüm özelliklerinin birleşimi bir robot üretilmesini istemişti. C# için bu örneği çoklu kalıtım ile çözememiş olsak da daha sonra arayüzler yardımıyla çözmüştük. Oradaki çözümün dışında çözümler de üretilebilir. Fakat ne olursa olsun tamamen kalıtım kullanarak bir çözüme ulaşamayız. C++ içinse bu durum geçerli değil. C++ desteklemiş olduğu çoklu kalıtım bu örnek için sıkıntı çıkarmadı. Fakat her zaman çıkarmayacak diye bir durum yok. Örneğimizdeki firmanın isterlerini biraz değiştirecek olursak Diamond Problem için uyarlayabiliriz.

Şimdi gelin uyarlamaya çalışalım böylece mantığı biraz daha kavramış olacaksınız.

Firma bizden birinci seri robotta SavunmaMod isimli bir fonksiyon istemiş olsun. Ve birinci seriden türetilen ikinci ve üçüncü seri robotlarında da bu fonksiyon bulunacaktır. Ve bunlar birbirinden farklı seriler olduğu için kendine has bir şekilde bu SavunmaMod fonksiyonunu düzenleyecektir. Ardından dördüncü seri robot, ikinci ve üçüncü seri robotun ortak bir ürünü olarak türetilmesini istedi. İşte burada diamond problemin ortasında kalacağız. Diamond Problem burada en alttaki sınıfın (dördüncü serinin) hangi fonksiyonu (SavunmaMod) seçeceğini bilememesidir. Çünkü ikinci ve üçüncü seri kendine has oluşturduğu SavunmaMod fonksiyonunu hangisinden kalıtım olarak alacak? Gelin bu örneğin diyagramını da oluşturalım.

Kalıtımdaki Problemin, Diamond Problem uyarlanışının diyagramı
Firma'nın Diamond Problem Diyagramı
Firma’nın Diamond Problem Diyagramı

Son olarak akılda kalıcılığını arttırmak için bu konudaki çok duyduğunuz ama gerçek hayattan bir örnek ile konuyu bitirelim. Doğadaki bütün hayvanları temsil eden “Hayvanlar Alemi” isimli bir sınıf var. “Hayvanlar Alemi” sınıfının “Yemek ye” isimli metodu olsun. Bu sınıfın altında bulunan birçok hayvan sınıfı var. Örneğin bu hayvan sınıfları arasında bulunan “Kedi” ve “Köpek” isimli iki sınıfı inceleyelim. Bu iki sınıfta “Hayvanlar Alemi” sınıfından kalıtım yoluyla türetildiği için “Yemek Ye” metoduna sahip. Ama “Kedi” ve “Köpek” sınıflarının kendine has yemek yeme özellikleri olduğu için “Yemek ye” metodunu kendilerine göre tekrar (Override) oluşturuyorlar. İlerleyen süreçte evde beslemek üzere olan türlerin “Kedi” ve “Köpek” türleri oluştuğu için “Ev Hayvanları” isimli bir sınıf oluşucaktır. Bu sınıf tabii ki de “Hayvanlar Alemi” sınıfından değil “Kedi” ve “Köpek” sınıfından kalıtım ile türeteceğiz. Çünkü her hayvan ev hayvanı değildir. Şimdi bizim “Kedi” ve “Köpek” sınıfından türetilen “Ev Hayvanları” sınıfımızın da “Yemek ye” metoduna sahip olması gerekiyor.

Ev hayvanımıza yemek ye komutunu verirsek nasıl yemek yiyecek? Bir kedi gibi mi yoksa köpek gibi mi? Buradaki durumun elmas şeklini andırmasından dolayı ( <> ) Diamond Problem ismini almaktadır. Son olarak bunun da diyagramını yapıp konumuzu bitirebiliriz.

Hayvanlar Alemi probleminin, Diamond Problem uyarlanışının diyagramı
Hayvanlar Alemi Örneğinin Şeması
Hayvanlar Alemi Örneğinin Şeması

Bu durumun önüne geçebilmek için Arayüzler (Interface) ortaya çıkmıştır. Java ve C#’tan aşina olduğumuz interface kavramına hakim değilseniz interfacelerle ilgili yazımı okumanızı öneririm. Interfacelerle ilgili bilmemiz gereken en önemli özellik bir sınıf yalnızca bir sınıftan kalıtım yapabilirken, bir sınıf birden çok interface impalements edebilir. Interfaceler metod barındırmadığı için bir mimari sözleşme veya yaptırım olarak kullanılmakta. Bu da “diamond problem” başka bir deyişle “deadly diamond of death” problemini çözmemizi sağlamış oldu.

Bu konunun da sonuna geldik. Bir marjinal, bir de herkesin bildiği soru üzerinden açıklamaya çalıştım. Görüşmek üzere 🙂 Sağlıklı Günler. C358