Qu'est-ce qu'une fonction de rappel?
language-agnostic
callback
Cheekysoft
la source
la source
Réponses:
Les développeurs sont souvent confus par ce qu'est un rappel à cause du nom de la maudite chose.
Une fonction de rappel est une fonction qui est:
Une bonne façon d'imaginer comment fonctionne une fonction de rappel est qu'il s'agit d'une fonction qui est " appelée à l'arrière " de la fonction dans laquelle elle est passée.
Peut-être qu'un meilleur nom serait une fonction "appel après" .
Cette construction est très utile pour un comportement asynchrone où nous voulons qu'une activité ait lieu à la fin d'un événement précédent.
Pseudocode:
Résultat si vous avez appelé event ():
L'ordre de sortie ici est important. Étant donné que les fonctions de rappel sont appelées par la suite, "J'ai terminé l'impression des numéros" est imprimé en dernier, pas en premier.
Les rappels sont appelés ainsi en raison de leur utilisation avec les langages de pointeurs. Si vous n'en utilisez pas, ne vous occupez pas du nom «rappel». Comprenez simplement que ce n'est qu'un nom pour décrire une méthode fournie comme argument à une autre méthode, de telle sorte que lorsque la méthode parent est appelée (quelle que soit la condition, comme un clic sur un bouton, une minuterie, etc.) et que son corps de méthode se termine, la fonction de rappel est alors invoquée.
Certains langages prennent en charge les constructions où plusieurs arguments de fonction de rappel sont pris en charge et sont appelés en fonction de la façon dont la fonction parent se termine (c'est-à-dire qu'un rappel est appelé dans le cas où la fonction parent se termine avec succès, un autre est appelé dans le cas où la fonction parent lance un erreur spécifique, etc.).
la source
once its parent method completes, the function which this argument represents is then called
. Donc, si la fonction est passée à une autre fonction comme argument mais appelée à partir du milieu du runtime de la fonction parent commeparent(cb) {dostuff1(); cb(); dostuff2()}
alors elle n'est pas considérée comme unecallback
fonction?Définition opaque
Une fonction de rappel est une fonction que vous fournissez à un autre morceau de code, lui permettant d'être appelée par ce code.
Exemple artificiel
Pourquoi voudriez-vous faire ça? Disons qu'il y a un service que vous devez invoquer. Si le service revient immédiatement, vous venez de:
Par exemple, supposons que le service soit la
factorial
fonction. Lorsque vous voulez la valeur de5!
, vous appelezfactorial(5)
et les étapes suivantes se produisent:Votre emplacement d'exécution actuel est enregistré (sur la pile, mais ce n'est pas important)
L'exécution est confiée à
factorial
Une fois
factorial
terminé, il place le résultat quelque part où vous pouvez y accéderL'exécution revient là où elle était [1]
Supposons maintenant que cela
factorial
prenne beaucoup de temps, car vous lui donnez des nombres énormes et il doit fonctionner sur un cluster de super-informatique quelque part. Disons que vous vous attendez à ce que cela prenne 5 minutes pour retourner votre résultat. Vous pourriez:Gardez votre conception et exécutez votre programme la nuit lorsque vous dormez, afin de ne pas regarder l'écran la moitié du temps
Concevez votre programme pour faire d'autres choses tout en
factorial
faisant son travailSi vous choisissez la deuxième option, les rappels peuvent fonctionner pour vous.
Conception de bout en bout
Afin d'exploiter un modèle de rappel, ce que vous voulez, c'est pouvoir appeler
factorial
de la manière suivante:Le second paramètre,,
what_to_do_with_the_result
est une fonction à laquelle vous envoyezfactorial
, dans l'espoir defactorial
l'appeler sur son résultat avant de revenir.Oui, cela signifie que cela
factorial
doit avoir été écrit pour prendre en charge les rappels.Supposons maintenant que vous souhaitiez pouvoir passer un paramètre à votre rappel. Maintenant, vous ne pouvez pas, parce que vous n'allez pas l'appeler,
factorial
oui. Ilfactorial
faut donc l'écrire pour vous permettre de passer vos paramètres, et il les remettra simplement à votre rappel quand il l'invoquera. Cela pourrait ressembler à ceci:Maintenant que
factorial
cela autorise ce modèle, votre rappel pourrait ressembler à ceci:et votre appel
factorial
seraitEt si vous voulez retourner quelque chose
logIt
? Eh bien, vous ne pouvez pas, parce que vousfactorial
n'y prêtez pas attention.Eh bien, pourquoi ne pouvez-vous pas
factorial
simplement renvoyer ce que votre rappel renvoie?Rendre non bloquant
Étant donné que l'exécution est censée être remise au rappel une fois
factorial
terminé, il ne devrait vraiment rien retourner à son appelant. Et idéalement, il lancerait en quelque sorte son travail dans un autre thread / processus / machine et reviendrait immédiatement afin que vous puissiez continuer, peut-être quelque chose comme ceci:Il s'agit maintenant d'un "appel asynchrone", ce qui signifie que lorsque vous l'appelez, il revient immédiatement mais n'a pas encore vraiment fait son travail. Vous avez donc besoin de mécanismes pour le vérifier et pour obtenir son résultat une fois terminé, et votre programme est devenu plus complexe dans le processus.
Et en passant, en utilisant ce modèle, le
factorial_worker_task
peut lancer votre rappel de manière asynchrone et revenir immédiatement.Donc que fais-tu?
La réponse est de rester dans le modèle de rappel. Chaque fois que vous voulez écrire
et
f
doit être appelé de manière asynchrone, vous écrirez à la placeoù
g
est passé en tant que rappel.Cela change fondamentalement la topologie de flux de votre programme et prend un certain temps pour s'y habituer.
Votre langage de programmation pourrait vous aider beaucoup en vous donnant un moyen de créer des fonctions à la volée. Dans le code immédiatement ci-dessus, la fonction
g
peut être aussi petite queprint (2*a+1)
. Si votre langue nécessite que vous définissiez cela comme une fonction distincte, avec un nom et une signature entièrement inutiles, votre vie va devenir désagréable si vous utilisez beaucoup ce modèle.Si, en revanche, votre langage vous permet de créer des lambdas, alors vous êtes en bien meilleure forme. Vous finirez alors par écrire quelque chose comme
ce qui est tellement plus agréable.
Comment passer le rappel
Comment transmettriez-vous la fonction de rappel
factorial
? Eh bien, vous pouvez le faire de plusieurs façons.Si la fonction appelée s'exécute dans le même processus, vous pouvez passer un pointeur de fonction
Ou peut-être que vous souhaitez conserver un dictionnaire de
fn name --> fn ptr
dans votre programme, auquel cas vous pouvez passer le nomPeut-être que votre langage vous permet de définir la fonction sur place, possible comme lambda! En interne, il crée une sorte d'objet et passe un pointeur, mais vous n'avez pas à vous en soucier.
Peut-être que la fonction que vous appelez s'exécute sur une machine entièrement distincte, et vous l'appelez en utilisant un protocole réseau comme HTTP. Vous pouvez exposer votre rappel en tant que fonction appelable HTTP et transmettre son URL.
Vous avez eu l'idée.
La récente augmentation des rappels
Dans cette ère du Web dans laquelle nous sommes entrés, les services que nous invoquons sont souvent sur le réseau. Souvent, nous n'avons aucun contrôle sur ces services, c'est-à-dire que nous ne les avons pas écrits, nous ne les maintenons pas, nous ne pouvons pas nous assurer qu'ils fonctionnent ou qu'ils fonctionnent.
Mais nous ne pouvons pas nous attendre à ce que nos programmes se bloquent en attendant que ces services répondent. Conscients de cela, les fournisseurs de services conçoivent souvent des API en utilisant le modèle de rappel.
JavaScript supporte très bien les rappels, par exemple avec les lambdas et les fermetures. Et il y a beaucoup d'activité dans le monde JavaScript, aussi bien sur le navigateur que sur le serveur. Il existe même des plates-formes JavaScript en cours de développement pour mobile.
À mesure que nous progressons, de plus en plus d'entre nous écriront du code asynchrone, pour lequel cette compréhension sera essentielle.
la source
Notez que le rappel est un mot.
La page de rappel de wikipedia l' explique très bien.
citation de la page wikipedia:
la source
Une réponse simple serait qu'il s'agit d'une fonction qui n'est pas appelée par vous mais plutôt par l'utilisateur ou par le navigateur après qu'un certain événement s'est produit ou après qu'un certain code a été traité.
la source
Une fonction de rappel est celle qui doit être appelée lorsqu'une certaine condition est remplie. Au lieu d'être appelée immédiatement, la fonction de rappel est appelée à un certain moment dans le futur.
Il est généralement utilisé lors du démarrage d'une tâche qui se terminera de manière asynchrone (c'est-à-dire se terminera un certain temps après le retour de la fonction appelante).
Par exemple, une fonction pour demander une page Web peut exiger que son appelant fournisse une fonction de rappel qui sera appelée lorsque le téléchargement de la page Web sera terminé.
la source
"...when a condition is met"
mais je pensais que les rappels sont appelés lorsque la fonction parent a terminé son exécution et ne dépendent pas des conditions (?).Les rappels sont plus facilement décrits en termes de système téléphonique. Un appel de fonction est analogue à appeler une personne au téléphone, à lui poser une question, à obtenir une réponse et à raccrocher; l'ajout d'un rappel modifie l'analogie de sorte qu'après lui avoir posé une question, vous lui donnez également votre nom et votre numéro afin qu'elle puisse vous rappeler avec la réponse.
- Paul Jakubik, "Implémentations de rappel en C ++"
la source
Je crois que ce jargon de "rappel" a été utilisé à tort dans de nombreux endroits. Ma définition serait quelque chose comme:
Je pense que les gens viennent de lire la première phrase de la définition du wiki:
J'ai travaillé avec de nombreuses API, voir divers mauvais exemples. Beaucoup de gens ont tendance à nommer un pointeur de fonction (une référence au code exécutable) ou des fonctions anonymes (un morceau de code exécutable) "rappel", si ce ne sont que des fonctions, pourquoi avez-vous besoin d'un autre nom pour cela?
En fait, seule la deuxième phrase de la définition du wiki révèle les différences entre une fonction de rappel et une fonction normale:
donc la différence est qui vous allez passer la fonction et comment votre fonction passée va être appelée. Si vous venez de définir une fonction et de la passer à une autre fonction et de l'appeler directement dans ce corps de fonction, ne l'appelez pas un rappel. La définition indique que votre fonction passée sera appelée par la fonction "de niveau inférieur".
J'espère que les gens peuvent arrêter d'utiliser ce mot dans un contexte ambigu, cela ne peut pas aider les gens à mieux comprendre que pire.
la source
Restons simples. Qu'est-ce qu'une fonction de rappel?
Exemple par parabole et analogie
J'ai une secrétaire. Chaque jour, je lui demande: (i) de déposer le courrier sortant de l'entreprise au bureau de poste, et après qu'elle l'ait fait, de faire: (ii) toute tâche que j'ai écrite pour elle sur une de ces notes autocollantes .
Maintenant, quelle est la tâche sur le pense-bête? La tâche varie d'un jour à l'autre.
Supposons que ce jour-là, je lui demande d'imprimer certains documents. J'écris donc cela sur le pense-bête, et je l'épingle sur son bureau avec le courrier sortant qu'elle doit poster.
En résumé:
La fonction de rappel est cette deuxième tâche: imprimer ces documents. Parce que c'est fait APRÈS que le courrier soit déposé, et aussi parce que le pense-bête lui disant d'imprimer le document lui est remis avec le courrier qu'elle doit poster.
Lions maintenant cela avec le vocabulaire de programmation
C'est tout. Rien de plus. J'espère que cela vous a éclairé - et sinon, postez un commentaire et je ferai de mon mieux pour clarifier.
la source
Cela fait sonner les rappels comme des instructions de retour à la fin des méthodes.
Je ne suis pas sûr que ce soit ça.
Je pense que les rappels sont en fait un appel à une fonction, à la suite d'une autre fonction appelée et terminée.
Je pense aussi que les rappels sont destinés à répondre à l'invocation d'origine, dans une sorte de "hé! Cette chose que vous avez demandée?
la source
otherFunction
) en tant que paramètre, et la fonction de rappel est appelée (ou exécutée) à l'intérieur duotherFunction
.Dans SOA, le rappel permet aux modules d'extension d'accéder aux services à partir du conteneur / de l'environnement.
Analogie: rappels. Asynchrone. Exemple réel non bloquant
pour le rappel
la source
Appel après serait un meilleur nom que le nom stupide, rappel . Lorsque ou si la condition est remplie dans une fonction, appelez une autre fonction, la fonction Appel après , celle reçue en argument.
Plutôt que de coder en dur une fonction interne dans une fonction, on écrit une fonction pour accepter comme argument une fonction Call After déjà écrite . L' appel après peut être appelé en fonction des changements d'état détectés par le code dans la fonction recevant l'argument.
la source
Une fonction de rappel est une fonction que vous spécifiez pour une fonction / méthode existante, à appeler lorsqu'une action est terminée, nécessite un traitement supplémentaire, etc.
En Javascript, ou plus spécifiquement jQuery, par exemple, vous pouvez spécifier un argument de rappel à appeler à la fin d'une animation.
En PHP, la
preg_replace_callback()
fonction vous permet de fournir une fonction qui sera appelée lorsque l'expression régulière est mise en correspondance, en passant la ou les chaînes mises en correspondance comme arguments.la source
regardez l'image :)
Le programme principal appelle la fonction de bibliothèque (qui peut également être une fonction de niveau système) avec le nom de la fonction de rappel. Cette fonction de rappel peut être implémentée de plusieurs manières. Le programme principal choisit un rappel selon les exigences.
Enfin, la fonction de bibliothèque appelle la fonction de rappel pendant l'exécution.
la source
La réponse simple à cette question est qu'une fonction de rappel est une fonction qui est appelée via un pointeur de fonction. Si vous passez le pointeur (adresse) d'une fonction comme argument à un autre, lorsque ce pointeur est utilisé pour appeler la fonction vers laquelle il pointe, il est dit qu'un rappel est effectué
la source
Supposons que nous ayons une fonction
sort(int *arraytobesorted,void (*algorithmchosen)(void))
où il peut accepter un pointeur de fonction comme argument qui peut être utilisé à un moment donné desort()
l'implémentation de. Ensuite, ici, le code qui est adressé par le pointeur de fonctionalgorithmchosen
est appelé comme fonction de rappel .Et voyez l'avantage est que nous pouvons choisir n'importe quel algorithme comme:
Qui ont été, par exemple, ont été mis en œuvre avec le prototype:
Ceci est un concept utilisé pour atteindre le polymorphisme dans la programmation orientée objet
la source
«En programmation informatique, un rappel est une référence au code exécutable, ou un morceau de code exécutable, qui est passé comme argument à un autre code. Cela permet à une couche logicielle de niveau inférieur d'appeler un sous-programme (ou une fonction) défini dans une couche de niveau supérieur. » - Wikipédia
Rappel en C à l'aide du pointeur de fonction
En C, le rappel est implémenté à l'aide du pointeur de fonction. Pointeur de fonction - comme son nom l'indique, est un pointeur sur une fonction.
Par exemple, int (* ptrFunc) ();
Ici, ptrFunc est un pointeur vers une fonction qui ne prend aucun argument et retourne un entier. N'OUBLIEZ PAS de mettre entre parenthèses, sinon le compilateur supposera que ptrFunc est un nom de fonction normal, qui ne prend rien et renvoie un pointeur sur un entier.
Voici du code pour illustrer le pointeur de fonction.
Essayons maintenant de comprendre le concept de rappel en C en utilisant le pointeur de fonction.
Le programme complet a trois fichiers: callback.c, reg_callback.h et reg_callback.c.
Si nous exécutons ce programme, la sortie sera
Ceci est un programme démontrant la fonction de rappel à l'intérieur de register_callback à l'intérieur de my_callback à l'intérieur du programme principal
La fonction de couche supérieure appelle une fonction de couche inférieure comme un appel normal et le mécanisme de rappel permet à la fonction de couche inférieure d'appeler la fonction de couche supérieure via un pointeur vers une fonction de rappel.
Rappel en Java à l'aide de l'interface
Java n'a pas le concept de pointeur de fonction Il implémente le mécanisme de rappel via son mécanisme d'interface Ici, au lieu d'un pointeur de fonction, nous déclarons une interface ayant une méthode qui sera appelée lorsque l'appelé aura terminé sa tâche
Permettez-moi de le démontrer à travers un exemple:
L'interface de rappel
L'appelant ou la classe de niveau supérieur
La fonction Callee ou la couche inférieure
Rappel à l'aide du modèle EventListener
Ce modèle est utilisé pour notifier de 0 à n nombres d'observateurs / auditeurs qu'une tâche particulière est terminée
La différence entre le mécanisme de rappel et le mécanisme EventListener / Observer est que dans le rappel, l'appelé notifie l'appelant unique, tandis que dans Eventlisener / Observer, l'appelé peut notifier toute personne intéressée par cet événement (la notification peut aller à d'autres parties de la application qui n'a pas déclenché la tâche)
Permettez-moi de l'expliquer à travers un exemple.
L'interface d'événement
Widget de classe
Bouton de classe
Case à cocher Classe
Classe d'activité
package com.som_itsolutions.training.java.exampleeventlistener;
Autre classe
Classe principale
Comme vous pouvez le voir dans le code ci-dessus, nous avons une interface appelée événements qui répertorie essentiellement tous les événements qui peuvent se produire pour notre application. La classe Widget est la classe de base pour tous les composants de l'interface utilisateur tels que Button, Checkbox. Ces composants d'interface utilisateur sont les objets qui reçoivent réellement les événements du code d'infrastructure. La classe de widgets implémente l'interface d'événements et possède également deux interfaces imbriquées, à savoir OnClickEventListener et OnLongClickEventListener
Ces deux interfaces sont responsables de l'écoute des événements qui peuvent se produire sur les composants d'interface utilisateur dérivés du widget comme Button ou Checkbox. Donc, si nous comparons cet exemple avec l'exemple de rappel précédent à l'aide de l'interface Java, ces deux interfaces fonctionnent comme l'interface de rappel. Ainsi, le code de niveau supérieur (Here Activity) implémente ces deux interfaces. Et chaque fois qu'un événement se produit sur un widget, le code de niveau supérieur (ou la méthode de ces interfaces implémentées dans le code de niveau supérieur, qui est ici Activity) sera appelé.
Permettez-moi maintenant de discuter de la différence de base entre le modèle de rappel et le programme d'écoute d'événements. Comme nous l'avons mentionné, en utilisant le rappel, l'appelé ne peut informer qu'un seul appelant. Mais dans le cas du modèle EventListener, toute autre partie ou classe de l'application peut s'enregistrer pour les événements qui peuvent se produire sur le bouton ou la case à cocher. L'exemple de ce type de classe est l'AutreClasse. Si vous voyez le code de l'AutreClasse, vous constaterez qu'il s'est enregistré en tant qu'écouteur au ClickEvent qui peut se produire dans le Bouton défini dans l'Activité. La partie intéressante est que, outre l'activité (l'appelant), cette OtherClass sera également notifiée chaque fois que l'événement de clic se produit sur le bouton.
la source
Une fonction de rappel est une fonction que vous transmettez (comme référence ou pointeur) à une certaine fonction ou un certain objet. Cette fonction ou cet objet rappellera cette fonction à tout moment plus tard, éventuellement plusieurs fois, pour tout type de but:
...
Décrire un rappel comme une fonction appelée à la fin d'une autre fonction ou tâche est donc trop simplificateur (même s'il s'agit d'un cas d'utilisation courant).
la source
Un rappel est une idée de passer une fonction en tant que paramètre à une autre fonction et de l'invoquer une fois le processus terminé.
Si vous obtenez le concept de rappel à travers les réponses impressionnantes ci-dessus, je vous recommande de connaître le contexte de son idée.
"Qu'est-ce qui les a incités (les informaticiens) à développer le rappel?" Vous pourriez apprendre un problème qui bloque (en particulier le blocage de l'interface utilisateur) et le rappel n'est pas la seule solution. Il existe de nombreuses autres solutions (ex: Thread, Futures, Promises ...).
la source
Un domaine d'utilisation important est que vous enregistrez l'une de vos fonctions en tant que descripteur (c'est-à-dire un rappel), puis envoyez un message / appelez une fonction pour effectuer un travail ou un traitement. Maintenant, une fois le traitement terminé, la fonction appelée appelle notre fonction enregistrée (c'est-à-dire que le rappel est terminé), indiquant ainsi que le traitement est terminé.
Ce lien wikipedia explique assez bien graphiquement.
la source
Une fonction de rappel, également connue sous le nom de fonction d'ordre supérieur, est une fonction qui est passée à une autre fonction en tant que paramètre, et la fonction de rappel est appelée (ou exécutée) à l'intérieur de la fonction parent.
Ici, nous avons passé une fonction en tant que paramètre à la méthode click. Et la méthode click appellera (ou exécutera) la fonction de rappel que nous lui avons transmise.
la source
Fonction de rappel Fonction qui est passée à une autre fonction comme argument.
Remarque: Dans l'exemple ci-dessus, test_function utilisé comme argument pour la fonction setTimeout.
la source