编程中的术语“钩子”是什么意思?

我最近在与一些人谈论我正在编写的程序时听到了“钩子”一词。 虽然我从对话中推断钩子是一种函数,但我不确定这个术语的含义。 我搜索了一个定义,但无法找到一个好的答案。 有人能够让我知道这个术语通常意味着什么,也许是一个小例子来说明这个定义?

12个解决方案

125 votes

从本质上讲,它是代码中的一个位置,允许您接入模块以提供不同的行为或在发生某些事情时做出反应。

Micah answered 2019-04-05T21:56:12Z

68 votes

钩子是由软件提供的功能,用于该软件的用户在某些情况下调用他们自己的代码。 该代码可以扩充或替换当前代码。

在过去,计算机真正是个人化的,病毒不那么流行(我说的是80年代),就像修补操作系统软件本身来调用你的代码一样简单。 我记得在Apple II上编写了Applesoft BASIC语言的扩展,它简单地将我的代码挂钩到BASIC解释器,方法是在处理任何一行之前调用我的代码。

有些计算机有预先设计的钩子,其中一个例子是Apple II上的I / O流。 它使用这样的钩子来注入整个磁盘子系统(Apple II ROM最初是在盒式磁带是PC的主要存储介质的时代制造的)。 您通过打印ASCII代码4(POKE),然后是要执行的命令,然后是CTRL-D来控制磁盘,它被磁盘子系统拦截,该子系统已连接到Apple ROM打印例程。

例如,行:

PRINT CHR(4);"CATALOG"

PRINT CHR(4);"IN#6"

列出磁盘内容然后重新初始化机器。 这允许通过将第一行设置为保护您的BASIC程序的技巧:

123 REM XIN#6

然后使用POKE在X所在的位置插入CTRL-D字符。 然后,任何试图列出源的人都会通过磁盘子系统检测到的输出例程发送重新初始化序列。

这通常是我们不得不诉诸的一种技巧,以获得我们想要的行为。

如今,随着操作系统更加安全,它为钩子本身提供了便利,因为您不再需要“在飞行中”或在磁盘上修改操作系统。

他们已经存在了很长时间。 大型机有它们(称为出口),大量的大型机软件甚至现在也使用这些设备。 例如,z / OS附带的免费源代码控制系统(称为SCLM)允许您通过简单地将自己的代码放在出口中来完全替换安全子系统。

paxdiablo answered 2019-04-05T21:57:06Z

34 votes

从一般意义上讲,“钩子”可以让您,程序员,查看和/或交互和/或改变系统/程序中已经发生的事情。

例如,Drupal CMS为开发人员提供了钩子,让他们在创建“内容节点”后采取其他操作。 如果开发人员没有实现钩子,则按正常方式创建节点。 如果开发人员实现了一个钩子,那么只要创建一个节点,他们就可以运行一些额外的代码。 此代码可以执行任何操作,包括回滚和/或更改原始操作。 它也可以完全与节点创建无关。

回调可以被认为是一种特定的钩子。 通过在系统中实现回调功能,该系统允许您在操作完成后调用一些其他代码。 但是,挂钩(作为通用术语)不仅限于回调。

另一个例子。 有时Web开发人员会将元素上的类名和/或ID称为钩子。 这是因为通过将ID /类名放在元素上,然后他们可以使用Javascript来修改该元素,或者“挂钩”到页面文档。 (这是拉伸意义,但它是常用的,值得一提)

Alan Storm answered 2019-04-05T21:57:49Z

13 votes

编程中的钩子是一种采用所谓的钩子来将一系列过程作为事件处理程序的技术。

geowa4 answered 2019-04-05T21:58:14Z

13 votes

钩子是一类功能,允许基本代码调用扩展代码。 这在核心开发人员希望在不暴露其代码的情况下提供可扩展性的情况下非常有用。

钩子的一种用法是在视频游戏模型开发中。 游戏可能不允许mod开发人员扩展基本功能,但是核心mod库开发人员可以添加钩子。 通过这些钩子,独立开发人员可以根据任何所需事件调用自定义代码,例如游戏加载,库存更新,实体交互等。

一种常见的实现方法是为函数提供一个空的回调列表,然后公开扩展回调列表的能力。 基本代码将始终在相同和适当的时间调用该函数,但是,使用空回调列表,该函数不执行任何操作。 这是设计的。

然后,第三方有机会编写其他代码并将其新回调添加到钩子的回调列表中。 除了可用挂钩的参考之外,它们还以最小的风险扩展了基本系统。

