`M_` चर उपसर्ग का क्या अर्थ है?


154

मैं अक्सर m_चर के लिए प्रयुक्त उपसर्ग देखता हूं ( m_World,m_Sprites ट्यूटोरियल, उदाहरण और अन्य कोड में, ...) मुख्य रूप से खेल के विकास से संबंधित।

लोग m_चर में उपसर्ग क्यों जोड़ते हैं ?



18
ध्यान से, आयु संकेतन के साथ सूट करने से पहले, कृपया कुछ इतिहास जांच लें कि हंगेरियन अंकन वास्तव में क्या है। क्योंकि एक int iCounter नामकरण सिर्फ व्यर्थ है। लेकिन एक int xAnnotationPos और yAnnotationPos का नामकरण उचित है। सिमेंटिक संस्करण का उपयोग करें।
अक्सेलके

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

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

8
किसी भी कोडिंग मानक के लिए और उसके खिलाफ तर्क हैं, लेकिन सवाल स्पष्ट रूप से पूछते हैं कि क्या है m_, फिर भी यहां आधी प्रतिक्रियाएं इस बात पर टिप्पणी करती हैं कि हर कोई अपने वर्तमान पसंदीदा को सबसे अच्छा क्यों मानता है।
cz

जवाबों:


108

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


51
एक नामकरण सम्मेलन के लिए सबसे खराब तर्क, आप केवल intellisense के लिए ctrl + स्पेस दबा सकते हैं।
orlp

11
@ नाइटक्रैकर इवेंटहॉफ मुझे उपसर्ग पसंद नहीं है, उनका कहने का मतलब है कि जब आप m_ टाइप करते हैं और फिर "CTRL + स्पेस" (जब तक कि यह ऑटो नहीं है) आपको केवल अपने सदस्यों वाली एक सूची मिलती है। नहीं बिल्कुल एक अच्छा कारण है, लेकिन यह एक प्लस है।
सिदार

13
इस बात का उल्लेख करते हुए कि समान कार्य करने के लिए बहुत अधिक अन्य-या-कम मानक तरीके हैं; "m_variable", "m_Variable", "mVariable", "_variable", "_Variable" ... कौन सा तरीका 'सबसे अच्छा' या 'सही' है (या क्या करना है) यह विवादास्पद और निरर्थक एक तर्क है ' रिक्त स्थान बनाम टैब '। :)
ट्रेवर पॉवेल

49
मैं केवल "इस->" का उपयोग करना पसंद करता हूं - थोड़े "m_" को निरर्थक बनाता है और यह बेहतर भी है क्योंकि यह कंपाइलर द्वारा लागू किया गया है (सिद्धांत रूप में आप किसी भी चर प्रकार पर "m_" पॉप कर सकते हैं; ऐसा "" के साथ नहीं कर सकते हैं) ")। मेरे हिस्से में इच्छा है कि C ++ सिर्फ "यह->" अनिवार्य करने पर मानकीकृत होगा। लेकिन यह एक उत्तर होने की तुलना में चर्चा की दुनिया में अधिक जा रहा है।

3
@LaurentCouvidou, आप वास्तव में लागू नहीं कर सकते हैं कि देवता m_या तो पहले से तैयार किए गए सदस्य चर बनाते हैं।
SomeWritesReserved

94

में स्वच्छ कोड: फुर्तीली सॉफ्टवेयर शिल्प कौशल की एक पुस्तिका इस उपसर्ग के उपयोग के खिलाफ एक स्पष्ट सिफारिश है:

आपको m_अब और सदस्य चर के साथ उपसर्ग करने की आवश्यकता नहीं है। आपकी कक्षाएं और कार्य इतने छोटे होने चाहिए कि आपको उनकी आवश्यकता न हो।

