जब हुक सही डिजाइन विकल्प होते हैं?


10

मैंने एक बड़ी रेल एप पर काम किया है, जहाँ ActiveRecord callbacks का उपयोग बड़े पैमाने पर और कठोर था। किसी रिकॉर्ड को सहेजने से कई बार अनपेक्षित दुष्परिणाम होते हैं और यह प्रणाली के लिए एक चुनौती थी।

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

मुझे पता है कि एक रेल एप्लिकेशन और एक लिस्प दुभाषिया काफी अलग-अलग प्रणालियां हैं, लेकिन मैं उत्सुक हूं कि कोई भी ज्ञात मानदंड है जब लोग यह तय करते हैं कि हुक समस्या का सामना करने के लिए सही डिजाइन विकल्प हैं या नहीं।

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

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

जवाबों:


5

जब आप हुक के रिसीवर पर नियंत्रण स्थानांतरित करके अपने उपभोक्ताओं से अमूर्तता के कार्यान्वयन के विवरण को कम करना चाहते हैं तो हुक एक अच्छा डिज़ाइन विकल्प है।

आप इसे एक अनाम प्रसारण (जैसे घटनाओं या अनाम कॉलबैक), या टाइप किए गए सार (जैसे इंटरफ़ेस या मूल वर्ग) का उपयोग करके कर सकते हैं।

आपको अनाम प्रसारण का उपयोग तब करना चाहिए जब:

  • हुक का कॉल वैकल्पिक है
  • कॉल करने वाले को परवाह नहीं है कि हुक कौन देता है।
  • रसीदों के निष्पादन का क्रम अप्रासंगिक है।
  • आप सभी सब्सक्राइबर को ऑब्जेक्ट स्टेट को हुक पर प्रसारित करना चाहते हैं।

जब आपको टाइप किया हुआ अमूर्त प्रयोग करना चाहिए:

  • हुक बुलाना अनिवार्य है।
  • कॉलिंग ऑब्जेक्ट को हुक के रिसीवर की पहचान करने की आवश्यकता है।
  • प्राप्तियों के निष्पादन का क्रम आपकी वस्तु के लिए प्रासंगिक है।

ब्रॉडकास्टिंग हुक का एक उदाहरण KeyPressedEvent है। ईवेंट को फायरिंग करने वाले वर्ग को इसकी परवाह नहीं है कि कौन इसे प्राप्त करता है और ईवेंट की सदस्यता लिए किसी को भी कीबोर्ड राज्य प्रसारित कर रहा है। रिसीवर्स के निष्पादन क्रम का घटना को फायर करने वाले वर्ग की वस्तु स्थिति पर कोई प्रभाव नहीं पड़ता है।

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


7

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

आप उनका उपयोग करते हैं क्योंकि मंच उन्हें आपको प्रदान करता है, या संभवतः प्रदर्शन के कारणों के लिए भी उनके उपयोग की आवश्यकता होती है। हुक का उपयोग करना अक्सर कोड जटिलता को कम करता है, व्यावसायिक आवश्यकताओं को लागू करने में मदद करता है, और सीपीयू के उपयोग को कम करता है, बैटरी और हार्डवेयर जीवन का विस्तार करता है। जब भी आप अपने कोड से सर्वश्रेष्ठ प्रदर्शन चाहते हैं तो आपको उनका उपयोग करना चाहिए।

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

एक सामान्य नियम के रूप में, हुक का उपयोग करें क्योंकि वे प्रदर्शन विशेषताएं हैं, और आपके कोड को विकल्प की तुलना में अधिक कुशलता से चलाएगा (जिसे "मतदान" कहा जाता है, जहां आप घटनाओं की जांच करने के लिए एक व्यस्त लूप में इंतजार करते हैं)। हालाँकि, यह भी सुनिश्चित करें कि आप उपयुक्त प्रलेखन का उपयोग करें और इसे अद्यतित रखें। हुक का उपयोग वस्तुतः हर उस भाषा में किया जाता है जिसका आप सामना करेंगे, और यह जानना महत्वपूर्ण है कि वे क्यों मौजूद हैं।


1

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

यदि नहीं, तो आपको अपने मॉड्यूल के एक अच्छे आर्क के साथ भाग जाना चाहिए। टेम्प्लेट-विधियाँ ओवरलोड कार्यों के साथ अच्छी तरह से काम करती हैं, आपको इसके लिए रनटाइम लॉजिक की कोई आवश्यकता नहीं है। विचार करें कि यह लागू होगा ढीली युग्मन एक भ्रम है: किसी चीज के बीच समान निर्भरता का स्तर है जिसे आप सीधे कॉल करते हैं या आप हुक करते हैं, कैली को वैसे भी अपना अनुबंध भरना होगा।

ध्यान दें, हो सकता है कि कुछ लोग ओवरलोड फंक्शन हुकिंग के साथ टेम्प्लेट-मेथड कहते हैं, लेकिन यह ऊपर से अलग है: यहां आपके पास एक स्थिर लिंकिंग है, जिसमें एक रखरखाव दुःस्वप्न में आने का कम जोखिम है।

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