आप C # में निर्देशन का उपयोग क्यों नहीं करेंगे?


71

एक बड़े C # प्रोजेक्ट पर मौजूदा कोडिंग मानकों में एक नियम शामिल है कि सभी प्रकार के नाम पूरी तरह से योग्य हैं, 'निर्देश' का उपयोग करते हुए रोजगार की मनाही है। इसलिए, परिचित के बजाय:

using System.Collections.Generic;

.... other stuff ....

List<string> myList = new List<string>();

(यह शायद कोई आश्चर्य की बात नहीं है कि varनिषिद्ध भी है।)

मैं इसके साथ समाप्त होता हूं:

System.Collections.Generic.List<string> myList = new System.Collections.Generic.List<string>();

टाइपिंग में यह 134% की वृद्धि है, जिसमें से कोई भी उपयोगी जानकारी प्रदान करने में वृद्धि नहीं करता है। मेरे विचार में, वृद्धि का 100% शोर (अव्यवस्था) है जो वास्तव में समझ को बाधित करता है।

प्रोग्रामिंग के 30+ वर्षों में, मैंने एक या दो बार इस तरह का मानक प्रस्तावित किया है, लेकिन इसे कभी लागू नहीं किया गया। इसके पीछे का तर्क मुझे खटकता है। मानक लागू करने वाला व्यक्ति मूर्ख नहीं है, और मुझे नहीं लगता कि वह दुर्भावनापूर्ण है। जब तक मैं केवल अन्य विकल्प के रूप में गुमराह छोड़ देता हूं जब तक कि मैं कुछ याद नहीं कर रहा हूं।

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

विचार

इस निषेध के कारण थे:

  1. पूरी तरह से योग्य प्रकार प्राप्त करने के लिए नाम पर माउस को मँडराना बोझिल है। हर समय पूरी तरह से योग्य प्रकार दिखाई देना बेहतर है।
  2. ईमेल कोड स्निपेट में पूरी तरह से योग्य नाम नहीं है, और इसलिए इसे समझना मुश्किल हो सकता है।
  3. विज़ुअल स्टूडियो (नोटपैड ++, उदाहरण के लिए) के बाहर कोड को देखने या संपादित करते समय, पूरी तरह से योग्य प्रकार का नाम प्राप्त करना असंभव है।

मेरा तर्क यह है कि सभी तीन मामले दुर्लभ हैं, और यह कि हर किसी को कुछ दुर्लभ मामलों को गुमराह करने के लिए केवल अव्यवस्थित और कम-समझने योग्य कोड की कीमत चुकानी पड़ती है।

संभावित नामस्थान संघर्ष के मुद्दे, जिनसे मुझे प्राथमिक चिंता होने की उम्मीद थी, उनका भी उल्लेख नहीं किया गया था। यह विशेष रूप से आश्चर्यजनक है क्योंकि हमारे पास एक नाम स्थान है MyCompany.MyProject.Core, जो एक विशेष रूप से बुरा विचार है। मैंने बहुत पहले ही जान लिया था कि किसी भी चीज का नाम C Systemया CoreC # रखना पागलपन का एक त्वरित मार्ग है।

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


टिप्पणियाँ विस्तारित चर्चा के लिए नहीं हैं; इस वार्तालाप को बातचीत में स्थानांतरित कर दिया गया है ।
मेपल_शॉफ्ट

1
एक वास्तविक दुनिया का उदाहरण क्यों यह एक अच्छा विचार हो सकता है (लेकिन सी ++ दुनिया में): क्यों "नामस्थान एसटीडी का उपयोग कर रहा है?" का जवाब , बुरा अभ्यास माना जाता है। , "निर्देशों और घोषणाओं का उपयोग करते हुए" दोनों पर प्रतिबंध लगा दिया जाता है।
पीटर मोर्टेंसन

रीजनिंग सेक्शन को पढ़ने से पहले, मैंने इस तरह के अनौपचारिक कारणों का अनुमान लगाया क्योंकि मेरी कंपनी के समान नियम हैं।
गक्क्निबग

जवाबों:


69

व्यापक प्रश्न:

क्या आपने कभी इस तरह के मानक लगाए जाने के बारे में सुना है? यदि हां, तो इसके पीछे क्या कारण था?

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


एक उदाहरण: उस प्रकार के परिदृश्य को शायद एक उदाहरण के साथ बेहतर ढंग से समझाया गया है।

