Callback (programació)

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