2010-12-22 9 views
16

मैं static कीवर्ड का उपयोग आंतरिक संबंध को परिभाषित करने के लिए लंबे समय से कर रहा हूं। बाद में, मैंने अज्ञात नेमस्पेस में स्थानीय चीजों को लपेटने की सी ++ शैली में स्विच किया।बेनामी नामस्थान: क्या वे वास्तव में महान हैं?

हालांकि, अब जब मैंने कुछ वर्षों तक अनाम नामस्थानों के साथ काम किया है, तो मुझे लगता है कि static कीवर्ड के साथ काम करना बहुत आसान है!

एक आम समस्या यह है कि मैं इस पद्धति है: एक निश्चित समारोह आंतरिक या बाह्य संबंध है यदि

namespace { 
    // ...five pages of code... 
} // namespace 

देखने के लिए, मैं अब, एक बहुत स्क्रॉल करना पड़ता है के रूप में पुराने सी शैली के लिए विरोध किया, जहां मैं यह जांच सकता है कि फ़ंक्शन/ऑब्जेक्ट के सामने static था या नहीं।

मुझे पता है कि अज्ञात नामस्थान ऐसी चीजें हैं जो static टाइप नहीं कर सकते हैं - लेकिन व्यक्तिगत रूप से मैं वास्तव में उसमें बहुत दिलचस्पी नहीं लेता हूं।

इस पर आपका क्या लेना है? अज्ञात नामस्थानों की जीत इतनी महान है कि यह कम पठनीयता की गारंटी देता है? या मैं सब गलत हूँ?

+3

नामस्थान क्षेत्र में 'स्थिर' फ़ंक्शंस को बहिष्कृत कर दिया गया है, इसका उपयोग करने के लिए पर्याप्त कारण नहीं है। एनन नेमस्पेस में फ़ंक्शंस में 'स्थिर' के सभी फायदे हैं, सिवाय इसके कि उनके पास बाहरी संबंध है। उत्तरार्द्ध मुझे लगता है कि पहले से ही कंपाइलर्स का ख्याल रखा गया है, निर्यात किए गए सेक्शन नाम से अज्ञात नेमस्पेस में परिभाषित नाम हटा रहा है। –

+11

@ जीन वास्तव में, स्थिर कार्यों को कभी बहिष्कृत नहीं किया गया था। बहिष्करण केवल * वस्तुओं * के खिलाफ था। हालांकि, एन 3225 में बहिष्करण हटा दिया गया था: सी ++ 0x में ऑब्जेक्ट देने या आंतरिक संबंधों को कार्य करने के लिए इसका उपयोग करने के लिए अब इसे बहिष्कृत नहीं किया गया है। एक और अंतर गिर गया है कि अनाम नामस्थान बाहरी संबंध बनाए रखेंगे: अनाम नाम और उनकी सामग्री को C++ 0x में आंतरिक संबंध मिलेगा। इसलिए स्थिर-मार्ग और नामस्थान-मार्ग के बीच अब कोई अंतर नहीं दिखता है, नामस्थान-मार्ग को छोड़कर 'नेमस्पेस {int a; } int ए; '। –

+0

@ जोहान्स: सी ++ 0x आंतरिक लिंकेज के साथ टेम्पलेट पैरामीटर की अनुमति देता है, या यह एक महान महान तोड़ने वाला परिवर्तन है? –

उत्तर

20

यदि आपका नाम स्थान में कोड बहुत लंबा है, वहाँ आप कर इसे रोकने के लिए कुछ भी नहीं है:

namespace { 
    int foo(char* x) { 
     return x[0] + x[1]; 
    } 
} 

namespace { 
    int bar(char *x, char *y) { 
     return foo(x) + foo(y); 
    } 
} 

सी ++ 03 एक अनाम नाम स्थान का उपयोग करने का व्यावहारिक लाभ में ठीक है कि सामग्री बाहरी है लिंकेज, (लेकिन अभी भी टीयू के बाहर अदृश्य हैं क्योंकि उन्हें संदर्भित करने का कोई तरीका नहीं है)।

namespace { 
    int foo(const char* x) { 
     return x[0] + x[1]; 
    } 
} 

static int foo2(const char *x) { 
    return x[0] + x[1]; 
} 

template <int (*F)(const char*)> 
void baz(const char *p) { 
    F(p); 
} 

int main() { 
    baz<foo>("ab"); // OK 
    baz<foo2>("ab"); // not valid 
} 
+0

हां, लेकिन क्या वाकई चीजों को बेहतर बनाना है? अधिक टाइपिंग, संतुलन के लिए अधिक कोष्ठक ... –

+4

@kotlinksi: ठीक है, आप ही हैं जिन्होंने कहा कि यह एक पठनीयता समस्या है जिसे आपने कोड के कई स्क्रीनों में केवल एक बार 'नेमस्पेस {}' टाइप किया है। अब आप कह रहे हैं कि इसे एक से अधिक बार टाइप करने के लिए एक उत्तरदायित्व समस्या है।यदि आप आंतरिक लिंकेज के साथ फ़ंक्शंस का उपयोग कर प्रबंधन कर सकते हैं तो आप 'स्थिर' का उपयोग कर सकते हैं। अगर किसी कारण से आपको बाहरी संबंध के साथ कार्यों की आवश्यकता है, तो इससे कोई फर्क नहीं पड़ता कि 'स्थिर' के फायदे क्या हैं, क्योंकि आप उन्हें नहीं प्राप्त कर सकते हैं। –

+0

@ kotlinksy: मुझे लगता है कि इन कार्यों के लिए केवल एक हेडर फ़ाइल बनाने की एक और संभावना होगी। इसे एक ऐसा नाम दें जो इंगित करता है कि इसकी सभी सामग्री अज्ञात नेमस्पेस में हैं, और फिर आप बता सकते हैं कि फ़ंक्शन कहां हैं कि वे किस फ़ाइल में हैं। –

1

एक अनाम नाम स्थान केवल एक चीज एक वर्ग घोषणा वैश्विक क्षेत्र को प्रदूषित करते हैं यह नहीं है कि है: टेम्पलेट मानकों आंतरिक संबंध नहीं हो सकता। एक .cpp फ़ाइल में किसी वर्ग को परिभाषित करते समय बहुत उपयोगी।

2

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

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

तो क्या विकल्प तुम क्या है:

यह जरूरत पर जोर देता काफी लिखने का बहुत सा overkill हो सकता है और -lets है- का सामना:

  1. एक नया (शायद निजी) वर्ग तुरंत बनाओ हर कोई कभी-कभी आलसी या जल्दी में होता है।

  2. निजी स्थिर कार्यों या गैर सदस्य कार्यों उत्पन्न करें:

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

  3. बेनामी नाम स्थान: -> यह वहाँ रखो और वर्ग के तरीकों, जहां उसका उपयोग किया जाएगा के करीब इस समारोह लिखने

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

अस्वीकरण: कई लोग तर्क दे सकते हैं कि एक पिंपल का उपयोग बहुत साफ है। यह सिर्फ मेरी व्यक्तिगत राय है।

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