Apa yang dimaksud dengan istilah "pengait" dalam pemrograman?

248

Baru-baru ini saya mendengar istilah "hook" ketika berbicara dengan beberapa orang tentang program yang saya tulis. Saya tidak yakin persis apa arti istilah ini meskipun saya menyimpulkan dari percakapan bahwa hook adalah jenis fungsi. Saya mencari definisi tetapi tidak dapat menemukan jawaban yang bagus. Apakah seseorang dapat memberi saya gambaran tentang apa arti istilah ini secara umum dan mungkin contoh kecil untuk menggambarkan definisi tersebut?

Chris
sumber
3
Lihat Menghubungkan @ Wikipedia . Tautan tersebut dimakamkan di salah satu jawaban pilihan bawah.
Palec

Jawaban:

143

Pada dasarnya itu adalah tempat dalam kode yang memungkinkan Anda untuk memanfaatkan modul untuk memberikan perilaku yang berbeda atau bereaksi ketika sesuatu terjadi.

Mikha
sumber
7
Apakah ini mirip dengan panggilan balik?
Chris
19
Hook sering (tetapi tidak selalu) menggunakan fungsi callback. Misalnya, Anda dapat mengaitkan sistem acara menggunakan "hookEvent (Events.STARTUP, myCallbackFunction)". Anda melewatkan penunjuk fungsi ke fungsi hookEvent, jadi ia tahu fungsi apa yang harus dipanggil saat acara terjadi. Semoga itu bisa membantu :-)
William Brendel
6
persis. Callback adalah "tipe" dari hook.
Micah
21
um ... tidak. Callback adalah callback dan tidak ada hubungannya dengan hook, callback hanya DIGUNAKAN untuk IMPLEMENTASI metode hook. Callback adalah pointer (RELJMP) ke fungsi / metode / prosedur (CALL), kait adalah modifikasi untuk menjalankan aplikasi.
khusus
1
@SahilBabbar No. Interupsi menyebabkan instruksi di beberapa tempat tertentu (interupsi) dieksekusi. Anda mungkin dapat menghubungkan ke proses penanganan interupsi, misalnya dengan memodifikasi tabel yang mencantumkan lokasi penangan interupsi sehingga kode Anda dipanggil pertama pada interupsi (dan kemudian kode Anda akan memanggil kode penanganan interupsi yang ada sebelumnya, di a daisy-chain
way
77

Hook adalah fungsionalitas yang disediakan oleh perangkat lunak bagi pengguna perangkat lunak tersebut untuk memiliki kode mereka sendiri yang dipanggil dalam keadaan tertentu. Kode itu dapat menambah atau mengganti kode saat ini.

Di masa lalu ketika komputer benar-benar pribadi dan virus kurang lazim (saya berbicara tahun 80-an), itu sesederhana menambal perangkat lunak sistem operasi itu sendiri untuk memanggil kode Anda. Saya ingat menulis ekstensi ke bahasa BASIC Applesoft di Apple II yang hanya mengaitkan kode saya ke juru bahasa BASIC dengan menyuntikkan panggilan ke kode saya sebelum salah satu baris diproses.

Beberapa komputer memiliki kait yang telah dirancang sebelumnya, salah satu contohnya adalah aliran I / O pada Apple II. Itu menggunakan pengait seperti itu untuk menyuntikkan seluruh sub-sistem disk (ROM Apple II pada awalnya dibangun pada hari-hari di mana kaset adalah media penyimpanan utama untuk PC). Anda mengendalikan disk dengan mencetak kode ASCII 4 ( CTRL-D) diikuti oleh perintah yang ingin Anda jalankan kemudian a CR, dan itu dicegat oleh sub-sistem disk, yang telah mengaitkan dirinya ke dalam rutinitas print ROM Apple.

Jadi misalnya, baris:

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

akan daftar isi disk kemudian menginisialisasi ulang mesin. Ini memungkinkan trik seperti melindungi program BASIC Anda dengan menetapkan baris pertama sebagai:

123 REM XIN#6

lalu gunakan POKEuntuk memasukkan CTRL-Dkarakter di tempat Xitu. Kemudian, siapa pun yang mencoba membuat daftar sumber Anda akan mengirimkan urutan inisialisasi ulang melalui rutinitas keluaran tempat sub-sistem disk akan mendeteksinya.

Itu sering kali merupakan tipu daya yang harus kita pilih, untuk mendapatkan perilaku yang kita inginkan.

Saat ini, dengan sistem operasi yang lebih aman, ia menyediakan fasilitas untuk kait itu sendiri, karena Anda tidak lagi harus memodifikasi sistem operasi "dalam penerbangan" atau pada disk.

Mereka sudah ada sejak lama. Mainframe memilikinya (disebut pintu keluar) dan banyak perangkat lunak mainframe menggunakan fasilitas itu bahkan sekarang. Sebagai contoh, sistem kontrol kode sumber gratis yang datang dengan z / OS (disebut SCLM) memungkinkan Anda untuk sepenuhnya menggantikan subsistem keamanan dengan hanya menempatkan kode Anda sendiri di pintu keluar.

paxdiablo
sumber
41

Dalam arti umum, "kait" adalah sesuatu yang akan membuat Anda, seorang programmer, melihat dan / atau berinteraksi dengan dan / atau mengubah sesuatu yang sudah terjadi dalam suatu sistem / program.

Misalnya, CMS Drupal memberi para pengembang kait yang memungkinkan mereka mengambil tindakan tambahan setelah "simpul konten" dibuat. Jika pengembang tidak menerapkan pengait, simpul dibuat normal. Jika pengembang mengimplementasikan pengait, mereka dapat menjalankan beberapa kode tambahan setiap kali sebuah simpul dibuat. Kode ini dapat melakukan apa saja, termasuk memutar mundur dan / atau mengubah tindakan asli. Itu juga bisa melakukan sesuatu yang tidak terkait dengan pembuatan simpul sepenuhnya.

Callback dapat dianggap sebagai jenis pengait yang spesifik. Dengan menerapkan fungsi panggilan balik ke dalam suatu sistem, sistem itu memungkinkan Anda memanggil beberapa kode tambahan setelah suatu tindakan selesai. Namun, pengait (sebagai istilah umum) tidak terbatas pada panggilan balik.

Contoh lain. Terkadang Pengembang Web akan merujuk pada nama kelas dan / atau ID pada elemen sebagai pengait. Itu karena dengan menempatkan ID / nama kelas pada suatu elemen, mereka kemudian dapat menggunakan Javascript untuk memodifikasi elemen itu, atau "menghubungkan" ke dokumen halaman. (Ini memperluas makna, tetapi ini biasanya digunakan dan layak disebutkan)

Alan Storm
sumber
Apa yang Anda maksud dengan "menghubungkan ke dokumen halaman"? Bisakah Anda memberi contoh? Saya mengerti contoh pertama - memberikan elemen html id sehingga Anda dapat menggunakan javacript untuk memodifikasi elemen.
berkomitmen dan
21

Kata sederhana:

Hook adalah cara mengeksekusi kode khusus (fungsi) baik sebelum, sesudah, atau alih-alih kode yang ada. Misalnya, suatu fungsi dapat ditulis untuk "menghubungkan" ke dalam proses login untuk menjalankan fungsi Captcha sebelum melanjutkan ke proses login normal.

Joseph Vernice
sumber
Jawaban terbaik imo
Daniel
15

Hooking dalam pemrograman adalah teknik yang menggunakan apa yang disebut hooks untuk membuat rantai prosedur sebagai event handler.

geowa4
sumber
15

Hooks adalah kategori fungsi yang memungkinkan kode dasar untuk memanggil kode ekstensi. Ini dapat berguna dalam situasi di mana pengembang inti ingin menawarkan ekstensibilitas tanpa memaparkan kode mereka.

Salah satu penggunaan kait adalah dalam pengembangan mod video game. Gim mungkin tidak memungkinkan pengembang mod untuk memperluas fungsionalitas basis, tetapi kait dapat ditambahkan oleh pengembang pustaka inti. Dengan kait ini, pengembang independen dapat meminta kode khusus mereka dipanggil untuk setiap acara yang diinginkan, seperti pemuatan game, pembaruan inventaris, interaksi entitas, dll.

Metode implementasi yang umum adalah memberi fungsi daftar kosong callback, lalu memaparkan kemampuan untuk memperpanjang daftar callback. Kode dasar akan selalu memanggil fungsi pada waktu yang sama dan tepat tetapi, dengan daftar panggilan balik kosong, fungsi tidak melakukan apa-apa. Ini dengan desain.

Pihak ketiga, kemudian, memiliki kesempatan untuk menulis kode tambahan dan menambahkan panggilan balik baru mereka ke daftar panggilan balik hook. Dengan tidak lebih dari referensi kait yang tersedia, mereka telah memperluas fungsionalitas dengan risiko minimal ke sistem pangkalan.

Hooks tidak memungkinkan pengembang untuk melakukan apa pun yang tidak dapat dilakukan dengan struktur dan antarmuka lainnya. Mereka adalah pilihan yang harus dibuat dengan mempertimbangkan tugas dan pengguna (pengembang pihak ketiga).

Untuk klarifikasi: sebuah kait memungkinkan ekstensi dan dapat diimplementasikan menggunakan panggilan balik. Callback umumnya tidak lebih dari penunjuk fungsi; alamat yang dihitung dari suatu fungsi. Tampaknya ada kebingungan dalam jawaban / komentar lain.

Jack Stout
sumber
4

Hook menunjukkan tempat dalam kode tempat Anda mengirim suatu peristiwa dengan tipe tertentu, dan jika acara ini didaftarkan sebelumnya dengan fungsi yang tepat untuk menelepon kembali, maka itu akan ditangani oleh fungsi terdaftar ini, jika tidak, tidak ada yang terjadi.

mendesak
sumber
2

kait dapat dieksekusi ketika beberapa kondisi ditemukan. misalnya beberapa perubahan variabel atau beberapa tindakan disebut atau beberapa peristiwa terjadi. kait dapat masuk dalam proses dan mengubah sesuatu atau bereaksi terhadap perubahan.

dusoft
sumber
1

Seringkali hooking mengacu pada hooking pesan Win32 atau yang setara dengan Linux / OSX, tetapi hooking yang lebih umum hanya memberitahukan objek / jendela / program / dll yang ingin Anda beri tahu ketika tindakan tertentu terjadi. Sebagai contoh: Memiliki semua jendela pada sistem memberitahu Anda ketika mereka akan ditutup.

Sebagai aturan umum, mengaitkan agak berbahaya karena melakukannya tanpa memahami bagaimana pengaruhnya terhadap sistem dapat menyebabkan ketidakstabilan atau perilaku yang sangat tidak terduga. Ini juga bisa SANGAT berguna dalam keadaan tertentu, pikir. Sebagai contoh: FRAPS menggunakannya untuk menentukan pada windows mana ia harus menunjukkan penghitung FPS-nya.

Toji
sumber
1

Chain of hooks adalah serangkaian fungsi di mana masing-masing fungsi memanggil fungsi berikutnya. Apa yang penting tentang rantai pengait adalah bahwa seorang programmer dapat menambahkan fungsi lain ke rantai pada saat dijalankan. Salah satu cara untuk melakukan ini adalah dengan mencari lokasi yang diketahui di mana alamat fungsi pertama dalam rantai disimpan. Anda kemudian menyimpan nilai pointer fungsi itu dan menimpa nilai di alamat awal dengan alamat fungsi yang ingin Anda masukkan ke dalam rantai kait. Fungsi kemudian dipanggil, melakukan bisnisnya dan memanggil fungsi berikutnya dalam rantai (kecuali Anda memutuskan sebaliknya). Secara alami, ada sejumlah cara lain untuk membuat rantai pengait, dari menulis langsung ke memori hingga menggunakan fasilitas pemrograman bahasa seperti Ruby atau Python.

Contoh rantai pengait adalah cara aplikasi MS Windows memproses pesan. Setiap fungsi dalam rantai pemrosesan baik memproses pesan atau mengirimnya ke fungsi berikutnya dalam rantai.

Joe Soul-bringer
sumber
1

Dalam sistem manajemen konten Drupal, 'hook' memiliki makna yang relatif spesifik. Ketika acara internal terjadi (seperti pembuatan konten atau login pengguna, misalnya), modul dapat merespons acara dengan menerapkan fungsi "kait" khusus. Ini dilakukan melalui konvensi penamaan - [nama-plugin-Anda] _user_login () untuk acara Login Pengguna, misalnya.

Karena konvensi ini, peristiwa yang mendasarinya disebut sebagai "kait" dan muncul dengan nama seperti "hook_user_login" dan "hook_user_authenticate ()" dalam dokumentasi API Drupal.

Eaton
sumber
Ini mengikuti ide yang disebutkan di atas , tentang "panggilan balik" "untuk bereaksi ketika sesuatu terjadi". Dalam kasus ini, panggilan balik tidak terdaftar secara eksplisit, tetapi didasarkan pada "penamaan ajaib". Ini saat ini dibahas di drupal.org, lihat Menggunakan Symfony EventDispatcher untuk kait acara
donquixote
Untuk menggeneralisasi, hook / callback / listener dapat "diketahui oleh kode panggilan" dengan cara yang berbeda (tidak mengatakan ini lengkap): 1. fungsi sulap bernama 2. kelas sulap nama 3. fungsi terdaftar secara eksplisit 4. fungsi terdaftar secara eksplisit 4. secara eksplisit objek terdaftar (pendengar, pelanggan, pengamat) 5. nama kelas terdaftar secara eksplisit (+ argumen konstruktor opsional), yang akan dipakai sebelum instasi kait. 6. dengan memodifikasi kode panggilan
donquixote
1

Dalam SANGAT singkat, Anda dapat mengubah kode panggilan API seperti MessageBoxke tempat fungsi berbeda diedit oleh Anda (secara global akan bekerja dengan sistem yang luas, secara lokal akan bekerja dengan proses yang luas).

Kenny Barker
sumber