Microsoft ने पैरामीटर, स्थानीय चर और निजी क्षेत्रों को समान नामकरण सम्मेलन क्यों बनाया?


18

मैंने कुछ समय पहले यह प्रश्न पूछा था: आप अपने निजी चर का नाम C # में कैसे रखते हैं?

उत्तर में से एक में, मुझे Microsoft के MSDN पृष्ठ पर इंगित किया गया था जो दर्शाता है कि निजी चर / फ़ील्ड को इस तरह नामित किया जाना चाहिए:

private int myInteger;

लेकिन एक पैरामीटर होगा:

void SomeMethod(int myInteger)

और एक स्थानीय चर इस तरह होगा:

int myInteger;

इसलिए जब आप उन्हें इस तरह से देखें

myInteger = 10;

आपके पास यह जानने का कोई तरीका नहीं है कि आप किस बारे में बात कर रहे हैं।

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

मैं भी यही बात सोच रहा हूँ। Microsoft का मानक इन सबसे अलग क्यों नहीं रहा?


10
आपका क्या मतलब है "आपके पास यह जानने का कोई तरीका नहीं है कि आप किस बारे में बात कर रहे हैं"? बेशक आप करते हैं - गुंजाइश।
थॉमस ओवेन्स

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

25
@kekekela: यह बिल्कुल पुराना नहीं है; स्टाइलकॉप स्पष्ट रूप से किसी अंडरस्कोर से शुरू होने वाले सदस्य चर के किसी भी उदाहरण को चिह्नित करेगा। सच कहूं तो मैं अंडरस्कोर को व्यर्थ और कष्टप्रद मानता हूं क्योंकि आवरण सटीक रूप से एक ही जानकारी देता है। यदि आपको गुंजाइश स्पष्ट करने की आवश्यकता है, तो उपसर्ग असाइनमेंट के साथ this.
Aaronaught

12
@ मैं पकड़ा बेमानी का एक गुच्छा "यह।" मेरे कोड के चारों ओर बिखरे हुए व्यर्थ और परेशान।

12
@kekekela: एकमात्र ऐसा स्थान जो मैं खुद को कभी भी ऐसा करने के लिए पाता हूं जो निर्माता में है, और निर्माता में यह सही अर्थ है क्योंकि आप शाब्दिक रूप से उन मूल्यों में गुजर रहे हैं जो सदस्य फ़ील्ड को आरंभ करते हैं ( this.component = component)। यदि आप अपने आप को अस्पष्ट scopes के साथ कहीं और पाते हैं, जैसे कि आपके पास "यह निरर्थक का एक गुच्छा 'है।" आपके कोड के आसपास बिखरे हुए ", तो आपके पास खराब लिखित कोड है।
एरॉन

जवाबों:


14

मूल नामकरण सम्मेलनों में वर्ग के सदस्यों के लिए एक m_ उपसर्ग था, यह एक अंडरस्कोर को सरल करने के लिए कम हो गया। आपको अंडरस्कोर उपसर्ग का उपयोग करके बहुत सारे पुराने C # Microsoft कोड दिखाई देंगे। हालाँकि, मैंने एक बार टेक एड में सुना कि एक प्रमुख अंडरस्कोर सीएलएस का अनुपालन नहीं है। मुझे लगता है यही कारण है कि वे सरल एक नाम-फिट-सभी योजना में चले गए। यह अब निश्चित नहीं हुआ करता था कि VB.Net के असंवेदनशील नाम भी CLS के अनुरूप नहीं थे।

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

आपको वह सब कुछ करने की ज़रूरत नहीं है जो एमएस आपको करने के लिए कहता है।


1
मुझे लगता है कि आपने "सीएलएस-अनुपालन" के साथ "सीएलआर-अनुपालन" को भ्रमित किया है। यदि कुछ गैर-सीएलआर शिकायत थे, तो वह संकलन नहीं करेगा। सीएलएस केवल एक चेतावनी है कि यह अन्य भाषाओं के साथ संगत नहीं हो सकता है, और मूल रूप से केवल सार्वजनिक सदस्यों (तकनीकी रूप से, आपके विधानसभा के बाहर दिखाई देने वाली चीजें) को प्रभावित करता है।
जोएल सी

@ जॉयल - तुम सही हो। यह सवाल इसके साथ संबंधित है: stackoverflow.com/questions/1195030/…
dave

2
मैं अभी भी "m_" उपसर्ग का उपयोग करता हूं ...
सीजरगॉन

