"सिस्टम का उपयोग क्यों कर रहा है?" बुरा अभ्यास नहीं माना जाता है?


47

मेरे पास C ++ पृष्ठभूमि है और मैं इस प्रश्न के उत्तर से पूरी तरह से समझता हूं और सहमत हूं: "नाम स्थान का उपयोग क्यों कर रहा है;" बुरा अभ्यास माना जाता है?

इसलिए मैं चकित हूं कि, C # के साथ कुछ अनुभव होने पर, मुझे वहां ठीक इसके विपरीत दिखाई देता है: using Some.Namespace;सचमुच हर जगह इसका उपयोग किया जाता है। जब भी आप एक प्रकार का उपयोग करना शुरू करते हैं, तो आप पहले उसके नाम स्थान के लिए एक निर्देश का उपयोग करते हैं (यदि यह पहले से ही नहीं है)। मुझे याद नहीं आ रहा है कि एक- .csफ़िले को देखा नहीं था जिसके साथ शुरू नहीं हुआ था using System; using System.Collections.Generic; using X.Y.Z; etc...। वास्तव में, यदि आप विज़ुअल स्टूडियो विज़ार्ड के माध्यम से एक नई फ़ाइल जोड़ते हैं, तो यह स्वचालित रूप से कुछ निर्देशों का उपयोग करके वहां जोड़ता है, भले ही आपको उनकी आवश्यकता न हो। इसलिए, जबकि C ++ समुदाय में आप मूल रूप से पाला जाता है, C # भी ऐसा करने के लिए प्रोत्साहित करता है। कम से कम इस तरह से यह मुझे प्रतीत होता है।

अब, मैं समझता हूँ कि C # और C ++ में निर्देशों का उपयोग करना बिल्कुल एक ही बात नहीं है। इसके अलावा, मैं समझता हूं कि using namespaceसी ++ में आप जिन सबसे खराब चीजों को कर सकते हैं, उनमें से एक को हेडर फाइल में डालते हैं, हेडर फाइलों की अवधारणा की कमी के कारण C # में कोई समकक्ष बुरा समकक्ष नहीं है और #include

हालांकि, उनके मतभेदों के बावजूद, सी # और सी ++ में निर्देशों का उपयोग करना एक ही उद्देश्य की सेवा करता है, जो केवल SomeTypeहर समय टाइप करने के लिए होता है, बजाय लंबे समय तक Some.Namespace.SomeType(सी ++ के ::बजाय .)। और इसी उद्देश्य के साथ, यह खतरा मुझे भी समान प्रतीत होता है: टकराव का नामकरण।

सबसे अच्छे मामले में यह एक संकलन त्रुटि का परिणाम है, इसलिए आपको "केवल" इसे ठीक करना होगा। सबसे बुरे मामले में, यह अभी भी संकलित करता है और कोड चुपचाप अलग-अलग चीजें करता है जो आप इसे करने का इरादा रखते हैं। तो मेरा सवाल है: क्यों (जाहिरा तौर पर) C # और C ++ में असमान रूप से खराब माने जाने वाले निर्देशों का उपयोग कर रहे हैं?

