O que significa o termo "gancho" na programação?

248

Recentemente, ouvi o termo "gancho" enquanto conversava com algumas pessoas sobre um programa que estava escrevendo. Não tenho certeza exatamente do que esse termo implica, embora tenha deduzido da conversa que gancho é um tipo de função. Procurei uma definição, mas não consegui encontrar uma boa resposta. Alguém poderia me dar uma idéia do que esse termo geralmente significa e talvez um pequeno exemplo para ilustrar a definição?

Chris
fonte
3
Consulte Hooking @ Wikipedia . O link está oculto em uma das respostas com menos votos.
Palec

Respostas:

143

Essencialmente, é um lugar no código que permite que você toque em um módulo para fornecer um comportamento diferente ou reagir quando algo acontecer.

Micah
fonte
7
É semelhante a um retorno de chamada?
Chris
19
Os ganchos geralmente (mas nem sempre) usam funções de retorno de chamada. Por exemplo, você pode conectar um sistema de eventos usando "hookEvent (Events.STARTUP, myCallbackFunction)". Você está passando um ponteiro de função para a função hookEvent, para que ele saiba qual função chamar quando o evento ocorrer. Espero que ajude :-)
William Brendel
6
exatamente. Um retorno de chamada é um "tipo" de gancho.
Miquéias
21
hum ... não. Um retorno de chamada é um retorno de chamada e não tem nada a ver com ganchos, eles são simplesmente USADOS para a IMPLEMENTAÇÃO de métodos de gancho. Os retornos de chamada são ponteiros (RELJMP) para funções / métodos / procedimentos (CALL), ganchos são modificações para aplicativos em execução.
specializt
1
@SahilBabbar Não. Uma interrupção faz com que as instruções em algum local especificado (a interrupção) sejam executadas. No entanto, você pode se conectar ao processo de tratamento de interrupções, por exemplo, modificando a tabela que lista os locais dos manipuladores de interrupções, para que seu código seja chamado primeiro na interrupção (e, em seguida, seu código chamaria o código de tratamento de interrupções anteriormente presente, em uma maneira em cadeia)
David Tonhofer
77

Um gancho é uma funcionalidade fornecida pelo software para que os usuários desse software tenham seu próprio código chamado em determinadas circunstâncias. Esse código pode aumentar ou substituir o código atual.

Antigamente, quando os computadores eram verdadeiramente pessoais e os vírus eram menos comuns (estou falando dos anos 80), era tão simples quanto aplicar o próprio software do sistema operacional para ligar para o seu código. Lembro-me de escrever uma extensão para a linguagem Applesoft BASIC no Apple II que simplesmente conectou meu código ao interpretador BASIC injetando uma chamada no meu código antes que qualquer linha fosse processada.

Alguns computadores tinham ganchos pré-projetados, um exemplo é o fluxo de E / S no Apple II. Ele usou esse gancho para injetar todo o subsistema de disco (as ROMs Apple II foram originalmente construídas nos dias em que os cassetes eram o principal meio de armazenamento dos PCs). Você controlava os discos imprimindo o código ASCII 4 ( CTRL-D) seguido do comando que você queria executar, em seguida CR, a , e foi interceptado pelo subsistema do disco, que havia se ligado às rotinas de impressão da Apple ROM.

Então, por exemplo, as linhas:

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

listaria o conteúdo do disco e reinicializaria a máquina. Isso permitiu truques como proteger seus programas BASIC, definindo a primeira linha como:

123 REM XIN#6

usando POKEpara inserir o CTRL-Dcaractere onde Xestava. Então, qualquer um que tentar listar sua fonte enviaria a sequência de reinicialização através das rotinas de saída onde o subsistema de disco a detectaria.

Esse é frequentemente o tipo de truque que tínhamos que recorrer, para obter o comportamento que queríamos.

Atualmente, com o sistema operacional mais seguro, ele oferece facilidades para ganchos, já que não é mais necessário modificar o sistema operacional "em voo" ou no disco.

