ऑब्जर्वर, पब / सब, और डेटा बाइंडिंग के बीच अंतर


163

ऑब्जर्वर पैटर्न , पब्लिश / सब्सक्राइब और डेटा बाइंडिंग में क्या अंतर है ?

मैंने स्टैक ओवरफ्लो पर थोड़ा खोज किया और कोई अच्छा जवाब नहीं मिला।

जो मैं मानता आया हूं कि डेटा बाइंडिंग एक सामान्य शब्द है और इसे लागू करने के विभिन्न तरीके हैं जैसे ऑब्जर्वर पैटर्न या पब / सब पैटर्न। ऑब्जर्वर पैटर्न के साथ, एक ऑब्जर्वेबल अपने ऑब्जर्वर को अपडेट करता है। पब / सब के साथ, 0-कई प्रकाशक कुछ कक्षाओं के संदेश प्रकाशित कर सकते हैं और 0-कई ग्राहक कुछ कक्षाओं के संदेशों की सदस्यता ले सकते हैं।

क्या "डेटा बाइंडिंग" को लागू करने के अन्य पैटर्न हैं?


मुझे एक और मिला: गंदी जाँच जो Angular.js करता है। यहाँ अधिक जानकारी: stackoverflow.com/questions/9682092/databinding-in-angularjs
जेस

जवाबों:


143

यहाँ मेरा तीन पर ले लो:

अनिवार्य तथ्य

मूल रूप से, इसका मूल अर्थ है "ऑब्जेक्ट Y पर संपत्ति X का मान, वस्तु B पर संपत्ति A के मूल्य के लिए शब्दार्थ रूप से बाध्य है। कोई अनुमान नहीं लगाया जाता है कि Y कैसे जानता है या ऑब्जेक्ट B पर परिवर्तन खिलाया गया है।

ऑब्जर्वर, या ऑब्जर्वेबल / ऑब्जर्वर

एक डिज़ाइन पैटर्न जिसके द्वारा किसी वस्तु को विशिष्ट घटनाओं के अन्य लोगों को सूचित करने की क्षमता के साथ जोड़ा जाता है - आम तौर पर वास्तविक घटनाओं का उपयोग करके किया जाता है, जो एक विशिष्ट फ़ंक्शन / विधि के आकार के साथ ऑब्जेक्ट में स्लॉट की तरह होते हैं। अवलोकनीय वह है जो सूचनाएं प्रदान करता है, और पर्यवेक्षक उन सूचनाओं को प्राप्त करता है। .Net में, अवलोकनीय किसी घटना को उजागर कर सकता है और पर्यवेक्षक "ईवेंट हैंडलर" आकार के हुक के साथ उस ईवेंट की सदस्यता लेता है। विशिष्ट तंत्र के बारे में कोई धारणा नहीं बनाई गई है, जो अधिसूचनाएँ होती हैं, और न ही पर्यवेक्षकों की संख्या के बारे में, जो एक पर्यवेक्षक अधिसूचित कर सकते हैं।

पब / उप

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

डेटा बाइंडिंग, Redux

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

डेटा बाइंडिंग रिड्यूक्स

डेटा बाइंडिंग के लिए एक वैकल्पिक कार्यान्वयन? ठीक है, यहाँ एक बेवकूफ है:

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

मैं आपके उत्तर की सराहना करता हूं और एक अलग डेटा बाइंडिंग विचार को लागू करने का प्रयास करता हूं।
जेस

@ हेज़मोन हेह, कोई समस्या नहीं; प्रेक्षक पैटर्न निश्चित रूप से "अमूर्त रूप से सबसे अच्छा" दृष्टिकोण है जिसके बारे में मुझे पता है, लेकिन मेरा भयानक छोटा उदाहरण "डेटा बाइंडिंग" भी करेगा, यद्यपि एक अराजक और अक्षम्य तरीके से।
जेरकीबॉल

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

154

पर्यवेक्षक / अवलोकन योग्य और प्रकाशक / सब्सक्राइबर पैटर्न के बीच दो प्रमुख अंतर हैं:

  1. ऑब्जर्वर / ऑब्जर्वेबल पैटर्न ज्यादातर एक सिंक्रोनस तरीके से लागू किया जाता है , यानी किसी घटना के होने पर ऑब्जर्वेबल अपने सभी ऑब्जर्वर की उपयुक्त विधि कहता है। प्रकाशक / सब्सक्राइबर पैटर्न ज्यादातर एक में कार्यान्वित किया जाता अतुल्यकालिक रास्ता (संदेश कतार का उपयोग)।

  2. ऑब्जर्वर / ऑब्जर्वेबल पैटर्न में ऑब्जर्वर ऑब्जर्वर के बारे में जानते हैं । जबकि, प्रकाशक / सब्सक्राइबर में , प्रकाशकों और ग्राहकों को एक दूसरे को जानने की आवश्यकता नहीं है । वे बस संदेश कतारों की मदद से संवाद करते हैं।

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


7
मैं O'Reilly ( shop.oreilly.com/product/0636920018421.do ) द्वारा जावास्क्रिप्ट वेब एप्लिकेशन पढ़ रहा था । अध्याय 2 में एलेक्स जेएस घटनाओं का उपयोग कर लागू करता है । यह एक कॉलबैक प्रकार का कार्यान्वयन है, लेकिन यह एक तुल्यकालिक उदाहरण है। pub/sub
जेस