钩子不允许开发人员做任何其他结构和接口无法完成的事情。 它们是考虑到任务和用户(第三方开发人员)的选择。

为了澄清:钩子允许扩展,可以使用回调实现。 回调通常只是一个函数指针; 计算的函数地址。 其他答案/评论似乎有些混乱。

Jack Stout answered 2019-04-05T21:58:45Z

9 votes

简单说:

钩子是在现有代码之前,之后或代替现有代码执行自定义代码(函数)的手段。 例如,可以编写函数以“挂钩”到登录过程中,以便在继续正常登录过程之前执行验证码功能。

Joseph Vernice answered 2019-04-05T21:59:06Z

4 votes

Hook表示代码中您发送某种类型事件的位置,如果此事件之前已使用适当的函数进行回调注册,那么它将由此注册函数处理,否则不会发生任何事情。

urgent answered 2019-04-05T21:59:26Z

2 votes

遇到某些条件时可以执行钩子。 例如 调用某些变量或某些操作或发生某些事件。 钩子可以进入过程并改变事物或对变化作出反应。

dusoft answered 2019-04-05T21:59:46Z

1 votes

通常挂钩是指Win32消息挂钩或Linux / OSX等价物,但更通用的挂钩只是通知另一个对象/窗口/程序/等您希望在指定的操作发生时得到通知。 例如:让系统上的所有窗口通知您即将关闭。

作为一般规则,挂钩有点危险,因为在不了解它如何影响系统的情况下进行挂钩会导致不稳定或出现意外行为。 思想认为,它在某些情况下也非常有用。 例如:FRAPS使用它来确定它应该显示哪个窗口的FPS计数器。

Toji answered 2019-04-05T22:00:07Z

1 votes

在Drupal内容管理系统中,'hook'具有相对特定的含义。 当发生内部事件时(例如,内容创建或用户登录),模块可以通过实现特殊的“钩子”功能来响应事件。 例如,这是通过命名约定 - 用户登录事件的[your-plugin-name] _user_login()来完成的。

由于这种约定,底层事件被称为“钩子”,并在Drupal的API文档中以“hook_user_login”和“hook_user_authenticate()”等名称出现。

Eaton answered 2019-04-05T22:00:39Z

0 votes

钩子链是一组函数,其中每个函数调用下一个函数。 一系列钩子的重要意义在于程序员可以在运行时向链中添加另一个函数。 一种方法是查找保持链中第一个函数的地址的已知位置。 然后保存该函数指针的值,并使用要插入到挂钩链中的函数的地址覆盖初始地址处的值。 然后调用该函数,执行其业务并调用链中的下一个函数(除非您另有决定)。 当然,还有许多其他方法可以创建一系列钩子,从直接写入内存到使用Ruby或Python等语言的元编程工具。

挂钩链的一个示例是MS Windows应用程序处理消息的方式。 处理链中的每个函数都处理消息或将消息发送到链中的下一个函数。

Joe Soul-bringer answered 2019-04-05T22:01:00Z

0 votes

非常简短,您可以将API调用的代码(例如MessageBox)更改为执行由您编辑的不同功能(全局将在系统范围内工作,本地将在进程范围内工作)。

Kenny Barker answered 2019-04-05T22:01:29Z

