2009-02-02 10 views
25

मैं एक सी # पृष्ठभूमि से आया हूं जहां सब कुछ अपना नामस्थान है, लेकिन यह अभ्यास सी ++ दुनिया में असामान्य प्रतीत होता है। क्या मुझे अपना कोड अपने नामस्थान, नामित नेमस्पेस, या नामस्थान में लपेटना चाहिए?क्या मुझे अपने सभी सी ++ कोड को अपने नामस्थान में लपेटना चाहिए?

+0

@ ओलिवर: टैग को संपादित करने के लिए आपको केवल 500 प्रतिष्ठा की आवश्यकता है। http://stackoverflow.com/faq –

उत्तर

35

कई सी ++ डेवलपर्स नामस्थानों का उपयोग नहीं करते हैं, दुख की बात है। जब मैंने सी ++ के साथ शुरुआत की, तो मैंने उन्हें लंबे समय तक उपयोग नहीं किया, जब तक कि मैं इस निष्कर्ष पर नहीं आया कि मैं नामस्थानों का उपयोग करके बेहतर कर सकता हूं।

कई पुस्तकालय नाम से पहले उपसर्ग डालकर नामस्थानों के आसपास काम करते हैं। उदाहरण के लिए, wxwidgets सबकुछ से पहले अक्षर "wx" डालता है। क्यूटी सब कुछ से पहले "क्यू" डालता है। इसके साथ वास्तव में कुछ भी गलत नहीं है, लेकिन इसके लिए आपको फिर से उस उपसर्ग को टाइप करने की आवश्यकता है, भले ही इसे संदर्भ से हटाया जा सके, जो आपके द्वारा घोषित घोषणाओं के संदर्भ में किया जा सकता है। नेमस्पेस के पास पदानुक्रमित क्रम है। नाम जो संदर्भ के बिंदु के करीब हैं जो उन्हें संदर्भित करते हैं, पहले पाए जाते हैं। इसलिए यदि आप अपने जीयूआई ढांचे के भीतर "विंडो" का संदर्भ देते हैं, तो इसे ":: :: विंडो" के बजाय "my :: gui :: विंडो" मिलेगा।

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

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

+5

हाँ, और यह कोड को और अधिक स्पष्ट बनाता है। एक वैश्विक चर आपको कुछ भी नहीं बताता है, लेकिन config :: max_threads कम से कम आपको यह कहता है कि यह कहां से आ रहा है। –

1

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

11

निर्भर करता है, यदि आपका कोड लाइब्रेरी कोड है, तो कृपया इसे नामस्थान में लपेटें, यह सी ++ में अभ्यास है। यदि आपका कोड केवल एक बहुत ही सरल एप्लीकेशन है जो किसी अन्य चीज़ के साथ बातचीत नहीं करता है, जैसे हैलो वर्ल्ड सॉर्ट ऐप, नामस्थानों की कोई आवश्यकता नहीं है, क्योंकि इसकी अनावश्यकता है।

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

2

यह वास्तव में इस बात पर निर्भर करता है कि आप किसी भी संघर्ष के लिए उम्मीद करते हैं या नहीं।

दो परिदृश्य;

1) यदि आप कोड बना रहे हैं जो दूसरों द्वारा उपयोग किया जा सकता है (जैसे पुस्तकालय) तो नामस्थान क्लैश हो सकता है ताकि आपके नामस्थान का उपयोग करके एक अच्छा विचार हो।

2) यदि आप तृतीय-पक्ष पुस्तकालयों का उपयोग कर रहे हैं तो उनके कोड को नामित नहीं किया जा सकता है और आपके साथ संघर्ष कर सकता है।

मैं यह भी कहूंगा कि यदि आप उम्मीद करते हैं कि आपका कोड बड़ा हो और कई अलग-अलग क्षेत्रों (गणित/भौतिकी/प्रतिपादन) को कवर करने के बाद नामस्थानों का उपयोग करके कोड को आसानी से वर्गीकृत किया जा सके, खासकर उन प्रकारों के लिए जो स्पष्ट रूप से वर्गीकृत नहीं हैं।

+0

आपका दूसरा बिंदु सी पुस्तकालयों को शामिल करते समय विशेष रूप से सच है, क्योंकि उनमें नामस्थान की कमी है। –

+0

@Robert - हाँ, अच्छा बिंदु। –

+2

यहां सी पुस्तकालयों के लिए कुछ भी "विशेष रूप से सच" नहीं है। अच्छे सी पुस्तकालयों को उपसर्गों के माध्यम से नामित किया जाता है। अच्छा С ++ पुस्तकालय नामस्थानों के माध्यम से नामित हैं। खराब सी और सी ++ पुस्तकालयों का नाम नहीं रखा गया है। यह गुणवत्ता की बात है, भाषा नहीं। – Constantin

1

लेकिन ये क्रिया

सच C++ दुनिया में असामान्य प्रतीत होता है। मुझे लगता है कि सभी कोड एक नामस्थान में लपेटा लगता है।
मैं जावा में देखे जाने वाले उसी प्रकार के सम्मेलन का उपयोग करता हूं (सिवाय इसके कि मैं कॉम छोड़ देता हूं)।

जावा

package com.<Company>.<Product>.<Package>; 

में C++ में

namespace <Company> 
{ 
    namespace <Product> 
    { 
     namespace <Package> 
     { 
     } 
    } 
} 
2

हम कामयाब सी ++ यहां हमारी आम पुस्तकालयों का उपयोग करता है में कोड लपेटकर समस्या थी।

कुछ वर्गों में .NET लाइब्रेरी (यानी System.Console) में सिस्टम क्लास के समान नाम थे।
हमें इन समस्याओं को हल करने के लिए कुछ बदसूरत मैक्रो पैच करना पड़ा।

शुरुआत में नामस्थानों का उपयोग करना इसे रोक देगा।

3

मैं सिर्फ गूगल के सी ++ शैली गाइड की खोज की और वे namespace guidelines.

है पूरी गाइड पढ़ने लायक है, लेकिन संक्षेप में प्रस्तुत करने, वे कहते हैं:

  • फ़ाइलों .cc के लिए अनाम नामस्थान जोड़े, लेकिन नहीं। एच फाइलें
  • पूरे नाम (शामिल/घोषणाओं के बाद) .cc और .h फ़ाइलों नामित नामस्थानों में लपेटें।
  • नामस्थान इंडेंट स्तर में वृद्धि नहीं करते हैं।
  • नामस्थान के लिए बंद ब्रेस पर } // namespace लिखें।
  • std में कुछ भी घोषित न करें, क्योंकि यह अपरिभाषित है। using निर्देश का उपयोग कर प्रतिबंधित है।
  • using कार्यों, विधियों और कक्षाओं में घोषणा की अनुमति है।
  • नामस्थान उपनाम कहीं भी अनुमति है।
+0

क्यों .h फ़ाइलों में unamed नामस्थान जोड़ें? – Casebash

1

मैं कहूंगा कि यह एक अच्छा विचार है, अगर किसी अन्य कारण से आपकी सामग्री को अन्य तृतीय-पक्ष कोड के साथ मिश्रित होने से रोकने के अलावा कोई अन्य कारण नहीं है।

मैं कक्षाओं में जितने चर और कार्यों को डालकर उससे भी आगे जाने की कोशिश करता हूं। लेकिन यह कभी-कभी करना चाहिए (अन्य ओओ भाषाओं की तुलना में) करना चाहिए।

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