5
मैंने पुस्तक नहीं पढ़ी है लेकिन अगर इसे "घटनाओं" के प्रयोग से लागू किया गया है, तो यह अतुल्यकालिक होगा क्योंकि परिभाषा के अनुसार घटनाएं अतुल्यकालिक हैं।
परम

3
हाय जेस, बेशक आप सही हैं। इन शब्दों के लिए कोई मानक परिभाषा नहीं है Par
परम

14
आम तौर पर एक पर्यवेक्षक के पास पर्यवेक्षकों की एक सूची होती है (यह उन सभी को एक घटना भेजने के लिए इस सूची पर पुनरावृत्ति करता है)। एक प्रकाशक को आम तौर पर केवल एक कतार के बारे में पता होता है, जहाँ वह अपनी घटनाओं / संदेशों को प्रकाशित करता है। यह नहीं जानता कि कितने उपभोक्ताओं ने उस कतार की सदस्यता ली है।
परम

7
मेरे लिए, यह दोनों के बीच महत्वपूर्ण अंतर है: इसके अलावा, पर्यवेक्षक पैटर्न में, पर्यवेक्षकों को अवलोकन के बारे में पता है। जबकि, पब / सब में, न तो प्रकाशकों, और न ही उपभोक्ताओं को एक दूसरे को जानने की जरूरत है। वे बस संदेश कतारों की मदद से संवाद करते हैं। बहुत बढ़िया जवाब!
मैरीसिडेड

23

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

एक बात ध्यान देने योग्य है: इन पैटर्नों का लक्ष्य कूट कूटना है

ऑब्जर्वर एक डिज़ाइन पैटर्न है जहां एक ऑब्जेक्ट (एक विषय के रूप में जाना जाता है) ऑब्जेक्ट्स की एक सूची को इस पर निर्भर करता है (पर्यवेक्षक), स्वचालित रूप से उन्हें राज्य में किसी भी बदलाव के बारे में सूचित करता है।

ऑब्जर्वर पैटर्न

इसका मतलब है कि observable objectइसकी एक सूची है जहां यह अपने सभी observersकार्यों को रखता है (जो आमतौर पर कार्य होते हैं)। और इस सूची को आगे बढ़ा सकते हैं और अच्छा समय महसूस होने पर इन कार्यों को लागू कर सकते हैं।

देखना यह पर्यवेक्षक पैटर्न जानकारी के लिए उदाहरण।

यह पैटर्न अच्छा है जब आप किसी ऑब्जेक्ट पर किसी भी डेटा परिवर्तन के लिए सुनना चाहते हैं और अन्य UI विचारों को इसी तरह अपडेट करते हैं।

लेकिन विपक्ष वेधशाला हैं जो केवल पर्यवेक्षकों को रखने के लिए एक सरणी बनाए रखते हैं (उदाहरण में, सरणी है observersList)।

यह अंतर नहीं करता है कि अपडेट को कैसे ट्रिगर किया जाता है क्योंकि इसमें केवल एक है notify function, जो उस सरणी में संग्रहीत सभी फ़ंक्शन को ट्रिगर करता है।

अगर हम अलग-अलग घटनाओं के आधार पर पर्यवेक्षकों को समूह में रखना चाहते हैं। हमें बस observersListइसे एक Objectतरह से संशोधित करने की आवश्यकता है

var events = {
    "event1": [handler1, handler2],
    "event2": [handler3]
}

देखना यह pubsub उदाहरण जानकारी के लिए।

और लोग इस भिन्नता को कहते हैं pub/sub। इसलिए आप eventsप्रकाशित किए गए कार्यों के आधार पर विभिन्न कार्यों को ट्रिगर कर सकते हैं ।


वैसे यह एक बेहतर, संक्षिप्त और स्पष्ट उत्तर है। :)
कोडरएक्स

एक उच्च स्तर पर मैंने हमेशा कहा है कि पब उप पर्यवेक्षक पैटर्न है, लेकिन हर चीज के साथ इसका स्वाद अलग है।
ग्रिम

9

मैं दोनों पैटर्न के बारे में आपके निष्कर्ष से सहमत हूं, फिर भी, मेरे लिए, मैं ऑब्जर्वेबल का उपयोग करता हूं जब मैं एक ही प्रक्रिया में हूं और मैं अंतर-प्रक्रिया परिदृश्यों में पब / उप का उपयोग करता हूं, जहां सभी पार्टियां केवल सामान्य चैनल को जानती हैं, लेकिन पार्टियों को नहीं ।

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

यदि आप अंतर-प्रक्रिया संचार में रुचि रखते हैं, तो मैं आपको सलाह देता हूं:

"एंटरप्राइज इंटीग्रेशन पैटर्न: डिजाइनिंग, बिल्डिंग, और मेसेजिंग सॉल्यूशंस" - http://www.addison-wesley.de/9780321200686.html

इस पुस्तक में प्रक्रियाओं या कक्षाओं के बीच संदेश भेजने के तरीके के बारे में बहुत सारे विचार हैं जो इंट्रा-प्रोसेस संचार कार्यों में भी उपयोग किए जा सकते हैं (इसने मुझे अधिक ढीले-ढाले तरीके से प्रोग्राम करने में मदद की)।

आशा है कि ये आपकी मदद करेगा!

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