2012-02-16 15 views
5

उदा। लिनक्स ड्राइवर विकास में container_of मैक्रो मिल सकता है। संक्षेप में यह -> पर रिवर्स ऑपरेटर है, यदि आप किसी सदस्य को पॉइंटर प्राप्त करते हैं तो उस संरचना को पॉइंटर प्रदान करना।"कंटेनर_ओफ़" पैटर्न का वास्तविक नाम

ग्रेग क्रोहा के ब्लॉग के अलावा मुझे इस पैटर्न को list और hash पिंटोस के कार्यान्वयन में मिला।

+3

बस अपनी सूची में जोड़ने के लिए, विंडोज के समान 'CONTAINING_RECORD' मैक्रो है। मैं 'पैटर्न' के लिए एक सामान्य नाम के बारे में नहीं जानता। –

+1

जब कंटेनर डेटा संरचनाओं को लागू करने के लिए उपयोग किया जाता है, तो सी ++ दुनिया में इस तकनीक को "घुसपैठ करने वाले कंटेनर" को बढ़ावा दें। हालांकि कंटेनर_ओफ़ सामान्य संदर्भों जैसे सूचियों और हैश तालिकाओं को लागू करने के बजाय अन्य संदर्भों में अधिक सामान्य और उपयोगी है। – nos

उत्तर

2

इस पैटर्न का असली नाम "container_of() है।" जावा या सी ++ डिज़ाइन पैटर्न वर्गीकरण में इस सी-आईएसएम को फिट करने का प्रयास व्यर्थ है। मुद्दा जिम्मेदारी श्रृंखला, या किसी भी नाम को निर्दिष्ट या प्रतिनिधि नहीं है। यदि आपको इन शर्तों में सोचना चाहिए तो यह एक "गन्दा सामान्यीकृत विरासत" है। यदि आपको इन शर्तों में सोचने की ज़रूरत नहीं है तो यह बहुत कम गन्दा है।

0

मैं कहूंगा कि यह एक बहुत ही विशेषतापूर्ण Chain Of Responsibility है। आपके माता-पिता कंटेनर संरचना में पॉइंटर की आवश्यकता होने का एकमात्र कारण है निहित तत्वों की पहुंच के भीतर पैरेंट कंटेनर कार्यक्षमता रखना। इस प्रकार, को "चेन" को ट्रिकल करने के अनुरोध को अनुमति देने के लिए आवश्यक कार्यान्वयन विस्तार के रूप में देखा जा सकता है जब तक यह सही "स्तर" पर संभाला न जाए।

एक कंटेनर/निहित रिश्ते के साथ, "सही" स्तर केवल एक स्तर ऊपर है, और ट्रिकल अप पर्याप्त स्तरों से गुजरता नहीं है (क्योंकि केवल एक स्तर है) ताकि एक आदर्श उदाहरण के रूप में अधिक रुचि पैदा हो सके पैटर्न। फिर भी, Chain of Responsibility के पीछे सामान्य विचार अभी भी हैं; एक श्रृंखला में एक बिंदु पर एक अनुरोध किया जाता है जो इसे संभाल नहीं सकता है, और परिवर्तन में एक अलग बिंदु पर संभाला जा सकता है।

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

और हाँ, there is a C2 pattern's page for it ... यदि आप मेरे तर्क से सहमत हैं।

संबंधित मुद्दे