Static Method Dispatching

0 2,045

Serinin ilk yazısında method dispatching konusuna genel olarak değinmiştim. Serinin ikinci yazısında static dispatching konusundan bahsetmek istiyorum.

Static dispatch kullanıldığı zaman çalışacak metodun hangi adreste olduğu compile-time’da belirleniyor, biliniyor. Bu sebeple run-time’da class’lar üzerinden metodun adresini bulmak için jump işlemleri yapmak gerekmediği için en hızlı dispatching yöntemidir. Compile-time’da karar verildiği için derleyici yapılabilecek tüm optimizasyonları uygulayabilmektedir. Hatta method inline hale bile getirilebilmekte ve bilinen adrese zıplama cost’undan da tasarruf edilebilmektedir.

Static dispatching’de metotların tek bir adresi olması beklendiği için override edilemezler.

Swift özelinde static methodları nasıl elde edebileceğimize değinecek olursam.
Class -> final keyword’ü ile tanımlanmış class’lar ve bir class’ın extension’ında tanımlanmış metotlar,
Protocol-> extensionda implement edilmiş metotlar,
Value type-> tüm metotlar
şeklinde bir tablo karşımıza çıkacaktır.
static keywordü kullanarak da bir metot static dispatch yapılabilir.

Protocol – Struct ikilisiyle güzel bir örnek vermek istiyorum.

Ardından View protocolünü sağlayan bir struct oluşturalım.

Son olarak bir View bir de CardView tipinde sabitler oluşturalım.

Kodumuzu bu şekilde çalıştırdığımız zaman aşağıdaki gibi bir çıktı elde edeceğiz.

 

 

Protocol’de tanımlanan fonksiyonumuz, extension içerisinde tanımlandığı için static olarak dispatch edildi ve pCardView objesi için bu fonksiyonun adresi çağırıldı.
CardView için de aynı şekilde extension’da tanımlandığı için kendisine ait fonksiyon çağırıldı.

Şimdi kodumuzda ufak bir değişiklik yapalım ve protocol içerisindeki metodumuzu protocol tanımının içine alalım.

Kodumuzu tekrar çalıştıralım.

 

 

Bu kez fonksiyonumuzu protokolün tanımlanma alanında oluşturduğumuz için dynamic dispatch oldu ve override edilerek her iki durumda da struct içerisindeki fonksiyon çağırıldı.

Serinin bir sonraki yazısında dynamic dispatch konusuna değineceğim, mutlu günler 🙂

Email adresiniz yayınlanmayacaktır.