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
[modifica]Hi ha dos tipus de callbacks en funció del flux de control en temps d'execició :
Callback bloquejant
[modifica]També conegut com a callback síncron. La funció callback es crida abans que la funció retorni.
Callback diferit
[modifica]També coneguts com a callback asíncron. La funció callback es crida després que la funció retorni.
Implementació
[modifica]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
[modifica]C
[modifica]/*
* 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#
[modifica]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
[modifica]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
[modifica]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
Referències
[modifica]- ↑ «What is a callback function?» (en anglès). https://stackoverflow.com.+[Consulta: 25 maig 2017].
- ↑ «Callback Functions» (en anglès). https://msdn.microsoft.com.+[Consulta: 26 maig 2017].