Callback (programació)
Callback, en ciències de la computació, és un codi executable (o un punter a aquest codi) que es passa com a argument dintre d'una funció. Si l'execució d'aquest codi es immediata s'anomena callback síncrona i si l'execució es pot realitzar més tard llavors s'anomena callbak assíncrona.[1][2]
Els llenguatges de programació implementen de diferents maneres la funcionalitat callback.
Tipus de callback
Hi ha dos tipus de callbacks en funció del flux de control en temps d'execició :
Callback bloquejant
També conegut com a callback síncron. La funció callback es crida abans que la funció retorni.
Callback diferit
També coneguts com a callback asíncron. La funció callback es crida després que la funció retorni.
Implementació
La forma del callback varia entre els diferents llenguatges de programació :
- En assembler, C, C++, Pascal, Modula2 i llenguatges similars, es passa com argument un punter o adreça a nivell màquina a una altra funció. Un exemple és l'API de Windows que és accessible a diferents compiladors.
- Molts llenguatges interpretats, tals com JavaScript, Lua, Python, Perl i PHP, permeten passar un objecte a una funció com argument.
- Els llenguatges CLI tals com C# i VB.NET provide a type-safe encapsulating reference, a "delegate", to define well-typed function pointers. These can be used as callbacks.
- Events i manegadors d'events (event handlers), s'empren en llenguatges .NET, proveeixen mètodes per callbacks.
- Els llenguatges funcionals suporten normalment first-class functions, que permeten passar funcions com arguments d'altres funcions. Així implementen callback.
- Alguns llenguatges, tals com Algol 68, Perl, Python, Ruby, Smalltalk, C++11 i posteriors, noves versions de C# i VB.NET i la majoria de llenguatges funcionals, permeten passar blocs de codi sense nom com arguments de funcions (lambda expressions).
- En llenguatges orientats a objectes sense funcions com arguments, tals com Java abans de la versió 8, els callbacks es poden simular passant una instància d'una classe abstracta.
Exemples
C
/* * This is a simple C program to demonstrate the usage of callbacks * The callback function is in the same file as the calling code. * The callback function can later be put into external library like * e.g. a shared object to increase flexibility. * */ #include <stdio.h> #include <string.h> typedef struct _MyMsg { int appId; char msgbody[32]; } MyMsg; void myfunc(MyMsg *msg) { if (strlen(msg->msgbody) > 0) printf("App Id = %d \nMsg = %s \n",msg->appId, msg->msgbody); else printf("App Id = %d \nMsg = No Msg\n",msg->appId); } /* * Prototype declaration */ void (*callback)(MyMsg *); int main(void) { MyMsg msg1; msg1.appId = 100; strcpy(msg1.msgbody, "This is a test\n"); /* * Assign the address of the function "myfunc" to the function * pointer "callback" (may be also written as "callback = &myfunc;") */ callback = myfunc; /* * Call the function (may be also written as "(*callback)(&msg1);") */ callback(&msg1); return 0; }
C#
public class Class1 { static void Main(string[] args) { Class2 c2 = new Class2(); /* * Calling method on Class2 with callback method as parameter */ c2.Method(CallBackMet); } /* * The callback method. This method prints the string sent in the callback */ static void CallBackMet(string str) { Console.WriteLine("Callback was: " + str); } } public class Class2 { /* * The method that calls back to the caller. Takes an action (method) as parameter */ public void Method(Action<string> callback) { /* * Calls back to method CallBackMet in Class1 with the message specified */ callback("The message to send back"); } }
JavaScript
Callbacks són molt típics en JavaScript. El següent exemple hi ha una funció (someAction) que pot cridar a 2 funcions callback (calcProduct, calcSum) :
function someAction(x, y, someCallback) { return someCallback(x, y); } function calcProduct(x, y) { return x*y; } function calcSum(x, y) { return x + y; } // alerts 75, the product of 5 and 15 alert(someAction(5, 15, calcProduct)); // alerts 20, the sum of 5 and 15 alert(someAction(5, 15, calcSum));
Python
Un exemple molt trivial d'ús de callback a Python. Primer es defineixen les dues funcions, la callback (my_callback) i la funció que fa la crida (caller), llavors es crida la funció callback en aquesta funció :
>>> def my_callback(val): ... print("function my_callback was called with {0}".format(val)) ... >>> def caller(val, func): ... func(val) ... >>> for i in range(5): ... caller(i, my_callback) ... function my_callback was called with 0 function my_callback was called with 1 function my_callback was called with 2 function my_callback was called with 3 function my_callback was called with 4