मान लीजिए कि हमारे पास Lists<T>दो अलग-अलग प्रोजेक्ट हैं।

System.Collections.Generic.List<T>
MyCorp.CustomCollections.Optimized.List<T>

जब हम पूरी तरह से योग्य ऑब्जेक्ट नाम का उपयोग करते हैं, तो यह स्पष्ट है कि List<T>इसका उपयोग किया जा रहा है। यह स्पष्टता स्पष्ट रूप से वाचालता की कीमत पर आती है।

और आप बहस कर रहे होंगे, "रुको! कोई भी कभी भी दो सूचियों का उपयोग नहीं करेगा!" वह वह जगह है जहां मैं रखरखाव परिदृश्य को इंगित करता हूं।

आप Fooअपने निगम के लिए लिखित मॉड्यूल हैं , जो स्वीकृत, अनुकूलित निगम का उपयोग करता है List<T>

using MyCorp.CustomCollections.Optimized;

public class Foo {
    List<object> myList = ...;
}

बाद में, एक नया डेवलपर आपके द्वारा किए जा रहे काम का विस्तार करने का निर्णय लेता है। कंपनी के मानकों के बारे में पता नहीं होने के कारण, वे usingब्लॉक को अपडेट करते हैं :

using MyCorp.CustomCollections.Optimized;
using System.Collections.Generic;

और आप देख सकते हैं कि कैसे जल्दी में चीजें खराब हो जाती हैं।

यह इंगित करने के लिए तुच्छ होना चाहिए कि आपके पास एक ही नाम के दो मालिकाना वर्ग हो सकते हैं लेकिन एक ही परियोजना के भीतर विभिन्न नामस्थानों में। तो यह सिर्फ .NET फ्रेमवर्क आपूर्ति की गई कक्षाओं से टकराने की चिंता नहीं है।

MyCorp.WeightsAndLengths.Measurement();
MyCorp.TimeAndSpace.Measurement();

वास्तविकता:
अब, क्या अधिकांश परियोजनाओं में ऐसा होने की संभावना है? नहीं वास्तव में नहीं। लेकिन जब आप बहुत सारे इनपुट के साथ एक बड़े प्रोजेक्ट पर काम कर रहे होते हैं, तो आप पूरी कोशिश करते हैं कि आप पर चीजें फटने की संभावना कम से कम हो।

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

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


विकल्प:
जब आप नहीं पूछते हैं, तो यह इंगित करने के लायक है कि यह समस्या का एक महान समाधान नहीं है। ऐसी कक्षाएं बनाना अच्छा नहीं है जो उनके नाम स्थान की घोषणा के बिना टकराएंगी।

List<T>, विशेष रूप से, एक आरक्षित शब्द के रूप में माना जाना चाहिए और आपकी कक्षाओं के नाम के रूप में उपयोग नहीं किया जाना चाहिए।

इसी तरह, परियोजना के भीतर अलग-अलग नामस्थानों को अद्वितीय वर्ग नाम रखने का प्रयास करना चाहिए। कोशिश करना और याद रखना कि Foo()आप किस नामस्थान के साथ काम कर रहे हैं, मानसिक ओवरहेड है जो सबसे अच्छा बचा जाता है। एक और तरीका कहा: होने MyCorp.Bar.Foo()और MyCorp.Baz.Foo()अपने डेवलपर्स यात्रा करने के लिए जा रहा है और सबसे अच्छा बचा।

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

Bar.Foo() 
Baz.Foo()

आपके वर्तमान प्रोजेक्ट के विशिष्ट कारण:

आपने उस मानक के बाद अपने वर्तमान प्रोजेक्ट के लिए दिए गए विशिष्ट कारणों से अपने प्रश्न को अपडेट किया। आइए उन पर एक नज़र डालें और वास्तव में नीचे बनी पगडंडी को खोदें।

पूरी तरह से योग्य प्रकार प्राप्त करने के लिए नाम पर माउस को मँडराना बोझिल है। हर समय पूरी तरह से योग्य प्रकार दिखाई देना बेहतर है।

"बोझिल?" उम नहीं। शायद कष्टप्रद। ऑन-स्क्रीन पॉइंटर को शिफ्ट करने के लिए प्लास्टिक के कुछ औंस को स्थानांतरित करना बोझिल नहीं है । लेकिन मैं पीछे हटा।

