प्लगइन्स का उपयोग क्या करना चाहिए: हुक, घटनाओं या कुछ और?


24

एक ऐप पर विचार करें जो प्लगइन्स को अपने कार्यक्रम प्रवाह पर प्रतिक्रिया करने की अनुमति देता है।

मैं इसे प्राप्त करने के 2 तरीके जानता हूं: हुक और ईवेंट

1. हुक

मुख्य कार्यक्रम प्रवाह के अंदर खाली कार्यों के लिए कॉल का उपयोग करें। इन कार्यों को प्लगइन्स द्वारा ओवरराइड किया जा सकता है।

उदाहरण के लिए, ड्रुपल सीएमएस हुक को लागू करता है जो मॉड्यूल और थीम के लिए उपलब्ध हैं। यहाँ एक उदाहरण दिया गया है कि file_copy फ़ंक्शन में हुक कैसे लागू किया जाता है।

function file_copy(stdClass $source, $destination = NULL, $replace = FILE_EXISTS_RENAME) {
    // ... [File copying routine]

    // Inform modules that the file has been copied.
    module_invoke_all('file_copy', $file, $source);

    return $file;
    // ...
}

एक मॉड्यूल एक को लागू कर सकते modulename_file_copy($file, $source)समारोह है जिसके द्वारा बुलाया जाएगा module_invoke_allमें file_copy। इस फ़ंक्शन के पूरा होने के बाद, file_copyवसीयत को फिर से शुरू करेगा।

2. घटनाएँ

एप्लिकेशन डिस्पैच घटनाओं है, जो प्लगइन्स द्वारा सुना जा सकता है। एक ईवेंट जिसे इसे सब्सक्राइब किया गया है, प्राप्त करने के बाद, एक प्रोग्राम प्रोग्राम फ्लो को इंटरसेप्ट करेगा और नेक्सेसरी ऑपरेशन करेगा।

उदाहरण के लिए, एक jQuery गैलरी प्लगइन Fotorama कई घटनाओं को लागू करता है । एक उदाहरण के रूप में, यहां इसकी showविधि का एक हिस्सा है जो fotorama:showघटना को आग लगाता है ।

  that.show = function (options) {
    // ... [show the new frame]

    // [fire the event]
    options.reset || triggerEvent('show', {
      user: options.user,
      time: time
    });

    // ... [do lots of other stuff with navigation bars, etc.]
  };

एक स्क्रिप्ट इस घटना को सुन सकती है और आग लगने पर कुछ कर सकती है:

$('.fotorama').on(
  'fotorama:show',
  function (e, fotorama, extra) {
    console.log(e.type + (extra.user ? ' after user’s touch' : ''));
    console.log('transition duration: ' + extra.time);
  }
);

सवाल

  1. क्या इस तरह के प्लगइन व्यवहार को लागू करने के लिए अन्य मुख्यधारा के तरीके हैं?

  2. यदि नहीं, तो किसी को हुक का उपयोग कब करना चाहिए और कब घटनाओं का उपयोग करना चाहिए? अंतिम लक्ष्य को ध्यान में रखते हुए कोड को ऐप और प्लगइन डेवलपर के दृष्टिकोण दोनों से अधिक मुख्य और पठनीय बनाना है?

जवाबों:


17

हुक और घटना के बीच मुख्य अंतर ढीले युग्मन बनाम तंग युग्मन है।

एक हुक प्रसारण के लिए एक सामान्य तरीका है कि कुछ हुआ है। आप recompile plugins के बिना नए हुक जोड़ सकते हैं, और सभी हुक एक सामान्य डिजाइन पैटर्न का पालन करते हैं। एक बार हुक एपीआई परिभाषित होने के बाद यह बदल नहीं जाता है इसलिए ऐप और प्लगइन के बीच युग्मन टूटने की संभावना नहीं है।

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

वे दोनों एक ही परिणाम प्राप्त करते हैं। यह सिर्फ इस बात पर निर्भर करता है कि आप ऐप को प्लगइन कैसे बनाना चाहते हैं।

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

ईवेंट आपको संकलित समय त्रुटियों को प्राप्त करने की क्षमता प्रदान करते हैं जो कि प्लगइन को संशोधित करने की आवश्यकता है, क्योंकि कुछ ईवेंट हस्ताक्षर बदल गए हैं।

