प्रोग्रामिंग में "हुक" शब्द का क्या अर्थ है?


248

मैंने हाल ही में एक कार्यक्रम के बारे में कुछ लोगों से बात करते हुए "हुक" शब्द सुना, जो मैं लिख रहा था। मैं अनिश्चित हूं कि यह शब्द क्या अर्थ रखता है, हालांकि मैं इस बातचीत से सहमत था कि एक हुक एक प्रकार का कार्य है। मैंने एक परिभाषा खोजी, लेकिन एक अच्छा जवाब नहीं मिला। क्या कोई मुझे इस बात का अंदाजा दे पाएगा कि इस शब्द का आम तौर पर क्या अर्थ होता है और शायद परिभाषा बताने के लिए एक छोटा सा उदाहरण?


3
देखें हुकिंग @ विकिपीडिया । लिंक को निचले वोट वाले उत्तरों में से एक में दफन किया गया है।
पालेक

जवाबों:


143

अनिवार्य रूप से यह कोड में एक जगह है जो आपको मॉड्यूल में टैप करने के लिए अलग-अलग व्यवहार प्रदान करने या कुछ होने पर प्रतिक्रिया करने की अनुमति देता है।


7
क्या यह कॉलबैक के समान है?
क्रिस

19
हुक अक्सर (लेकिन हमेशा नहीं) कॉलबैक फ़ंक्शन का उपयोग करते हैं। उदाहरण के लिए, आप "हुकएवेंट (Event.STARTUP, myCallbackFunction)" का उपयोग करके एक ईवेंट सिस्टम को हुक कर सकते हैं। आप एक फ़ंक्शन पॉइंटर को हुकएवेंट फ़ंक्शन में पास कर रहे हैं, इसलिए यह जानता है कि जब घटना होती है तो किस फ़ंक्शन को कॉल करना है। आशा है कि मदद करता है :-)
विलियम ब्रेंडल

6
बिल्कुल सही। कॉलबैक हुक का एक "प्रकार" है।
मीका

21
उम नहीं। एक कॉलबैक एक कॉलबैक है और हुक के साथ कुछ नहीं करना है, कॉलबैक हुक-विधियों के कार्यान्वयन के लिए बस उपयोग किया जाता है। कॉलबैक कार्य / विधियों / प्रक्रियाओं (CALL) के संकेत (RELJMP) हैं, हुक चल रहे अनुप्रयोगों के लिए संशोधन हैं।
specializt

1
@SahilBabbar No. एक निर्दिष्ट स्थान पर निर्देशों का कारण बनता है (व्यवधान) निष्पादित किया जाना। हालाँकि, आप इंटरप्ट हैंडलिंग प्रक्रिया में हुक लगाने में सक्षम हो सकते हैं, उदाहरण के लिए, टेबल को इंटरप्ट हैंडलर के स्थानों को सूचीबद्ध करके संशोधित करना ताकि आपका कोड पहले बाधित हो जाए (और फिर आपका कोड पहले से मौजूद इंटरप्ट हैंडलिंग कोड को कॉल करेगा, डेज़ी-चेन तरीके से)
डेविड टोनहोफर

77

उस सॉफ़्टवेयर के उपयोगकर्ताओं के लिए एक हुक सुविधा प्रदान की जाती है, जिसमें कुछ विशेष परिस्थितियों में अपना स्वयं का कोड होता है। वह कोड वर्तमान कोड को बढ़ा या बदल सकता है।

पुराने दिनों में जब कंप्यूटर वास्तव में व्यक्तिगत थे और वायरस कम प्रचलित थे (मैं 80 के दशक की बात कर रहा हूं), यह उतना ही सरल था जितना कि आपके कोड को कॉल करने के लिए ऑपरेटिंग सिस्टम सॉफ़्टवेयर को पैच करना। मुझे याद है कि Apple II पर Applesoft BASIC भाषा के लिए एक एक्सटेंशन लिखना जो बस किसी भी लाइन के संसाधित होने से पहले मेरे कोड पर कॉल को इंजेक्ट करके BASIC दुभाषिया में मेरे कोड को झुका देता था।

कुछ कंप्यूटरों में पहले से डिज़ाइन किए गए हुक थे, एक उदाहरण Apple II पर I / O स्ट्रीम था। यह पूरे डिस्क उप-प्रणाली को इंजेक्ट करने के लिए इस तरह के हुक का उपयोग करता था (Apple II ROM मूल रूप से उन दिनों में बनाए गए थे जहां कैसेट पीसी के लिए प्राथमिक भंडारण माध्यम थे)। आपने ASCII कोड 4 ( ) को प्रिंट करके डिस्क्स को नियंत्रित CTRL-Dकिया था और उसके बाद कमांड जिसे आप निष्पादित करना चाहते थे CR, और इसे डिस्क उप-सिस्टम द्वारा इंटरसेप्ट किया गया था, जिसने खुद को Apple ROM प्रिंट रूटीन में हुक किया था।

