क्या घटना सुनने वालों को कमजोर संदर्भों में रखा जाना चाहिए?


9

आमतौर पर घटना सुनने वालों को उस वस्तु को रेखांकित नहीं करना चाहिए जो उन्हें पंजीकृत करती है।

क्या इसका मतलब यह है कि ईवेंट श्रोताओं को डिफ़ॉल्ट रूप से कमजोर संदर्भों द्वारा आयोजित किया जाना चाहिए (ऑब्जेक्ट श्रोताओं द्वारा कमजोर संग्रह में संग्रहीत हैं)?

क्या ऐसे वैध मामले हैं जब श्रोता को अपने निर्माता को रेखांकित करना चाहिए?

या शायद इस तरह की स्थिति एक गलती है और इसे अनुमति नहीं दी जानी चाहिए?


कमजोर संदर्भों को आमतौर पर उदाहरणों द्वारा दर्शाया जाता है, और ये उदाहरण उस बिंदु पर भी जमा हो सकते हैं जहां उन्हें कचरा के रूप में एकत्र किया जाना चाहिए। तो यह एक मुक्त दोपहर का भोजन नहीं है। कमजोर संदर्भों को साफ करने वाला एक ही तर्क मजबूत संदर्भों को साफ कर सकता है।
फ्रैंक हिलमैन

जवाबों:


7

श्रोताओं को उस वस्तु को क्यों नहीं बताना चाहिए जिसने उन्हें पंजीकृत किया है? ऐसा लगता है कि आप मान रहे हैं कि श्रोताओं को नियंत्रण के तरीकों (यदि हम जीयूआई उदाहरण लेते हैं) द्वारा पंजीकृत किया जाना चाहिए - या अधिक सटीक रूप से, जीयूआई टूलकिट के नियंत्रणों को प्राप्त करने वाली कक्षाओं की वस्तुओं द्वारा विधियां। यह एक आवश्यकता नहीं है - आप उदाहरण के लिए, घटना श्रोताओं को पंजीकृत करने के लिए एक विशेष वस्तु का उपयोग कर सकते हैं और उस वस्तु को बाद में खोद सकते हैं।

इसके अलावा, यदि इवेंट श्रोताओं को कमजोर रूप से संदर्भित किया गया था, तो आपको वास्तव में उन संदर्भों को रखना होगा, भले ही आप उस संदर्भ का उपयोग न करें। ऐसा करने में विफल रहने से श्रोता को एक यादृच्छिक समय पर एकत्र किया जाएगा। तो, हमें एक बग मिलता है जो है

  • गलती से बनाना आसान है (आपको बस इतना करना है कि किसी ऑब्जेक्ट को एक संदर्भ चर में संग्रहीत करना न भूलें जिसे आप कभी उपयोग नहीं करेंगे)।
  • नोटिस करने के लिए मुश्किल (आप केवल उस बग को प्राप्त करेंगे यदि जीसी उस वस्तु को इकट्ठा करता है)।
  • डिबग के लिए कठिन (डिबग सत्र में - जो हमेशा रिलीज सत्र की तरह काम करता है - आप केवल उस बग का सामना करेंगे यदि जीसी ने वस्तु एकत्र की है)।

और अगर उस बग से बचना पर्याप्त प्रोत्साहन नहीं है, तो यहां कुछ और हैं:

  1. आपके द्वारा बनाए जाने वाले प्रत्येक श्रोता के लिए आपको एक नाम सोचना होगा ।

  2. कुछ भाषाओं में स्टैटिक एलीलिस का उपयोग होता है जो एक चेतावनी उत्पन्न करेगा यदि आपके पास एक निजी सदस्य फ़ील्ड है जो कभी नहीं लिखा जाता है या कभी नहीं पढ़ा जाता है। आपको उस ओवरराइडिंग के लिए एक तंत्र का उपयोग करना होगा।

  3. ईवेंट श्रोता कुछ करता है, और एक बार जिस वस्तु के पास इसका मजबूत संदर्भ होता है उसे एकत्र किया जाता है, वह कुछ करना बंद कर देगा। अब आपके पास कुछ ऐसा है जो कार्यक्रम की स्थिति को प्रभावित करता है और जीसी पर निर्भर करता है - जिसका अर्थ है कि जीसी कार्यक्रम के ठोस राज्य को प्रभावित करता है। और यह बाड है !

  4. कमजोर संदर्भों को संभालना धीमा है, क्योंकि आपके पास अप्रत्यक्ष स्तर का एक और स्तर है और चूंकि आपको यह जांचने की आवश्यकता है कि क्या संदर्भ एकत्र किया गया था। यदि कमजोर श्रोताओं में ईवेंट श्रोताओं का होना आवश्यक था, तो यह एक समस्या नहीं होगी - लेकिन ऐसा नहीं है!


