我最近在与一些人谈论我正在编写的程序时听到了"钩子"一词.虽然我从对话中推断钩子是一种函数,但我不确定这个术语的含义.我搜索了一个定义,但无法找到一个好的答案.有人能够让我知道这个术语通常意味着什么,也许是一个小例子来说明这个定义?
Mic*_*cah 137
从本质上讲,它是代码中的一个位置,允许您接入模块以提供不同的行为或在发生某些事情时做出反应.
pax*_*blo 76
钩子是由软件提供的功能,用于该软件的用户在某些情况下调用他们自己的代码.该代码可以扩充或替换当前代码.
在过去,计算机真正是个人化的,病毒不那么流行(我说的是80年代),就像修补操作系统软件本身来调用你的代码一样简单.我记得在Apple II上编写了Applesoft BASIC语言的扩展,它简单地将我的代码挂钩到BASIC解释器,方法是在处理任何一行之前调用我的代码.
有些计算机有预先设计的钩子,其中一个例子是Apple II上的I/O流.它使用这样的钩子来注入整个磁盘子系统(Apple II ROM最初是在盒式磁带是PC的主要存储介质的时代制造的).您通过打印 ASCII代码4(CTRL-D)后跟您要执行的命令a CR来控制磁盘,并且它被磁盘子系统拦截,该子系统已连接到Apple ROM打印例程.
例如,行:
PRINT CHR(4);"CATALOG"
PRINT CHR(4);"IN#6"
Run Code Online (Sandbox Code Playgroud)
列出磁盘内容然后重新初始化机器.这允许通过将第一行设置为保护您的BASIC程序的技巧:
123 REM XIN#6
Run Code Online (Sandbox Code Playgroud)
然后使用POKE将CTRL-D字符插入到的位置X.然后,任何试图列出源的人都会通过磁盘子系统检测到的输出例程发送重新初始化序列.
这通常是我们不得不诉诸的一种技巧,以获得我们想要的行为.
如今,随着操作系统更加安全,它为钩子本身提供了便利,因为您不再需要"在飞行中"或在磁盘上修改操作系统.
他们已经存在了很长时间.大型机有它们(称为出口),大量的大型机软件甚至现在也使用这些设备.例如,z/OS附带的免费源代码控制系统(称为SCLM)允许您通过简单地将自己的代码放在出口中来完全替换安全子系统.
Ala*_*orm 38
从一般意义上讲,"钩子"可以让您,程序员,查看和/或交互和/或改变系统/程序中已经发生的事情.
例如,Drupal CMS为开发人员提供了钩子,让他们在创建"内容节点"后采取其他操作.如果开发人员没有实现钩子,则按正常方式创建节点.如果开发人员实现了一个钩子,那么只要创建一个节点,他们就可以运行一些额外的代码.此代码可以执行任何操作,包括回滚和/或更改原始操作.它也可以完全与节点创建无关.
回调可以被认为是一种特定的钩子.通过在系统中实现回调功能,该系统允许您在操作完成后调用一些其他代码.但是,挂钩(作为通用术语)不仅限于回调.
另一个例子.有时Web开发人员会将元素上的类名和/或ID称为钩子.这是因为通过将ID /类名放在元素上,然后他们可以使用Javascript来修改该元素,或者"挂钩"到页面文档.(这是拉伸意义,但它是常用的,值得一提)
Jac*_*out 15
钩子是一类功能,允许基本代码调用扩展代码.这在核心开发人员希望在不暴露其代码的情况下提供可扩展性的情况下非常有用.
钩子的一种用法是在视频游戏模型开发中.游戏可能不允许mod开发人员扩展基本功能,但是核心mod库开发人员可以添加钩子.通过这些钩子,独立开发人员可以根据任何所需事件调用自定义代码,例如游戏加载,库存更新,实体交互等.
一种常见的实现方法是为函数提供一个空的回调列表,然后公开扩展回调列表的能力.基本代码将始终在相同和适当的时间调用该函数,但是,使用空回调列表,该函数不执行任何操作.这是设计的.
然后,第三方有机会编写其他代码并将其新回调添加到钩子的回调列表中.除了可用挂钩的参考之外,它们还以最小的风险扩展了基本系统.
钩子不允许开发人员做任何其他结构和接口无法完成的事情.它们是考虑到任务和用户(第三方开发人员)的选择.
为了澄清:钩子允许扩展,可以使用回调实现.回调通常只是一个函数指针; 计算的函数地址.其他答案/评论似乎有些混乱.
| 归档时间: |
|
| 查看次数: |
93585 次 |
| 最近记录: |