क्या इवेंट चेनिंग को अच्छा अभ्यास माना जाता है?


15

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

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

हालांकि, इस समाधान के लिए संभावित डाउनसाइड तथ्य यह होगा कि श्रृंखला में कुछ गलत होने के लिए कुछ भी होना चाहिए (जैसे मानव त्रुटि के कारण झूठी घटना ट्रिगर), बग को पकड़ना काफी मुश्किल होगा।

क्या इवेंट एक अच्छा विचार टीएम है ? यदि नहीं, तो ईवेंट संबंधी कोड को अव्यवस्थित रखने के लिए वैकल्पिक तरीके क्या हैं?


1
मैं पिछले कुछ वर्षों से जावास्क्रिप्ट के लिए एक घटना पुस्तकालय का काम कर रहा हूं। kayoub5.github.io/onQuery यह जटिल घटनाओं को लिखने की अनुमति देता है जैसे <br> (A या B) तब C तब (D और E) {A + B} > C > {D & E}<br> <br> यह निश्चित रूप से कम समय में जटिल समाधान लिखने में मदद करता है, लेकिन जैसा कि पहले उल्लेख किया गया है, परीक्षण और डिबगिंग अभी भी एक दर्द है।
अय्यूब कानिच

जवाबों:


11

क्या घटना एक अच्छे विचार का पीछा कर रही है?

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

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

और वे कोड के बारे में डीबगिंग और तर्क पर सुपर कठिन हैं।

अब कभी-कभी उन्हें अपेक्षाकृत सीमित परिदृश्यों में उपयोग किया जा सकता है जहां कोड की संरचना इन समस्याओं में से कुछ को सीमित करती है। UI में, कैस्केडिंग घटनाओं का उपयोग पदानुक्रम को ट्रिगर करने के लिए किया जा सकता है क्योंकि पदानुक्रम संरचना स्वामित्व और लूपिंग चिंताओं को सीमित करने में मदद करती है।

फिर भी, मैं इन दिनों कहीं अधिक बार पाता हूं कि मैं एक रचनाकार में एक प्रतिनिधि को उस तरह के एक्स्टेंसिबल व्यवहार के लिए स्वीकार करता हूं, जो कि रनटाइम पर मनमाना व्यवहार करने देता है।


कुछ बेहतरीन बिंदु, विशेष रूप से यूआई पदानुक्रम के बारे में।
विघ्नहर्ता

2

इवेंट चैनिंग एक अच्छा विचार है अगर

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

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


2

किसी ऐसे व्यक्ति के दृष्टिकोण से बोलना, जिसने एक बार एक घटना-श्रृंखला-संबंधित त्रुटि को ट्रैक करने में कुछ दिन बिताए, यह एक बहुत बुरा विचार (sm) है। आप अपना नियंत्रण प्रवाह छिपा रहे हैं (जैसा कि आपने नोट किया है) डिबगिंग को बुरा सपना बना सकता है। स्थिति मैं पैदा हुई थी जब किसी ने कुछ त्रुटि-हैंडलिंग कोड जोड़ा जो नियंत्रण को रीसेट करता है। इससे onPropertyChangeहैंडलर की एक श्रृंखला बनी जिसने नियंत्रण को ताज़ा करने में त्रुटि की, जिसमें त्रुटि हैंडलर था, जिसके कारण इसे फिर से दूसरे नियंत्रण को रीसेट करना पड़ा, और इसी तरह। मूल रूप से यूआई केवल सीपीयू के साथ 100% आंकी जाएगी।

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


1
यह एक विशिष्ट कार्यान्वयन के साथ एक समस्या की तरह लगता है, सामान्य रूप से अवधारणा के साथ नहीं।
मैट एस

मुझे लगता है कि गैर-नियतात्मक नियंत्रण प्रवाह के साथ मुद्दा डिजाइन के लिए अंतर्निहित है। जब तक आप बहुत विशिष्ट प्रवाह कोडिंग कर रहे हैं और सामान्य प्रयोजन पब / उप-प्रकार तंत्र का उपयोग नहीं कर रहे हैं।
टीएमएन

2

दूसरों के द्वारा बताए गए सभी कारणों के लिए, अच्छी तरह से घटना को लागू करना मुश्किल है।

हालाँकि, यह अधिकांश नियम इंजनों का मूल आधार भी है। JBoss Drools, IBM jRules, PegaSystems, Corticon, और FICO Blaze सलाहकार सभी प्रमुख बिजनेस रूल्स मैनेजमेंट सिस्टम (BRMS) हैं जो उपयोगकर्ताओं को सिस्टम में होने वाली घटनाओं के आधार पर नियमों की घोषणा करने की अनुमति देते हैं। आगे और पीछे दोनों-पीछा संभव और संभव है।

प्रोलॉग भाषा और इसका व्युत्पत्ति एक ही धारणा पर आधारित हैं।

शामिल एल्गोरिदम सरल नहीं हैं, डीबगिंग एक दर्द हो सकता है, लेकिन मॉडल में बहुत अधिक मूल्य पाया जाना है।


1

एक संभावित दोष यह है कि यह गलती से लूपिंग अपडेट के साथ समाप्त करने के लिए काफी आसान है। उदा ए -> बी -> सी -> ए -> बी ...

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

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