Callback (programació)

De Viquipèdia
Salta a: navegació, cerca
Fig.1 Esquema de blocs de funció callback

Callback, en ciències de la computació, és una 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] [3]

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 assí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 assemblerCC++PascalModula2 i llenguatges similars, es passa com argument un punter o adreça a nivell màquina a una latra funció. Un exemple és l'API de Windows que és accessible a diferents compiladors.
  • Molts llenguatges interpretats, tals com JavaScriptLuaPythonPerl 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, RubySmalltalkC++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'un aclasse 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? - Quora» (en anglès). https://www.quora.com.+[Consulta: 25 maig 2017].
  2. «What is a callback function?» (en anglès). https://stackoverflow.com.+[Consulta: 25 maig 2017].
  3. «Callback Functions» (en anglès). https://msdn.microsoft.com.+[Consulta: 26 maig 2017].