387 Stimmen

Was versteht man unter dem Begriff "Hook" in der Programmierung?

Vor kurzem hörte ich den Begriff "Hook", als ich mit einigen Leuten über ein Programm sprach, das ich gerade schrieb. Ich bin mir nicht sicher, was dieser Begriff genau bedeutet, obwohl ich aus dem Gespräch schloss, dass ein Hook eine Art Funktion ist. Ich habe nach einer Definition gesucht, konnte aber keine gute Antwort finden. Könnte mir jemand eine Vorstellung davon geben, was dieser Begriff im Allgemeinen bedeutet, und vielleicht ein kleines Beispiel zur Veranschaulichung der Definition nennen?

206voto

Micah Punkte 106323

Im Wesentlichen handelt es sich um eine Stelle im Code, die es Ihnen ermöglicht, ein Modul anzuzapfen, um entweder ein anderes Verhalten bereitzustellen oder zu reagieren, wenn etwas passiert.

107voto

paxdiablo Punkte 809679

Ein Hook ist eine Funktion, die von einer Software bereitgestellt wird, damit die Benutzer dieser Software unter bestimmten Umständen ihren eigenen Code aufrufen können. Dieser Code kann den aktuellen Code ergänzen oder ersetzen.

In den alten Zeiten, als Computer noch wirklich persönlich waren und Viren weniger verbreitet waren (ich spreche von den 80er Jahren), war es so einfach wie Parcheando die Betriebssystemsoftware selbst, um Ihren Code aufzurufen. Ich erinnere mich, wie ich eine Erweiterung für Applesoft BASIC auf dem Apple II schrieb, die meinen Code einfach in den BASIC-Interpreter einfügte, indem sie einen Aufruf meines Codes einfügte, bevor eine Zeile verarbeitet wurde.

Einige Computer verfügten über vorgefertigte Haken, zum Beispiel der E/A-Stream des Apple II. Er benutzte einen solchen Haken, um das gesamte Festplatten-Subsystem einzuschleusen (Apple II ROMs wurden ursprünglich in den Tagen gebaut, als Kassetten das primäre Speichermedium für PCs waren). Sie steuerten die Festplatten durch Drucken den ASCII-Code 4 ( CTRL-D ), gefolgt von dem Befehl, den Sie ausführen möchten, und einem CR und wurde vom Disk-Subsystem abgefangen, das sich in die Apple-ROM-Druckroutinen eingeklinkt hatte.

So zum Beispiel die Zeilen:

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

listet den Inhalt der Festplatte auf und initialisiert den Rechner neu. Dies ermöglichte Tricks wie den Schutz Ihrer BASIC-Programme durch die Einstellung der ersten Zeile als:

123 REM XIN#6

dann mit POKE zum Einfügen der CTRL-D Zeichen, in dem die X war. Dann würde jeder, der versucht, Ihre Quelle aufzulisten, die Re-Initialisierungssequenz durch die Ausgaberoutinen schicken, wo das Festplatten-Subsystem sie erkennen würde.

Das ist oft die Art von Trickserei, die wir anwenden mussten, um das gewünschte Verhalten zu erreichen.

Heutzutage, da das Betriebssystem sicherer geworden ist, bietet es die Möglichkeit, selbst Haken zu setzen, da man das Betriebssystem nicht mehr "während des Fluges" oder auf der Festplatte verändern darf.

Es gibt sie schon seit einem lang Zeit. Mainframes hatten sie (Exits genannt), und ein großer Teil der Mainframe-Software nutzt diese Möglichkeiten auch heute noch. Das kostenlose Quellcode-Kontrollsystem, das mit z/OS geliefert wird (SCLM genannt), ermöglicht es Ihnen beispielsweise, das Sicherheitssubsystem vollständig zu ersetzen, indem Sie einfach Ihren eigenen Code in den Exit einfügen.

66voto

Alan Storm Punkte 160579

Im allgemeinen Sinne ist ein "Hook" etwas, das es Ihnen als Programmierer ermöglicht, etwas anzusehen und/oder mit etwas zu interagieren und/oder etwas zu ändern, das bereits in einem System/Programm vorhanden ist.