आपने वैकल्पिक तरीकों के लिए कहा।

आदेश:

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

मैक्रो:

जब चीजें होती हैं, तो जवाब देने के बजाय प्लगइन्स। प्लगइन्स लगातार चीजों का कारण बनते हैं। मैक्रो एक छोटी उच्च-स्तरीय भाषा है जो एप्लिकेशन के ऊपर चलती है यह बताती है कि क्या करना है।

राज्य परिवर्तन श्रोता:

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


2
विकल्पों के लिए +1, परिभाषाओं के लिए -1 और युग्मन तर्क (जो मौजूद नहीं है लेकिन युग्मन डिज़ाइन विकल्पों का परिणाम है, जो भी आप अपने प्लगइन सिस्टम को नाम देते हैं)

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

3

निश्चित रूप से घटनाओं, यह वास्तुशिल्प स्तर पर पहले से ही आवश्यक अमूर्तता के लिए अनुमति देता है।

उम्मीद न करें कि कोई भी एक प्लगइन लिखने वाला वास्तव में ऐसा करता है जैसा कि दस्तावेज या किसी भी तरह से सही है। मैं लाखों उपयोगकर्ताओं के साथ एक अच्छी तरह से प्रलेखित एपीआई बनाए हुए हूं और मैं आपको बहुत ही दर्दनाक अनुभव से बता सकता हूं कि मूल रूप से कोई भी कभी भी दस्तावेज नहीं पढ़ता है और लगभग कोई भी एपीआई का सही उपयोग नहीं करता है।

निम्न उदाहरण को हुक के साथ लें: आपके पास एक सिस्टम है जहां 20 प्लगइन्स चल रहे हैं। उन प्लगइन्स में से एक उस file_copyतरीके से कॉल करता है जिस तरह से इसे प्रलेखित किया गया है और प्रलेखित के परिणामस्वरूप परिणाम की उम्मीद है। लेकिन कुछ अन्य प्लगइन ने उस फ़ंक्शन को झुका दिया है और इसलिए निम्न में से एक समस्या क्रैश या खराबी का कारण बनती है:

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

यदि आप उपरोक्त प्लग इन घटनाओं के साथ घटनाओं के साथ भी ऐसा ही करते हैं, तो निम्न होता है:

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

1

वंशानुक्रम एक विकल्प हो सकता है।

हुक के अलावा, वंशानुक्रम को अतिरिक्त विधि परिभाषाओं की आवश्यकता नहीं होती है, और खाली पद्धति को कॉल करने के लिए कोई प्रदर्शन हानि नहीं होती है, जब तक कि कुछ भी हुक न हो।

घटनाओं के अलावा, वंशानुक्रम को भी घटना के आह्वान के लिए अतिरिक्त कोड की आवश्यकता नहीं है।

हालाँकि, वंशानुक्रम सबसे अच्छा काम करता है अगर एक प्रकार का व्यवहार संशोधित करने वाला केवल एक ही प्लगइन हो। यदि आपको कई प्लगइन्स की आवश्यकता है, तो दूसरे को पहले आदि से प्राप्त करना होगा, जो उचित नहीं है।


-1 क्योंकि आप इनहेरिटेंस का उपयोग करते हैं और फिर अपने विनिर्देश का उपयोग करने के लिए तात्कालिक कोड को बदलते हैं और विरासत का दुरुपयोग करते हैं क्योंकि नए व्यवहार का मुख्य अनुप्रयोग के रूप में एक अलग उद्देश्य है ...
स्पार्क

0

निश्चित रूप से घटनाओं। यह आपकी वास्तुकला को और अधिक विस्तृत-स्केलेबल बनाने की अनुमति देता है।

कल्पना कीजिए कि अगर आपको अपने प्लगइन को उदाहरण के लिए एक अलग मशीन में रखने की आवश्यकता होगी तो क्या होगा। घटनाओं का उपयोग करना - आपको अपनी घटनाओं को नेटवर्क आधारित बनाने के लिए कोड की एक छोटी शांति को संशोधित करने की आवश्यकता होगी।

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