क्या नेस्टेड कक्षाओं को अंडर रेटेड किया जाता है?


9

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

यह मुझे इस सवाल की ओर ले जाता है: क्या मैं उन कारणों के लिए एक स्वाभाविक रूप से खराब रास्ते से नीचे जा रहा हूं, जब मुझे पता चलेगा कि वे मुझे काटने के लिए वापस आए हैं, या फिर नेस्टेड क्लासेस हो सकती हैं, जो कुछ कम हैं?

यहां दो उदाहरण दिए गए हैं, जिनका मैंने अभी उपयोग किया है: https://gist.github.com/3975581 - पहली ने मुझे एक साथ हिचकोले वाली चीजों को कसकर रखने में मदद की, दूसरा मुझे कार्यकर्ताओं को संरक्षित सदस्यों तक पहुंच प्रदान करने ...


मैं केवल उत्तर / अंतर्दृष्टि के लिए धन्यवाद कहना चाहता हूं - मुझे यकीन नहीं है कि मुझे उत्तर कैसे देना है, इसलिए मैं इसे छोड़ दूंगा, जबकि मुझे मिली सलाह और फिर से विचार करना चाहिए ...
आरोन एनोडाइड

जवाबों:


6

मैं इसे "शायद ही कभी इस्तेमाल किया जाने वाला डिज़ाइन तंत्र" नहीं कहूंगा - कम से कम, सार्वभौमिक रूप से नहीं: हालांकि ऐसी दुकानें हैं जहां कुछ योगदानकर्ताओं को नेस्टेड कक्षाओं का उपयोग करने पर फेंक दिया जा सकता है, यह बिल्कुल भी अस्पष्ट विशेषता नहीं है।

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


* जावा में एक समान सुविधा का उपयोग बहुत अधिक है, क्योंकि C # में उपलब्ध अन्य विकल्प जावा में नहीं हैं।


तो क्या ओओपी डिज़ाइन के सार के अनुसार एक वर्ग को पूरी तरह से दूसरे वर्ग में छिपाना अच्छा है?
मैक्सवुड

1
@Maxood यदि आप इसे छिपा सकते हैं तो कक्षा को छिपाना अच्छा है। आपके एपीआई को लागू करने के तरीके के बारे में आपके एपीआई के उपयोगकर्ता को कम से कम पता होना चाहिए।
डेस्ब्लिंकनेलाइट

3

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

तो OOP को महान (पुन: प्रयोज्य) बनाने वाली बात यहाँ अनुपस्थित है। इसके अलावा, आप एक नेस्टेड क्लास के साथ क्या हासिल कर सकते हैं जो आप मूल तरीकों और निजी सदस्यों के साथ पैरेंट क्लास के भीतर हासिल नहीं कर सकते?

नेस्टेड कक्षाओं का उपयोग करने वाले एक उपयोगी सॉफ्टवेयर पैटर्न के लिए, यहां देखें


10
मैंने कभी भी पुन: प्रयोज्य चीज नहीं खरीदी है, कम से कम जिस तरह से आमतौर पर इसे नहीं डाला जाता है। (1) मौजूदा कोड / कक्षाओं में कॉल करना (जिसके बारे में आप बात करते हैं, और जिसे मैं आमतौर पर पुन: उपयोग की परिभाषा के रूप में देखता हूं) का ओओपी से कोई लेना-देना नहीं है, यह सिर्फ बुनियादी तौर-तरीका है। (2) सबटाइप पॉलीमॉर्फिज्म, जो ओओपी की एक विशिष्ट विशेषता है, विशिष्ट कार्यान्वयन को अप्रासंगिक बनाकर ग्राहक कोड का पुन: उपयोग करने की अनुमति देता है , अर्थात यह ठीक उसी तरह से काम करता है जैसे कंक्रीट वर्ग सुलभ हो या न हो। IOW वह पुन: उपयोग करता है जो मैं खरीदता हूं, लेकिन यह नेस्टेड कक्षाओं के साथ भी काम करता है।

1
मैं कहता हूं कि मूल वर्ग द्वारा दिए गए नामस्थान इन्सुलेशन भी है - इसलिए यदि आप चाहते हैं, तो ए और बी दोनों वर्ग ने "परमेस" को नेस्टेड क्लास और गैर-सार्वजनिक सदस्यों की पहुंच प्रदान कर सकते हैं। क्या वे दोनों कारण नहीं हैं कि भीतर के वर्ग हैं जो कक्षा के बाहर उपयोग किए जाते हैं?
हारून एनोडाइड

@AaronAnodide नेस्टेड कक्षाओं का उपयोग करने के लिए एक अच्छे तरीके के बारे में एक उत्तर होना चाहिए। यह वास्तव में कैसे / क्यों मैं उनका उपयोग करता हूं, यह कोड को व्यवस्थित करने में मदद करता है।
इजाकाटा

2

am I going down an inherintly bad path

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

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

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

जब तक, ज़ाहिर है, आपको एक असंबद्ध हाथ को लागू करने की आवश्यकता थी। फिर निम्नलिखित करके हाथ बनाने से भ्रम होता है क्योंकि शरीर / धड़ / पक्ष नहीं है। (भ्रमित करने वाले आवरण पर भी ध्यान दें)।

arm newArm = new Body.torso.side.arm("");

1

नेस्टेड कक्षाओं के बारे में मैं केवल यही सोच सकता हूं कि उन्हें निजी (या संरक्षित) बनाया जा सकता है। मैं कहूंगा कि इस मामले में नेस्टेड क्लासेस आपको कार्यक्षमता को एनकैप्सुलेट करने में मदद कर सकते हैं यदि किसी क्लास को बाहरी क्लास और अकेले उस क्लास द्वारा इस्तेमाल करने का इरादा है।


1

मेरे अनुभव में, नेस्टेड कक्षाएं

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

आपकी कक्षा पर एक संक्षिप्त नज़र थी, और अभी मुझे लगता है कि:

  • यह देखने के लिए दर्दनाक है क्योंकि वर्ग बहुत बड़ा है
  • मैं पूरे शरीर को बनाए बिना "उंगलियों" का परीक्षण नहीं कर सकता
  • मेरे पास धड़ के कई कार्यान्वयन नहीं हो सकते हैं। एक "मानव शरीर" संदर्भ में यह स्पष्ट नहीं लगता है, लेकिन एक अलग परिदृश्य में यह स्पष्ट हो जाएगा।

अपनी कक्षा को कई वर्गों में अलग क्यों न करें और उन्हें अलग नामस्थान दें। उदाहरण के लिए

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