तर्क की यह रेखा किसी भी चीज़ की तुलना में कवर-अप की तरह अधिक लगती है। ऑफहैंड, मुझे लगता है कि एप्लिकेशन के भीतर कक्षाएं कमजोर रूप से नामित हैं और आपको क्लास नाम के आसपास की अर्थ सूचना की उचित मात्रा को चमकाने के लिए नेमस्पेस पर भरोसा करना होगा।

यह पूरी तरह से योग्य वर्ग नामों के लिए एक वैध औचित्य नहीं है, शायद यह आंशिक रूप से योग्य वर्ग नामों का उपयोग करने के लिए एक वैध औचित्य है।

ईमेल कोड स्निपेट में पूरी तरह से योग्य नाम नहीं है, और इसलिए इसे समझना मुश्किल हो सकता है।

यह (जारी?) तर्क की पंक्ति मेरे संदेह को पुष्ट करती है कि कक्षाएं वर्तमान में खराब रूप से नामित हैं। फिर से, गरीब वर्ग के नाम रखने के लिए पूरी तरह से योग्य वर्ग नाम का उपयोग करने के लिए सब कुछ की आवश्यकता के लिए एक अच्छा औचित्य नहीं है । यदि कक्षा के नाम को समझना मुश्किल है, तो पूरी तरह से योग्य वर्ग के नामों को ठीक करने की तुलना में बहुत अधिक गलत है।

विज़ुअल स्टूडियो (नोटपैड ++, उदाहरण के लिए) के बाहर कोड को देखने या संपादित करते समय, पूरी तरह से योग्य प्रकार का नाम प्राप्त करना असंभव है।

सभी कारणों में से, इस एक ने मुझे अपना पेय थूक दिया। लेकिन फिर, मैं पचाता हूं।

मुझे आश्चर्य हो रहा है कि विज़ुअल स्टूडियो के बाहर टीम अक्सर एडिटिंग या कोड क्यों देख रही है? और अब हम एक औचित्य को देख रहे हैं जो कि नाम स्थान प्रदान करने के लिए बहुत अच्छी तरह से रूढ़िवादी है। यह एक टूलिंग समर्थित तर्क है जबकि नामस्थान कोड को संगठनात्मक संरचना प्रदान करने के लिए हैं।

ऐसा लगता है कि यह परियोजना डेवलपर्स के साथ खराब नामकरण सम्मेलनों से ग्रस्त है जो टूलींग उनके लिए क्या प्रदान कर सकते हैं इसका लाभ नहीं उठा रहे हैं। और उन वास्तविक मुद्दों को हल करने के बजाय, उन्होंने लक्षणों में से एक पर एक बैंड-सहायता को थप्पड़ मारने का प्रयास किया है और पूरी तरह से योग्य वर्ग नामों की आवश्यकता है। मुझे लगता है कि इसे एक पथभ्रष्ट दृष्टिकोण के रूप में वर्गीकृत करना सुरक्षित है।

यह देखते हुए कि खराब रूप से नामित कक्षाएं हैं, और यह मानते हुए कि आप रिफ्लेक्टर नहीं कर सकते हैं, इसका सही उत्तर विज़ुअल स्टूडियो आईडीई को इसके पूर्ण लाभ के लिए उपयोग करना है। संभवतः वीएस पावरटूल पैकेज जैसे प्लगइन में जोड़ने पर विचार करें। फिर, जब मैं देख रहा हूं तो मैं AtrociouslyNamedClass()कक्षा के नाम पर क्लिक कर सकता हूं, F12 दबाएं और इसे बेहतर तरीके से समझने के लिए कक्षा की परिभाषा में सीधे ले जाया जाए कि यह क्या करने की कोशिश कर रहा है। इसी तरह, मैं कोड-एफ 12 पर क्लिक करके कोड के सभी स्पॉट ढूंढ सकता हूं जो वर्तमान में उपयोग करने से पीड़ित हैं AtrociouslyNamedClass()

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

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


1
+1। मैंने वास्तव में हमारे आंतरिक नामस्थानों में कुछ बुरा टकरावों का सामना किया है। दोनों एक "2.0" प्रोजेक्ट के लिए विरासत कोड को पोर्ट करने में, और बस कुछ चुनिंदा वर्ग नामों के साथ जो विभिन्न नामस्थान संदर्भों में शब्दार्थ रूप से मान्य हैं। वास्तव में मुश्किल बात यह है कि एक ही नाम वाली दो चीजों में अक्सर समान इंटरफेस होते हैं, इसलिए कंपाइलर शिकायत नहीं करेगा ... आपका रनटाइम होगा!
svidgen

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

