Que signifie le terme «crochet» dans la programmation?

248

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, même si j'ai déduit de la conversation qu'un crochet est un type de fonction. J'ai cherché une définition mais je n'ai pas pu trouver une bonne réponse. Quelqu'un pourrait-il 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?

Chris
la source
3
Voir Hooking @ Wikipedia . Le lien est enterré dans l'une des réponses les moins votées.
Palec

Réponses:

143

Il s'agit essentiellement d'un emplacement dans le code qui vous permet de vous connecter à un module pour fournir un comportement différent ou pour réagir lorsque quelque chose se produit.

Michée
la source
7
Est-ce similaire à un rappel?
Chris
19
Les hooks utilisent souvent (mais pas toujours) des fonctions de rappel. Par exemple, vous pouvez raccorder un système d'événements à l'aide de "hookEvent (Events.STARTUP, myCallbackFunction)". Vous passez un pointeur de fonction à la fonction hookEvent, afin qu'il sache quelle fonction appeler lorsque l'événement se produit. J'espère que cela aide :-)
William Brendel
6
exactement. Un rappel est un "type" de hook.
Micah
21
um non. Un rappel est un rappel et n'a rien à voir avec les hooks, les callbacks sont simplement UTILISÉS pour la MISE EN ŒUVRE des méthodes de hook. Les rappels sont des pointeurs (RELJMP) vers des fonctions / méthodes / procédures (CALL), les hooks sont des modifications des applications en cours d'exécution.
specializt
1
@SahilBabbar No. Une interruption provoque l'exécution des instructions à un endroit spécifié (l'interruption). Cependant, vous pouvez peut-être vous connecter au processus de gestion des interruptions, par exemple en modifiant le tableau répertoriant les emplacements des gestionnaires d'interruptions afin que votre code soit appelé en premier lors de l'interruption (puis votre code appellera le code de gestion des interruptions précédemment présent, dans en guirlande)
David Tonhofer
77

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

Dans les temps anciens où les ordinateurs étaient vraiment personnels et les virus moins répandus (je parle des années 80), c'était aussi simple que de patcher le logiciel du système d'exploitation lui-même pour appeler votre code. Je me souviens d'avoir écrit une extension du langage Applesoft BASIC sur l'Apple II qui a simplement accroché mon code à l'interpréteur BASIC en injectant un appel à mon code avant que la ligne ne soit traitée.

Certains ordinateurs avaient des crochets préconçus, un exemple étant le flux d'E / S sur l'Apple II. Il a utilisé un tel crochet pour injecter le sous-système de disque entier (les ROM Apple II ont été initialement construites à l'époque où les cassettes étaient le principal support de stockage pour les PC). Vous avez contrôlé les disques en imprimant le code ASCII 4 ( CTRL-D) suivi de la commande que vous vouliez exécuter puis a CR, et il a été intercepté par le sous-système de disque, qui s'était accroché aux routines d'impression Apple ROM.

Ainsi, par exemple, les lignes:

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

répertorie le contenu du disque, puis réinitialise la machine. Cela a permis des astuces telles que la protection de vos programmes BASIC en définissant la première ligne comme:

123 REM XIN#6

puis en utilisant POKEpour insérer le CTRL-Dcaractère à l'endroit où il se Xtrouvait. Ensuite, toute personne essayant de répertorier votre source enverra la séquence de réinitialisation via les routines de sortie où le sous-système de disque la détectera.

C'est souvent le genre de ruse à laquelle nous avons dû recourir pour obtenir le comportement que nous voulions.

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

Ils existent depuis longtemps . Les mainframes en avaient (appelés sorties) et de nombreux logiciels mainframe utilisent ces installations même maintenant. 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 à la sortie.

paxdiablo
la source
41

Dans un sens générique, un "hook" est quelque chose qui vous permettra, en tant que programmeur, de voir et / ou d'interagir avec et / ou de changer quelque chose qui se passe déjà dans un système / programme.

Par exemple, le CMS Drupal fournit aux développeurs des crochets qui leur permettent de prendre des mesures supplémentaires après la création d'un "nœud de contenu". Si un développeur n'implémente pas de hook, le nœud est créé normalement. Si un développeur implémente un hook, il peut faire exécuter du code supplémentaire chaque fois qu'un nœud est créé. Ce code pourrait faire n'importe quoi, y compris annuler et / ou modifier l'action d'origine. Il pourrait également faire quelque chose de complètement étranger à la création de nœud.

Un rappel pourrait ê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. Cependant, le raccordement (en tant que terme générique) n'est pas limité aux rappels.

Un autre exemple. Parfois, les développeurs Web font référence aux noms de classe et / ou aux identifiants sur les éléments comme des crochets. En effet, en plaçant l'ID / le nom de classe sur un élément, ils peuvent ensuite utiliser Javascript pour modifier cet élément, ou «se connecter» au document de la page. (cela étire le sens, mais il est couramment utilisé et mérite d'être mentionné)

