Fonction de rappel
Source: Wikipédia sous licence CC-BY-SA 3.0.
La liste des auteurs de cet article est disponible ici.

En informatique, une fonction de rappel (callback en anglais) est une fonction qui est passée en argument à une autre fonction. Cette-dernière peut alors faire usage de cette fonction de rappel comme de n'importe quelle autre fonction, alors qu'elle ne la connait pas par avance.

Principe

La technique de la fonction de rappel (En informatique, une fonction de rappel (callback en anglais) est une fonction qui est passée en argument à une autre fonction. Cette-dernière peut alors faire usage de cette fonction...) s'inspire du principe d'Hollywood où l'appelant laisse ses coordonnées pour pouvoir être rappelé par la suite. L'intérêt est le passage à un modèle évènementiel et modulaire.

Illustration

Prenons l'exemple d'un programme contenant une partie Analyseur effectuant par exemple l'analyse lexicale (L'analyse lexicale est la transformation d’un flot de caractères en un flot de lexèmes ou tokens.) d'un document (Dans son acception courante un document est généralement défini comme le support physique d'une information.). Supposons qu'une partie Traitement du programme, soit capable de compter les occurrences des mots qui lui sont transmis. Si Traitement se déclare en attente d'évènements émanant d'Analyseur pour chaque mot reconnu au moyen d'une fonction de rappel, alors le programme global permettra de compter les occurrences des mots du texte analysé. Or, la partie Analyseur ne gère pas spécifiquement le comptage des mots et ne dépend pas de Traitement. Elle peut donc être réutilisée pour une autre tâche comme le test de la présence de mots-clés.

Pseudo-code (En programmation, le pseudo-code est une façon de décrire un algorithme sans référence à un langage de programmation en particulier.) de l'Analyseur:

 
 // Variable (En mathématiques et en logique, une variable est représentée par un symbole. Elle est utilisée pour marquer un rôle dans une formule, un prédicat...) de type fonction stockant la fonction de rappel 
 fonction(mot) traiterMot; 
 // Affectation (En algorithmique (informatique), une affectation est une opération qui permet d'attribuer une valeur à une variable.) de la fonction de rappel 
 fixerFonctionTraitementMot(fonction(mot) f) { 
 traiterMot <- f; 
 } 
 // Corps de l'analyseur 
 analyse() { 
 ... 
 traiterMot(mot); 
 ... 
 } 
 

Pseudo-code du Traitement :

 
 // Définition (Une définition est un discours qui dit ce qu'est une chose ou ce que signifie un nom. D'où la division entre les définitions réelles et les définitions nominales.) de la fonction qui sera rappelée 
 nouvelleOccurrence(mot) { 
 ... 
 } 
 

Pseudo-code du programme principal :

 
 // préparation du rappel et 
 fixerFonctionTraitementMot(nouvelleOccurrence); 
 //appel de l'analyseur 
 analyse(); 
 

Exemple

Nous recherchons le premier entier supérieur à 5. (en langage C)

La première approche sans fonction de rappel:

 
 int i; 
 for (i = 0; i < length; i++) 
 { 
 if (array[i] > 5) 
 { 
 break (Break est un mot anglais faisant référence à la notion de rupture (to break peut signifier « casser » et « a break » peut signifier « une pause »). Le mot est notamment employé :); 
 } 
 } 
 if (i < length) 
 { 
 printf("Item %d\n", i); 
 } 
 else 
 { 
 printf("Not found\n"); 
 } 
 