4
@DavidArno - मैं आपसे असहमत नहीं हूं। हालाँकि, बड़ी परियोजनाओं में वह विकल्प नहीं हो सकता है। मैं केवल इशारा कर रहा हूं कि एक बड़ी परियोजना उस नियम को क्यों लागू कर सकती है। मैं नियम की वकालत नहीं कर रहा हूँ , हालाँकि। बस यह कि कभी-कभी इसकी आवश्यकता होती है क्योंकि टीम के पास कोई अन्य विकल्प नहीं है।

4
@ GlenH7 आप अपने उत्तर में अन्य उपलब्ध समाधानों को निर्दिष्ट करना चाह सकते हैं। मैं लोगों को इस पर ठोकर खाते हुए देखना चाहता हूं और सोचता हूं "ओह। यह एक महान विचार है!" हालांकि शेष उद्देश्य और व्यावहारिक के लिए +1।
रबडकॉक

3
@JimMischel - ऐसा लगता है कि नियम का इस्तेमाल किसी चीज़ के लिए बैसाखी के रूप में किया जा रहा है । यह निर्धारित करना संभव नहीं है कि वह चीज क्या है। उच्च स्तर पर, हां, कभी-कभी अनुमति न देने का औचित्य है usingsलेकिन यह नहीं लगता कि आपकी परियोजना उन मामलों में से एक के रूप में योग्य है।

16

मैंने एक कंपनी में काम किया, जहां उनके पास एक ही नाम के साथ कई कक्षाएं थीं, लेकिन विभिन्न कक्षा पुस्तकालयों में।

उदाहरण के लिए,

  • Domain.Customer
  • Legacy.Customer
  • ServiceX.Customer
  • ViewModel.Customer
  • Database.Customer

खराब डिजाइन, आप कह सकते हैं, लेकिन आप जानते हैं कि ये चीजें कैसे व्यवस्थित रूप से विकसित होती हैं, और क्या विकल्प है - नाम शामिल करने के लिए सभी वर्गों का नाम बदलें? सब कुछ के प्रमुख refactoring?

किसी भी मामले में, ऐसे कई स्थान थे जहां परियोजनाओं ने इन सभी अलग-अलग पुस्तकालयों को संदर्भित किया जो कि कक्षा के कई संस्करणों का उपयोग करने के लिए आवश्यक थे।

साथ usingशीर्ष पर सीधे, इस पिछवाड़े में एक प्रमुख दर्द, था ReSharper अजीब बातें कोशिश करते हैं और यह काम करने के लिए, पुनर्लेखन करना होगा usingमक्खी पर निर्देशों, आप ग्राहक नहीं सकते हो के कलाकारों-जैसे- मिलेगा ग्राहक-शैली की त्रुटियां और पता नहीं है कि कौन सा प्रकार सही था।

इसलिए, कम से कम आंशिक नाम स्थान होने पर,

var cust = new Domain.Customer

या

public void Purchase(ViewModel.Customer customer)

कोड की पठनीयता में बहुत सुधार किया और यह स्पष्ट किया कि आपको कौन सी वस्तु चाहिए।

यह एक कोडिंग मानक नहीं था, यह पूर्ण नाम स्थान नहीं था, और इसे मानक के रूप में सभी वर्गों पर लागू नहीं किया गया था।


13
"क्या विकल्प है, सभी वर्गों का नाम बदलने के लिए नाम बदलें? सब कुछ के प्रमुख refactoring?" हां, यह (सही) विकल्प है।
डेविड अरनो

2
केवल अल्पावधि में। लंबी अवधि में कोड में स्पष्ट नाम स्थान का उपयोग करने की तुलना में यह बहुत कम महंगा है।
डेविड अर्नो

3
उस तर्क को स्वीकार करने में प्रसन्नता, जब तक आप मुझे नकद नहीं शेयरों में भुगतान कर रहे हैं।
इवान

8
@ डेविड: नहीं, यह सही विकल्प नहीं है। पूरी तरह से योग्य या तो सभी पहचानकर्ता या कम से कम जो वास्तव में टकराते हैं, वह सही तरीका है और यही वजह है कि नाम स्थान पहले से मौजूद हैं, जब समान मॉड्यूल में एक ही नाम का उपयोग किया जाता है तो टकराव प्रदान करते हैं। मुद्दा यह है कि कुछ मॉड्यूल 3 पार्टियों से हो सकते हैं, जो कोडबेस को आप संशोधित नहीं कर सकते हैं। तो आप क्या करते हैं, जब दो अलग-अलग 3 पार्टी के कार्यकर्ताओं से पहचानकर्ता टकराते हैं और आपको दोनों पुस्तकालयों का उपयोग करने की आवश्यकता होती है, लेकिन उनमें से कोई भी रिफ्लेक्टर नहीं कर सकता है? नाम स्थान मौजूद हैं, क्योंकि रिफैक्टरिंग हमेशा संभव नहीं है।
कैसरलुडी

