¿Qué se entiende por el término "gancho" en la programación?

248

Recientemente escuché el término "enganchar" mientras hablaba con algunas personas sobre un programa que estaba escribiendo. No estoy seguro de lo que implica exactamente este término, aunque deduje de la conversación que un gancho es un tipo de función. Busqué una definición pero no pude encontrar una buena respuesta. ¿Alguien podría darme una idea de lo que significa generalmente este término y quizás un pequeño ejemplo para ilustrar la definición?

Chris
fuente
3
Ver Hooking @ Wikipedia . El enlace está enterrado en una de las respuestas con menos votos.
Palec

Respuestas:

143

Esencialmente, es un lugar en el código que le permite acceder a un módulo para proporcionar un comportamiento diferente o reaccionar cuando algo sucede.

Micah
fuente
77
¿Es esto similar a una devolución de llamada?
Chris
19
Los ganchos a menudo (pero no siempre) usan funciones de devolución de llamada. Por ejemplo, puede conectar un sistema de eventos usando "hookEvent (Events.STARTUP, myCallbackFunction)". Está pasando un puntero de función a la función hookEvent, por lo que sabe a qué función llamar cuando se produce el evento. Espero que ayude :-)
William Brendel
66
exactamente. Una devolución de llamada es un "tipo" de gancho.
Micah el
21
mmm no. Una devolución de llamada es una devolución de llamada y no tiene nada que ver con los ganchos, las devoluciones de llamada simplemente se UTILIZAN para la IMPLEMENTACIÓN de métodos de enlace. Las devoluciones de llamada son punteros (RELJMP) a funciones / métodos / procedimientos (CALL), los enlaces son modificaciones a las aplicaciones en ejecución.
specializt
1
@SahilBabbar No. Una interrupción hace que se ejecuten las instrucciones en algún lugar específico (la interrupción). Sin embargo, es posible que pueda engancharse en el proceso de manejo de interrupciones, por ejemplo, modificando la tabla que enumera las ubicaciones de los manejadores de interrupciones para que su código sea llamado primero en la interrupción (y luego su código llamaría al código de manejo de interrupciones previamente presente, en a manera de cadena de margaritas)
David Tonhofer
77

Un enlace es la funcionalidad proporcionada por el software para que los usuarios de ese software tengan su propio código llamado bajo ciertas circunstancias. Ese código puede aumentar o reemplazar el código actual.

En los viejos tiempos, cuando las computadoras eran realmente personales y los virus eran menos frecuentes (estoy hablando de los años 80), era tan simple como parchear el software del sistema operativo para llamar a su código. Recuerdo haber escrito una extensión al lenguaje BASIC de Applesoft en el Apple II que simplemente conectó mi código al intérprete BASIC inyectando una llamada a mi código antes de que se procesara cualquiera de las líneas.

Algunas computadoras tenían ganchos prediseñados, un ejemplo es la transmisión de E / S en el Apple II. Utilizó dicho gancho para inyectar todo el subsistema del disco (las ROM de Apple II se construyeron originalmente en los días en que los casetes eran el medio de almacenamiento principal para las PC). Usted controló los discos imprimiendo el código ASCII 4 ( CTRL-D) seguido del comando que deseaba ejecutar luego a CR, y fue interceptado por el subsistema de disco, que se había enganchado en las rutinas de impresión ROM de Apple.

Entonces, por ejemplo, las líneas:

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

enumeraría el contenido del disco y luego reinicializaría la máquina. Esto permitió trucos como proteger sus programas BASIC configurando la primera línea como:

123 REM XIN#6

luego usando POKEpara insertar el CTRL-Dpersonaje en donde Xestaba. Entonces, cualquiera que intente enumerar su fuente enviará la secuencia de reinicialización a través de las rutinas de salida donde el subsistema de disco la detectaría.

Ese es a menudo el tipo de truco al que tuvimos que recurrir para obtener el comportamiento que queríamos.

Hoy en día, con el sistema operativo más seguro, proporciona facilidades para los ganchos, ya que ya no se supone que modifique el sistema operativo "en vuelo" o en el disco.