Das Drupal CMS bietet Entwicklern beispielsweise Hooks, mit denen sie nach der Erstellung eines "Content Nodes" zusätzliche Aktionen durchführen können. Wenn ein Entwickler keinen Hook implementiert, wird der Knoten wie üblich erstellt. Wenn ein Entwickler einen Hook implementiert, kann er zusätzlichen Code ausführen lassen, wenn ein Knoten erstellt wird. Dieser Code kann alles Mögliche tun, einschließlich Rückgängigmachen und/oder Ändern der ursprünglichen Aktion. Er könnte auch etwas tun, das mit der Erstellung des Knotens überhaupt nichts zu tun hat.

Einen Rückruf kann man sich als eine besondere Art von Haken vorstellen. Durch die Implementierung von Callback-Funktionen in ein System ermöglicht dieses System den Aufruf von zusätzlichem Code, nachdem eine Aktion abgeschlossen wurde. Hooking (als allgemeiner Begriff) ist jedoch nicht auf Rückrufe beschränkt.

Ein weiteres Beispiel. Manchmal bezeichnen Webentwickler die Klassennamen und/oder IDs von Elementen als Hooks. Das liegt daran, dass sie, indem sie die ID/den Klassennamen auf ein Element setzen, Javascript verwenden können, um dieses Element zu ändern oder sich in das Seitendokument "einzuklinken". (das ist zwar übertrieben, aber es wird häufig verwendet und ist erwähnenswert)

55voto

Joseph Vernice Punkte 411

Einfach gesagt:

Ein Hook ist ein Mittel zur Ausführung von benutzerdefiniertem Code (Funktion) entweder vor, nach oder anstelle von vorhandenem Code. So kann zum Beispiel eine Funktion geschrieben werden, die sich in den Anmeldevorgang einhakt, um eine Captcha-Funktion auszuführen, bevor der normale Anmeldevorgang fortgesetzt wird.

28voto

Jack Stout Punkte 1205

Hooks sind eine Kategorie von Funktionen, die es dem Basiscode ermöglichen, Erweiterungscode aufzurufen. Dies kann in Situationen nützlich sein, in denen ein Kernentwickler Erweiterbarkeit anbieten möchte, ohne seinen Code offenzulegen.

Ein Beispiel für die Verwendung von Hooks ist die Entwicklung von Mods für Videospiele. Ein Spiel erlaubt es Mod-Entwicklern möglicherweise nicht, die Basisfunktionalität zu erweitern, aber Hooks können von den Entwicklern der Core-Mod-Bibliothek hinzugefügt werden. Mit diesen Hooks können unabhängige Entwickler ihren benutzerdefinierten Code bei jedem gewünschten Ereignis aufrufen lassen, z. B. beim Laden des Spiels, bei Inventaraktualisierungen, bei Interaktionen mit Entitäten usw.

Eine gängige Implementierungsmethode besteht darin, einer Funktion eine leere Liste von Rückrufen zu geben und dann die Möglichkeit zu bieten, die Liste der Rückrufe zu erweitern. Der Basiscode wird die Funktion immer zum gleichen Zeitpunkt aufrufen, aber mit einer leeren Rückrufliste tut die Funktion nichts. Dies ist beabsichtigt.

Ein Dritter hat dann die Möglichkeit, zusätzlichen Code zu schreiben und seinen neuen Rückruf in die Rückrufliste des Hooks aufzunehmen. Mit nichts weiter als einem Verweis auf die verfügbaren Hooks verfügen sie über eine erweiterte Funktionalität bei minimalem Risiko für das Basissystem.

Mit Hooks können Entwickler nichts tun, was nicht auch mit anderen Strukturen und Schnittstellen möglich wäre. Sie sind eine Wahl, die mit Rücksicht auf die Aufgabe und die Benutzer (Drittentwickler) getroffen werden muss.

Zur Verdeutlichung: ein Hook erlaubt die Erweiterung und kann mit Callbacks implementiert werden. Rückrufe sind im Allgemeinen nichts anderes als ein Funktionszeiger; die berechnete Adresse einer Funktion. Es scheint in anderen Antworten/Kommentaren Verwirrung zu geben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X