4
+1 "आपके लिए वह सब कुछ करने की ज़रूरत नहीं है जो एमएस आपको करने के लिए कहता है"। अपने लिए सोचो!
gbjbaanb

1
यह केवल सीएलएस-शिकायत नहीं है यदि क्षेत्र है protected, नहींprivate
राहेल

9

localऔर parameterचर को उसी तरह नामित किया गया है क्योंकि उनका दायरा समान है

निजी चरों के लिए, उस पर अलग-अलग राय है। मैंने हमेशा यहां पाए गए मानकों का उपयोग किया है , जो _निजी चर से पहले एक अग्रणी का उपयोग करने के लिए निर्दिष्ट करता है, हालांकि लेखक कहता है कि यह _थोड़ा विवादास्पद है और Microsoft इसके खिलाफ सिफारिश करता है।

विकिपीडिया बताता है कि C और C ++ में

डबल अंडरस्कोर या अंडरस्कोर और एक कैपिटल लेटर के साथ शुरू होने वाले नाम कार्यान्वयन (कंपाइलर, स्टैंडर्ड लाइब्रेरी) के लिए आरक्षित होते हैं और उनका उपयोग नहीं किया जाना चाहिए (जैसे __reserved या _Reserved)।

शायद शायद यही कारण था कि माइक्रोसॉफ्ट के खिलाफ सिफारिश करने के पीछे, हालाँकि यह सर्वविदित है कि कई Microsoft देवता _अपने निजी चर के लिए किसी भी उपसर्ग का उपयोग करते हैं ।


2
एक ही गुंजाइश (+1) वाले पैरामीटर और स्थानीय चर के बारे में अच्छा बिंदु। किसी और ने उल्लेख नहीं किया है। कोरोलरी यह है कि यदि आपको पैरामीटर के समान नाम के साथ स्थानीय चर की आवश्यकता है, तो आप बस पैरामीटर का उपयोग कर सकते हैं। व्यक्तिगत रूप से हालांकि मुझे अंडरस्कोर बदसूरत और अभेद्य लगता है। जबकि thisनिश्चित रूप से वर्तमान वस्तु को संदर्भित करता है। मैं नफरत के लिए समझ में नहीं आता this। क्या इसलिए कि यह गलत समझा गया है?
जेसन एस

4

मैं आपको यह सुनिश्चित करने के लिए नहीं कह सकता कि उन्होंने उन्हें अलग क्यों नहीं रखा। यह संभावना है कि कोई भी नहीं हो सकता जब तक कि मानकों को बनाने में किसी ने भाग नहीं लिया, यह प्रश्न देखने के लिए होता है।

बहुत से लोग उदाहरणों के साथ _या उससे पहले के उदाहरणों को जोड़कर अपने स्वयं के सम्मेलन बनाते हैं m_, लेकिन मुझे नहीं लगता कि यह मायने रखता है। आप संदर्भ से बहुत कुछ समझ सकते हैं और आईडीई इन दिनों आपकी मदद करने के लिए पर्याप्त स्मार्ट हैं। उदाहरण के लिए, ReSharper addon के साथ विजुअल स्टूडियो आपको विभिन्न रंगों में स्थानीय चर और उदाहरण चर दिखाएगा।

यदि यह वास्तव में मायने रखता है कि आप दो स्कोपों ​​के बीच अंतर करते हैं, तो आप this.उदाहरण चर का उल्लेख करने के लिए उपसर्ग का उपयोग कर सकते हैं :

public class Test
{
    private int myInteger;

    void SomeMethod(int myInteger)
    {
        this.myInteger = 10; // sets instance variable to 10
        myInteger = 10; // does not affect the instance variable.
    }
}

किसी भी अन्य प्लगइन्स के बिना, Visual Studio डिफ़ॉल्ट रूप से आपको Intellisense के साथ मदद करेगा:

स्क्रीनशॉट

(पॉप-अप अभी भी वहां ReSharper द्वारा स्टाइल किया जा सकता है, लेकिन ReSharper बिल्ट-इन Intellisense की सुविधाओं के लिए कुछ भी नहीं जोड़ता है, इसलिए जब स्टॉक एक छोटे से अलग दिख सकता है, तो इसमें अभी भी दोनों विकल्प होंगे। )

चर नामकरण और कार्यक्षेत्र के साथ संभावित समस्याओं को पकड़ने में मदद करने के लिए आप FxCop और StyleCop जैसे कोड विश्लेषण टूल का उपयोग कर सकते हैं ।


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

4

Microsoft का मानक इन सबसे अलग क्यों नहीं रहा?

