Что подразумевается под термином "крючок" в программировании?


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

12 191

12 ответов:

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

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

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

некоторые компьютеры были предварительно разработаны крючки, одним из примеров является поток ввода / вывода на Apple II. он использовал такой крюк, чтобы ввести всю дисковую подсистему (Apple II ПЗУ были первоначально построены в те дни, когда кассеты были основным носителем данных для ПК). Вы управляли дисками с помощью печати код ASCII 4 (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), позволяет полностью заменить подсистему безопасности, просто поместив свой собственный код в выход.

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

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

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

другой пример. Иногда Веб Разработчики будут ссылаться на имена классов и / или идентификаторы элементов как на крючки. Это связано с тем, что, поместив имя ID/class на элемент, они могут затем использовать Javascript для изменения этого элемента или "подключаться" к документу страницы. (это растягивает смысл, но он обычно используется и стоит упомянуть)

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

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

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

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

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

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

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

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

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

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

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

часто зацепление относится к Win32 message hooking или эквиваленты Linux/OSX, но в более общем виде подключение просто уведомляет другой объект/окно/программу/etc, что вы хотите получать уведомления, когда происходит указанное действие. Например: имея все окна в системе уведомить вас, как они собираются закрыть.

Как правило, зацепление является несколько опасным, так как делать это без понимания того, как это влияет на систему может привести к нестабильности или сама аренда неожиданное поведение. Это также может быть очень полезно в определенных обстоятельствах, подумал он. Например: FRAPS использует его, чтобы определить, какие окна он должен показать счетчик кадров в секунду на.

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

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

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

пример цепочки крючков-это способ, которым приложение MS Windows обрабатывает сообщения. Каждая функция в цепочке обработки либо обрабатывает сообщение, либо отправляет его следующей функции цепь.

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