Han existido por mucho tiempo. Los mainframes los tenían (llamados salidas) y una gran cantidad de software de mainframe usa esas instalaciones incluso ahora. Por ejemplo, el sistema de control de código fuente gratuito que viene con z / OS (llamado SCLM) le permite reemplazar completamente el subsistema de seguridad simplemente colocando su propio código en la salida.

paxdiablo
fuente
41

En un sentido genérico, un "gancho" es algo que le permitirá a usted, un programador, ver y / o interactuar y / o cambiar algo que ya está sucediendo en un sistema / programa.

Por ejemplo, el Drupal CMS proporciona a los desarrolladores ganchos que les permiten tomar medidas adicionales después de crear un "nodo de contenido". Si un desarrollador no implementa un enlace, el nodo se crea de forma normal. Si un desarrollador implementa un enlace, puede ejecutar un código adicional cada vez que se crea un nodo. Este código podría hacer cualquier cosa, incluyendo retroceder y / o alterar la acción original. También podría hacer algo no relacionado con la creación del nodo por completo.

Una devolución de llamada podría considerarse como un tipo específico de gancho. Al implementar la funcionalidad de devolución de llamada en un sistema, ese sistema le permite llamar a un código adicional después de que se haya completado una acción. Sin embargo, el enganche (como término genérico) no se limita a las devoluciones de llamada.

Otro ejemplo. A veces, los desarrolladores web se referirán a los nombres de clase y / o ID de elementos como ganchos. Esto se debe a que al colocar el nombre de ID / clase en un elemento, pueden usar Javascript para modificar ese elemento o "engancharse" al documento de la página. (Esto está ampliando el significado, pero se usa comúnmente y vale la pena mencionarlo)

Alan Storm
fuente
¿Qué quiere decir con "enganchar al documento de la página"? ¿Podrías dar un ejemplo? Entendí el primer ejemplo: dar una identificación a un elemento html para que pueda usar javacript para modificar el elemento.
committedandroider
21

Simple dijo:

Un enlace es un medio de ejecutar código personalizado (función) antes, después o en lugar del código existente. Por ejemplo, se puede escribir una función para "enganchar" en el proceso de inicio de sesión para ejecutar una función Captcha antes de continuar con el proceso normal de inicio de sesión.

Joseph Vernice
fuente
Mejor respuesta imo
Daniel
15

Enganchar en la programación es una técnica que emplea los llamados ganchos para hacer una cadena de procedimientos como un controlador de eventos.

geowa4
fuente
15

Los ganchos son una categoría de función que permite que el código base llame al código de extensión. Esto puede ser útil en situaciones en las que un desarrollador principal quiere ofrecer extensibilidad sin exponer su código.

Un uso de ganchos es en el desarrollo de mods de videojuegos. Un juego puede no permitir a los desarrolladores de mods extender la funcionalidad básica, pero los desarrolladores de la biblioteca de mods pueden agregar ganchos. Con estos ganchos, los desarrolladores independientes pueden tener su código personalizado invocado en cualquier evento deseado, como la carga del juego, actualizaciones de inventario, interacciones de la entidad, etc.

Un método común de implementación es dar a una función una lista vacía de devoluciones de llamada, luego exponer la capacidad de extender la lista de devoluciones de llamada. El código base siempre llamará a la función al mismo tiempo, pero, con una lista de devolución de llamada vacía, la función no hace nada. Esto es por diseño.

Un tercero, entonces, tiene la oportunidad de escribir código adicional y agregar su nueva devolución de llamada a la lista de devolución de llamada del enlace. Con nada más que una referencia de ganchos disponibles, tienen una funcionalidad extendida con un riesgo mínimo para el sistema base.

Los ganchos no permiten a los desarrolladores hacer nada que no se pueda hacer con otras estructuras e interfaces. Son una elección a tener en cuenta para la tarea y los usuarios (desarrolladores de terceros).

Para aclarar: un enlace permite la extensión y puede implementarse mediante devoluciones de llamada. Las devoluciones de llamada generalmente no son más que un puntero de función; La dirección calculada de una función. Parece haber confusión en otras respuestas / comentarios.