Microsoft के लोगों ने फ्रेमवर्क डिज़ाइन गाइडलाइन्स नामक एक पुस्तक लिखी , जिसमें कई सम्मेलनों की व्याख्या की गई, जिसमें बताया गया कि क्यों कुछ चीजों को ऊँचा किया गया , और अन्य को पास्कल केस किया गया

संपादित करें (पुस्तक से विवरण जोड़ते हुए):

पुस्तक में, उन्होंने प्रयोज्य अध्ययन करने का उल्लेख किया है, साथ ही टर्बो पास्कल समूह को प्राप्त करने से कुछ सबक भी सीखे हैं। इसके अलावा, जबकि सभी भाषाएँ केस-संवेदी नहीं होती हैं (जैसे VB), अन्य हैं (जैसे C #), इसलिए किसी के नामकरण में संगत होना चाहिए। केवल वस्तुओं को भेद करने के मामले में मतभेद पर निर्भर नहीं कर सकते। यदि कोई बाकी ढांचे द्वारा उपयोग किए जाने वाले सम्मेलनों से चिपक जाता है, तो यह देवों द्वारा कम भ्रम पैदा करेगा।

अध्याय 3, नामकरण दिशानिर्देश।
खंड 3.1 पूंजीकरण सम्मेलनों है।

camelCasingपैरामीटर नामों के लिए है।
PascalCasingनाम स्थान, प्रकार और सदस्य नामों के लिए है। इस घटना में कि नाम के हिस्से के रूप में 2-अक्षर के शब्द हैं, उन्हें एक साथ पूंजीकृत रखें, जैसे कि IOStream

खंड 3.5 में नामकरण कक्षाएं, संरचना और इंटरफेस शामिल हैं।
धारा 3.6 में नामकरण प्रकार के सदस्य शामिल हैं।
धारा 3.7 में नामकरण मापदंडों को शामिल किया गया है।


4
क्या आप उन लोगों के लिए संक्षेप में प्रस्तुत करना चाहेंगे जो पुस्तक के स्वामी नहीं हैं?
क्रामि

मैं क्रमी से सहमत हूं। एक सारांश बहुत अच्छा होगा!
18

@Kramil, Vaccano, ऐसा लगता है कि मुझे इसे फिर से लाइब्रेरी से चेक करना होगा। आम तौर पर मैं ऐसा केवल तब करता हूं जब एक नई नौकरी शुरू करते हैं और चर्चाएं नामकरण और कोडिंग मानकों की ओर मुड़ जाती हैं।
तंगुरेना

1
योग्य, इसलिए "कोई केवल वस्तुओं को भेद करने के मामले में मतभेदों पर निर्भर नहीं हो सकता है", फिर आइटम को अलग करने के लिए कैमलकेस या पास्कलकेस का उपयोग करने के लिए कहता है।
gbjbaanb

1

क्योंकि वे बहुत अलग हैं क्योंकि वे जिस संदर्भ में लिखे गए हैं उसके आधार पर हैं।

उदाहरण के लिए, क्या आपने कभी सदस्य चर के रूप में एक पैरामीटर का उपयोग किया है? या एक पैरामीटर के रूप में एक स्थानीय चर? एक स्थानीय के रूप में एक सदस्य चर के बारे में कैसे?

  • सभी सदस्य चर एक वर्ग के "निकाय" में होते हैं। मैं वास्तव में इस तर्क को नहीं खरीदता कि आपको सदस्य को उपसर्ग करने की आवश्यकता है जब आप thisइसे एक समान नाम के साथ स्थानीय चर से अलग करने के लिए उपयोग कर सकते हैं , अन्यथा इसकी आवश्यकता नहीं है।

  • एक स्थानीय चर भी केवल एक विधि के दायरे के अंदर या कोड ब्लॉक दायरे में परिभाषित किया गया है।

  • एक पैरामीटर हमेशा विधि हस्ताक्षर में परिभाषित किया जाता है।

यदि आपको इन सभी प्रकार के चर भ्रमित या मिश्रित हैं, तो आपको वास्तव में इसे और अधिक पठनीय या खोज करने योग्य बनाने के लिए अपने कोड डिज़ाइन के बारे में अधिक सोचना चाहिए। की तुलना में उन्हें बेहतर और अधिक आत्म वर्णनात्मक नाम दें myInteger


0

मैं Microsoft के मानकों के बारे में आपके प्रश्न का उत्तर नहीं दे सकता। आप एक मानक इन बातों को अलग करने के लिए चाहते हैं, PL / SQL पैरामीटर के लिए मानक मैं उपयोग के साथ पैरामीटर नाम लगाकर किया जाता है in_, out_, io_,, in- बाहर हैं और इन-बाहर पैरामीटर के लिए। चर जो एक फ़ंक्शन के लिए स्थानीय हैं, एक के साथ उपसर्ग हैं v_


0

ज्यादातर कंपनियों को पता है कि उनके पास कोडिंग मानक हैं जो उनके सदस्य चर के लिए उपसर्ग के रूप में या तो अंडरस्कोर या लोअरकेस अक्षर m ("सदस्य" मुझे लगता है) को निर्दिष्ट करते हैं।

इसलिए

_varName

या

mVarName


2
हाँ, लेकिन एमएस ने सदस्यों के लिए मीटर का उपयोग किया जो कि ओपी में मिल रहा है।
क्रिस्टोफर Bibbs

"अधिकांश कंपनियों" में Microsoft शामिल नहीं है, जो कि वह कंपनी है जिसके बारे में यह प्रश्न है।
Aaronaught

1
मुझे पता ही नहीं चला कि माइक्रोसाफ्ट MSDN Microsoft में आंतरिक कोडिंग मानकों के लिए है।
जेएफओ

1
@ जेफ़ो: आप सही कह रहे हैं, यह नहीं है, लेकिन उनके आंतरिक कोडिंग दिशानिर्देश एक ही बात कहते हैं
Aaronaught

0

जैसा कि अन्य लोगों ने बताया है, आप आमतौर पर बता सकते हैं कि कौन सी गुंजाइश है कि आइटम का उपयोग किया जाए। आपके पास वास्तव में एक ही दायरे में पैरामीटर और स्थानीय चर नहीं हो सकता है और यदि आप निजी चर चाहते हैं, तो बस इस .myInteger का उपयोग करें। इसलिए मुझे नहीं लगता कि Microsoft इसके बारे में बहुत चिंतित है क्योंकि यदि आप चाहते हैं तो आप उनके बीच आसानी से अंतर कर सकते हैं।

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

कहा जा रहा है कि, Microsoft द्वारा उपयोग किए जाने वाले नए मानक (ऊंट मामले और पास्कल मामले का मिश्रण) बहुत बुरा नहीं है। लेकिन अगर आप और आपके सहकर्मी इसे पसंद नहीं करते हैं, तो मानकों के अपने सेट के साथ आओ (सामूहिक रूप से सबसे अच्छा है)। यह पाठ्यक्रम इस बात पर निर्भर करता है कि आपकी कंपनी के पास पहले से ही मानकों का एक सेट है या नहीं। यदि वे करते हैं, तो उनसे चिपके रहते हैं। अन्यथा आप और आपके सहकर्मियों के लिए क्या काम आता है। बस इसे तार्किक रखें। '

चूंकि आरोनियट ने चार्ल्स सिमोनी और हंगेरियन नोटेशन के बारे में उद्धरण के लिए पूछा: http://en.wikipedia.org/wiki/Charles_Simonyi

http://en.wikipedia.org/wiki/Hungarian_notation

http://msdn.microsoft.com/en-us/library/aa260976(v=VS.60).aspx

http://ootips.org/hungarian-notation.html

http://www.hitmill.com/programming/vb/Hungarian.html

http://web.mst.edu/~cpp/common/hungarian.html

पिछले दो हंगेरियन अंकन के उदाहरण हैं और ootips लिंक इस विषय पर कुछ राय से संबंधित कुछ उद्धरण हैं। ध्यान दें कि सिस्टम हंगेरियन नोटेशन भी है, लेकिन वह भी, जहाँ तक मुझे जानकारी है, Microsoft प्रोग्रामर से लोकप्रियता मिली (हालाँकि ऐप्स भिन्नता के लिए सिमोनी के विपरीत, मुझे नहीं पता कि कौन है)।


1
1) हंगेरियन का आविष्कार Microsoft द्वारा नहीं किया गया था, और 2) आप जिस "हंगेरियन" की बात कर रहे हैं, वह शब्दार्थ हंगेरियन के बजाय हंगरी का है।
Aaronaught

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

[उद्धरण वांछित]
Aaronaught

1
उम, हमें हंगेरियन नोटेशन क्या है, इस पर उद्धरण की आवश्यकता नहीं थी। [उद्धरण वांछित] आपके उत्तर के सभी संदिग्ध दावों के लिए है।
आरोन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.