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]

Fig.1 Esquema de blocs de funció callback

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

  1. «What is a callback function?» (en anglès). https://stackoverflow.com.+[Consulta: 25 maig 2017].
  2. «Callback Functions» (en anglès). https://msdn.microsoft.com.+[Consulta: 26 maig 2017].