उदाहरण के लिए, लाइनें:

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

डिस्क सामग्री को सूचीबद्ध करेगा फिर मशीन को फिर से शुरू करेगा। इसने इस तरह की तरकीबों की अनुमति दी जैसे कि पहली पंक्ति को निर्धारित करके अपने बुनियादी कार्यक्रमों की रक्षा करना:

123 REM XIN#6

फिर जहां था वहां चरित्र POKEडालने के लिए । फिर, आपके स्रोत को सूचीबद्ध करने का प्रयास करने वाला कोई भी व्यक्ति आउटपुट रूटीन के माध्यम से पुन: इनिशियलाइज़ अनुक्रम भेजेगा जहां डिस्क सब-सिस्टम उसका पता लगाएगा।CTRL-DX

जैसा व्यवहार हम चाहते थे वैसा पाने के लिए अक्सर हमें छल करना पड़ता था।

आजकल, ऑपरेटिंग सिस्टम अधिक सुरक्षित होने के साथ, यह हुक के लिए भी सुविधाएं प्रदान करता है, क्योंकि अब आप ऑपरेटिंग सिस्टम को "इन-फ्लाइट" या डिस्क पर संशोधित करने वाले नहीं हैं।

वे लंबे समय से आसपास हैं । मेनफ्रेम ने उन्हें (एक्सिट्स कहा जाता था) और मेनफ्रेम सॉफ्टवेयर का एक बड़ा सौदा अब भी उन सुविधाओं का उपयोग करता है। उदाहरण के लिए, z / OS (जिसे SCLM कहा जाता है) के साथ आने वाला मुफ्त स्रोत कोड नियंत्रण प्रणाली आपको केवल बाहर निकलने में अपना कोड डालकर सुरक्षा सबसिस्टम को पूरी तरह से बदलने की अनुमति देता है।


41

एक सामान्य अर्थ में, एक "हुक" एक ऐसी चीज है जो आपको एक प्रोग्रामर, दृश्य और / या के साथ बातचीत और / या कुछ को बदलने की अनुमति देता है जो पहले से ही एक सिस्टम / प्रोग्राम में चल रहा है।

उदाहरण के लिए, ड्रुपल सीएमएस डेवलपर्स को हुक के साथ प्रदान करता है जो उन्हें "सामग्री नोड" बनाने के बाद अतिरिक्त कार्रवाई करने देता है। यदि कोई डेवलपर हुक लागू नहीं करता है, तो नोड प्रति सामान्य बनाया जाता है। यदि कोई डेवलपर हुक लागू करता है, तो नोड बनाए जाने पर वे कुछ अतिरिक्त कोड चला सकते हैं। यह कोड कुछ भी कर सकता है, जिसमें वापस रोल करना और / या मूल कार्रवाई को बदलना शामिल है। यह पूरी तरह से नोड निर्माण के लिए असंबंधित कुछ भी कर सकता है।

एक कॉलबैक को एक विशिष्ट प्रकार के हुक के रूप में सोचा जा सकता है। किसी सिस्टम में कॉलबैक कार्यक्षमता को लागू करने से, वह प्रणाली आपको एक कार्रवाई पूरी होने के बाद कुछ अतिरिक्त कोड को कॉल करने देती है। हालांकि, हुकिंग (एक सामान्य शब्द के रूप में) कॉलबैक तक सीमित नहीं है।

एक और उदाहरण। कभी-कभी वेब डेवलपर्स हुक के रूप में तत्वों पर वर्ग के नाम और / या आईडी का उल्लेख करेंगे। ऐसा इसलिए है क्योंकि एक तत्व पर आईडी / वर्ग का नाम रखकर, वे तब उस तत्व को संशोधित करने के लिए जावास्क्रिप्ट का उपयोग कर सकते हैं, या पृष्ठ दस्तावेज़ में "हुक" कर सकते हैं। (यह अर्थ को बढ़ा रहा है, लेकिन आमतौर पर इसका उपयोग किया जाता है और ध्यान देने योग्य है)


"पृष्ठ दस्तावेज़ में हुक" से आपका क्या अभिप्राय है? क्या आप एक उदाहरण दे सकते हैं? मैंने पहला उदाहरण समझा - html एलिमेंट को एक आईडी देना ताकि आप एलीमेंट को संशोधित करने के लिए javacript का उपयोग कर सकें।
committedandroider

21

सरल ने कहा:

