Yazan : Şadi Evren ŞEKER
Bu yazının amacı, bilgisayar programlama dillerinde kullanılan bir yaklaşım olan geri çağırım (call back) kavramını açıklamaktır.
Bir programlama dilinin, yapısal programlama dili (structured programming language) olabilmesi için aşağıdaki üç özelliğe haiz olması gerekir:
- Kod bloğunun koşula bağlı olabilmesi : Klasik programlama dillerindeki if/else yapısı
- Kod bloğunun tekrar ettirilebilir olması : Klasik programlama dillerindeki döngü (loop) yapısı
- Kod bloğunun parametrize edilebilir olması: Klasik programlama dillerindeki fonksiyon (function) yapısı
Yukarıdaki bu üç özelliği günümüz programlama dillerinin hemen hepsi bünyelerinde barındırmaktadır ve günümüzdeki çoğu dil, yapısal programlama dili olma özelliğini taşır.
Geri çağırım ismi verilen özellik ise, yukarıdaki özelliklerden üçüncüsünün parametre olarak bir kod bloğunu alabilmesidir. Diğer bir deyişle, çalıştırılacak olan kod bloğunun, parametre olarak basit sayılar veya değişkenler yerine, farklı bir kod bloğunu alması ve bu kod bloğunu çalıştırması, hatta diğer iki özelliği de kullanarak, alınan parametredeki kod bloklarını tekrar etmesi veya koşullu olarak sçmesi anlamına gelir
Geri çağırım özelliği (call back), bir programlama dilinde, aşağıdakine benzer bir yapı kazandırır:
Yukarıdaki temsili resimde, klasik bir geri çağırımda, bir ana fonksiyonun (örneğin C gibi dillerdeki main fonksiyonu olabilir), herhangi bir kütüphanede bulunan fonksiyonu çağırması ve ardından bu kütüphanenin de ana programdaki bir fonksiyonu geri çağırması ifade edilmiştir.
Bu gösterimden anlaşıldığı üzere kütüphane fonksiyonu, basitçe kendisine gelen çağırımı, ana programdan aldığı bir parametreye geri yönlendirmektedir. Bu kullanım ise C gibi dillerde ancak fonksiyon göstericisi (function pointer) yapısı ile mümkündür. Yani gelen bir çağrının, ana programdaki hangi fonksiyona yönlendirileceği (geri çağrılacağı , callback), gelen kütüphane fonksiyonuna verilmiş bir parametre olan ikinci bir fonksiyon ile yapılabilir ki bu parametrede ancak ikinci bir fonksiyon olabilir.
Bu durumu örnek bir kod ile anlatmaya çalışalım:
#include <stdio.h> int func(int); void PassPtr(int (*pt2Func)(int)) { int sonuc = (*pt2Func)(12); printf("%d",sonuc); } main(){ int (*fp)(int); fp = func; PassPtr(fp); } int func(int arg){ return ++arg; }
Yukarıdaki kodda bulunan main fonksiyonu, öncelikle fp isminde bir fonksiyon göstericisi tanımlamış ve bu fonksiyon göstericisini, PassPtr ismi verilen fonkisyona parametre olarak geçirmiştir. Yukarıdaki yapıda, PassPtr isimli fonkisyon, daha alt seviyede olan bir kütüphane fonksiyonu ve func ismi verilen ve main fonkisyonunda fp isimli gösterici ile ifade edilen fonksiyon ise geri çağırım yapılan fonksiyon olarak düşünülebilir.
Bu durumda, bizim tasarım yapımız aşağıdaki şekilde görülebilir
Yukarıdaki yaklaşımın faydası, bize alt seviye fonksiyonunun hiç bilgisi olmadan üst seviyedeki herhangi bir fonksiyona geri dönüş imkanı vermesidir. Bu anlamada, programda soyutlama (abstraction) yakalanmasında veya geçirilen parametreler sayesinde bilgi gizlenmesi (inforation hiding) özelliği kazandırmaktadır.
Özet olarak geri çağırım özelliği, bir programlama yaklaşımında kullanılan tasarım yöntemlerinden birisidir ve nesne yönelimli olmayan programlama dillerinde, yukarıda bahsedilen durumlarda sıklıkla kullanılan bir çözümdür. Nesne yönelimli programlama dillerinin gelişimi ile birlikte, tasarım kalıpları (design patterns) önem kazanmış ve bu kalıplardan gözlemci kalıbı (observer patter) yukarıda açıklanan özelliklerin tamamını bir nesne yönelimli programlama dilinde çözmeye yöenlik olarak programcıların hizmetine sunulmuştur.
hocam resimler gözükmüyor..
Resimlerde sorun var hocam