2011年5月14日 星期六

[轉錄] What is callback function

大學時代第一次看見 callback function 這個名詞的時候,上網查了一些說明卻也是看不太懂。隨著使用次數的增加,愈能感覺到這是一個簡單卻十分重要的東西。

callback function 可以說是「如果發生了某件事,就做這件事」。就像是蝙蝠俠跟高譚市警察局說:「如果看見罪犯,就打開蝙蝠燈呼叫我。」也可以像是城市獵人一般,遇到麻煩就在新宿車站的留言板上寫下 XYZ。

蝙蝠俠當然可以把這件事情抽換成「如果看見罪犯,就到新宿車站的留言板寫下 XYZ」

callback

圖中被打上馬賽克的部份就是 callback function。這個 callback function 可以是請對方吃冰淇淋,一起研究數學推導公式,或是賞他一巴掌,whatever you want。

call

我們在寫程式的時候,往往就是扮演正妹 A 的角色,寫了一個計畫 (function),告訴正妹 B (library,通常就是處理 event 的部份) 在符合條件的情況下執行計畫。

這樣的機制在圖形化介面裡十分重要,現今的 GUI toolkit 大多數都是使用事件驅動的方式 (event driven),使用者按下了某個按鍵,我們就去執行特定的工作。原因在於:我們無法預期現在使用者會按下 Yes or No。

callback function 是甚麼?它就是我們要提供的一個解法。有了 callback function 便能做到許多抽象化的處理,譬如說在上層我們指派黑社會娘娘腔金牌殺手去對付丁力。提供不同的 callback function,底下的金牌殺手就可能用毒蛇、用迴力標,甚至是家屬謝禮散。

川島芳子小姐只在乎丁力有沒有被殺死,至於怎麼被殺死的,她不管!

底下是一小段簡單的程式碼,希望可以給還不了解的朋友一點點幫助。透過 function pointer,同樣是呼叫 exe_callback() 卻產生不一樣的結果。


 1 #include

 2 #include

 3

 4 /********  in another library ******/

 5 static void (*callback_func)() = NULL;

 6

 7 void set_callback(void (*callback)()) {

 8         callback_func = callback;

 9 }

10

11 void exe_callback() {

12         if(callback_func == NULL) {

13                 printf("No callback function!!\n");

14         }else {

15                 callback_func();

16         }

17 }

18 /**************** End *******************/

19

20 void say_hello() {

21         printf("Hello, Girl\n");

22 }

23

24 void say_byebye() {

25         printf("Byebye, girl!\n");

26 }

27

28 int main() {

29         set_callback(say_hello);

30         printf("Execute callback function:");

31         exe_callback();

32         set_callback(say_byebye);

33         printf("Execute callback function:");

34         exe_callback();

35         return 0;

36 }

沒有留言: