Static – Dynamic Dispatch

on

Static – Dynamic Dispatch

Nesne yönelimli proglamada bilinmesi gereken en önemli konulardan birisi de dispatching‘dir. Bu makalede dispatching konusuna değinmeye çalışacağım.

Bir metodu çağıracak kod satırı yazdığınızda ve çalıştırdığınızda bu metot runtime da çağırılır. Peki bu metot nasıl çağrılır. Burada compiler devreye girer ve erişilebilir en uygun metodu çağırarak ilgili parametreleri geçer. Bazen birden fazla kullanılabilir metot olabilir, bu noktada en uygun metot seçilmelidir. İşte compilerın en uygun metodu tespit edip çağırma mekanizmasına dispatching denir.

Dispatching mekanizmaları iki başlıkta incelenebilir;

  • Static dispatch
  • Dynamic dispatch

Static Dispatch

Biraz teorik bilgi verdikten sonra, bir örnekle konuyu anlaşılır kılmaya çalışalım. Yukarıda ki kodu incelediğimizde, Robot class’ında ki SayHi metodu çağrılacak. Bu metodun ne zaman çağrılacağı compile time da belli oluyor.  Önce Robot classının bir instance’ı alınır ve akabinde SayHi metodu çağrılır. Bu compiler için gayet basit ve anlaşılır bir durumdur. Compile time da metodun nasıl çağrılacağına karar veren bu yapıya Static Dispatch denilir.

Neredeyse bütün programlama dilleri Static Dispatch mekanizmasını destekler ve oldukça performanslıdır. 

 

Dynamic Dispatch

Run timeda, metotların aldığı parametrelere göre dinamik olarak çağrılmasına Dynamic Dispatch denilir.
Teorik bilgi ile beraber örneğimize geçelim.

Yukarıda ki gibi bir hiyerarşi oluşturalım.

Person classını ve üç tane overloadu olan Use metodunu yukarıdaki gibi tanımlayalım.

Beşinci ve altıncı satırlara break point koyup yukarıdaki kodu çalıştırğımızda itel ve tel değişkenlerinde SmartPhone tipinin olduğunu görüyoruz. Buraya kadar bir problem yok zaten olmasını beklediğimizde bu. 

İşin en önemli kısmına geldik,  sizce ekran çıktısı ne olur? 

İşte ekran çıktısı. 

Buradaki dikkat edilmesi gereken en önemli nokta şu, Person classın da SmartPhone tipini alan metot çalışması gerekirken çalışmamış ve diğer overload metotlar çalışmış.  Ama itel ve tel değişkenlerinde ki tipimiz SmartPhone’ du neden SmartPhone tipini alan overload çalışmadı?.

Bunun sebebi compiler ın dinamik olarak tip tutmuyor olması, yani siz kodunuzu yazarken itel değişkenine ITelephone tipini verdiniz, tel değişkenine de Telephone tipini verdiniz runtime da bu değişkenlerin SmartPhone olmasını istediniz işte compiler bunu yapamıyor.  İşin aslı bunu önemsemiyorda, kod yazılırken değişkende hangi tip varsa ona göre hareket ediyor. 

Peki bu durumu nasıl düzeltebiliriz. İki farklı şekilde çözüm bulabiliriz.

  • Dynamic
  • Visitor Pattern

 

.Net 4.0 dan sonra gelen dynamic anahtar kelimesi ile bu duruma bir çözüm bulabiliyoruz. 

Kodumuzu yukarıdaki gibi değiştirdiğimizde, ekran görüntüsü de aşağıdaki gibi değişiyor. 

Burada dynamic anahtar kelimesi yardımımıza koşuyor ancak dynamic bu amaç için geliştirilmediği için kullanırken dikkat etmeliyiz aksi halde performans sorunlarıyla karşılaşabiliriz. 

Aklımıza şöyle bir soru gelebilir, dynamic yerine var kullansaydık aynı sonucu elde etmezmiydik. Yukarıdaki örnek için sonuç pek değişmeyebilir ama dynamic ve var arasında dramatik farklar vardır. Aralarındaki farkı kısaca açıklamak gerekirse var tipleri statik olarak tutar, dynamic ise dinamik olarak tutar, yani dynamic olarak tanımladığınız değişkenin tipi run time da belirlenir, var da ise tip statik olarak tanımlandığı için compile time da tip bellidir.

Diğer bir çözümün Visitor Pattern olduğunu söylemiştik, bu makaleyi çok fazla uzatmamak adına, Visitor Pattern konusuna başka bir makalede değineceğim. 

 

 

Kaynak

codeproject.com