Callback (informática)

De Wikipedia, la enciclopedia libre
Saltar a: navegación, búsqueda
Un callback esta a menudo al mismo nivel del llamado original.

En programación de computadoras, una devolución de llamada o retrollamada (en inglés: callback) es una función "A" que se usa como argumento de otra función "B". Cuando se llama a "B", ésta ejecuta "A". Para conseguirlo, usualmente lo que se pasa a "B" es el puntero a "A".

Esto permite desarrollar capas de abstracción de código genérico a bajo nivel que pueden ser llamadas desde una subrutina (o función) definida en una capa de mayor nivel. Usualmente, el código de alto-nivel inicia con el llamado de alguna función, definida a bajo-nivel, pasando a esta un puntero, o un puntero inteligente (conocido como handle), de alguna función. Mientras la función de bajo-nivel se ejecuta, esta puede ejecutar la función pasada como puntero para realizar alguna tarea. En otro escenario, las funciones de bajo nivel registran las funciones pasadas como un handle y luego pueden ser usadas de modo asincrónico.

Una retrollamada puede ser usada como una aproximación simple al polimorfismo y a la programación genérica, donde el comportamiento de una función puede ser dinámicamente determinado por el paso punteros a funciones o handles a funciones de bajo nivel que aunque realicen tareas diferentes los argumentos sean compatibles entre sí. Esta es una técnica de mucha importancia por lo que se la llama código reutilizable.

Uso[editar]

En otro escenario común, el callback es primero registrado y más tarde llamado asincrónicamente.

Estas funciones de retrollamadas tienen una gran variedad de usos. Por ejemplo, podría ser una función que lee un archivo de configuración y que asocia valores con opciones. Si las opciones están identificadas con un hash, entonces se escribe la función tal que haga una retrollamada que lo hace más flexibe: su usuario puede elegir que algoritmo de hashing desea y la función continuará trabajando, ya que usa la retrollamada para cambiar los nombres de las opciones en los hashes; así, las retrollamadas permiten al usuario de una función personalizarla en tiempo de ejecución.

Se puede considerar como ejemplo el problema de realizar varias operaciones arbitrarias en una lista. Una opción puede ser iterar sobre la lista, o también realizar alguna operación sobre cada uno de los elementos de la lista. En la práctica, la solución más común, pero no ideal, es utilizar iteradores como un bucle for) que deberá duplicarse en cada lugar del código donde sea necesario. Más aún, si la lista es actualizada por un proceso asíncrono (por ejemplo, si un elemento es añadido o eliminado), el iterador podría corromperse durante el paso a través de la lista.

Una alternativa podría ser crear una nueva biblioteca de funciones que ejecute la tarea deseada con la sincronización apropiada en cada caso. Esta propuesta aún requiere que cada nueva función de la biblioteca contenga el código para ir a través de la lista. Esta solución no es aceptable para bibliotecas genéricas que tengan como objetivo varias aplicaciones; el desarrollador de la biblioteca no puede anticiparse a las necesidades de cada aplicación, y el desarrollador de las aplicaciones no debería necesitar conocer los detalles de la implementación de la biblioteca.

En este caso las retrollamadas resuelven estos problemas. Un procedimiento es escribir el paso a través de una lista que provee a la aplicación del código para ir a través de la lista y operando sobre cada elemento. Existe una clara distinción entre la biblioteca y la aplicación sin sacrificar la flexibilidad. Una retrollamada puede también considerarse un tipo de rutina enlazada por referencia.

Otro uso es en la señalización de errores. Un programa en un sistema operativo Unix, por ejemplo, podría no querer terminar inmediatamente cuando recibe un SIGTERM; para tomar los recaudos necesarios, una función de retrollamada podría efectuar una limpieza.

También puede utilizarse para controlar si una función actúa o no: Xlib permite predicados personalizables a especificarse para determinar si un programa desea manipular un evento.

El siguiente código en C demuestra el uso de funciones de retrollamada para mostrar dos números:

#include <stdio.h>
#include <stdlib.h>
 
/* La función de llamada toma una simple retrollamada como un parámetro. */
void ImprimirDosNumeros(int (*numeroEntrada)(void)) {
    printf("%d y %d\n", numeroEntrada(), numeroEntrada());
}
 
/* Una posible retrollamada. */
int unaRetrollamada(void) {
    return (rand() % 1000) + 9001;
}
 
/* Otra posible retrollamada. */
int otraRetrollamada(void) {
    return 42;
}
 
/* El programa principal llama a ImprimrDosNumeros() con tres retrollamadas diferentes. */
int main(void) {
    ImprimrDosNumeros(&rand);
    ImprimrDosNumeros(&unaRetrollamada);
    ImprimrDosNumeros(&otraRetrollamada);
    return 0;
}

Este ejemplo daría una salida en consola similar a:

  125185 y 89188225
  9084 y 9441
  42 y 42

Referencias[editar]

Enlaces externos[editar]