एक हुक कस्टम कोड (फ़ंक्शन) को निष्पादित करने का एक साधन है, पहले या बाद में, मौजूदा कोड के बजाय। उदाहरण के लिए, सामान्य लॉगिन प्रक्रिया को जारी रखने से पहले कैप्चा फ़ंक्शन को निष्पादित करने के लिए एक फ़ंक्शन को लॉगिन प्रक्रिया में "हुक" लिखा जा सकता है।


सबसे अच्छा जवाब imo
डैनियल

15

प्रोग्रामिंग में हुकिंग एक ऐसी तकनीक है जो तथाकथित हुक को एक इवेंट हैंडलर के रूप में प्रक्रियाओं की श्रृंखला बनाने के लिए नियोजित करती है।


15

हुक फ़ंक्शन की एक श्रेणी है जो आधार कोड को एक्सटेंशन कोड को कॉल करने की अनुमति देता है। यह उन स्थितियों में उपयोगी हो सकता है जिनमें एक कोर डेवलपर अपने कोड को उजागर किए बिना एक्स्टेंसिबिलिटी की पेशकश करना चाहता है।

हुक का एक उपयोग वीडियो गेम मॉड विकास में है। एक गेम से आधार डेवलपर्स को आधार कार्यक्षमता का विस्तार करने की अनुमति नहीं मिल सकती है, लेकिन हुक को मुख्य मॉड लाइब्रेरी डेवलपर्स द्वारा जोड़ा जा सकता है। इन हुक के साथ, स्वतंत्र डेवलपर्स किसी भी वांछित घटना पर अपने कस्टम कोड को बुला सकते हैं, जैसे कि गेम लोडिंग, इन्वेंट्री अपडेट, इकाई इंटरैक्शन आदि।

कार्यान्वयन का एक सामान्य तरीका एक फ़ंक्शन को कॉलबैक की एक खाली सूची देना है, फिर कॉलबैक की सूची का विस्तार करने की क्षमता को उजागर करना है। आधार कोड हमेशा फ़ंक्शन को समान और उचित समय पर कॉल करेगा, लेकिन खाली कॉलबैक सूची के साथ, फ़ंक्शन कुछ भी नहीं करता है। यह डिजाइन द्वारा है।

एक तृतीय पक्ष, तब अतिरिक्त कोड लिखने और हुक की कॉलबैक सूची में अपना नया कॉलबैक जोड़ने का अवसर होता है। उपलब्ध हुक के संदर्भ से अधिक कुछ नहीं होने के साथ, उन्होंने आधार प्रणाली के लिए न्यूनतम जोखिम पर कार्यक्षमता बढ़ाई है।

हुक डेवलपर्स को कुछ भी करने की अनुमति नहीं देते हैं जो अन्य संरचनाओं और इंटरफेस के साथ नहीं किया जा सकता है। वे कार्य और उपयोगकर्ताओं (थर्ड-पार्टी डेवलपर्स) पर विचार करने के लिए एक विकल्प हैं।

स्पष्टीकरण के लिए: एक हुक एक्सटेंशन की अनुमति देता है और कॉलबैक का उपयोग करके लागू किया जा सकता है। कॉलबैक आमतौर पर एक फ़ंक्शन पॉइंटर से अधिक कुछ नहीं होते हैं; किसी फ़ंक्शन का परिकलित पता। अन्य उत्तरों / टिप्पणियों में भ्रम प्रतीत होता है।


4

हुक कोड में एक जगह को दर्शाता है जहां आप कुछ प्रकार की एक घटना भेजते हैं, और अगर इस घटना को वापस बुलाने के लिए एक उचित फ़ंक्शन के साथ पंजीकृत किया गया था, तो इसे इस पंजीकृत फ़ंक्शन द्वारा नियंत्रित किया जाएगा, अन्यथा कुछ भी नहीं होता है।


2

कुछ हालत का सामना करने पर हुक निष्पादित किए जा सकते हैं। जैसे कुछ परिवर्तनशील परिवर्तन या कुछ क्रिया कहलाती है या कुछ घटना घटती है। हुक प्रक्रिया में प्रवेश कर सकते हैं और चीजों को बदल सकते हैं या परिवर्तनों पर प्रतिक्रिया कर सकते हैं।


1

अक्सर हुकिंग Win32 संदेश हुकिंग को संदर्भित करता है या लिनक्स / OSX समकक्षों , लेकिन अधिक सामान्य रूप से हुकिंग किसी अन्य ऑब्जेक्ट / विंडो / प्रोग्राम / आदि को सूचित करता है जिसे आप निर्दिष्ट कार्रवाई होने पर सूचित करना चाहते हैं। उदाहरण के लिए: सिस्टम पर सभी विंडो होने से आपको सूचित करना होगा क्योंकि वे बंद होने वाले हैं।