La seconde ( Seconde est le féminin de l'adjectif second, qui vient immédiatement après le premier ou qui s'ajoute à quelque chose de nature identique. La seconde est une unité de mesure...) avec fonction de rappel:

 
 /* LIBRARY CODE */ 
 int traverseWith(int array[], size_t length, 
 int (*callback)(int index, int item, void *param), 
 void *param) 
 { 
 int exitCode = 0; 
 for (int i = 0; i < length; i++) { 
 exitCode = callback(i, array[i], param); 
 if (exitCode != 0) { 
 break; 
 } 
 } 
 return exitCode; 
 } 
 /* APPLICATION CODE */ 
 int search (int index, int item, void *param) 
 { 
 if (item > 5) { 
 *(int *)param = index; 
 return 1; 
 } else { 
 return 0; 
 } 
 } 
 /* (in another function) */ 
 int index; 
 int found; 
 found = traverseWith(array, length, &search, &index); 
 if (found) { 
 printf("Item %d\n", index); 
 } else { 
 printf("Not found\n"); 
 } 
 

Mise en oeuvre par passage de fonctions en paramètre (Un paramètre est au sens large un élément d'information à prendre en compte pour prendre une décision ou pour effectuer un calcul.)

Les fonctions de rappel ont été très utilisées en programmation système (La programmation système est un type de programmation qui vise au développement de programmes qui font partie du système d'exploitation d'un ordinateur ou qui en réalisent les fonctions. Elle se distingue de la programmation des applications en...) et notamment en langage langage C. En effet, le C a permis assez tôt de passer (Le genre Passer a été créé par le zoologiste français Mathurin Jacques Brisson (1723-1806) en 1760.) des pointeurs de fonctions en paramètre d'autres fonctions. Cela le rendait techniquement capable d'implanter le mécanisme des fonctions de rappel.

Notons que le passage de fonction en paramètre est généralisé en programmation fonctionnelle (Un langage fonctionnel est un langage de programmation dont la syntaxe et les caractéristiques encouragent la programmation fonctionnelle. Le langage fonctionnel le plus ancien est le Lisp, créé en 1958 par Mac...), toutefois dans ce cadre, on ne parle plus de fonction de rappel. En effet, dans ce paradigme, les fonctions sont des éléments de première classe (Dans un moyen de transport (avion, train ou bateau), la première classe est la classe la plus confortable et celle offrant généralement le plus de prestations. En...) (au même titre que les constantes par exemple). Aussi, les fonctions qui peuvent prendre d'autres fonctions en argument et/ou renvoyer une fonction comme valeur de retour sont alors qualifiées de fonctions d'ordre supérieur.

Evolution du principe

Avec l'apparition de la programmation (La programmation dans le domaine informatique est l'ensemble des activités qui permettent l'écriture des programmes informatiques. C'est une étape importante de la conception de logiciel (voire de matériel, cf. VHDL).) objet (De manière générale, le mot objet (du latin objectum, 1361) désigne une entité définie dans un espace à trois dimensions, qui a une fonction précise, et qui peut être désigné par une...) et des interfaces, la technique de rappel a évolué. On passe maintenant en paramètre un objet qui se conforme à une interface (Une interface est une zone, réelle ou virtuelle qui sépare deux éléments. L’interface désigne ainsi ce que chaque élément a besoin de connaître de l’autre pour pouvoir fonctionner correctement.) donnée (Dans les technologies de l'information, une donnée est une description élémentaire, souvent codée, d'une chose, d'une transaction, d'un événement, etc.). Il n'y a donc plus une, mais autant de fonctions que l'on souhaite rappeler. De plus le fait de passer un objet permet de contextualiser en indiquant sur quoi s'effectue le rappel, tandis qu'une fonction de rappel précisait seulement comment rappeler. Cependant la technique des fonction de rappel continue à avoir les faveurs des langages disposant de fermetures, où celles-ci offrent des capacités équivalentes aux objets en terme de contexte (Le contexte d'un évènement inclut les circonstances et conditions qui l'entourent; le contexte d'un mot, d'une phrase ou d'un texte inclut les mots qui l'entourent. Le...).

Page générée en 0.345 seconde(s) - site hébergé chez Amen
Ce site fait l'objet d'une déclaration à la CNIL sous le numéro de dossier 1037632
Ce site est édité par Techno-Science.net - A propos - Informations légales
Partenaire: HD-Numérique