Что подразумевается под термином «крючок» в программировании? - PullRequest
216 голосов
/ 22 января 2009

Я недавно услышал термин «крючок», когда говорил с некоторыми людьми о программе, которую я писал. Я точно не знаю, что подразумевается под этим термином, хотя из разговора я понял, что ловушка - это тип функции. Я искал определение, но не смог найти хороший ответ. Может ли кто-нибудь дать мне представление о том, что обычно означает этот термин, и, возможно, небольшой пример, иллюстрирующий определение?

Ответы [ 12 ]

131 голосов
/ 22 января 2009

По сути, это место в коде, которое позволяет вам подключиться к модулю, чтобы обеспечить другое поведение или реагировать, когда что-то происходит.

71 голосов
/ 22 января 2009

Хук - это функциональность, предоставляемая программным обеспечением, чтобы пользователи этого программного обеспечения могли вызывать свой собственный код при определенных обстоятельствах. Этот код может дополнять или заменять текущий код.

В старые времена, когда компьютеры были по-настоящему личными, а вирусы были менее распространены (я говорю о 80-х), это было так же просто, как исправление самого программного обеспечения операционной системы для вызова вашего кода. Я помню, как писал расширение для языка Applesoft BASIC на Apple II, которое просто подключало мой код к интерпретатору BASIC, вводя вызов в мой код до обработки какой-либо строки.

У некоторых компьютеров были предварительно спроектированные перехватчики, одним из примеров которых является поток ввода-вывода на Apple II. Он использовал такую ​​зацепку для внедрения всей дисковой подсистемы (ПЗУ Apple II изначально создавались в те дни, когда кассеты были основным носителем данных для ПК). Вы управляли дисками путем печати кода 4 ASCII (CTRL-D), за которым следовала команда, которую вы хотели выполнить, затем CR, и она была перехвачена дисковой подсистемой, которая подключилась сама в процедуры печати Apple ROM.

Так, например, строки:

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

выдаст список содержимого диска, а затем повторно инициализирует машину. Это позволило использовать такие хитрости, как защита ваших основных программ, установив в первой строке:

123 REM XIN#6

затем с помощью POKE вставить символ CTRL-D в том месте, где был X. Затем любой, кто пытается перечислить ваш источник, отправит последовательность повторной инициализации через выходные процедуры, где дисковая подсистема обнаружит его.

Часто к таким хитростям мы прибегали, чтобы добиться желаемого поведения.

В настоящее время операционная система более безопасна и предоставляет возможности для перехвата, поскольку вам больше не нужно изменять операционную систему «в полете» или на диске.

Они были вокруг долго раз. Они были у мэйнфреймов (так называемые выходы), и многие мэйнфреймы используют их уже сейчас. Например, бесплатная система управления исходным кодом, поставляемая с z / OS (называемая SCLM), позволяет полностью заменить подсистему безопасности, просто разместив свой собственный код на выходе.

37 голосов
/ 22 января 2009

В общем смысле «крючок» - это то, что позволит вам, программисту, просматривать и / или взаимодействовать и / или изменять то, что уже происходит в системе / программе.

Например, Drupal CMS предоставляет разработчикам хуки, которые позволяют им предпринимать дополнительные действия после создания «узла содержимого». Если разработчик не реализует ловушку, узел создается в обычном режиме. Если разработчик реализует ловушку, он может запускать дополнительный код всякий раз, когда создается узел. Этот код может делать что угодно, включая откат и / или изменение исходного действия. Это также может сделать что-то не связанное с созданием узла полностью.

Обратный вызов может рассматриваться как особый вид хука. Внедряя функцию обратного вызова в систему, эта система позволяет вам вызывать некоторый дополнительный код после завершения действия. Однако перехват (в качестве общего термина) не ограничивается обратными вызовами.

Еще один пример. Иногда веб-разработчики будут ссылаться на имена классов и / или идентификаторы элементов как хуки. Это происходит потому, что, помещая имя ID / класса в элемент, они могут затем использовать Javascript для изменения этого элемента или «подключиться» к документу страницы. (это растягивает смысл, но это обычно используется и стоит упомянуть)

15 голосов
/ 25 января 2016

Хуки - это категория функций, которая позволяет базовому коду вызывать код расширения. Это может быть полезно в ситуациях, когда основной разработчик хочет предложить расширяемость, не раскрывая свой код.

Одно из применений хуков в разработке модов для видеоигр. Игра может не позволять разработчикам модов расширять базовую функциональность, но разработчики базовой библиотеки модов могут добавлять хуки. С помощью этих хуков независимые разработчики могут вызывать свой собственный код для вызова любого желаемого события, такого как загрузка игры, обновления инвентаря, взаимодействия с сущностями и т. Д.

Распространенным методом реализации является предоставление функции пустого списка обратных вызовов, а затем предоставление возможности расширять список обратных вызовов. Базовый код всегда будет вызывать функцию в одно и то же время, но с пустым списком обратных вызовов функция ничего не делает. Это по замыслу.

Таким образом, третья сторона имеет возможность написать дополнительный код и добавить свой новый обратный вызов в список обратных вызовов ловушки. Имея не что иное, как справку о доступных хуках, они обладают расширенной функциональностью с минимальным риском для базовой системы.

Хуки не позволяют разработчикам делать то, что нельзя сделать с другими структурами и интерфейсами. Их выбор следует делать с учетом задачи и пользователей (сторонних разработчиков).

Для пояснения: ловушка позволяет расширение и может быть реализована с использованием обратных вызовов. Обратные вызовы, как правило, не более, чем указатель на функцию; вычисленный адрес функции. Кажется, что в других ответах / комментариях есть путаница.

14 голосов
/ 22 января 2009

Перехват в программировании - это техника, использующая так называемые перехватчики для создания цепочки процедур в качестве обработчика событий.

11 голосов
/ 02 августа 2016

Просто сказал:

Хук - это средство выполнения пользовательского кода (функции) до, после или вместо существующего кода. Например, функция может быть написана для «подключения» к процессу входа в систему, чтобы выполнить функцию Captcha перед продолжением обычного процесса входа в систему.

4 голосов
/ 05 апреля 2014

Hook обозначает место в коде, где вы отправляете событие определенного типа, и если это событие было ранее зарегистрировано с соответствующей функцией для обратного вызова, то оно будет обработано этой зарегистрированной функцией, иначе ничего не произойдет.

2 голосов
/ 22 января 2009

хуки могут быть выполнены, когда встречаются некоторые условия. например изменяются некоторые переменные или вызывается какое-то действие, или происходит какое-то событие. крючки могут войти в процесс и изменить вещи или реагировать на изменения.

1 голос
/ 18 августа 2012

Короче говоря, вы можете изменить код вызова API, такого как MessageBox, чтобы он выполнял другую функцию, отредактированную вами (глобально будет работать во всей системе, локально будет работать во всем процессе).

1 голос
/ 22 января 2009

В системе управления контентом Drupal «крючок» имеет относительно специфическое значение. Когда происходит внутреннее событие (например, создание контента или логин пользователя), модули могут реагировать на событие, реализуя специальную функцию «ловушки». Это делается с помощью соглашения об именах - например, [your-plugin-name] _user_login () для события User Login.

Из-за этого соглашения базовые события упоминаются как "ловушки" и появляются с именами, такими как "hook_user_login" и "hook_user_authenticate ()" в документации API Drupal.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...