Wikipedia · einfach zusammengefasst · Stand
Hook (Informatik)
Hook (englisch für Haken, auch Einschubmethode genannt) bezeichnet in der Programmierung eine Schnittstelle, mit der fremder Programmcode in eine bestehende …
Inhalt5 Abschnitte
Grundidee und Zweck
Ein Hook, auch Einschubmethode genannt, ist in der Programmierung eine Schnittstelle, über die fremder Programmcode in eine bestehende Anwendung eingebunden werden kann. Dadurch lässt sich ein Programm erweitern, sein Ablauf verändern oder ein bestimmtes Ereignis abfangen. Typisch ist, dass ein Hook im Standardfall nichts tut, also erst durch zusätzlichen Code eine Wirkung bekommt.
Hooks können an verschiedenen Stellen wirken: direkt im Quelltext, über Konfigurationsdateien, durch den Aufruf von Funktionen, denen der auszuführende Code mitgegeben wird, oder durch Mechanismen des Betriebssystems. Betriebssysteme können Hooks zum Abfangen von Nachrichten bereitstellen. Damit lassen sich zum Beispiel systemweite Hotkeys umsetzen: Ein Programm kann Tastatur-Nachrichten empfangen, unabhängig davon, welches Programm gerade den Fokus hat.
Implementierung im Programmcode
Wenn der Quelltext eines Programms vorliegt, kann man es grundsätzlich direkt erweitern. Das ist aber oft aufwendig, besonders wenn der Code nicht genau bekannt ist. Solche Änderungen können viele Anpassungen erfordern, unerwünschte Nebenwirkungen haben und müssen bei jeder neuen Programmversion erneut eingepflegt werden.
Darum legen manche Programme bestimmte Stellen ausdrücklich als Erweiterungspunkte fest. Ein typischer Hook ist dann eine Funktion, die im ursprünglichen Programm leer implementiert ist und deshalb zunächst nichts bewirkt. Diese leere Funktion kann später auf eine fremdimplementierte Funktion umgelenkt werden. So kann zusätzlicher Code eingebunden werden, ohne den übrigen Programmablauf stark zu verändern.
Hooks in objektorientierter Programmierung
In der objektorientierten Programmierung werden Hooks vor allem durch Vererbung oder Delegation umgesetzt.
Bei Vererbung sind Hooks leere Methoden, die in Unterklassen ausprogrammiert werden können. Ein Beispiel ist das Entwurfsmuster der Schablonenmethode. Dabei werden mehrere Methoden nacheinander als Hooks aufgerufen, um einen Algorithmus mit festem Ablaufrahmen an bestimmten Stellen zu spezialisieren.
Bei Delegation wird ein Hook als Objekt an den aufrufenden Programmteil übergeben, meist als Attribut. Dieses Objekt muss eine bestimmte Schnittstelle implementieren. Ein Beispiel dafür ist das Strategie-Entwurfsmuster. Wenn mehrere verschiedene Dienstleister denselben Hook nutzen sollen, kann der Aufrufer statt eines einzelnen Attributs eine Liste verwenden. Dann werden mehrere Hook-Implementierungen der Reihe nach aufgerufen. Das geschieht zum Beispiel bei einem Listener, der Benutzerinteraktionen abfängt. Wird die Liste nur so lange abgearbeitet, bis der erste Hook ein bestimmtes Ergebnis zurückliefert, spricht man von einer Zuständigkeitskette.
Betriebssystem-Hooks
Betriebssystem-Hooks unter Windows werden in einer eigenen DLL implementiert. Eine DLL ist eine Programmbibliothek, die von anderen Programmen oder vom Betriebssystem geladen werden kann. Diese Hook-DLL wird vom Betriebssystem ohne einen Programmkontext aufgerufen.
Ein Programm, das einen solchen Hook einsetzt, etwa zur Benachrichtigung über ein Ereignis, muss deshalb auf anderem Weg erfahren, welche Ergebnisse der Code in der DLL liefert. Dafür kann zum Beispiel Interprozesskommunikation verwendet werden, also ein Mechanismus, mit dem verschiedene Prozesse Daten austauschen.
Einbindung und Konfiguration
Ein wichtiges Problem ist, wie das aufrufende Programm erfährt, welche Programmteile die vorhandenen Hooks nutzen wollen.
Die einfachste Möglichkeit ist, den Programmcode direkt zu verändern, damit Zugriff auf die Hooks entsteht. Eine andere Möglichkeit ist die Einbindung über Konfiguration. In der prozeduralen Programmierung kann das über Funktionszeiger geschehen: Dabei wird die Startadresse einer aufzurufenden Unterroutine eingetragen. In der objektorientierten Programmierung kann eine Klasse dynamisch über ihren Namen geladen werden. Diese Klasse implementiert dann als Unterklasse oder als Delegationsobjekt den Code, der vom Hook aufgerufen wird. Auch Dependency Injection kann verwendet werden, um Hooks einfach zu konfigurieren.
Eine dritte Möglichkeit ist, ein Objekt oder eine Funktion über eine Zugriffsfunktion zu setzen. Dieses Objekt oder diese Funktion wird dann vom Hook aufgerufen. Das wird vor allem genutzt, wenn der Hook von einer Programmbibliothek bereitgestellt wird, die von demselben Programmteil verwendet wird, der auch die Hooks nutzen möchte. Ein Beispiel dafür ist ein Listener für Benutzerinteraktionen.