पब्लिश-सब्सक्रिप्शन पैटर्न गोटो से कैसे अलग है?


11

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

मैंने बहुत सारे जावास्क्रिप्ट कार्यक्रमों में कुछ ऐसा ही देखा है, जिसमें घटनाओं को मॉड्यूल में आसानी से "हॉप" करने के लिए उपयोग किया जाता है। क्या मैं प्रकाशित-सदस्यता या इवेंट-संचालित पैटर्न के बारे में कुछ याद कर रहा हूं?


5
return, try/catch, break, continue, switch- उन सब goto । गोटो में बनाया गया प्रतिबंध के विभिन्न स्तरों के साथ माना जाता हानिकारक कैसे कोड काम करता है के बारे में सोच के लिए हानिकारक है।

@ मिचेल्ट: अधिकांश मामलों के लिए, गोटो के विकल्प हैं जो कोड के बारे में तर्क करना आसान बनाते हैं। उस तथ्य की सराहना करने में कोई बुराई नहीं है। हारमोन केवल तभी किया जाता है जब आप वारंट होने पर गोटो का उपयोग नहीं करते हैं (जो आमतौर पर ऐसा नहीं होता है), या यदि आप लापरवाही से गोटो का उपयोग करते हैं। मेरा मानना ​​है कि Apple ने हमें बाद का एक अच्छा उदाहरण दिखाया ।
back2dos

... पता नहीं क्या कार्यक्रम के कुछ हिस्सों सदस्यता ले रहे हैं ... : के साथ पहले बड़ा अंतर gotoमें निहित है रों के अंत में भागों । दूसरा बड़ा अंतर है बिना किसी विचार के । तीसरा प्रमुख अंतर यह है कि यह वैचारिक रूप से एक है gosub, नहीं goto
मौविसील

1
यह इंटरकैल के "से आया" के करीब है।
कोडइन्चोस

@ back2dos भी इसका एक अच्छा उदाहरण है कि मैं कोड के 1-लाइन ब्लॉक के लिए भी कर्ली ब्रेसिज़ क्यों पसंद करता हूं।
मेटाफ़ाइट

जवाबों:


19

हाँ, आप निश्चित रूप से कुछ याद कर रहे हैं । गोतोस आमतौर पर इस्तेमाल किया जाएगा, जैसा कि आपने कहा था, नियंत्रण के एक-तरफ़ा हस्तांतरण को करने के लिए।

हालाँकि, इवेंट ऐसा नहीं करते हैं। जब कोड घटना को आग लगाता है, तो यह अच्छी तरह से जानता है कि एक बार घटना प्रकाशित होने पर (या संसाधित, पंक्तिबद्ध, निकाल दिया गया ... आदि) कोड निष्पादन घटना को उत्पन्न करने वाले कोड में बहुत अगली पंक्ति पर फिर से शुरू होगा।

गोटो का उपयोग कोड के बीच एक बहुत ही तंग युग्मन बनाता है जो उस बयान को कॉल करता है और कोड जो प्राप्त होने वाले छोर पर है। डेवलपर को गोटो का उपयोग करने के लिए दोनों स्थानों का अंतरंग ज्ञान होना चाहिए।

दूसरी ओर, कोड जो घटनाओं को आग लगाते हैं, आमतौर पर उस घटना को सुनने के लिए रुचि रखने वाले या देखभाल करने वाले को पता नहीं होगा। कोई श्रोता हो सकता है। या 100 श्रोता हो सकते हैं या 0. वे श्रोता उसी कार्यक्रम में हो सकते हैं जहाँ घटना को निकाल दिया गया था, या वे पूरी तरह से अलग आवेदन में हो सकते हैं, या वे एक अलग मशीन पर हो सकते हैं। जहां तक ​​प्रकाशक का सवाल है, जैसे ही वह इस घटना को उत्पन्न करता है उसका काम हो जाता है।

यदि आप अभी तक मेरे साथ हैं, तो मैंने ऊपर जो वर्णन किया है, वह पब / सब पैटर्न का आदर्श मामला है। दुर्भाग्य से वास्तविक दुनिया में चीजें हमेशा आदर्श नहीं होती हैं और ऐसे मामले होते हैं जहां प्रकाशक एक घटना उत्पन्न करते हैं, एक ग्राहक को आमंत्रित किया जाता है, राज्य की एक पूरी गुच्छा को बदल देता है और जब तक कोड निष्पादन प्रकाशक "दुनिया" में वापस आ जाता है उल्टा हो गया। और मुझे यकीन है कि आप इसे अतीत में चला चुके हैं, क्योंकि यह स्थिति अक्सर तब उत्पन्न होती है जब पब / उप पैटर्न बहुत सरल तरीके से लागू होता है (जैसे सी # में प्रतिनिधियों या घटनाओं के उपयोग के माध्यम से, या सी में फ़ंक्शन / इंटरफ़ेस पॉइंटर्स) / C ++)।

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


+1 प्रकाशित / सदस्यता ढीली युग्मन की अनुमति देता है; गोटो नहीं
फ़ुहारमैनेटर

6

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

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

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

तुम सही हो, यद्यपि। कोई व्यक्ति बहुत सारे संदेशों के साथ एक पब / सब सिस्टम लिख सकता है और इतने कम कूदता है कि प्रसंस्करण प्रवाह पर नज़र रखना दुःस्वप्न बन सकता है। और दूसरी तरफ, आप GOTOs के साथ एक प्रणाली लिख सकते हैं जो बेहद व्यवस्थित रूप से व्यवहार करता है और आसानी से समझ में आता है। (मैं सांकेतिक भाषाओं को संभालने से पहले बहुत जटिल प्रणालियों के लिए विधानसभा कोड के बारे में सोच रहा हूं।)

लेकिन आमतौर पर, आप पब / उप से प्राप्त होने वाले डिकॉउपिंग को वितरित प्रसंस्करण की समस्या को सरल करते हैं और आपके सिस्टम के भीतर तर्क को डिकोड करते हैं। आम तौर पर, सीधे-सीधे GOTO जटिल सिस्टम बनाते हैं जहां नियंत्रण के प्रवाह को समझना समस्याग्रस्त हो जाता है।

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