Jack Stout
fuente
4

Hook denota un lugar en el código donde se despacha un evento de cierto tipo, y si este evento se registró antes con una función adecuada para devolver la llamada, entonces sería manejado por esta función registrada, de lo contrario no sucede nada.

urgente
fuente
2

los ganchos se pueden ejecutar cuando se encuentra alguna condición. por ejemplo, algunos cambios de variables o alguna acción se llama o sucede algún evento. Los ganchos pueden entrar en el proceso y cambiar las cosas o reaccionar ante los cambios.

dusoft
fuente
1

A menudo, el enlace se refiere al enlace de mensajes Win32 o los equivalentes de Linux / OSX, pero el enlace más genérico es simplemente notificar a otro objeto / ventana / programa / etc. que desea que se le notifique cuando ocurre una acción específica. Por ejemplo: hacer que todas las ventanas del sistema le notifiquen cuando están a punto de cerrarse.

Como regla general, el enganche es algo peligroso, ya que hacerlo sin comprender cómo afecta al sistema puede provocar inestabilidad o, al menos, un comportamiento inesperado. También puede ser MUY útil en ciertas circunstancias, pensó. Por ejemplo: FRAPS lo usa para determinar en qué ventanas debe mostrar su contador FPS.

Toji
fuente
1

Una cadena de ganchos es un conjunto de funciones en el que cada función llama a la siguiente. Lo importante de una cadena de ganchos es que un programador puede agregar otra función a la cadena en tiempo de ejecución. Una forma de hacerlo es buscar una ubicación conocida donde se mantenga la dirección de la primera función en una cadena. Luego guarda el valor del puntero de esa función y sobrescribe el valor en la dirección inicial con la dirección de la función que desea insertar en la cadena de enlace. Luego se llama a la función, hace su trabajo y llama a la siguiente función de la cadena (a menos que usted decida lo contrario). Naturalmente, hay varias otras formas de crear una cadena de ganchos, desde escribir directamente en la memoria hasta usar las funciones de metaprogramación de lenguajes como Ruby o Python.

Un ejemplo de una cadena de ganchos es la forma en que una aplicación de MS Windows procesa los mensajes. Cada función en la cadena de procesamiento procesa un mensaje o lo envía a la siguiente función en la cadena.

Joe portador de almas
fuente
1

En el sistema de gestión de contenido de Drupal, "gancho" tiene un significado relativamente específico. Cuando ocurre un evento interno (como la creación de contenido o el inicio de sesión del usuario, por ejemplo), los módulos pueden responder al evento implementando una función especial de "enlace". Esto se realiza mediante una convención de nomenclatura: [your-plugin-name] _user_login () para el evento de inicio de sesión de usuario, por ejemplo.

Debido a esta convención, los eventos subyacentes se denominan "ganchos" y aparecen con nombres como "hook_user_login" y "hook_user_authenticate ()" en la documentación de la API de Drupal.

Eaton
fuente
Esto sigue la idea mencionada anteriormente , de una "devolución de llamada" "para reaccionar cuando algo sucede". En este caso, la devolución de llamada no se registra explícitamente, sino que se basa en "nombres mágicos". Esto se discute actualmente en drupal.org, consulte Uso de Symfony EventDispatcher para ganchos de eventos
donquixote
Para generalizar, un gancho / devolución de llamada / oyente puede "darse a conocer al código de llamada" de diferentes maneras (sin decir que esto está completo): 1. funciones con nombre mágico 2. clases con nombre mágico 3. funciones explícitamente registradas 4. explícitamente objetos registrados (oyentes, suscriptores, observadores) 5. nombres de clase registrados explícitamente (+ argumentos de constructor opcionales), para ser instanciados antes de que se active el gancho. 6. modificando el código de llamada
donquixote
1

En resumen, puede cambiar el código de una llamada a la API, por ejemplo, MessageBoxdónde realiza una función diferente editada por usted (globalmente funcionará en todo el sistema, localmente en todo el proceso).

Kenny Barker
fuente