इसका एक उदाहरण (C # कोड) भी है:

बुरा अभ्यास:

public class Part
{
    private String m_dsc; // The textual description

    void SetName(string name)
    {
        m_dsc = name;
    }
}

अच्छा अभ्यास:

public class Part
{
    private String description;

    void SetDescription(string description)
    {
        this.description = description;
    }
}

हम स्पष्ट रूप से अस्पष्टता ( यानी , descriptionसदस्य और descriptionपैरामीटर) के मामले में सदस्य चर का संदर्भ देने के लिए भाषा निर्माणों के साथ गणना करते हैं this:।


6
रिकॉर्डिंग हो सकती है "इस उपसर्ग के उपयोग के बारे में एक स्पष्ट सिफारिश है:"
Xofo

मुझे खुशी है कि किसी ने इसे लिखा
dmitreyg

एक और कारण यह है कि जावा में गेटटर / सेटर को गेटनेम / सेटनाम माना जाता है, इसलिए गेटम_नाम खराब है और आपको एक-एक करके उन्हें संभालने की आवश्यकता है।
लियोन

इसे लिखने के लिए धन्यवाद। मैं सिर्फ यह बताना चाहता था कि आपके द्वारा उद्धृत पुस्तक अगस्त 2008 से बाहर है - और मुझे आज भी (2019) नए कोड में यह बुरा व्यवहार लगता है।
अलेक्सलोमा87

20

C ++ में यह आम बात है। ऐसा इसलिए है क्योंकि C ++ में सदस्य फ़ंक्शन और सदस्य चर के लिए एक ही नाम नहीं हो सकता है, और गेट्टर फ़ंक्शन को अक्सर "get" उपसर्ग के बिना नाम दिया जाता है।

class Person
{
   public:
      std::string name() const;

   private:
      std::string name; // This would lead to a compilation error.
      std::string m_name; // OK.
};

main.cpp:9:19: error: duplicate member 'name'
      std::string name;
                  ^
main.cpp:6:19: note: previous declaration is here
      std::string name() const;
                  ^
1 error generated.

http://coliru.stacked-crooked.com/a/f38e7dbb047687ad

"m_" "सदस्य" के लिए बताता है। उपसर्ग "_" भी सामान्य है।

आपको प्रोग्रामिंग भाषाओं में इसका उपयोग नहीं करना चाहिए जो विभिन्न सम्मेलनों / व्याकरण का उपयोग करके इस समस्या को हल करते हैं।


11

m_उपसर्ग अक्सर सदस्य चर के लिए प्रयोग किया जाता है - मुझे लगता है कि इसकी मुख्य लाभ यह है कि यह एक सार्वजनिक संपत्ति और निजी सदस्य चर यह समर्थन के बीच स्पष्ट अंतर बनाने में मदद करता है:

int m_something

public int Something => this.m_something; 

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

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


5
अगर आपको this.अपनी भाषा में लिखना है, तो m_वास्तव में बेकार है।
रुस्लान

@Ruslan m_यह है कि इसे संपत्ति से वापस अलग करना है - इसलिए this.Somethingसंपत्ति this.m_somethingके लिए समर्थन सदस्य के लिए। यह एक ऐसा सम्मेलन नहीं है जिसे मैं खुद पसंद करता हूं, लेकिन मैंने ज्यादातर इसे असंवेदनशील भाषाओं (जैसे वीबी) में इस्तेमाल किया है।
कीथ

1
क्यों नहीं, this.Somethingसंपत्ति के this.somethingलिए और समर्थन के लिए? या this._somethingसमर्थन के लिए? this.m_somethingबेमानी है। मैं इसका उपयोग _somethingकरता हूं ताकि मैं गलती से इसे टाइप न करूं जब मैं टाइप करने जा रहा हूं Something, सदस्यता के साथ कुछ भी नहीं करना है या नहीं
AustinWBryan

@AustinWBryan केस-असंवेदनशील भाषाओं के बारे में मेरी पिछली टिप्पणी देखें। हाँ, इस पर एक _उपसर्ग खुद काम करेगा, लेकिन m_सम्मेलन है। यह ऐसा नहीं है जिसे मैं व्यक्तिगत रूप से उपयोग करूंगा, लेकिन यदि आप इसे उस कोड में देखते हैं जो लेखक का इरादा था।
कीथ

7

जैसा कि अन्य उत्तरों में कहा गया है, m_उपसर्ग का उपयोग यह दर्शाने के लिए किया जाता है कि एक चर वर्ग का सदस्य है। यह हंगेरियन नोटेशन से अलग है क्योंकि यह चर के प्रकार को इंगित नहीं करता है लेकिन इसका संदर्भ है।

मैं m_C ++ में उपयोग करता हूं लेकिन कुछ अन्य भाषाओं में नहीं जहां 'यह' या 'स्व' अनिवार्य है। मुझे C ++ के साथ उपयोग किया गया 'यह->' देखना पसंद नहीं है क्योंकि यह कोड को काटता है।

एक अन्य उत्तर m_dsc"बुरा अभ्यास" और 'विवरण' है; "अच्छा अभ्यास" है, लेकिन यह एक लाल हेरिंग है क्योंकि समस्या का संक्षिप्त नाम है।

एक अन्य उत्तर में thisलिखा गया है कि टाइपिंग इन्टेलिसेनइज़ीन टाइप करें लेकिन किसी भी अच्छे IDE में मौजूदा वर्ग के सदस्यों के लिए IntelliSense पॉप अप करने के लिए हॉटकी होगी।


"लेकिन यह एक लाल हेरिंग है" - अच्छी बात है। एक निष्पक्ष तुलना m_descriptionबनाम होगी description
बैटल

3

जैसा कि कई अन्य प्रतिक्रियाओं में कहा गया है, m_ एक उपसर्ग है जो सदस्य चर को दर्शाता है। यह आमतौर पर C ++ दुनिया में उपयोग किया जाता है और जावा सहित अन्य भाषाओं में भी प्रचारित किया जाता है।

एक आधुनिक आईडीई में यह पूरी तरह से बेमानी है क्योंकि वाक्य रचना हाइलाइटिंग यह स्पष्ट करता है कि कौन से चर स्थानीय हैं और कौन से सदस्य हैं । हालाँकि, जब 90 के दशक के अंत में सिंटैक्स हाइलाइटिंग दिखाई देती थी, तब तक यह सम्मेलन कई वर्षों तक चलता रहता था और इसे कम से कम (C ++ दुनिया में) निर्धारित किया गया था।

मुझे नहीं पता कि आप किन ट्यूटोरियल्स का उल्लेख कर रहे हैं, लेकिन मुझे लगता है कि वे दो कारकों में से एक के कारण कन्वेंशन का उपयोग कर रहे हैं:

  • वे C ++ ट्यूटोरियल हैं, जिन्हें m_ कन्वेंशन के लिए लोगों द्वारा लिखा गया है, और / या ...
  • वे सिंटैक्स हाइलाइटिंग के बिना सादे (मोनोपॉज़) पाठ में कोड लिखते हैं, इसलिए उदाहरणों को स्पष्ट करने के लिए m_ सम्मेलन उपयोगी है।

एक उदाहरण यह हो सकता है: wiki.qt.io/How_to_Use_QSettings क्यूटी निर्माता के बाद से हाइलाइटिंग का उपयोग करते हुए, पहला अनुमान प्रकट हो सकता है। एक वर्ग और p_variable की निजी वस्तुओं के लिए _object () का उपयोग करके थोड़ा अलग एक और सम्मेलन हो सकता है अगर यह एक सूचक है क्योंकि दोनों को उच्चीकृत नहीं किया गया है जैसा कि मैं जानता हूं और इसका उपयोग करने के लिए मेरे लिए समझ में आता है।
इवानोविक

3

लॉकहीड मार्टिन एक 3-उपसर्ग नामकरण योजना का उपयोग करता है जो विशेष रूप से दूसरों के कोड को पढ़ने के साथ काम करने के लिए अद्भुत था।

   Scope          Reference Type(*Case-by-Case)   Type

   member   m     pointer p                       integer n
   argument a     reference r                     short   n
   local    l                                     float   f
                                                  double  f
                                                  boolean b

इसलिए...

int A::methodCall(float af_Argument1, int* apn_Arg2)
{
    lpn_Temp = apn_Arg2;
    mpf_Oops = lpn_Temp;  // Here I can see I made a mistake, I should not assign an int* to a float*
}

जो इसके लायक है उसे ले लो।


बहुत बढ़िया। "उदाहरण" के लिए धन्यवाद। यह वास्तव में काम में आता है जब आप कोड की 200,000 पंक्तियों का संपादन कर रहे हैं।
जिवितर्कय

1
रक्षात्मक होने की आवश्यकता नहीं है। मैं ईमानदारी से आपको यह दिखाने में मदद करने की कोशिश कर रहा हूं कि आपके उत्तर में कोई गलती है। मुझे और स्पष्ट होने दें, फिर: यदि आपके पास कोड की 5, या 200000 लाइनें हैं, तो इससे कोई फर्क नहीं पड़ता: कंपाइलर आपको असंगत पॉइंटर प्रकारों के साथ असाइनमेंट नहीं करने देगा। तो टिप्पणी में किया गया बिंदु मूट है।
कैसियो रेनन

रक्षात्मक के रूप में आने का मतलब नहीं था। माफ़ करना।
jveturkey

यह हंगेरी अंकन है, जो आधुनिक भाषाओं में मतलब नहीं है का एक परिवर्तन हो ...
डॉक

2

वर्तमान उत्तरों को पूरा करने के लिए और जैसा कि प्रश्न भाषा विशिष्ट नहीं है, कुछ सी-प्रोजेक्ट m_वैश्विक चर को परिभाषित करने के लिए उपसर्ग का उपयोग करते हैं जो एक फ़ाइल के लिए विशिष्ट हैं - और g_वैश्विक चर के लिए जो कि परिभाषित फ़ाइल से बड़ा है।
इस मामले में उपसर्ग के साथ परिभाषित वैश्विक चर को इस m_ रूप में परिभाषित किया जाना चाहिए static

देखें EDK2 (एक UEFI ओपन-सोर्स कार्यान्वयन) कोडिंग सम्मेलन इस सम्मेलन का उपयोग कर परियोजना का एक उदाहरण के लिए।


1

एक तर्क जो मैंने अभी तक नहीं देखा है वह यह है कि उपसर्ग जैसे कि 'डी मैक्रो' के m_साथ नाम के टकराव को रोकने के लिए इस्तेमाल किया जा सकता है #define

के लिए खोज regex #define [a-z][A-Za-z0-9_]*[^(]में /usr/include/term.hशाप / ncurses से।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.