在计算机编程里pi是什么意思,编程中的术语“钩子”是什么意思?相关推荐

  1. 转]一个计算机专业学生几年的Java编程经验汇总

    1. 关于动态加载机制?? 学习Java比C++更容易理解OOP的思想,毕竟C++还混合了不少面向过程的成分.很多人都能背出来Java语言的特点,所谓的动态加载机制等等.当然概念往往是先记住而后消化的 ...

  2. 函数式编程里的Materialization应该翻译成什么?

    Materialization是函数式编程里的一个专业术语, 用于特指函数式编程中查询被实际执行并生成结果的这一过程. 首先, 搜了一下中文资料, 暂时没有对该词的中文翻译,  CSDN\博客园\阿里 ...

  3. Java面试题 20在面向对象编程里,经常使用is-a来说明对象之间的继承关系

    Java面试题 20在面向对象编程里,经常使用is-a来说明对象之间的继承关系,下列对象中不具备继承关系的是?() A:手机与小米手机 B:企业家与雷军 C:编程语言与Java D:中国与北京 类之间 ...

  4. 在 Windows 中编程 Raspberry Pi Pico 的初学者指南

    在 Windows 中编程 Raspberry Pi Pico 的初学者指南 在本教程中,我们将了解如何在 Windows 系统中安装和设置用于编程 Raspberry Pi Pico 的 Visua ...

  5. 学计算机编程我有什么好处,学编程到底有什么好处?我发现了这三个秘密!

    乔布斯:每个人都应该学习编程,因为它将教会你如何思考. 最近,和家长聊起了孩子学编程前后的变化. 这位家长告诉我,孩子学编程前后变化真的很大,起初孩子的积极性不怎么好,但学了编程之后,各方面得到了很好 ...

  6. 一个计算机专业学生几年的Java编程经验汇总

    在javaeye上无意中发现这份转帖,对j2se,j2ee各方面都有涉及,一口气看了j2se的部分,写得挺不错的,转过来给大家分享. 一个计算机专业学生几年的Java编程经验汇总 ========== ...

  7. Java:计算机编程语言Java的简介、安装(编程环境/工具)、学习路线(如何学习Java以及几十项代码编程案例分析)之详细攻略

    Java:计算机编程语言Java的简介.安装(编程环境/工具).学习路线(如何学习Java以及几十项代码编程案例分析)之详细攻略 目录 Java的简介 1.Java的工作原理--基于Eclipse等编 ...

  8. 机器人编程需要c语言吗,机器人编程和计算机编程有什么不一样

    原标题:机器人编程和计算机编程有什么不一样 格物斯坦小坦克就大家关心的机器人编程教育和计算机编程教育做一个对比,这样帮助大家更好地了解二者的共同性和区别. 机器人编程的目的是让学生学会组装.搭建和编写 ...

  9. 关于编程里的那些ABC

    关于编程里的那些ABC 本文主要是一篇基础类整理文章,按照26个字母的排序,整理出一些在编程上比较重要的工具.框架.语言等等. A - Angular.JS 如果被设计用来构建 Web 应用程序的话, ...

  10. ChatGPT 正在杀死编程里的乐趣

    多年以来,编程一直是我生命最重要的快乐来源之一,我从没细想过这份快乐能伴随我多久.但就在几天前,在观摩了 ChatGPT 替我编写一个 Python 程序的全过程后,我突然有种强烈的感觉:不远的将来, ...

最新文章

  1. R构建Logistic回归实战(Logistic Regression)
  2. python爬虫能干什么-Python爬虫能做什么
  3. Python环境的安装
  4. 移植MT76x8 私有WIFI驱动V4.1.0.0到Openwrt 18.06所遇到的坑
  5. g11 android 4.4,HTC G11 Incredible S 稳定流畅Android4.0.4华丽体验Sense4.1 省电耐用
  6. imp 只导入索引_Elasticsearch系列---实战零停机重建索引
  7. 字体文件夹_下载了各种五花八门的CAD字体,为什么打开图纸还是找不到字体?...
  8. hdu 1242 Rescue(BFS入门)
  9. 洛谷P1005 矩阵取数游戏
  10. mysql图书管理系统er图,图书管理系统er图.doc
  11. 软考(一)-软考开始了
  12. 星空下的新赛点,民营航空迎来新机会
  13. Python爬虫分析,全国结婚率连续5年下降,这届年轻人,为什么不敢结婚?
  14. 计算机九九乘法口诀表,九九乘法口诀表
  15. C#实现程序一次打开两个窗口,两个窗口分别放置在两个屏幕
  16. rem css calc,关于使用rem单位、css函数calc()进行自适应布局
  17. vscode正则替换:大写改小写
  18. 今天上班了,周末跟随公司组织的旅游去了四川省南充市阆中市参观了张飞庙了解了一下“张飞身葬阆中,头葬云阳”的故事。...
  19. 华为完成首个5G测试;央行搭建区块链平台;苹果将于今夜凌晨举行发布会;蔚来汽车明日在美上市; | 雷锋网9月12日消息...
  20. shienblink 振动/敲击检测传感器详解

热门文章

  1. div两侧的boder断开 消失 奇怪
  2. php字符串转拼音,php程序如何把中文字符转换为拼音
  3. IPO笔记之:关于自然人股东投资移民变更身份对IPO事宜之影响
  4. Python3 抓取微信账单信息
  5. 头条推荐量越来越少,是否还要坚持下去?
  6. curl实现自动重启飞鱼星VW1900路由器
  7. jQuery easyUI设置表格中的背景色
  8. opengl 3D平衡球小游戏
  9. Eclipse中导入项目前有红叉提示但是项目内容不报错解决办法
  10. 折叠屏,vivo的高端打手?