2009-08-02 25 views
7

मैं निम्नलिखित न्यूनतम उदाहरण पर अपने स्वयं के कोड शुद्धता पर सवाल उठाने की कोशिश कर रहा हूं जिसमें एक हेडर फ़ाइल वर्तमान नेमस्पेस में पहचानकर्ता लिफ्ट करती है।नेमस्पेस शुद्धता

#include <string> 

namespace mine { 

    using std::string; // std::string lifted into mine 

    struct agent 
    { 
     string name; 
    }; 
} 

यह एक सुझाव मैं हाल ही में एक typedef के उपयोग के लिए एक और विकल्प के रूप में किया जाता है:

#include <string> 

struct agent 
{ 
    private: 
     typedef std::string string; 
    public: 
     string name; 
}; 

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

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

ऐसा लगता है कि हमेशा सबसे कम संभव दायरे में काम करने और वहां से काम करने के लिए मुझे और अधिक सही लगता है। केवल बिल्कुल जरूरी है। तथ्य यह है कि मैं दूसरे उदाहरण पर टाइपपीफ निजी बनाता हूं, इसकी वजह से बिल्कुल ठीक था। लेकिन फिर मैं दूसरे उदाहरण के साथ अपनी सलाह का पालन नहीं करता हूं।

लेकिन दूसरी तरफ, मेरी चिंताओं तथ्य किसी से परिणाम नाम स्थान मेरा का दुरुपयोग हो सकता है:

using namespace mine; 

पहली नज़र में, हम जानते हैं कि यह एक नाम स्थान के लिए एक सही उपयोग प्रतिमान नहीं है। लेकिन इनकार नहीं किया जा सकता है जब यह वांछनीय हो सकता है। पहला दृष्टिकोण क्या आपको लगता है?

उत्तर

8

मैं सोचा होगा स्पष्ट समाधान है:

namespace mine { 
    struct agent 
    { 
     std::string name; 
    }; 
} 

मैं व्यक्तिगत रूप से सब पर हेडर फाइल में निर्देशों का उपयोग कर का उपयोग नहीं करते। कार्यान्वयन फाइलों में, निश्चित रूप से।

+0

बिल्कुल! किसी भी मामले में उदाहरण उन मामलों की सेवा करता है जहां लेखक के पास कक्षा के भीतर घोषित होने के लिए बहुत से प्रकार हैं और उनके टाइपिंग को सरल बनाना चाहते हैं। मैंने महसूस किया कि मैंने पहले उदाहरण के साथ गलत सलाह दी है। लेकिन कुछ विचार पसंद करेंगे, क्योंकि std :: स्ट्रिंग बल्कि innocuos है। –

+1

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

7

मैं सामान्य रूप से ऐसा करते हैं:

// In header file: 

#include <string> 

namespace mine { 

    struct agent 
    { 
     std::string name; 
    }; 
} 

// In source file: 

using std::string; 

namespace mine { 
    // Code 
}  

इस तरह आप बाहर std :: फिर से लागू करने में लिखने के लिए अधिक से अधिक की जरूरत नहीं है, लेकिन आप लोग हैं, जो अपने हेडर अनजाने आयात का उपयोग की समस्या से बचने के std :: प्रतीकों।

+0

यदि "मेरा" टेम्पलेट को परिभाषित करता है, तो हेडर फ़ाइल स्रोत फ़ाइल है। –

1

मैं आमतौर पर ऐसा करते हैं:

// In header file 
#include <string> 
namespace mine 
{ 
    namespace detail 
    { 
     using std::string; 

     struct agent 
     { 
      string name; 
     } 
    } 

    using detail::agent; 
} 

इस तरह से मैं या तो शीर्षक में std:: टाइपिंग रखने की जरूरत नहीं है, लेकिन किसी को अभी भी using namespace mine; कर सकते हैं और std से नाम आयात नहीं।

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