Callback (programació)

De la Viquipèdia, l'enciclopèdia lliure
Fig.1 Esquema de blocs de funció callback

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]

  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].