web-dev-qa-db-fra.com

Qu'entend-on par "crochet" dans la programmation?

J'ai récemment entendu le terme "crochet" en parlant à certaines personnes d'un programme que j'écrivais. Je ne sais pas exactement ce que ce terme implique, bien que j'aie déduit de la conversation qu'un crochet est un type de fonction. J'ai cherché une définition mais je suis incapable de trouver une bonne réponse. Est-ce que quelqu'un pourrait me donner une idée de ce que ce terme signifie généralement et peut-être un petit exemple pour illustrer la définition?

226
Chris

En gros, c'est un endroit dans le code qui vous permet de faire appel à un module pour adopter un comportement différent ou pour réagir lorsque quelque chose se produit.

132
Micah

Un raccordement est une fonctionnalité fournie par un logiciel pour que les utilisateurs de ce logiciel puissent faire appeler leur propre code dans certaines circonstances. Ce code peut augmenter ou remplacer le code actuel.

Autrefois, lorsque les ordinateurs étaient vraiment personnels et les virus moins répandus (je parle des années 80), il suffisait de corriger le logiciel du système d'exploitation lui-même pour appeler votre code. Je me souviens d’avoir écrit une extension du langage BASIC Applesoft sur le Apple II) qui a simplement raccordé mon code à l’interprète BASIC en injectant un appel dans mon code avant le traitement de la ligne.

Certains ordinateurs avaient des crochets préconçus, un exemple étant le flux d'E/S sur le Apple II. Il utilisait un tel crochet pour injecter tout le sous-système du disque (les ROM Apple II étaient initialement construites). à l’époque où les cassettes constituaient le support de stockage principal pour les PC), vous contrôliez les disques par impression the ASCII code 4 (CTRL-D) suivi de la commande que vous voulez exécuter, puis un CR, qui a été intercepté par le sous-système de disque, qui s’était connecté au Apple ROM imprimer les routines.

Ainsi, par exemple, les lignes:

PRINT CHR(4);"CATALOG"
PRINT CHR(4);"IN#6"

listerait le contenu du disque puis réinitialiserait la machine. Cela a permis de protéger votre programme BASIC en configurant la première ligne comme suit:

123 REM XIN#6

puis en utilisant POKE pour insérer le CTRL-D caractère à l'endroit où se trouvait X. Ensuite, toute personne essayant de répertorier votre source enverrait la séquence de réinitialisation via les routines de sortie où le sous-système de disque la détecterait.

C'est souvent le genre de ruse auquel nous avons eu recours pour obtenir le comportement que nous souhaitions.

De nos jours, avec le système d’exploitation plus sécurisé, il offre des installations pour les hooks, puisque vous n’êtes plus censé modifier le système d’exploitation "en vol" ou sur le disque.

Ils ont été autour pendant un long temps. Les mainframes les avaient (appelées sorties) et un grand nombre de logiciels mainframe les utilisent déjà. Par exemple, le système de contrôle de code source gratuit fourni avec z/OS (appelé SCLM) vous permet de remplacer entièrement le sous-système de sécurité en plaçant simplement votre propre code dans l'exit.

75
paxdiablo

De manière générique, un "crochet" est quelque chose qui vous permettra, en tant que programmeur, de visualiser et/ou d'interagir avec et/ou de modifier quelque chose qui se passe déjà dans un système/programme.

Par exemple, le CMS Drupal fournit aux développeurs des crochets leur permettant de prendre des mesures supplémentaires après la création d'un "noeud de contenu". Si un développeur n'implémente pas de crochet, le noeud est créé normalement. Si un développeur implémente un hook, il peut exécuter du code supplémentaire chaque fois qu'un nœud est créé, ce qui peut tout faire, y compris annuler et/ou modifier l'action d'origine, mais aussi quelque chose de totalement indépendant de la création du nœud.

Un rappel peut être considéré comme un type spécifique de crochet. En implémentant la fonctionnalité de rappel dans un système, ce système vous permet d'appeler du code supplémentaire une fois l'action terminée. Toutefois, l'accrochage (en tant que terme générique) ne se limite pas aux rappels.