5

सामान्य तौर पर, हाँ, कमजोर संदर्भों का उपयोग किया जाना चाहिए। लेकिन पहले हमें इस बारे में स्पष्ट होना चाहिए कि "ईवेंट श्रोताओं" से आपका क्या मतलब है।

कॉलबैक

कुछ प्रोग्रामिंग शैलियों में, विशेष रूप से अतुल्यकालिक संचालन के संदर्भ में, एक कॉलबैक के रूप में गणना के एक हिस्से का प्रतिनिधित्व करना आम है जो एक निश्चित घटना पर निष्पादित होता है। उदाहरण के लिए Promise[ 1 ] में एक thenविधि हो सकती है जो पिछले चरण के पूरा होने पर कॉलबैक पंजीकृत करती है:

promise =
    Promise.new(async_task)                # - kick off a task
    .then(value => operation_on(value))    # - queue other operations
    .then(value => other_operation(value)) #   that get executed on completion
... # do other stuff in the meanwhile
# later:
result = promise.value # block for the result

यहाँ, पंजीकृत कॉलबैक thenको मजबूत संदर्भों द्वारा आयोजित किया जाना है , क्योंकि कॉलबैक के संदर्भ में वादा (घटना स्रोत) एकमात्र वस्तु है। यह एक मुद्दा नहीं है क्योंकि वादे का जीवनकाल सीमित होता है, और वादों की श्रृंखला पूरी होने के बाद कचरा एकत्र किया जाएगा।

ऑब्जर्वर पैटर्न

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

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

कमजोर संदर्भ इस मेमोरी लीक को ठीक करते हैं, क्योंकि वे पर्यवेक्षक को कचरा एकत्र करने की अनुमति देते हैं। जब विषय सभी पर्यवेक्षकों को सूचित करने के लिए चारों ओर जाता है और पाता है कि पर्यवेक्षक के कमजोर संदर्भों में से एक खाली है, तो उस संदर्भ को सुरक्षित रूप से हटाया जा सकता है। वैकल्पिक रूप से कमजोर संदर्भों को इस तरह से लागू किया जा सकता है जो विषय को क्लीनअप कॉलबैक दर्ज करने की अनुमति देता है जो संग्रह पर पर्यवेक्षक को हटा देगा।

लेकिन ध्यान दें कि कमजोर संदर्भ केवल एक बैंड-सहायता है जो पर्यवेक्षक को हटाने के लिए भूलकर क्षति को सीमित करता है। सही समाधान यह सुनिश्चित करने के लिए होगा कि एक पर्यवेक्षक को हटा दिया जाए जब कोई ज़रूरत न हो। विकल्पों में शामिल हैं:

  • इसे मैन्युअल रूप से करना, लेकिन यह त्रुटियों से ग्रस्त है।

  • जावा या usingC # में संसाधन के साथ प्रयास करने के लिए कुछ का उपयोग करना ।

  • नियतात्मक विनाश, जैसे कि RAII मुहावरे के माध्यम से। ध्यान दें कि निर्धारक कचरा संग्रह के साथ एक भाषा में, विनाशकारी को ट्रिगर करने के लिए इस विषय से पर्यवेक्षक तक कमजोर संदर्भों की आवश्यकता हो सकती है।

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