एक उत्तर के कुछ विचार जो मेरे पास हैं (इनमें से कोई भी मुझे वास्तव में संतुष्ट नहीं करता है, हालांकि):

  • नेमस्पेस (C ++ में से सी # में बहुत लंबे समय तक और भी बहुत कुछ नेस्ट हो जाते हैं stdबनाम System.Collection.Generic)। तो, इस तरह से कोड को डी-नॉइज़ करने में अधिक इच्छा और अधिक लाभ है। लेकिन अगर यह सच है, तब भी यह तर्क तभी लागू होता है जब हम मानक नामस्थानों को देखते हैं। कस्टम लोगों का कोई भी छोटा नाम हो सकता है, जैसे C # और C ++ दोनों में।

  • नामस्थान C # की तुलना में C # में "अधिक बारीक दानेदार" प्रतीत होते हैं। उदाहरण के लिए, C ++ पूरे मानक पुस्तकालय में निहित है std(प्लस कुछ छोटे नेस्टेड नामस्थान तरह chrono), जबकि सी # में आप System.IO, System.Threading, System.Textआदि तो, नाम टकराव के होने का खतरा कम है। हालांकि, यह केवल एक आंत की भावना है। मैंने वास्तव में गिनती नहीं की कि आप कितने नामों के साथ "आयात" करते हैं using namespace stdऔर using System। और फिर, भले ही यह सच हो, यह तर्क केवल मानक नामस्थानों को देखते हुए लागू होता है। अपने खुद के डिजाइन किए जा सकते हैं ठीक दानेदार के रूप में आप चाहते हैं, दोनों सी # और सी ++ में।

क्या और भी तर्क हैं? मैं विशेष रूप से वास्तविक कठिन तथ्यों में रुचि रखता हूं (यदि कोई हो) और राय में इतना नहीं है।


2
@Timo ओपी स्पष्ट रूप से हेडर प्रदूषण के बारे में नहीं पूछ रहा है।
कोनराड रुडोल्फ

1
मैंने यह मान लिया क्योंकि वैश्विक नामस्थान के लिए समान डिग्री के लिए कोई प्रतिस्पर्धा नहीं है कि C ++ (मुख्य रूप से C मानक पुस्तकालय के कारण) में है। लेकिन मैं उन लोगों के जवाबों का इंतजार करता हूं जो सबसे अच्छे से जानते हैं।
व्यिक

2
@ThomasWeller C ++ में यह स्पष्ट है। C # में Ext(this T t, long l)उस एक्सटेंशन विधि पर विचार करें जिसके माध्यम से कॉल किया जाता है t.Ext(0)। यदि आप फिर एक और नामस्थान जोड़ते हैं जिसमें एक विस्तार विधि होती है Ext(this T t, int i), तो वह एक बजाय बुलाया जाएगा। लेकिन मैं C # (अभी तक) का विशेषज्ञ नहीं हूं।
sebrockm

2
@ फ्रेंक भले ही मैंने आपको वह बिंदु प्रदान किया हो, फिर वही तर्क C ++ पर लागू होता है, आगे C ++ और C # के बीच के अंतर को न देखने के मेरे सवाल को आगे
बढ़ाता है

3
अस्पष्टता के मामले में @Franck C ++ आपको संकलक त्रुटि देगा। साथ ही C #।
टिमो

जवाबों:


28

"सिस्टम का उपयोग क्यों कर रहा है?" बुरा अभ्यास नहीं माना जाता है?

"सिस्टम का उपयोग?" है सार्वभौमिक एक बुरा व्यवहार नहीं माना जाता। उदाहरण के लिए देखें: आप C # में निर्देश का उपयोग क्यों नहीं करेंगे?

लेकिन यह सच हो सकता है कि इसे उतना बुरा नहीं माना जाता है using namespace std। शायद इसलिए:

  1. C # में हेडर फाइलें नहीं हैं। पूर्व-प्रोसेसर का उपयोग करके एक सी # स्रोत फ़ाइल को दूसरे में "शामिल करना" असामान्य है।

  2. stdनेमस्पेस लगभग सपाट होता है अर्थात लगभग सभी मानक पुस्तकालय कार्य, प्रकार और चर इसमें होते हैं (फाइलसिस्टम सब-नेमस्पेस जैसे कुछ अपवाद हैं)। इसमें बहुत, बहुत अधिक संख्या में पहचानकर्ता शामिल हैं। मेरी समझ में, Systemबहुत कम नाम शामिल हैं, और इसके बजाय अधिक उप-नामस्थान हैं।

  3. C # में, कोई वैश्विक कार्य या चर नहीं हैं। जैसे, वैश्विक पहचानकर्ताओं की संख्या आमतौर पर C ++ के विपरीत काफी कम होती है, जो उन लोगों के पास होती है: इसके अलावा, यह सी लाइब्रेरीज़ का उपयोग करने के लिए विशिष्ट है (अक्सर अप्रत्यक्ष रूप से) जिसमें नाम स्थान नहीं है, और इसलिए उनके सभी नामों को वैश्विक में रखें नाम स्थान।

  4. जहाँ तक मुझे पता है, C # में कोई तर्क निर्भर लुकअप नहीं है। नाम छिपाना, ओवरलोडिंग आदि के साथ एडीएल उन मामलों का उत्पादन कर सकता है जहां कुछ कार्यक्रम नाम संघर्ष से प्रभावित नहीं होते हैं, जबकि अन्य सूक्ष्म रूप से प्रभावित होते हैं, और सभी कोने के मामलों को पकड़ना परीक्षण के साथ संभव नहीं है।

इन अंतरों के कारण, "सिस्टम का उपयोग करना;" की तुलना में नाम संघर्ष की संभावना कम है using namespace std


इसके अलावा, नामस्थान "आयात करना" एक तरह से स्व-स्थायी सम्मेलन है: यदि मानक नाम स्थान का आयात करना पारंपरिक है, तो प्रोग्रामर पारंपरिक रूप से अपने स्वयं के पहचानकर्ताओं के लिए उस नामस्थान से नाम चुनने से बचने की कोशिश करेंगे , जो समस्याओं को कम करने में मदद करता है इस तरह के सम्मेलन।

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


3
यह नामस्थान खोलने की केवल संभावित कमियों पर विचार करता है। यह एक शुरुआत है, लेकिन मुझे लगता है कि हमें फायदे पर भी विचार करने की आवश्यकता है: C ++ के मामले में, ज्यादातर मामलों में यह पांच वर्णों ( std::) को बचा रहा है । C # में, यह पर्याप्त रूप से अधिक है ( System."केवल" 7 वर्ण हैं, लेकिन अन्य, नेस्टेड नामस्थान में कई और वर्ण हैं, और हर जगह उन्हें लिखना कोड को पूरी तरह से अपठनीय बना देगा)।
कोनराड रूडोल्फ

क्या यह भी मामला नहीं है कि C # अधिभार का रिज़ॉल्यूशन C ++ में एक की तुलना में अधिक दयालु है और संकलक त्रुटियों के माध्यम से बहुत अधिक अस्पष्टता निकाली गई है? (किसी भी तरह से आपके जवाब की आलोचना जो आधिकारिक लगती है।)
बाथशीबा

3
@KonradRudolph यदि कमियां महत्वपूर्ण मानी जाती थीं, और टाइपिंग की मात्रा भी इतनी ही होती थी (टाइपिंग की मात्रा की तुलना में std::), तो क्या यह using Sys = System;नाम की जगह गैर-उपनाम को प्रदूषित करने की बजाय विशिष्ट शैली का उपयोग नहीं होगा using?
एरोरिका

2
"आधिकारिक" के बारे में @Bsheheba, मैं यह बताना चाहता हूं कि मैं C # के बारे में बहुत कम जानता हूं, और मेरा उत्तर C ++ के ज्ञान पर आधारित है, और कुछ Google C # के बारे में खोज करता है। इसलिए, अगर कोई व्यक्ति C # भागों की जाँच करता है तो मैं इसकी सराहना करता हूँ :)
eerorika 17

2
ADL भाग के बारे में: C # में विस्तार विधियाँ हैं। यह ADL की तुलना में एक अलग डिज़ाइन है, लेकिन वे नामकरण संघर्ष के बारे में समान समस्याएं साझा करते हैं।
तिमो

-2

हालांकि, उनके मतभेदों के बावजूद, C # और C ++ में निर्देशों का उपयोग करना एक ही उद्देश्य है, जो केवल SomeType टाइप करने के लिए है, बजाय इसके कि कुछ अधिक। Some.Namespace.SomeType (C ++ के साथ :: के बजाय।)। और इसी उद्देश्य के साथ, यह खतरा भी मुझे प्रतीत होता है: टकराव का नामकरण।

हां, लेकिन आपने उस खतरे को निर्यात नहीं किया (पढ़ें: दूसरों को इससे निपटने के लिए मजबूर करना), क्योंकि:

अब, मैं समझता हूँ कि C # और C ++ में निर्देशों का उपयोग करना बिल्कुल एक ही बात नहीं है। इसके अलावा, मैं समझता हूं कि सी ++ में नेमस्पेस का उपयोग करके आप जो सबसे खराब चीजों में से एक कर सकते हैं, उसे हेडर फ़ाइल में डाल सकते हैं, हेडर फ़ाइलों और #include की अवधारणा की कमी के कारण C # में कोई समकक्ष नहीं है।

इसलिए यह एक अलग श्रेणी है।

साथ ही, C ++ को IDE उसी तरह से विकसित किया गया "डिज़ाइन" नहीं किया गया है जिस प्रकार C # है। C # को हमेशा Visual Studio में इसके Intellisense और Whatnot के साथ लिखा जाता है। इसे उस तरह से इस्तेमाल करने के लिए डिज़ाइन किया गया है, जिसे लोगों ने बनाया है। भले ही कितने लोग ID ++ को C ++ में विकसित करने के लिए उपयोग करते हैं, यह उस उपयोग के मामले को अत्यधिक चिंता के रूप में नहीं बनाया गया है।

नामस्थान C # की तुलना में C # में अधिक "ठीक दानेदार" प्रतीत होते हैं।

हाँ, वह भी। using namespace stdऔर using System.Collection.Genericअतुलनीय हैं।

तो उनकी तुलना मत करो!


2
यह ओपी की चिंता का जवाब नहीं देता है, जो स्पष्ट रूप से हेडर में नामस्थान खोलने के बारे में नहीं है , बल्कि कार्यान्वयन फाइलों में है
कोनराड रुडोल्फ

2
@KonradRudolph using namespace stdC ++ में बचने की सलाह ज्यादातर हेडर फाइलों के बारे में है। उत्तर यह है कि यह C # में लागू नहीं होता है।
पंख

8
@AsteroidsWithWings से बचने की सलाह using namespace stdनिश्चित रूप से ज्यादातर हेडर के बारे में नहीं है। हेडर में इसका इस्तेमाल खतरनाक है। आपके कार्यान्वयन में इसका उपयोग करने के खिलाफ सलाह दी जाती है।
टॉमी एंडरसन

1
using namespace ...सी ++ में बचने की सलाह नामकरण टकराव से बचने के बारे usingमें है, सी # में निर्देश भी नामकरण टकराव की संभावना का परिचय देता है, फिर इसे टालें क्यों नहीं? भले ही कार्यान्वयन अलग हो।
टॉमी एंडरसन

@ टॉमी एंडरसन, ऐसा होने पर इस तरह के संघर्ष को हल करना कितना मुश्किल है? एक सेकंड लगता है। चूँकि C # usingघोषणाएँ प्रति फ़ाइल हैं जो एकल प्रकार / वर्ग को परिभाषित करती हैं और सामान्य रूप से अनुप्रयोग डोमेन अवधारणाओं के अपेक्षाकृत संकीर्ण सेट के साथ करना होता है (आदर्श रूप से, एकल जिम्मेदारी सिद्धांत) ऐसे नामस्थान संघर्ष की संभावना बेहद कम है। लेकिन जब होते हैं आसानी से तय होते हैं। सामान्य .NET विकास उपकरण / IDE आपकी बहुत मदद करते हैं। संपूर्ण विकास पारिस्थितिकी तंत्र पर विचार करें जो आपको कई विकास गतिविधियों में सबसे अच्छा संयोजन करके अधिक उत्पादक बनाने के लिए डिज़ाइन किया गया है
21
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.