Un autre exemple. Parfois, les développeurs Web se réfèrent aux noms de classe et/ou aux identifiants sur les éléments en tant que points d'ancrage. En effet, en plaçant le nom de l'ID/de la classe sur un élément, ils peuvent ensuite utiliser Javascript pour modifier cet élément, ou "se connecter" au document de la page. (ceci élargit le sens, mais il est couramment utilisé et mérite d'être mentionné)

38
Alan Storm

Les crochets sont une catégorie de fonction qui permet au code de base d'appeler le code d'extension. Cela peut être utile dans les situations où un développeur principal souhaite offrir une extensibilité sans exposer son code.

Une des utilisations des crochets est le développement de mods de jeux vidéo. Un jeu peut ne pas autoriser les développeurs de mod à étendre les fonctionnalités de base, mais des hooks peuvent être ajoutés par les développeurs de bibliothèques de mods principaux. Avec ces points d'ancrage, les développeurs indépendants peuvent faire appel à leur code personnalisé pour tout événement souhaité, tel que le chargement du jeu, les mises à jour de l'inventaire, les interactions d'entités, etc.

Une méthode d'implémentation courante consiste à donner à une fonction une liste vide de rappels, puis à exposer la possibilité d'étendre la liste des rappels. Le code de base appellera toujours la fonction au même moment et au même moment mais, avec une liste de rappel vide, la fonction ne fait rien. C'est par conception.

Un tiers a alors la possibilité d'écrire du code supplémentaire et d'ajouter son nouveau rappel à la liste de rappel du point d'ancrage. N'ayant rien de plus qu'une référence des points d'ancrage disponibles, ils ont des fonctionnalités étendues présentant un risque minimal pour le système de base.

Les crochets ne permettent pas aux développeurs de faire quoi que ce soit qui ne puisse être fait avec d'autres structures et interfaces. Ils sont un choix à faire en tenant compte de la tâche et des utilisateurs (développeurs tiers).

Pour plus de précision: un hook permet l'extension et peut être implémenté à l'aide de callbacks. Les rappels ne sont généralement rien de plus qu'un pointeur de fonction; l'adresse calculée d'une fonction. Il semble y avoir confusion dans les autres réponses/commentaires.

15
Jack Stout

Hooking en programmation est une technique utilisant ce que l'on appelle des hooks pour créer une chaîne de procédures en tant que gestionnaire d'événements.

14
geowa4

Simple a dit:

Un hook est un moyen d'exécuter du code personnalisé (fonction) avant, après ou à la place du code existant. Par exemple, une fonction peut être écrite pour "se connecter" au processus de connexion afin d'exécuter une fonction Captcha avant de poursuivre le processus de connexion normal.

12
Joseph Vernice

Le crochet indique un endroit dans le code où vous envoyez un événement d'un certain type, et si cet événement a été enregistré auparavant avec une fonction appropriée à rappeler, alors il serait géré par cette fonction enregistrée, sinon rien ne se produit.

4
urgent

les hooks peuvent être exécutés lorsqu'une condition est rencontrée. par exemple. des modifications de variables ou une action sont appelées ou un événement se produit. les crochets peuvent entrer dans le processus et changer les choses ou réagir en cas de changement.

2
dusoft

Souvent, hooking fait référence à hooking de messages Win32 ou à ses équivalents Linux/OSX, mais plus généralement, le hooking consiste simplement à notifier à un autre objet/fenêtre/programme/etc que vous souhaitez être averti lorsqu'une action spécifiée se produit. Par exemple: toutes les fenêtres du système vous avertissent lorsqu'elles sont sur le point de se fermer.

En règle générale, le raccordement est quelque peu dangereux car le faire sans comprendre comment il affecte le système peut conduire à une instabilité ou même à un comportement inattendu. Cela peut aussi être TRÈS utile dans certaines circonstances, pensa-t-on. Par exemple: FRAPS l'utilise pour déterminer les fenêtres sur lesquelles le compteur FPS doit être affiché.

1
Toji

Une chaîne de crochets est un ensemble de fonctions dans lesquelles chaque fonction appelle la suivante. Ce qui est important dans une chaîne de crochets, c'est qu'un programmeur peut ajouter une autre fonction à la chaîne au moment de l'exécution. Une façon de procéder consiste à rechercher un emplacement connu où l'adresse de la première fonction d'une chaîne est conservée. Vous sauvegardez ensuite la valeur de ce pointeur de fonction et écrasez-la à l'adresse initiale avec l'adresse de la fonction que vous souhaitez insérer dans la chaîne de raccordement. La fonction est ensuite appelée, fait son travail et appelle la fonction suivante de la chaîne (sauf décision contraire de votre part). Naturellement, il existe un certain nombre de façons de créer une chaîne de crochets, de l'écriture directe dans la mémoire à l'utilisation des fonctions de métaprogrammation de langages comme Ruby ou Python.

Un exemple de chaîne de points d'ancrage est la manière dont une application MS Windows traite les messages. Chaque fonction de la chaîne de traitement traite un message ou l'envoie à la fonction suivante de la chaîne.

1
Joe Soul-bringer

Dans le Drupal, "hook" a une signification relativement spécifique. Lorsqu'un événement interne se produit (comme la création de contenu ou la connexion d'un utilisateur, par exemple), les modules peuvent répondre à l'événement en implémentant: une fonction spéciale de "raccordement", réalisée via la convention de dénomination - [nom-votre-plug-in] _user_login () pour l'événement de connexion utilisateur, par exemple.

En raison de cette convention, les événements sous-jacents sont appelés "hooks" et apparaissent sous des noms tels que "hook_user_login" et "hook_user_authenticate ()" dans la documentation de l'API Drupal.

1
Eaton

En très bref, vous pouvez changer le code d'un appel d'API tel que MessageBox pour qu'il remplisse une fonction différente que vous avez modifiée (globalement, cela fonctionnera à l'échelle du système, localement, à l'échelle du processus).

1
Kenny Barker