2010-12-21 17 views
7

मैं हाल ही में इवेंट श्रोताओं का अध्ययन कर रहा हूं और मुझे लगता है कि मैंने अंततः उन्हें नीचे प्राप्त कर लिया है। असल में, वे ऐसे कार्य होते हैं जिन्हें किसी अन्य ऑब्जेक्ट की विधि पर बुलाया जाता है। मेरा सवाल यह है कि फ़ंक्शन को कॉल करते समय इवेंट श्रोता क्यों ठीक काम करेगा?फ़ंक्शन कॉल पर ईवेंट श्रोताओं का उपयोग क्यों करें?

उदाहरण, मैं player.display_health() को कॉल करना चाहता हूं, और जब इसे निकाल दिया जाता है, तो method player.get_health() को निकाल दिया और संग्रहीत किया जाना चाहिए ताकि display_health() तक इसका उपयोग हो। फ़ंक्शन को कॉल करने पर मुझे ईवेंट श्रोता का उपयोग क्यों करना चाहिए? भले ही display_health() किसी अन्य ऑब्जेक्ट में थे, फिर भी यह मेरे लिए एक समस्या प्रतीत नहीं होता है।

यदि आपके पास एक और उदाहरण है जो उपयोग को बेहतर बनाता है, तो कृपया मुझे बताएं। शायद विशेष भाषाओं से इसका लाभ नहीं होता है? (जावास्क्रिप्ट, पीएचपी, एएसपी?)

उत्तर

8

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

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

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

बस कुछ त्वरित उदाहरण, मुझे यकीन है कि दूसरों के पास और भी कुछ है।

+0

डोमेन लाइब्रेरीज़ के पीछे विचार जिस पर मैंने नियंत्रण किया है, मुझे अच्छी समझ मिली क्योंकि मेरे द्वारा काम की जाने वाली अधिकांश सामग्री पर मेरा पूरा नियंत्रण है। इसलिए जब से मेरा नियंत्रण होता है, तो मुझे विपरीत प्रश्न पूछने की ज़रूरत है, क्या फ़ंक्शन कॉल पर ईवेंट श्रोताओं का उपयोग न करने का कोई कारण नहीं है? – Organiccat

+0

@ ऑर्गनिकैट: पहले की तरह, मुझे यकीन है कि अन्य कारण भी हैं। लेकिन मेरे लिए सबसे बड़ा कारण निर्भरता उलटा सिद्धांत होगा। ईवेंट का जवाब देने वाला कोड (या यहां तक ​​कि हो सकता है) एक निर्भरता हो सकती है जो तर्कसंगत रूप से उस कोड से संबंधित नहीं है जो ईवेंट को बढ़ा रहा है। – David

+0

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

4

मेरा सवाल यह है कि फ़ंक्शन को कॉल करते समय एक ईवेंट श्रोता क्यों ठीक काम करेगा?

क्या होगा यदि आप नहीं जानते कि आप किस फ़ंक्शन को कॉल करना चाहते हैं?

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

तो इसके बजाय, आप ईवेंट में इवेंट हैंडलर संलग्न कर सकते हैं। फिर जब ईवेंट ट्रिगर होता है, तो बटन जो कुछ भी करने की आवश्यकता है, उसे संकलित करने के समय के बारे में जानने के बिना बटन कर सकता है।

+0

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

1

संक्षेप में, आप घटना श्रोता बिना कोड लिख सकते हैं, लेकिन घटना श्रोता अन्य मदद का उपयोग कर पुस्तकालय के रूप में एक ही कोड का उपयोग करें।

+1

क्या आप पुस्तकालय के रूप में कोडित होने पर दूसरों की मदद कैसे करेंगे, इस पर विस्तार से बता सकते हैं? – cavpollo

संबंधित मुद्दे