डिज़ाइन: मूल वर्ग में वापस कॉल करना


13

जब बच्चों के साथ किसी ऑब्जेक्ट को मॉडलिंग करते हैं, तो रचना के माध्यम से बच्चों को शामिल करना आम है, माता-पिता वर्ग के सदस्य के रूप में। हालांकि कभी-कभी बच्चों को माता-पिता को कुछ बताने की आवश्यकता होती है, उन्हें माता-पिता के कार्य को कॉल करने की आवश्यकता होती है। C ++ का उपयोग करके इसे कैसे पूरा किया जा सकता है? कुछ विकल्प हैं:

  1. अभिभावक वर्ग को वैश्विक बनाएं इसलिए बाल वस्तुएं अभिभावक वस्तु के सदस्य कार्यों को कह सकेंगी।

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

ऐसा करने के अन्य तरीके क्या हैं? क्या इस तरह की चीज़ के लिए एक सामान्य डिज़ाइन पैटर्न या नाम है?

ध्यान दें कि मैं C ++ में विचारों और समाधानों में दिलचस्पी रखता हूं क्योंकि विवरण अन्य ऑब्जेक्ट-ओरिएंटेड भाषाओं में अलग-अलग होने जा रहे हैं। उदाहरण के लिए बिंदु 2 के ऊपर 'संकेत या संदर्भ' और दोनों ही C ++ में ही संभव हैं। C ++ में ऐसी भाषा सुविधाएँ हैं जो अन्य भाषाओं में मौजूद नहीं हैं, इसलिए समस्या के समाधान के कार्यान्वयन संभवतः इन भाषा सुविधाओं को समाधान में शामिल करेंगे, जो किसी अन्य भाषा में किसी व्यक्ति के साथ आने वाले समाधान को अलग बना सकते हैं।


क्या आप एक उदाहरण जोड़ सकते हैं? क्या यह आपके प्रश्न के लिए एक वैध उदाहरण है? आपके पास ऑर्डरबुक (बच्चों) के साथ एक ऑर्डरबॉज़ (= माता-पिता) है और ऑर्डरटाइम-मात्रा में परिवर्तन होने पर ऑर्डर को कुल अपडेट करना चाहते हैं? या कुछ और पूरी तरह से अलग सोच रहे हैं?
k3b

@ k3b हाँ यह एक वैध उदाहरण है। बच्चे में कुछ जानकारी ने माता-पिता को कुछ करने की आवश्यकता को बदल दिया है।
शाशांग

बस कुछ निर्माण पैरामीटर और संदर्भ डेटा सदस्यों को प्रत्येक बाल वर्ग में जोड़ें।
tp1

क्या बच्चे को माता-पिता के बारे में सब पता delegateहोना चाहिए , या एक सरल पर्याप्त होगा?
जुलिएन गुर्टाल्ट

जवाबों:


16

पहले चीजें पहले, यह एक कोड गंध हो सकता है। माता-पिता / बच्चों के लिए रचना का उपयोग करने की बात यह है कि माता-पिता बच्चों के बारे में जानते हैं, लेकिन इसके विपरीत नहीं। विशेषकर यदि संबंध 'सम्‍मिलित ’से अधिक है तो of से बना है’।

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


मेरी स्थिति में यह एक कोड गंध है। बहुत बढ़िया जवाब।
मार्टिन फ़ेफ़र

3

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

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

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


2

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

इसलिए मैं विकल्प 2 के साथ जाऊंगा। आपको सावधान रहना होगा, हालांकि, जब बच्चे को माता-पिता से दूर किया जाता है, तो आपको बच्चे में माता-पिता के संदर्भ को हटाने और इसे शून्य (या एक नए माता-पिता की ओर इंगित करने की आवश्यकता होती है, यदि उसके पास है) एक)। या आप केवल संदर्भ के आधार पर बच्चे की वस्तु को हटा सकते हैं।


1

उन्हें माता-पिता के लिए एक संदर्भ या एक सूचक दें। आप उन्हें माता-पिता के दोस्त बना सकते हैं, या तथाकथित विधि को सार्वजनिक कर सकते हैं। यदि आप उपरोक्त में से कोई भी कार्य नहीं करना चाहते हैं, तो आप उन्हें एक "पुल" ऑब्जेक्ट पास कर सकते हैं, जो माता-पिता के तरीकों में से एक को सार्वजनिक रूप से उजागर करता है और वह स्वयं माता-पिता का एक नेस्टेड नेस्टेड क्लास है (इसलिए इसमें हर माता-पिता की पहुंच है )। यह कई स्थितियों में थोड़ा बहुत जटिल हो सकता है।


1

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

एक पूरी तरह से व्यवहार्य विकल्प है। सभी आधुनिक भाषाओं में एक विशेषता है जिसका उपयोग किसी अन्य भाषा को संदर्भित करने के लिए किया जा सकता है।


1

थोड़ी भिन्नता के साथ एक समान दृष्टिकोण है लेकिन जो लाभ देता है:

कहते हैं पेरेंट ए में कंपोनेंट सी होता है।

घटक सी में, इंटरफेससी घोषित करें और इसके संदर्भ को रखें। यह बाहरी दुनिया के साथ घटक का इंटरफ़ेस है।

जनक A इंटरफ़ेससी को लागू करता है, और घटक C में अपना संदर्भ निर्धारित करता है। घटक C, जनक A को InterfaceC के रूप में देखता है।

विचार यह है: एक घटक अपने इंटरफेस का उपयोग करके बाहर से बात करता है।

माता-पिता को सीधे सेट करने पर इस का उपयोग करने के फायदे हैं:

कहते हैं कि घटक कुछ करता है और उसे अभिभावक को सूचित करने की आवश्यकता होती है। इसे इंटरफेस कहते हैं। बाद में, आप तय करते हैं कि आप माता-पिता को बदलना चाहते हैं। घटक बिल्कुल परवाह नहीं करता है और आप इसमें कोई बदलाव नहीं करेंगे।

बाद में कहें कि आप किसी घटना की कई वस्तुओं को सूचित करना चाहते हैं। आप बस InterfaceC की एक सूची बनाते हैं और उसमें संदर्भ जोड़ते हैं।

नुकसान: एक अभिभावक वर्ग कई इंटरफेस को लागू करेगा (मुझे लगता है कि यह एक फायदा के रूप में है, हालांकि, कक्षा की घोषणा को देखकर, मुझे तुरंत पता है कि कौन इस पर बात करता है)


0

ध्यान दें कि यह c # विशिष्ट है। मुझे पता नहीं है कि क्या c ++ में भी कुछ ऐसा ही है।

यदि आपके पास पुश-बट्टों के साथ एक गुइ-फॉर्म है, तो आप आमतौर पर इवेंट-सब्सक्राइबेशन का उपयोग करके एक अलग दृष्टिकोण रखते हैं जिसे ऑब्जर्वर_पैटर्न के रूप में भी जाना जाता है या पब्लिश-सब्सक्रिप्शन पैटर्न के

पुशबटन usally विशिष्ट रूप को नहीं जानता है कि वह कहाँ रहता है। इसके बजाय बटन एक घटना को ट्रिगर या प्रकाशित करता है और प्रपत्र ए प्राप्त करता है सदस्यता अधिसूचना और तदनुसार प्रतिक्रिया कर सकता है।

इस गु-एस के अलावा इस तंत्र का उपयोग हर पराग-बच्चे-संबंध में किया जा सकता है

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