Eles já existem há muito tempo. Os mainframes os possuíam (chamados de saídas) e uma grande quantidade de software de mainframe usa esses recursos até agora. Por exemplo, o sistema de controle de código-fonte gratuito que acompanha o z / OS (chamado SCLM) permite substituir completamente o subsistema de segurança simplesmente colocando seu próprio código na saída.

paxdiablo
fonte
41

Em um sentido genérico, um "gancho" é algo que permitirá a você, um programador, visualizar e / ou interagir e / ou alterar algo que já está acontecendo em um sistema / programa.

Por exemplo, o Drupal CMS fornece aos desenvolvedores ganchos que permitem que eles executem ações adicionais após a criação de um "nó de conteúdo". Se um desenvolvedor não implementar um gancho, o nó será criado normalmente. Se um desenvolvedor implementar um gancho, ele poderá executar algum código adicional sempre que um nó for criado. Esse código pode fazer qualquer coisa, incluindo reverter e / ou alterar a ação original. Também poderia fazer algo não relacionado inteiramente à criação do nó.

Um retorno de chamada pode ser considerado como um tipo específico de gancho. Ao implementar a funcionalidade de retorno de chamada em um sistema, esse sistema permite que você chame algum código adicional após a conclusão de uma ação. No entanto, ligar (como um termo genérico) não se limita a retornos de chamada.

Outro exemplo. Às vezes, os desenvolvedores da Web se referem a nomes de classes e / ou IDs em elementos como ganchos. Isso porque, ao colocar o ID / nome da classe em um elemento, eles podem usar o Javascript para modificar esse elemento ou "conectar-se" ao documento da página. (isso está ampliando o significado, mas é comumente usado e vale a pena mencionar)

Alan Storm
fonte
O que você quer dizer com "conectar-se ao documento da página"? Você poderia dar um exemplo? Eu entendi o primeiro exemplo - fornecer um ID a um elemento html para que você possa usar o javacript para modificar o elemento.
committedandroider
21

Simples disse:

Um gancho é um meio de executar código personalizado (função) antes, depois ou em vez do código existente. Por exemplo, uma função pode ser gravada para "conectar" ao processo de logon para executar uma função Captcha antes de continuar com o processo normal de logon.

Joseph Vernice
fonte
Melhor resposta imo
Daniel
15

Enganchar na programação é uma técnica que utiliza os chamados ganchos para fazer uma cadeia de procedimentos como manipulador de eventos.

geowa4
fonte
15

Ganchos são uma categoria de função que permite que o código base chame o código de extensão. Isso pode ser útil em situações nas quais um desenvolvedor principal deseja oferecer extensibilidade sem expor seu código.

Um uso de ganchos está no desenvolvimento de mod de videogame. Um jogo pode não permitir que os desenvolvedores de mods estendam a funcionalidade básica, mas ganchos podem ser adicionados pelos desenvolvedores principais da biblioteca de mods. Com esses ganchos, desenvolvedores independentes podem ter seu código personalizado chamado para qualquer evento desejado, como carregamento de jogos, atualizações de inventário, interações entre entidades, etc.

Um método comum de implementação é fornecer a uma função uma lista vazia de retornos de chamada e expor a capacidade de estender a lista de retornos de chamada. O código base sempre chamará a função no mesmo momento e em tempo adequado, mas, com uma lista de retorno de chamada vazia, a função não fará nada. Isso ocorre por design.

Um terceiro, então, tem a oportunidade de escrever código adicional e adicionar seu novo retorno de chamada à lista de retorno de chamada do gancho. Com nada mais que uma referência dos ganchos disponíveis, eles estenderam a funcionalidade com risco mínimo ao sistema básico.

Hooks não permitem que os desenvolvedores façam algo que não possa ser feito com outras estruturas e interfaces. Eles são uma escolha a ser feita levando em consideração a tarefa e os usuários (desenvolvedores de terceiros).

Para esclarecimento: um gancho permite a extensão e pode ser implementado usando retornos de chamada. Os retornos de chamada geralmente não passam de um ponteiro de função; o endereço calculado de uma função. Parece haver confusão em outras respostas / comentários.