एक सामान्य नियम के रूप में, हुकिंग कुछ हद तक खतरनाक है क्योंकि यह समझे बिना कि यह कैसे प्रभावित करता है कि यह प्रणाली अस्थिरता पैदा कर सकती है या बहुत ही कम अप्रत्याशित व्यवहार कर सकती है। यह भी कुछ परिस्थितियों में बहुत उपयोगी हो सकता है, सोचा। उदाहरण के लिए: FRAPS इसका उपयोग यह निर्धारित करने के लिए करता है कि उसे कौन सी विंडो दिखानी चाहिए, यह FPS काउंटर पर है।


1

हुक की एक श्रृंखला फ़ंक्शन का एक सेट है जिसमें प्रत्येक फ़ंक्शन अगले को कॉल करता है। हुक की एक श्रृंखला के बारे में जो महत्वपूर्ण है वह यह है कि एक प्रोग्रामर रन टाइम में श्रृंखला में एक और फ़ंक्शन जोड़ सकता है। ऐसा करने का एक तरीका एक ज्ञात स्थान की तलाश करना है जहां श्रृंखला में पहले फ़ंक्शन का पता रखा जाता है। फिर आप उस फ़ंक्शन पॉइंटर के मान को सहेजते हैं और उस फ़ंक्शन के प्रारंभिक पते पर मूल्य को अधिलेखित करते हैं, जिस फ़ंक्शन के साथ आप हुक श्रृंखला में सम्मिलित करना चाहते हैं। तब फ़ंक्शन को बुलाया जाता है, अपना व्यवसाय करता है और अगले फ़ंक्शन को श्रृंखला में कहता है (जब तक कि आप अन्यथा तय नहीं करते)। स्वाभाविक रूप से, हुक की एक श्रृंखला बनाने से लेकर रूबी या पायथन जैसी भाषाओं की मेटाप्रोग्रामिंग सुविधाओं का उपयोग करने के लिए सीधे लिखने से लेकर कई अन्य तरीके हैं।

हुक की श्रृंखला का एक उदाहरण वह तरीका है जो एक एमएस विंडोज एप्लिकेशन संदेशों को संसाधित करता है। प्रसंस्करण श्रृंखला में प्रत्येक फ़ंक्शन या तो एक संदेश संसाधित करता है या श्रृंखला में अगले फ़ंक्शन को भेजता है।


1

Drupal सामग्री प्रबंधन प्रणाली में, 'हुक' का एक अपेक्षाकृत विशिष्ट अर्थ है। जब कोई आंतरिक घटना होती है (जैसे सामग्री निर्माण या उपयोगकर्ता लॉगिन, उदाहरण के लिए), मॉड्यूल एक विशेष "हुक" फ़ंक्शन को लागू करके घटना पर प्रतिक्रिया कर सकते हैं। यह नामकरण सम्मेलन के माध्यम से किया जाता है - [आपका-प्लगइन-नाम] _user_login () उपयोगकर्ता लॉगिन घटना के लिए, उदाहरण के लिए।

इस कन्वेंशन के कारण, अंतर्निहित घटनाओं को "हुक" के रूप में संदर्भित किया जाता है और ड्रुपल के एपीआई प्रलेखन में "हुक_यूज़र_लगिन" और "हुक_सियर_थूथेंट ()" जैसे नामों के साथ दिखाई देते हैं।


यह ऊपर वर्णित विचार का अनुसरण करता है , जब कुछ होता है, तो प्रतिक्रिया करने के लिए "कॉलबैक" "। इस मामले में, कॉलबैक स्पष्ट रूप से पंजीकृत नहीं है, लेकिन "जादू नामकरण" पर आधारित है। यह वर्तमान में drupal.org पर चर्चा की गई है, इवेंट हुक के लिए यूज सिम्फनी EventDispatcher
donquixote

सामान्य करने के लिए, एक हुक / कॉलबैक / श्रोता को विभिन्न तरीकों से "कॉलिंग कोड के लिए जाना जाता है" (यह कहना पूरा नहीं होता है): 1. जादू-नाम वाले कार्य 2. जादू-नाम वाले वर्ग 3. स्पष्ट रूप से पंजीकृत कार्य 4. स्पष्ट रूप से पंजीकृत वस्तुओं (श्रोताओं, ग्राहकों, पर्यवेक्षकों) 5. स्पष्ट रूप से पंजीकृत वर्ग के नाम (+ वैकल्पिक निर्माता args), हुक आग से पहले तत्काल किया जाना है। 6. कॉलिंग कोड को संशोधित करके
दान

1

बहुत कम में, आप एक एपीआई कॉल के कोड को बदल सकते हैं जैसे MessageBoxकि यह आपके द्वारा संपादित एक अलग फ़ंक्शन करता है (विश्व स्तर पर सिस्टम व्यापक रूप से काम करेगा, स्थानीय रूप से प्रक्रिया व्यापक होगी)।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.