Недавно я услышал термин "крючок" во время разговора с некоторыми людьми о программе, которую я писал. Я не уверен точно, что подразумевает этот термин, хотя я вывел из беседы, что крючок - это тип функции. Я искал определение, но не смог найти хороший ответ. Кто-нибудь сможет дать мне представление о том, что этот термин вообще означает и, возможно, небольшой пример, чтобы проиллюстрировать определение?
Что подразумевается под термином "крючок" в программировании?
Ответ 1
По сути, это место в коде, которое позволяет вам подключиться к модулю, чтобы либо различать поведение, либо реагировать, когда что-то происходит.
Ответ 2
Крюк - это функциональность, предоставляемая программным обеспечением для пользователей этого программного обеспечения, чтобы их собственный код вызывался при определенных обстоятельствах. Этот код может увеличить или заменить текущий код.
В прежние времена, когда компьютеры были действительно личными, а вирусы были менее распространены (я говорю 80-е годы), было так же просто, как исправление самого программного обеспечения операционной системы, чтобы вызвать ваш код. Я помню, как писал расширение на Applesoft BASIC на Apple II, которое просто подключило мой код к интерпретатору BASIC, введя вызов моего кода до того, как какая-либо из строк была обработана.
На некоторых компьютерах были запрограммированные крючки, одним из примеров которых был поток ввода-вывода на Apple II. Он использовал такой крючок для ввода всей дисковой подсистемы (Apple II ROM были первоначально построены в те дни, когда кассеты были основным носителем для ПК). Вы управляли дисками, распечатав код ASCII 4 (CTRL-D
), а затем команду, которую вы хотели выполнить, а затем CR
, и она была перехвачена подсистемой диска, которая подключилась к программам печати Apple ROM.
Так, например, строки:
PRINT CHR(4);"CATALOG"
PRINT CHR(4);"IN#6"
будет перечислять содержимое диска, а затем повторно инициализировать машину. Это позволило сделать такие трюки, как защита ваших программ BASIC, установив первую строку как:
123 REM XIN#6
затем используя POKE
, чтобы вставить символ CTRL-D
, где был X
. Затем любой, кто пытается перечислить ваш источник, отправит последовательность повторного инициализации через выходные процедуры, в которых подсистема диска обнаружит ее.
То, что часто приходилось прибегать к обману, чтобы получить то поведение, которое мы хотели.
В настоящее время, когда операционная система более безопасна, она предоставляет средства для самих крючков, поскольку вы больше не должны изменять операционную систему "в полете" или на диске.
Они давно существуют. Мейнфреймы имели их (называемые выходами), и большое количество программного обеспечения для мэйнфреймов использует эти объекты даже сейчас. Например, система управления свободным исходным кодом, которая поставляется с z/OS (называемая SCLM), позволяет полностью заменить подсистему безопасности, просто поместив свой собственный код в выход.
Ответ 3
В общем смысле "крючок" - это то, что позволит вам, программисту, просматривать и/или взаимодействовать и/или изменять что-то, что уже происходит в системе/программе.
Например, Drupal CMS предоставляет разработчикам перехваты, позволяющие им выполнять дополнительные действия после создания "контента node". Если разработчик не реализует крючок, создается node за нормальный. Если разработчик реализует крючок, он может запускать некоторый дополнительный код всякий раз, когда создается node. Этот код может делать все, включая откат и/или изменение исходного действия. Он также может полностью сделать что-то, не связанное с созданием node.
Обратный вызов можно рассматривать как определенный тип крючка. Внедряя функции обратного вызова в систему, эта система позволяет вам вызвать дополнительный код после завершения действия. Однако привязка (как общий термин) не ограничивается обратными вызовами.
Другой пример. Иногда веб-разработчики будут ссылаться на имена классов и/или идентификаторы на элементах как на крючки. Это связано с тем, что, помещая имя идентификатора/класса в элемент, они могут затем использовать Javascript для изменения этого элемента или "привязки" к документу страницы. (это растягивает смысл, но обычно используется и стоит упомянуть)
Ответ 4
Hooking в программировании - это метод, использующий так называемые крючки для создания цепочки процедур как обработчика событий.
Ответ 5
Крюки - это категория функций, которая позволяет базовому коду вызывать код расширения. Это может быть полезно в ситуациях, когда основной разработчик хочет предложить расширяемость, не подвергая их код.
Одно использование крючков в разработке мода видеоигр. Игра может не позволить разработчикам мод расширять базовую функциональность, но крючки могут быть добавлены разработчиками основной библиотеки мод. С помощью этих крючков независимые разработчики могут иметь свой собственный код, вызванный любым желаемым событием, таким как загрузка игры, обновления инвентаря, взаимодействия с объектами и т.д.
Общим методом реализации является предоставление функции пустой список обратных вызовов, а затем возможность расширения списка обратных вызовов. Базовый код всегда будет вызывать функцию в одно и то же время, но с пустым списком обратных вызовов функция ничего не делает. Это по дизайну.
Затем у третьей стороны есть возможность написать дополнительный код и добавить свой новый обратный вызов в список обратного вызова крюка. Имея не более чем ссылку на доступные крючки, они имеют расширенную функциональность с минимальным риском для базовой системы.
Крючки не позволяют разработчикам делать что-либо, что не может быть сделано с другими структурами и интерфейсами. Они могут быть сделаны с учетом задачи и пользователей (сторонних разработчиков).
Для пояснения: крючок разрешает расширение и может быть реализован с использованием обратных вызовов. Обратные вызовы обычно представляют собой не что иное, как указатель на функцию; вычисленный адрес функции. В других ответах/комментариях, похоже, есть путаница.
Ответ 6
Крюк обозначает место в коде, в котором вы отправляете событие определенного типа, и если это событие было зарегистрировано ранее с надлежащей функцией для обратного вызова, тогда это будет обрабатываться этой зарегистрированной функцией, иначе ничего не произойдет.
Ответ 7
Простой сказал:
Крюк - это средство выполнения пользовательского кода (функции) либо до, после, либо вместо существующего кода. Например, функция может быть записана для "перехвата" в процессе входа в систему, чтобы выполнить функцию Captcha, прежде чем продолжить обычный процесс регистрации.
Ответ 8
крючки могут выполняться при возникновении некоторого условия. например некоторые переменные изменения или какое-то действие вызывается или происходит какое-то событие. крючки могут вводить в процесс и изменять вещи или реагировать на изменения.
Ответ 9
Зачастую привязка относится к подключению сообщений Win32 или эквивалентам Linux/OSX, но более общий способ подключения - это просто уведомление другого объекта/окна/программы/и т.д., которые вы хотите получать, когда будет указано указанное действие. Например: наличие всех окон в системе уведомляет вас о завершении закрытия.
Как правило, перехват является несколько опасным, поскольку делать это, не понимая, как он влияет на систему, может привести к нестабильности или к очень неожиданному поведению. Он также может быть ОЧЕНЬ полезен в определенных обстоятельствах, думал. Например: FRAPS использует его, чтобы определить, в каких окнах он должен показывать счетчик FPS.
Ответ 10
В системе управления контентом Drupal "hook" имеет относительно специфический смысл. Когда происходит внутреннее событие (например, создание контента или вход в систему пользователя), модули могут реагировать на событие, реализуя специальную функцию "hook". Это делается с помощью соглашения об именах - [your-plugin-name] _user_login() для события входа пользователя, например.
Из-за этого соглашения основные события называются "крючками" и отображаются с именами "hook_user_login" и "hook_user_authenticate()" в документации API Drupal.
Ответ 11
Цепь крючков - это набор функций, в которых каждая функция вызывает следующее. Что важно в цепочке крючков, так это то, что программист может добавить еще одну функцию в цепочку во время выполнения. Один из способов сделать это - найти известное место, где сохраняется адрес первой функции в цепочке. Затем вы сохраняете значение этого указателя функции и перезаписываете значение на начальном адресе с адресом функции, которую вы хотите вставить в цепочку крючков. Затем функция вызывается, выполняет свою деятельность и вызывает следующую функцию в цепочке (если вы не решите иначе). Естественно, существует целый ряд других способов создания цепочки крючков, от прямой записи в память до использования средств метапрограммирования таких языков, как Ruby или Python.
Примером цепочки крючков является способ, которым приложение MS Windows обрабатывает сообщения. Каждая функция в цепочке обработки обрабатывает сообщение или отправляет его следующей функции в цепочке.
Ответ 12
В ОЧЕНЬ коротком, вы можете изменить код вызова API, например MessageBox
, туда, где он выполняет другую функцию, отредактированную вами (глобально будет работать в системном масштабе, локально будет работать весь процесс).