"कोड बदबू" क्या हैं जो एक लक्षण है कि एक घटना श्रोता मॉडल की आवश्यकता होती है?


10

एक कोड बेस में क्या लक्षण हैं जो इंगित करते हैं कि घटना-श्रोता दृष्टिकोण की आवश्यकता है?

यह मुझे लगता है कि जब ऐसी कक्षाएं होती हैं, जिन्हें अन्य द्वारा बुलाया जाना चाहिए, अन्य कक्षाओं के डिज़ाइन-टाइम सेट में परिभाषित नहीं किया जाता है, तो आपको किसी प्रकार के सिग्नलिंग ढांचे की आवश्यकता होती है, लेकिन मैं यह सुनना चाहता हूं कि अन्य परिस्थितियां क्या हैं एक घटना-आधारित मॉडल में बदलकर।

जवाबों:


8

इवेंट / श्रोता aproach तंग युग्मन से बचने की कोशिश करता है , इसलिए सभी कोड बदबू आ रही है कि संकेत मिलता है, appoach को इंगित करेगा।

उसके आधार पर, मैं निम्नलिखित लक्षणों का सुझाव दूंगा:

  • बड़े कंस्ट्रक्टर , जैसा कि प्रत्येक ऑब्जेक्ट को हर दूसरे ऑब्जेक्ट को जानना होता है, और इसके बिना काम नहीं किया जा सकता है। हो सकता है obj.set_dependecy(x)कि कंस्ट्रक्टर कॉल के तुरंत बाद के रूप में प्रच्छन्न हो ।

  • द्विदिश निर्भरता , क्योंकि, घटनाओं के बिना, एक अनिवार्य भाषा में, सूचना का प्रवाह मूल रूप से 'पुश' (किसी व्यक्ति को कॉल करना) है

  • 'ज्ञान का पदानुक्रम' निर्धारित करना कठिन है । यह द्विदिश निर्भरताएं हैं , बस एक और ध्यान: यदि कोई ए है, जो बी को सुनता है, ए को बी का पता है, लेकिन बी ए का नहीं है, तो एक 'पदानुक्रम' है: कुछ वस्तुओं को कुछ भी नहीं पता है, कुछ अन्य जानते हैं , आदि, उदाहरण के लिए, जब एमवीसी को इस तरह से लागू किया जाता है: http://en.wikipedia.org/wiki/Model_View_Controller , मॉडल ही जानता है, दृश्य मॉडल जानता है, और नियंत्रक दृश्य और मॉडल जानता है।


1
द्विदिश निर्भरताएं अब तक के सबसे टेल्टेल संकेत हैं जो आपको एक इवेंट-संचालित मॉडल पर स्विच करने की आवश्यकता है। कंस्ट्रक्टर ब्लोट का मतलब यह हो सकता है, लेकिन अधिक बार न केवल इसका मतलब है कि आपको एकत्रीकरण, संरचना, और / या सामान्य अमूर्त (यानी रिफैक्टरिंग, डिजाइन में बदलाव नहीं) के तरीके से अधिक करने की आवश्यकता है।
आरोन

आप सही हे। मैंने इसका पता लगाने की सहजता से आदेश देने की कोशिश की, और बड़े निर्माता बहुत सरल हैं, उन्हें नियमित अभिव्यक्तियों द्वारा पकड़ा जा सकता है।
कीपल

6

जब आप संदेश / संकेतों / घटनाओं के एक सेट पर प्रतिक्रिया नहीं दे सकते या नहीं जान सकते।

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

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


3

मैं आपके प्रश्न को बदल दूंगा और कहूंगा: जब एक वस्तु आधारित अनुप्रयोग के लिए एक घटना आधारित सही समाधान नहीं है? मुझे लगता है कि ज्यादातर ओओ अनुप्रयोगों को लाभ हो सकता है यदि उन्हें इवेंट निर्माता और उपभोक्ता के रूप में डिज़ाइन किया गया है।

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

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

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

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


2

यदि इवेंट-श्रोताओं (उर्फ। ऑब्जर्वर पैटर्न) मौजूद नहीं है तो आपको क्या करना है, इसके बारे में सोचें।

यदि आपके पास कोई ऑब्जेक्ट है जो अन्य ऑब्जेक्ट्स की सूची का संदर्भ देता है और प्रक्रिया में दिए गए बिंदु पर उन पर एक विधि कहता है, तो आपको निश्चित रूप से वहां एक घटना होनी चाहिए।

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

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

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