C ++ में नामस्थान का उपयोग करने के लिए सर्वोत्तम अभ्यास [बंद]


38

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

अब सवाल के लिए। पुस्तक के उदाहरण सभी जावा में हैं, जबकि मैं पिछले कई वर्षों से C ++ में काम कर रहा था। क्लीन कोड में विचार नामस्थान के उपयोग तक कैसे विस्तारित होंगे, जो जावा में मौजूद नहीं हैं? (हां, मुझे जावा पैकेज के बारे में पता है, लेकिन यह वास्तव में ऐसा नहीं है।)

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

संपादित करें: मेरा सवाल पैकेज सिद्धांतों के बारे में इस विकिपीडिया प्रविष्टि में उत्तर दिया गया है ।


7
एक अच्छा और वास्तविक दुनिया डेवलपर प्रश्न का एक और उदाहरण बंद हो गया । यदि यह डेवलपर सर्वोत्तम प्रथाओं के बारे में पूछने के लिए स्टैकएक्सचेंज साइट नहीं है, तो क्या है?
सैम गोल्डबर्ग

@ समगोल्डबर्ग: यह बेहतर हो जाता है। मुझे इस प्रश्न का एक अच्छा उत्तर यहाँ मिला: en.wikipedia.org/wiki/Package_Principles । मैंने इस उत्तर को पोस्ट किया, और एक मॉडरेटर ने इसे हटा दिया, क्योंकि मैंने केवल लिंक पोस्ट किया था और सामग्री को कॉपी / पेस्ट करने का समय नहीं था।
दिमा

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

जवाबों:


22

(मैंने क्लीन कोड नहीं पढ़ा है और बहुत जावा नहीं जानता हूं।)

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

हां, जैसा कि यह कई वर्गों और कई कार्यों में रिफैक्टिंग के साथ होता है।

क्या संबंधित वर्गों के एक छोटे समूह को हमेशा एक नाम स्थान में लपेटा जाना चाहिए?

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

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

क्या यह बहुत सारे छोटे वर्गों की जटिलता को प्रबंधित करने का तरीका है, या बहुत सारे नामस्थानों के प्रबंधन की लागत निषेधात्मक होगी?

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

Namespace उपनाम आपको एक विशिष्ट संदर्भ में लंबे नामस्थान के लिए एक छोटे नाम का उपयोग करने की अनुमति देता है, जो फिर से आसान उपयोग की अनुमति देता है:

void f() {
  namespace CWVLN = Company_with_very_long_name;  // Example from the standard.
  // In this scope, use CWVLN::name instead of Company_with_very_long_name::name.
  namespace fs = boost::filesystem;  // Commonly used.
}

बूस्ट पर विचार करें, जिसमें एक ही रूट नेमस्पेस है, बूस्ट, और फिर कई सबनामस्पेस - बूस्ट :: एसियो, बूस्ट :: आईओ, बूस्ट: फाइलसिस्टम, बूस्ट :: ट्यूपल्स, इत्यादि - विभिन्न पुस्तकालयों के लिए। कुछ नाम रूट नाम स्थान पर "पदोन्नत" हैं :

सभी परिभाषाएँ नामस्थान में हैं :: बूस्ट :: ट्यूपल्स, लेकिन सबसे आम नाम नेमस्पेस पर उठाए जाते हैं :: घोषणाओं के साथ बढ़ावा। ये नाम हैं: tuple, make_tuple, टाई और प्राप्त करें। इसके अलावा, रेफ और cref को सीधे :: बूस्ट नेमस्पेस के तहत परिभाषित किया गया है।

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


एक पंक्ति के जवाब के बजाय पूर्ण विश्लेषण के लिए +1 @Fred नर्क। आपको यह जानने के लिए पुस्तक नहीं पढ़ना है कि प्रश्न क्या है। यह टिप्पणी धागा उन अवधारणाओं और अंतरों को उजागर करता है जो इस पुस्तक पर एक सी ++ और एक जावा प्रोग्रामर हो सकते हैं। अमेज़न में क्लीन कोड टिप्पणी
Marlon

8

आपके पास अपने सभी कोड के लिए एक मास्टर नेमस्पेस होना चाहिए। यह इसे नाम कोड के संबंध में बाहरी कोड से अलग करता है।

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

विशेष रूप से यदि आपके पास FileInfo जैसे एक सामान्य ध्वनि वाला नाम है, जिसका अर्थ किसी संदर्भ में कुछ विशेष है, तो इसे नाम स्थान में रखें।

आप इसके लिए एक वर्ग का उपयोग भी कर सकते हैं, हालांकि एक वर्ग एक्स्टेंसिबल नहीं है, इसलिए आप अपने हेडर को संशोधित किए बिना कक्षा में नई घोषणाएं नहीं जोड़ सकते।


3

नामस्थान एक मॉड्यूल अवधारणा नहीं है, इसलिए मैं केवल उनका उपयोग करूंगा जहां नाम संघर्ष हो सकता है।


4
पक्का नहीं आपका क्या मतलब है। एक नाम स्थान में लिपटे संबंधित वर्गों का एक सेट मॉड्यूल क्यों नहीं होगा?
दिमा

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

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

3
एक्सेस प्रतिबंध मॉड्यूल के लिए ऑर्थोगोनल है। वास्तव में, आपके पास सफल सिस्टम हैं जैसे कि पायथन जो निश्चित रूप से C ++ के नामस्थानों की तुलना में अधिक "मॉड्यूल-जैसे" हैं, लेकिन सभी पर कोई एक्सेस प्रतिबंध नहीं लगाते हैं।
फ्रेड Nurk

मेरा मानना ​​है कि यह स्कॉट मेयर की पुस्तकों
राफेल

1

जावा में नामस्थान हैं, वे वास्तव में नहीं कहे जाते हैं। में javax.swing.* javaxएक नाम स्थान है और swingएक उप नाम स्थान है। मैंने यह जानने के लिए किताब नहीं पढ़ी है कि यह जावा पैकेज के बारे में क्या कहता है, लेकिन समान सिद्धांत किसी भी भाषा में नाम स्थान पर बहुत सीधे लागू होंगे।

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


1

मुझे गहरे नेमस्पेस (जो आमतौर पर तीन स्तरों का मतलब है) पसंद हैं।

  • मेरे पास कंपनी का नाम है।
  • एप्लिकेशन / util / lib / आदि
  • प्रोजेक्ट का नाम / या पैकेज उपयुक्त के रूप में

स्थिति के आधार पर मेरा एक और स्तर हो सकता है

  • विवरण (प्लेटफ़ॉर्म विशिष्ट कार्यान्वयन विवरण)
  • बर्तन (उपयोगिता वस्तु जिसे अभी तक सामान्य उपयोगिता में नहीं ले जाया गया है)।
  • मुझे जो भी चाहिए।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.