Jack Stout
fonte
4

Hook indica um local no código em que você envia um evento de determinado tipo e, se esse evento foi registrado anteriormente com uma função adequada para retornar a chamada, ele seria tratado por essa função registrada, caso contrário, nada acontece.

urgente
fonte
2

ganchos podem ser executados quando alguma condição é encontrada. por exemplo, algumas mudanças de variáveis ​​ou alguma ação é chamada ou algum evento acontece. ganchos podem entrar no processo e mudar as coisas ou reagir a mudanças.

dusoft
fonte
1

Frequentemente, a conexão refere-se à conexão de mensagens do Win32 ou aos equivalentes Linux / OSX, mas a conexão mais genericamente é simplesmente notificar outro objeto / janela / programa / etc que você deseja que seja notificado quando uma ação especificada acontecer. Por exemplo: Todas as janelas do sistema notificam você quando estão prestes a fechar.

Como regra geral, enganchar é um tanto arriscado, pois fazê-lo sem entender como afeta o sistema pode levar à instabilidade ou ao comportamento inesperado. Também pode ser MUITO útil em determinadas circunstâncias, pensou. Por exemplo: o FRAPS o utiliza para determinar em quais janelas ele deve mostrar seu contador de FPS.

Toji
fonte
1

Uma cadeia de ganchos é um conjunto de funções em que cada função chama a próxima. O que é significativo em uma cadeia de ganchos é que um programador pode adicionar outra função à cadeia em tempo de execução. Uma maneira de fazer isso é procurar um local conhecido onde o endereço da primeira função em uma cadeia é mantido. Você salva o valor desse ponteiro de função e sobrescreve o valor no endereço inicial pelo endereço da função que deseja inserir na cadeia de ganchos. A função é chamada, faz seus negócios e chama a próxima função na cadeia (a menos que você decida de outra forma). Naturalmente, existem várias outras maneiras de criar uma cadeia de ganchos, desde a gravação direta na memória até o uso dos recursos de metaprogramação de linguagens como Ruby ou Python.

Um exemplo de uma cadeia de ganchos é a maneira como um aplicativo MS Windows processa mensagens. Cada função na cadeia de processamento processa uma mensagem ou a envia para a próxima função na cadeia.

Joe Soul-portador
fonte
1

No sistema de gerenciamento de conteúdo Drupal, 'gancho' tem um significado relativamente específico. Quando ocorre um evento interno (como criação de conteúdo ou login do usuário, por exemplo), os módulos podem responder ao evento implementando uma função especial "hook". Isso é feito através da convenção de nomenclatura - [your-plugin-name] _user_login () para o evento Login do Usuário, por exemplo.

Por causa dessa convenção, os eventos subjacentes são referidos como "ganchos" e aparecem com nomes como "hook_user_login" e "hook_user_authenticate ()" na documentação da API do Drupal.

Eaton
fonte
Isso segue a idéia mencionada acima , de um "retorno de chamada" "para reagir quando algo acontecer". Nesse caso, o retorno de chamada não é registrado explicitamente, mas com base na "nomeação mágica". Isto está a ser discutida no drupal.org, consulte Use Symfony EventDispatcher para ganchos de eventos
Donquixote
Para generalizar, um gancho / retorno de chamada / ouvinte pode ser "conhecido pelo código de chamada" de maneiras diferentes (sem dizer que isso está completo): 1. funções com nome mágico 2. classes com nome mágico 3. funções explicitamente registradas 4. funções explicitamente registradas 4. explicitamente objetos registrados (ouvintes, assinantes, observadores) 5. nomes de classe registrados explicitamente (+ argumentos construtores opcionais), a serem instanciados antes que o gancho seja acionado. 6. modificando o código de chamada
donquixote
1

Em MUITO curto, você pode alterar o código de uma chamada de API, como MessageBoxpara onde ele executa uma função diferente editada por você (globalmente funcionará em todo o sistema, localmente, em todo o processo).

Kenny Barker
fonte