2012-11-27 63 views
9

मैं प्रोग्रामिंग के लिए नया हूं और मैं बहुत सारे गेम कोडिंग ट्यूटोरियल देख रहा हूं। मैंने देखा है कि उनमें से अधिकतर वे सीधे विधि को कॉल करने के बजाय विधियों को ट्रिगर करने के लिए कस्टम ईवेंट का उपयोग करते हैं।प्रत्यक्ष विधि कॉलिंग के बजाय कस्टम ईवेंट का उपयोग क्यों करें?

इस अभ्यास के पीछे क्या तर्क है? वे सिर्फ विधि क्यों नहीं बुला रहे हैं?

उदाहरण के लिए:


हम दो वस्तुओं है: A और BA में A.methodA() है कि B को X स्थिति ट्रिगर होने पर उपयोग करने की आवश्यकता है।

क्यों लागू:

BA कि A बताता है करने के लिए एक घटना डिस्पैच A.methodA()

के बजाय चलाने के लिए:

B का उपयोग करता A.methodA()

+0

अच्छी तरह से, हर बार आपको एक विधि को ट्रिगर करने की आवश्यकता होती है, तो आप कचरा कलेक्टर के लिए जीवन को आसान बना रहे हैं =) (उसके बारे में चिंता करने के लिए कम चीज़ें होंगी)। – Ziul

उत्तर

14

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

यह करने के लिए कुछ लाभ हैं:

  • बहुत आसान इकाई परीक्षण जब आप वर्ग ए या बी बदलने
  • कम अपने कोड को तोड़ने के
  • कम मौका (आप वर्ग बी के बिना क्लास ए परीक्षण कर सकते हैं) आपके कोड में अन्य कक्षाओं के संदर्भ, जो मेमोरी लीक की क्षमता को कम करता है
  • क्लीनर कोड
  • अधिक लचीला/पुन: प्रयोज्य कोड (अन्य कक्षाओं का एक गुच्छा सभी घटनाओं को सुन/प्रतिक्रिया दे सकता है अपने प्रेषक में कोई अतिरिक्त कोड आउट करें)
+4

+1; मैं यह भी जोड़ूंगा कि किसी ऑब्जेक्ट को अपने माता-पिता के साथ संवाद करने का उचित तरीका है। विधि कॉल या सार्वजनिक गुण उचित तरीके हैं कि माता-पिता को अपने बच्चों के साथ संवाद करना चाहिए। – JeffryHouser

+3

@ www.Flextras.com - सहमत हैं, खासकर यदि बच्चों के वर्ग अलग-अलग माता-पिता वर्गों के साथ उपयोग किए जाते हैं। – BadFeelingAboutThis

2

आमतौर पर घटनाओं का उपयोग करके बड़े अनुप्रयोगों में अमूर्त सब कुछ मदद मिलेगी। जब आपके पास 15+ कक्षाएं हों और वे सभी नियंत्रक को घटनाओं को अलग कर रहे हों, तो यह पता लगाने के लिए कोड के सभी अलग-अलग हिस्सों को पढ़ने के लिए क्या हो रहा है, यह जानने के लिए बहुत आसान है। कॉलबैक का उपयोग स्पेगेटी कोड बनाना शुरू होता है।

हालांकि, प्रत्यक्ष फ़ंक्शन कॉल ईवेंट की तुलना में तेज़ी से निष्पादित किए जा रहे हैं।

1

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

संपादित करें: इसके अलावा, यह ध्यान देने योग्य है कि कभी-कभी लोग घटनाओं के तर्कों को पार करने के लिए जो कुछ भी वर्णन करते हैं, वह करते हैं।

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

private function onClickHandler(e:MouseEvent = null):void{ 
    //as long as you never reference "e" within this method, this method can be used both for MouseEvent listeners and manually calling it elsewhere in the code 
} 

तकनीक मदद कर सकते हैं कि एक ईवेंट हैंडलर है कि केवल एक और तरीका है और कुछ नहीं कहता होने से बचने के। इस समय मेरे प्रोग्रामिंग में, प्रत्येक एकल AS3 ईवेंट हैंडलर मैं लिखता हूं, डिफ़ॉल्ट रूप से ईवेंट तर्क को शून्य से सेट करता है। यह सिर्फ बाद में चीजों को आसान बनाता है।

1

You might want to read this.

और यह भी ध्यान रखें कॉलबैक विधि का उपयोग कर आप एक कस्टम ईवेंट मॉडल के माध्यम से सीधे और नहीं इसे करने के लिए मानकों को पारित करने के लिए अनुमति देता है।

0

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

Buttonizer.autoButton(_buttQuit, this, "onPress"); 
public function onPressQuit(c:Sprite) { 
// Execution goes here 
} 

आप अपनी खुद की घटना मॉडल का निर्माण कर सकते हैं, यह जीवन को सरल, और अपने कोड और अधिक संक्षिप्त कर देगा।