4
@CarlSixsmith, यदि कोई रीफ़ैक्टरिंग पर मार्टिन फाउलर के विचारों का समर्थन करता है, तो यदि परिवर्तन उपयोगकर्ता को प्रभावित करता है, तो आप सही हैं, यह रीफ़ैक्टरिंग नहीं है; यह पुनर्गठन का दूसरा रूप है। हालांकि यह दो बिंदुओं को बढ़ाता है: 1. क्या सभी सार्वजनिक तरीके स्वचालित रूप से एपीआई का हिस्सा हैं? 2. फाउलर खुद स्वीकार करते हैं कि वह इस परिभाषा पर एक हारने वाली लड़ाई लड़ रहे हैं , जिसमें "रीफैक्टरिंग" शब्द का उपयोग करके लोगों की बढ़ती संख्या का मतलब सार्वजनिक बदलाव सहित सामान्यीकृत पुनर्गठन है।
डेविड अर्नो

7

बहुत अधिक वर्बोज़ या बहुत कम होने के लिए अच्छा नहीं है: किसी को बहुत अधिक कोड लिखने से परहेज करते हुए, सूक्ष्म बग को रोकने के लिए पर्याप्त विस्तृत होने के लिए एक सुनहरा मध्य खोजना चाहिए।

C # में, इसका एक उदाहरण तर्कों के नाम हैं। मुझे कई बार एक समस्या का सामना करना पड़ा जहां मैंने समाधान की तलाश में घंटों बिताए, जबकि लेखन की एक अधिक क्रियात्मक शैली पहले स्थान पर बग को रोक सकती थी। समस्या में तर्कों के क्रम में त्रुटि है। उदाहरण के लिए, क्या यह आपके लिए सही है?

if (...) throw new ArgumentNullException("name", "The name should be specified.");
if (...) throw new ArgumentException("name", "The name contains forbidden characters.");

पहली नज़र में, यह पूरी तरह से ठीक दिखता है, लेकिन एक बग है। अपवादों के निर्माणकर्ताओं के हस्ताक्षर हैं:

public ArgumentException(string message, string paramName)
public ArgumentNullException(string paramName, string message)

तर्कों का क्रम नहीं देखा?

अधिक क्रिया शैली को अपनाते हुए जहां एक तर्क का नाम निर्दिष्ट किया जाता है, हर बार विधि एक ही प्रकार के दो या अधिक तर्क स्वीकार करती है , हम त्रुटि को फिर से होने से रोकते हैं, और इसी तरह:

if (...) throw new ArgumentNullException(paramName: "name", message: "The name should be specified.");
if (...) throw new ArgumentException(paramName: "name", message: "The name contains forbidden characters.");

स्पष्ट रूप से लिखने के लिए लंबा है, लेकिन कम समय बर्बाद डिबगिंग में परिणाम है।

चरम सीमाओं की ओर धकेल दिया गया, हर जगह तर्कों का उपयोग करने के लिए मजबूर किया जा सकता है , जैसे कि doSomething(int, string)उन तरीकों में जहां मापदंडों के क्रम को मिलाने का कोई तरीका नहीं है। यह संभवतः लंबी अवधि में परियोजना को नुकसान पहुंचाएगा, जिसके परिणामस्वरूप ऊपर वर्णित बग को रोकने के लाभ के बिना बहुत अधिक कोड होगा।

आपके मामले में, "नहीं using" नियम के पीछे प्रेरणा यह है कि गलत प्रकार, जैसे कि MyCompany.Something.List<T>बनाम का उपयोग करना अधिक कठिन बना देना चाहिए System.Collections.Generic.List<T>

व्यक्तिगत रूप से, मैं इस तरह के नियम से बचूंगा क्योंकि, IMHO, कोड को पढ़ने में मुश्किल की लागत गलत प्रकार के दुरुपयोग के थोड़े कम जोखिम के लाभ से ऊपर है, लेकिन कम से कम, इस नियम का एक वैध कारण है।