Alan Storm
la source
Qu'entendez-vous par «se connecter au document de la page»? Pouvez-vous donner un exemple? J'ai compris le premier exemple - donner à un élément html un identifiant afin que vous puissiez utiliser javacript pour modifier l'élément.
committedandroider
21

Simple 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 "accrocher" dans le processus de connexion afin d'exécuter une fonction Captcha avant de passer au processus de connexion normal.

Joseph Vernice
la source
Meilleure réponse imo
Daniel
15

Le hooking en programmation est une technique qui utilise des soi-disant hooks pour créer une chaîne de procédures en tant que gestionnaire d'événements.

geowa4
la source
15

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 utilisation des crochets est dans le développement de mod de jeux vidéo. Un jeu peut ne pas permettre aux développeurs de mod d'étendre les fonctionnalités de base, mais des crochets peuvent être ajoutés par les développeurs principaux de la bibliothèque de mod. Avec ces crochets, les développeurs indépendants peuvent faire appeler leur code personnalisé à tout événement souhaité, tel que le chargement du jeu, les mises à jour d'inventaire, les interactions d'entité, etc.

Une méthode d'implémentation courante consiste à attribuer à une fonction une liste vide de rappels, puis à exposer la possibilité d'étendre la liste de rappels. Le code de base appellera toujours la fonction en même temps, 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 hook. Avec rien de plus qu'une référence de crochets disponibles, ils ont des fonctionnalités étendues avec 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 peut pas ê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 rappels. 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.

Jack Stout
la source
4

Hook indique un endroit dans le code où vous distribuez 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.

urgent
la source
2

les hooks peuvent être exécutés lorsqu'une condition est rencontrée. par exemple, certains changements de variables ou une action est appelée ou un événement se produit. les crochets peuvent entrer dans le processus et changer les choses ou réagir aux changements.

dusoft
la source
1

Souvent, le raccordement fait référence au raccordement de messages Win32 ou aux équivalents Linux / OSX, mais de manière plus générique, il suffit de 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 entraîner une instabilité ou, à tout le moins, un comportement inattendu. Il peut également être TRÈS utile dans certaines circonstances, pensait-il. Par exemple: FRAPS l' utilise pour déterminer sur quelles fenêtres il doit afficher son compteur FPS.

Toji
la source
1

Une chaîne de crochets est un ensemble de fonctions dans lesquelles chaque fonction appelle la suivante. Ce qui est important à propos d'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 enregistrez ensuite la valeur de ce pointeur de fonction et écrasez la valeur à l'adresse initiale par l'adresse de la fonction que vous souhaitez insérer dans la chaîne de crochet. La fonction est ensuite appelée, fait son travail et appelle la fonction suivante de la chaîne (sauf si vous en décidez autrement). Naturellement, il existe un certain nombre d'autres façons de créer une chaîne de crochets, de l'écriture directement dans la mémoire à l'utilisation des fonctionnalités de métaprogrammation de langages comme Ruby ou Python.

Un exemple de chaîne de crochets 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.

Joe Soul-porteur
la source
1

Dans le système de gestion de contenu Drupal, «hook» a une signification relativement spécifique. Lorsqu'un événement interne se produit (comme la création de contenu ou la connexion utilisateur, par exemple), les modules peuvent répondre à l'événement en implémentant une fonction "hook" spéciale. Cela se fait via la convention de dénomination - [your-plugin-name] _user_login () pour l'événement User Login, par exemple.

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

Eaton
la source
Cela suit l'idée mentionnée ci - dessus , d'un "rappel" "pour réagir quand quelque chose se passe". Dans ce cas, le rappel n'est pas explicitement enregistré, mais basé sur un "nom magique". Ceci est actuellement discuté sur drupal.org, voir Utiliser Symfony EventDispatcher pour les hooks d'événements
donquixote
Pour généraliser, un hook / callback / listener peut être "porté à la connaissance du code appelant" de différentes manières (sans dire que c'est complet): 1. fonctions à nom magique 2. classes à nom magique 3. fonctions explicitement enregistrées 4. explicitement objets enregistrés (écouteurs, abonnés, observateurs) 5. noms de classe explicitement enregistrés (+ arguments optionnels du constructeur), à instancier avant le déclenchement du hook. 6. en modifiant le code d'appel
donquixote
1

En TRÈS court, vous pouvez changer le code d'un appel d'API tel que l' MessageBoxendroit où il fait une fonction différente éditée par vous (globalement fonctionnera à l'échelle du système, localement fonctionnera à l'échelle du processus).

Kenny Barker
la source