मैं एक सी # पृष्ठभूमि से आया हूं जहां सब कुछ अपना नामस्थान है, लेकिन यह अभ्यास सी ++ दुनिया में असामान्य प्रतीत होता है। क्या मुझे अपना कोड अपने नामस्थान, नामित नेमस्पेस, या नामस्थान में लपेटना चाहिए?क्या मुझे अपने सभी सी ++ कोड को अपने नामस्थान में लपेटना चाहिए?
उत्तर
कई सी ++ डेवलपर्स नामस्थानों का उपयोग नहीं करते हैं, दुख की बात है। जब मैंने सी ++ के साथ शुरुआत की, तो मैंने उन्हें लंबे समय तक उपयोग नहीं किया, जब तक कि मैं इस निष्कर्ष पर नहीं आया कि मैं नामस्थानों का उपयोग करके बेहतर कर सकता हूं।
कई पुस्तकालय नाम से पहले उपसर्ग डालकर नामस्थानों के आसपास काम करते हैं। उदाहरण के लिए, wxwidgets सबकुछ से पहले अक्षर "wx" डालता है। क्यूटी सब कुछ से पहले "क्यू" डालता है। इसके साथ वास्तव में कुछ भी गलत नहीं है, लेकिन इसके लिए आपको फिर से उस उपसर्ग को टाइप करने की आवश्यकता है, भले ही इसे संदर्भ से हटाया जा सके, जो आपके द्वारा घोषित घोषणाओं के संदर्भ में किया जा सकता है। नेमस्पेस के पास पदानुक्रमित क्रम है। नाम जो संदर्भ के बिंदु के करीब हैं जो उन्हें संदर्भित करते हैं, पहले पाए जाते हैं। इसलिए यदि आप अपने जीयूआई ढांचे के भीतर "विंडो" का संदर्भ देते हैं, तो इसे ":: :: विंडो" के बजाय "my :: gui :: विंडो" मिलेगा।
नेमस्पेस कुछ अच्छी सुविधाएं सक्षम करता है जिनका उपयोग उनके बिना नहीं किया जा सकता है। उदाहरण के लिए, यदि आप अपनी कक्षा को नेमस्पेस में डालते हैं, तो आप उस नामस्थान के भीतर निःशुल्क फ़ंक्शंस को परिभाषित कर सकते हैं। फिर आप नामों को सभी नामों को आयात करके, या चुनिंदा रूप से उनमें से कुछ को मौजूदा दायरे में (बिना घोषणा का उपयोग करके) को बिना कॉल किए कॉल को कॉल करें।
आजकल, मैं इनका उपयोग किए बिना अब कोई परियोजना नहीं करता हूं। वे फिर से एक ही उपसर्ग को टाइप करना इतना आसान बनाते हैं, लेकिन फिर भी अच्छे संगठन और वैश्विक नामस्थान के नाम-प्रदूषण से बचने के लिए अच्छा संगठन है।
हाँ, और यह कोड को और अधिक स्पष्ट बनाता है। एक वैश्विक चर आपको कुछ भी नहीं बताता है, लेकिन config :: max_threads कम से कम आपको यह कहता है कि यह कहां से आ रहा है। –
नामों के संघर्ष का जोखिम होने पर आपको केवल नामस्थानों की आवश्यकता है - कुछ वैश्विक रूप से देखे गए फ़ंक्शन या चर या कक्षा को एक से अधिक बार परिभाषित किया गया है। अन्यथा आप नामस्थान के साथ ठीक काम करेंगे - बस अपनी कक्षाओं का नाम दें ताकि वे रनटाइम लाइब्रेरी कक्षाओं को डुप्लिकेट न करें और वैश्विक कार्यों/चर को कुछ उचित वर्गों के स्थिर सदस्य बनें।
निर्भर करता है, यदि आपका कोड लाइब्रेरी कोड है, तो कृपया इसे नामस्थान में लपेटें, यह सी ++ में अभ्यास है। यदि आपका कोड केवल एक बहुत ही सरल एप्लीकेशन है जो किसी अन्य चीज़ के साथ बातचीत नहीं करता है, जैसे हैलो वर्ल्ड सॉर्ट ऐप, नामस्थानों की कोई आवश्यकता नहीं है, क्योंकि इसकी अनावश्यकता है।
और चूंकि नेमस्पेस की आवश्यकता नहीं है क्योंकि वेब पर कोड स्निपेट और उदाहरण शायद ही कभी उनका उपयोग करते हैं लेकिन अधिकांश वास्तविक परियोजनाएं उनका उपयोग करती हैं।
यह वास्तव में इस बात पर निर्भर करता है कि आप किसी भी संघर्ष के लिए उम्मीद करते हैं या नहीं।
दो परिदृश्य;
1) यदि आप कोड बना रहे हैं जो दूसरों द्वारा उपयोग किया जा सकता है (जैसे पुस्तकालय) तो नामस्थान क्लैश हो सकता है ताकि आपके नामस्थान का उपयोग करके एक अच्छा विचार हो।
2) यदि आप तृतीय-पक्ष पुस्तकालयों का उपयोग कर रहे हैं तो उनके कोड को नामित नहीं किया जा सकता है और आपके साथ संघर्ष कर सकता है।
मैं यह भी कहूंगा कि यदि आप उम्मीद करते हैं कि आपका कोड बड़ा हो और कई अलग-अलग क्षेत्रों (गणित/भौतिकी/प्रतिपादन) को कवर करने के बाद नामस्थानों का उपयोग करके कोड को आसानी से वर्गीकृत किया जा सके, खासकर उन प्रकारों के लिए जो स्पष्ट रूप से वर्गीकृत नहीं हैं।
आपका दूसरा बिंदु सी पुस्तकालयों को शामिल करते समय विशेष रूप से सच है, क्योंकि उनमें नामस्थान की कमी है। –
@Robert - हाँ, अच्छा बिंदु। –
यहां सी पुस्तकालयों के लिए कुछ भी "विशेष रूप से सच" नहीं है। अच्छे सी पुस्तकालयों को उपसर्गों के माध्यम से नामित किया जाता है। अच्छा С ++ पुस्तकालय नामस्थानों के माध्यम से नामित हैं। खराब सी और सी ++ पुस्तकालयों का नाम नहीं रखा गया है। यह गुणवत्ता की बात है, भाषा नहीं। – Constantin
लेकिन ये क्रिया
सच C++ दुनिया में असामान्य प्रतीत होता है। मुझे लगता है कि सभी कोड एक नामस्थान में लपेटा लगता है।
मैं जावा में देखे जाने वाले उसी प्रकार के सम्मेलन का उपयोग करता हूं (सिवाय इसके कि मैं कॉम छोड़ देता हूं)।
जावा
package com.<Company>.<Product>.<Package>;
में C++ में
namespace <Company>
{
namespace <Product>
{
namespace <Package>
{
}
}
}
हम कामयाब सी ++ यहां हमारी आम पुस्तकालयों का उपयोग करता है में कोड लपेटकर समस्या थी।
कुछ वर्गों में .NET लाइब्रेरी (यानी System.Console) में सिस्टम क्लास के समान नाम थे।
हमें इन समस्याओं को हल करने के लिए कुछ बदसूरत मैक्रो पैच करना पड़ा।
शुरुआत में नामस्थानों का उपयोग करना इसे रोक देगा।
मैं सिर्फ गूगल के सी ++ शैली गाइड की खोज की और वे namespace guidelines.
है पूरी गाइड पढ़ने लायक है, लेकिन संक्षेप में प्रस्तुत करने, वे कहते हैं:
- फ़ाइलों .cc के लिए अनाम नामस्थान जोड़े, लेकिन नहीं। एच फाइलें
- पूरे नाम (शामिल/घोषणाओं के बाद) .cc और .h फ़ाइलों नामित नामस्थानों में लपेटें।
- नामस्थान इंडेंट स्तर में वृद्धि नहीं करते हैं।
- नामस्थान के लिए बंद ब्रेस पर
} // namespace
लिखें। std
में कुछ भी घोषित न करें, क्योंकि यह अपरिभाषित है।using
निर्देश का उपयोग कर प्रतिबंधित है।using
कार्यों, विधियों और कक्षाओं में घोषणा की अनुमति है।- नामस्थान उपनाम कहीं भी अनुमति है।
क्यों .h फ़ाइलों में unamed नामस्थान जोड़ें? – Casebash
मैं कहूंगा कि यह एक अच्छा विचार है, अगर किसी अन्य कारण से आपकी सामग्री को अन्य तृतीय-पक्ष कोड के साथ मिश्रित होने से रोकने के अलावा कोई अन्य कारण नहीं है।
मैं कक्षाओं में जितने चर और कार्यों को डालकर उससे भी आगे जाने की कोशिश करता हूं। लेकिन यह कभी-कभी करना चाहिए (अन्य ओओ भाषाओं की तुलना में) करना चाहिए।
- 1. क्या मुझे अपने सभी डब्ल्यूसीएफ सेवा कोड को कैच ब्लॉक में लपेटना चाहिए?
- 2. क्या मुझे #if (DEBUG) में Debugger.Log() को कॉल लपेटना चाहिए?
- 3. क्या मुझे अपने डेटाबेस में ओपनआईडी को एन्क्रिप्ट करना चाहिए?
- 4. जावास्क्रिप्ट: क्या मुझे अपने कार्यान्वयन को छुपाया जाना चाहिए?
- 5. एचटीएमएल 5, मुझे अपने ग्राहकों को क्या कहना चाहिए?
- 6. क्या मुझे अपने जेमफाइल में सटीक संस्करण निर्दिष्ट करना चाहिए?
- 7. क्या मुझे अपने डेटाबेस में एक स्थानिक इंडेक्स चाहिए?
- 8. क्या मुझे अपने आईओसी कंटेनर को समाहित करना चाहिए?
- 9. मैं अपने कोड एएसपीनेट सी #
- 10. एमएसपीसी, मुझे अपने [विषय()] विशेषताओं में क्या रखना चाहिए?
- 11. क्या मुझे अपने सभी जावास्क्रिप्ट स्रोतों को एक ही फाइल में कॉपी करना चाहिए?
- 12. क्या मुझे अपने डीएलएल पर हस्ताक्षर करना चाहिए?
- 13. क्या मुझे हमेशा अपना कोड कोशिश करने में लपेटना चाहिए ... ब्लॉक को पकड़ें?
- 14. क्या मुझे अपने सबवर्जन रिपोजिटरी में संकलित बाइनरी जोड़नी चाहिए?
- 15. क्या मुझे अपने पैथ में .NET फ्रेमवर्क निर्देशिका जोड़नी चाहिए?
- 16. क्या मुझे अपने यूआरएल के अंत में .htm रखना चाहिए?
- 17. क्या मुझे अपने .NET कोड को obfuscating के बारे में चिंतित होना चाहिए?
- 18. मुझे अपने निपटान() विधि में अपवादों को कैसे संभालना चाहिए?
- 19. मुझे अपने जुनीट परीक्षण कहां रखना चाहिए?
- 20. क्या मुझे अपने सी/सी ++ स्रोतों में #शामिल करना होगा?
- 21. क्या मुझे अपने रेल एप्लिकेशन
- 22. क्या मुझे अपने पायथन एप्लिकेशन के साथ सी पुस्तकालयों को बंडल करना चाहिए?
- 23. मुझे अपने फ्लेक्स एप्लिकेशन को व्यवस्थित कैसे करना चाहिए?
- 24. क्या मुझे अपने नियंत्रकों (एमवीसी) का परीक्षण करना चाहिए?
- 25. मुझे अपने gemspec
- 26. क्या मुझे अपने कोड में ब्लॉक पहचानकर्ता ("अंत;") का उपयोग करना चाहिए?
- 27. मुझे अपने डेटामैटप्लेट को कहां परिभाषित करना चाहिए?
- 28. मुझे अपने सीएसएस वर्गों को कैसे नामित करना चाहिए?
- 29. मुझे अपने प्रश्नों में लेनदेन का उपयोग कब करना चाहिए?
- 30. क्या नामस्थान ब्लॉक में # अंतर्निहित लपेटना अच्छा विचार है?
@ ओलिवर: टैग को संपादित करने के लिए आपको केवल 500 प्रतिष्ठा की आवश्यकता है। http://stackoverflow.com/faq –