इन जैसी स्थितियों का पता उपकरणों द्वारा लगाया जा सकता है। यदि कोई ऐसा पैरामीटर मौजूद नहीं है, तो ReSharper विशेषता के paramNameसाथ चिह्नित करता है InvokerParameterNameऔर चेतावनी जारी करता है।
जॉनबोट

2
@ जॉनबॉट: वे निश्चित रूप से कर सकते हैं, लेकिन बहुत सीमित मामलों में। अगर मेरे पास है तो क्या होगा SomeBusiness.Something.DoStuff(string name, string description)? कोई भी उपकरण यह समझने के लिए पर्याप्त नहीं है कि नाम क्या है और विवरण क्या है।
आर्सेनी मौरज़ेंको

@ArseniMourzenko इस मामले में भी मानव को यह पता लगाने के लिए समय निकालने की आवश्यकता है कि क्या आह्वान सही है या नहीं।
गक्क्निबग

6

नाम स्थान कोड को एक पदानुक्रमित संरचना देता है, जो छोटे नामों के लिए अनुमति देता है।

   MyCompany.Headquarters.Team.Leader
   MyCompany.Warehouse.Team.Leader

यदि आप "कीवर्ड" का उपयोग करने की अनुमति देते हैं, तो घटनाओं की एक श्रृंखला है ...

  • हर कोई वास्तव में एक वैश्विक नामस्थान का उपयोग कर रहा है
    (क्योंकि वे हर नाम स्थान को शामिल करते हैं, जो वे संभवतः चाहते हैं)
  • लोगों को नाम क्लैश होने लगते हैं, या
  • नाम बंद होने की चिंता

इसलिए जोखिम से बचने के लिए, हर कोई वास्तव में लंबे नामों का उपयोग करना शुरू कर देता है:

   HeadquartersTeamLeader
   WarehouseTeamLeader

स्थिति बढ़ जाती है ...

  • किसी और ने पहले से ही एक नाम चुना हो सकता है, इसलिए आप एक लंबा उपयोग करते हैं।
  • नाम लंबे और लंबे हो जाते हैं।
  • लंबाई 60 वर्णों से अधिक हो सकती है, जिसमें कोई अधिकतम नहीं है - यह हास्यास्पद है।

मैंने ऐसा होते देखा है, इसलिए उन कंपनियों के साथ सहानुभूति रख सकते हैं जो "उपयोग" कर रही हैं।


11
प्रतिबंध usingपरमाणु विकल्प है। नाम स्थान के उपनाम और आंशिक योग्यता बेहतर है।
जिम मेंथेल ऑक्ट

1

इसके साथ समस्या usingयह है कि यह स्पष्ट रूप से स्पष्ट घोषणा के बिना नामस्थान में जोड़ता है। यह रखरखाव प्रोग्रामर के लिए बहुत अधिक समस्या है जो कुछ का सामना करता है जैसे कि List<>और डोमेन से परिचित हुए बिना, यह नहीं जानता कि किस usingखंड ने इसे पेश किया है।

एक समान समस्या जावा में होती है यदि कोई उदाहरण के import Java.util.*;बजाय लिखता है import Java.util.List;; बाद की घोषणा के दस्तावेजों को क्या नाम दिया गया है ताकि List<>स्रोत में बाद में होने पर, इसकी उत्पत्ति importघोषणा से ज्ञात हो ।


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

जिम .. मैंने बस एक परिभाषा पर अपने माउस को मँडराया और यह काम नहीं किया। क्या आपने इस संभावना पर विचार किया था कि दुनिया के कुछ प्रोग्रामर Microsoft IDEs का उपयोग न करें? किसी भी स्थिति में, आपका काउंटर मेरी बात को अमान्य नहीं करता है, कि उपयोग करने वाला स्रोत अब स्व-दस्तावेजीकरण नहीं है
माइकल मोंटेनेरियो

2
हां, C # में काम करने वाले लोग हैं जो सर्वोत्तम उपलब्ध साधनों का उपयोग न करके खुद को विकलांग बना रहे हैं। और, जबकि तर्क है कि पूर्ण योग्यता "स्व दस्तावेज" में कुछ योग्यता है, ऐसे कोड की पठनीयता में भारी लागत है। वह सभी बाहरी कोड शोर पैदा करता है जो कोड के उन हिस्सों को अस्पष्ट करता है जो वास्तव में मायने रखते हैं।
जिम मेंथेल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.