C # - खेतों पर उपसर्गों को हतोत्साहित क्यों किया जाता है?


19

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

मेरे लिए, अगर मैं किसी और के कोड के माध्यम से पढ़ रहा हूं, और मैं इसे देखता हूं:

count = 3;

मुझे लगता है कि countउस फ़ंक्शन के लिए एक चर स्थानीय है और मैं कुछ ऐसा कर रहा हूं जिसका उपयोग फ़ंक्शन में कहीं और किया जाएगा; अगर मैं इसे देखता हूं:

m_count = 3;

मुझे तुरंत एहसास हुआ कि मैं ऑब्जेक्ट की स्थिति को अपडेट कर रहा हूं।

Microsoft शैली दिशानिर्देश कहते हैं कि गलत तरीके से काम करना है। मैं अपने गैर-सार्वजनिक क्षेत्रों को नाम देना चाहता हूं, जैसे कि फ़ंक्शन में परिभाषित अस्थायी चर। नहीं m_, एक साधारण अंडरस्कोर भी नहीं।

हां, हम अपनी स्वयं की कोडिंग शैली को परिभाषित कर सकते हैं, लेकिन फिर मुझे विभिन्न स्थिर कोड विश्लेषण उपकरणों के साथ कुश्ती करनी होगी, उन्हें यह समझाने के लिए कि चीजों को करने का हमारा तरीका ठीक है।

मुझे Microsoft शैली में परिवर्तन करने में खुशी हो रही है, लेकिन मैं यह जानना चाहूंगा कि चीजें किस तरह से हैं।

अब यह क्यों बुरा माना जा सकता है कि यह बताने में सक्षम है कि एक चर स्थानीय है या सदस्य है?

PS यह बहुत ही समान है कि वर्तमान में "#" कीवर्ड के बारे में वर्तमान सर्वोत्तम प्रथाओं को c # के क्षेत्र और तरीकों के बारे में क्या कहा जाता है? , लेकिन मैं m_नहीं के बारे में पूछ रहा हूँthis.

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


9
क्या C # में thisकीवर्ड नहीं है ? क्या आप thisऐसे सदस्यों का उपयोग नहीं कर सकते , जैसे कि this.count?
FrustratedWithFormsDesigner

3
M_ उपसर्ग एक C ++ - ism है जहां यह खेतों और विधियों के बीच नाम की गड़बड़ी से बचा जाता है। C # में यह एक समस्या नहीं है क्योंकि विधि के नाम ऊपरी मामले, निचले मामले वाले क्षेत्रों के साथ शुरू होना चाहिए।
अमन

4
यदि आप 2017 में कोड प्रिंट कर रहे हैं, तो आप कुछ गलत कर रहे हैं। अन्य दो परिदृश्यों में, यह स्पष्ट रूप से स्पष्ट होना चाहिए कि countजहां यह विधि में घोषित नहीं किया गया था, वहां से बाहर नहीं निकला था। सच कहूँ तो "आईडीई से बाहर" तर्क वास्तव में कमजोर है। विशेष रूप से चूंकि कोड समीक्षा उपकरण भी हैं जो आईडीई में काम करते हैं।
एंडी

4
जोएल से अभी भी प्रासंगिक पोस्ट
कासे स्पीकमैन

जवाबों:


19

जब वे विंडोज के लिए एपीआई पर काम कर रहे थे, तो Microsoft ने 'm_', साथ ही 'i', 'sz' आदि का उपयोग करते हुए हंगेरियन नोटेशन के उपयोग की सिफारिश की। इस समय यह उपयोगी था क्योंकि IDE मजबूत नहीं था। यह जानकारी आपको दिखाने के लिए पर्याप्त है।

दूसरी ओर, C # के पास शुरू से ही बहुत मजबूत IDE है।

इसलिए उन्होंने सार्वजनिक स्थैतिक या संरक्षित क्षेत्रों के लिए C # के लिए Microsoft के नामकरण दिशानिर्देशों में सिफारिश की :

 DO use PascalCasing in field names.
 DO name fields using a noun, noun phrase, or adjective.
X DO NOT use a prefix for field names.

अब जब आप अपने माउस से उस पर होवर कर सकते हैं, या CTRL + K + W दबा सकते हैं, और सदस्य के बारे में सभी जानकारी प्राप्त कर सकते हैं, तो Microsoft इस निर्णय पर आया कि उपसर्ग खराब रूप हैं; वे पहले से हल की गई समस्या का एक मैनुअल समाधान हैं।

निजी क्षेत्रों को विशेष रूप से दिशानिर्देशों से बाहर रखा गया है, लेकिन Microsoft इस निष्कर्ष पर पहुंचा है कि निजी क्षेत्रों के लिए आंतरिक रूप से आगे बढ़ने के लिए भी यही स्थिति है, जिसे आप .NET 4.5 या .NET कोर पर Resharper को इंगित करते हुए देख सकते हैं।

अपने टूल का उपयोग करें, इसे मैन्युअल रूप से न करें।


2
एंडी के समान जवाब ... हां लेकिन ... कई परिस्थितियां हैं जहां मैं आईडीई के बाहर कोड देख रहा हूं। उदाहरण - (1) मर्ज टूल। (2) कोड समीक्षा उपकरण। (3) (हांफना) प्रिंटआउट।
बेट्टी क्रोकर

एंडी ने शाब्दिक रूप से वही इंस्टेंट पोस्ट किया जो मैंने किया। मैंने "1 नई टिप्पणी" देखी जैसे ही मैंने "उत्तर जोड़ें" पर क्लिक किया। जहां तक ​​उन साधनों की बात है, उनमें से दो पहले से ही आईडीई में हैं। प्रिंटआउट ... आप ऐसा क्यों कर रहे हैं?
केविन फी

1
मेरा प्रारंभिक प्रश्न अनुत्तरित है ... हाँ, Microsoft ने कहा कि m_ का उपयोग न करें और उपकरण निर्माताओं ने इसका अनुसरण नहीं किया, लेकिन यह m_ का उपयोग करने का तकनीकी कारण नहीं है, इसे अक्सर "अथॉरिटी के लिए अपील" कहा जाता है। केवल तकनीकी कारण जो मैंने m_ का उपयोग नहीं करने के लिए देखा है, टिमोथी ट्रॉस्ले से आया है और मुझे यह समझ में नहीं आया है ...
बेट्टी क्रोकर

8
@BettyCrokker क्योंकि m_ बिल्कुल कोई मूल्य नहीं जोड़ता है। IDE आपको सदस्य बताता है या नहीं, इसलिए m_ बेमानी है। किसी भी m_ पर आपको क्यों ठीक किया जाता है? क्यों नहीं l_ (स्थानीय के लिए)? Afsdfjdskfjas_ क्यों नहीं? मैं सवाल को कम करने जा रहा हूं, क्योंकि इसका एक मूर्खतापूर्ण धार्मिक तर्क है। आप जो चाहे करें। आपके द्वारा निर्दिष्ट दिशा-निर्देश भी कहते हैं "फ़ील्ड-नामकरण दिशानिर्देश स्थिर सार्वजनिक और संरक्षित फ़ील्ड्स पर लागू होते हैंआंतरिक और निजी फ़ील्ड _not_ दिशानिर्देशों द्वारा कवर किए जाते हैं , और सदस्य डिज़ाइन दिशानिर्देशों द्वारा सार्वजनिक या संरक्षित इंस्टेंस फ़ील्ड की अनुमति नहीं होती है।"
एंडी

1
@BettyCrokker ठीक है, लेकिन आप उन दिशानिर्देशों के बारे में पूछ रहे हैं जो उस धारणा के साथ बने हैं। आप स्थैतिक उपकरणों के बारे में भी शिकायत कर रहे हैं जो संभवतः उस धारणा का उपयोग कर रहे हैं, क्योंकि "कोई भी नहीं" (त्रुटि के स्वीकार्य सांख्यिकीय मार्जिन के भीतर) उनके सी # कोड को प्रिंट करता है। मुझे नहीं पता कि आप कौन से सांख्यिकीय विश्लेषण उपकरण का उपयोग करते हैं, लेकिन रेस्पर काफी विशिष्ट है: निजी क्षेत्र "_lowerCase" हैं। किसी भी प्रकार या "अपरकेस" के सार्वजनिक सदस्य, और स्थानीय लोग "लोअरकेस" हैं। "एम" पर सहेजना वास्तव में बहुत अच्छा लगता है, वैसे भी।
केविन फी

17

C # के पास कोई वैश्विक चर नहीं है, जिससे केवल स्थानीय चर और वर्ग-फ़ील्ड निकलते हैं।

और यदि आपके पास इतने सारे स्थानीय चर हैं कि आप एक पहचानकर्ता हैं या नहीं, तो आपने सबसे जटिल तरीके से जटिलता के प्रबंधन के दिशानिर्देशों का उल्लंघन किया है।

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

अब जब हमने यह स्थापित कर दिया है कि "इस-ए-इस-ए-मेंबर" का उद्देश्य अब नहीं है क्योंकि फ़ंक्शन-स्कोप बहुत छोटा होना चाहिए और वैश्विक स्कोप मौजूद नहीं है, तो उन मार्करों के लिए एक नुकसान है: वे बाधित करते हैं सदस्यों के पास या अन्य तरीके से चल रहे तर्क / स्थानीय चर।


एक बार जब आप इसमें जाते हैं, तो यह एक वर्ग या नाम स्थान भी हो सकता है।
कोडइन्चोस

3
मुझे नहीं लगता कि यह वास्तव में इस सवाल का जवाब देता है।
व्लादिमीर स्टोक

5
@FrankHileman वास्तव में, यह है। यह बताता है कि क्यों किसी नाम को बदसूरत करने का कोई अच्छा कारण नहीं है।
डेडुप्लिकेटर

2
"uglifying"? यदि यह मामला है, तो यह केवल एक राय है। कुरूपता के बारे में सभी की अलग-अलग राय हो सकती है। एक से अधिक एक सम्मेलन को प्राथमिकता देने के कारण हैं, लेकिन इस मामले में कोई मानक सम्मेलन नहीं है।
फ्रैंक हिलमैन

1
@ डेडप्लिकेटर सौंदर्य देखने वाले की आंखों में है। जिन सम्मेलनों को मैंने एक बार बदसूरत माना था, मैं अब उनकी सराहना करता हूं।
फ्रैंक हिलमैन

11

क्यों डेवलपर्स नेमस्पेस निर्देश के उपयोग के साथ नाम स्थान बनाने से बचते हैं?

System.DateTime()की तुलना में अधिक स्पष्ट है DateTime()। यह मुझे बताता है कि मैं किसके साथ काम कर रहा हूं। क्या यह सिर्फ इसलिए है क्योंकि हम आलसी टाइपिस्ट हैं?

नहीं, हम आलसी टाइपिस्ट हैं, लेकिन ऐसा नहीं है।

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

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


2
इस सवाल का जवाब नहीं लगता है। .Net में निजी क्षेत्रों के लिए कोई सामान्य वरीयता या सम्मेलन नहीं है।
फ्रैंक हिलमैन

12
@FrankHileman सामान्य तौर पर, हम अच्छे नामों को पसंद करते हैं। कन्वेंशन अच्छे नाम नहीं बनाते हैं। कन्वेंशन McOhPlease Von StopItAlreadyStine जैसे नाम बनाते हैं।
कैंडिड_ओरेंज

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

7

थोड़ा विस्तार करते हैं।

3 सामान्य उपसर्ग शैलियाँ हैं, जिनमें से सभी का कभी-कभी c # कोड में सामना किया जाता है:

  • म_
  • _
  • इस।

इस तरह के उपसर्ग आमतौर पर एक वर्ग के निजी कार्यान्वयन में उपयोग किए जाते हैं । Microsoft अनुशंसा मुख्य रूप से एक वर्ग के उजागर भागों के बारे में है।

m_ओवर का उपयोग करने का लाभ यह _है कि उपसर्ग आपके पूरे कोडबेस में समान हो सकता है यदि आप c # के साथ-साथ उन भाषाओं का उपयोग करते हैं जहां _उपसर्ग के रूप में उपयोग करने की अनुमति नहीं है । * m_ओवर this.का लाभ यह है कि यह छोटा है और आप गलती से नहीं करेंगे। उपसर्ग के बारे में भूल जाओ।

_ओवर m_का फायदा यह है कि यह छोटा है और उपसर्ग के साथ शुरू होने वाली किसी भी चीज को एक उपकरण द्वारा वर्णानुक्रम में क्रमबद्ध किया जाता है। _ओवर this.का फायदा यह है कि यह छोटा है और आप गलती से उपसर्ग के बारे में नहीं भूलेंगे।

का लाभ this.अधिक m_और _है कि आप एक codebase में इसका इस्तेमाल करते हैं, जहां कर सकते हैं _या m_एक स्वीकार किए जाते हैं और सार्वभौमिक सम्मेलन नहीं हैं। इसका मतलब यह भी है कि किसी को भी _या m_सम्मेलन के बारे में जानने की जरूरत नहीं है , जिसे चीजों को सरल बनाने के रूप में देखा जा सकता है। एक नकारात्मक पक्ष के रूप में, क्योंकि कंपाइलर इस उपसर्ग के बारे में परवाह नहीं करता है, this.उपसर्ग कभी-कभी गायब हो जाएगा, और जैसे कि एक संकेतक के रूप में विश्वसनीय नहीं होगा।


* एक बार जब आप _C ++ / CLI (जो वास्तव में वास्तव में उपयोग नहीं करना चाहिए _) से उपयोग करने वाली C # कक्षाएं एक्सेस करना शुरू करते हैं , तो आप देखेंगे कि एक सामान्य उपसर्ग पर सहमत होना अधिक जटिल है जितना कि यह होना चाहिए। एक उपसर्ग न करने का निर्णय लेने से उस शोर से छुटकारा मिल जाता है। इसे Deduplicator के उत्तर के साथ मिलाएं, जिसे मैं "उपसर्ग का लाभ लगभग नगण्य है" के रूप में परिभाषित करूंगा, और यह हमें देता है: "उपसर्गों का उपयोग करते समय एक छोटी सी समस्या है, और एक छोटे से उल्टा है, इस प्रकार यह सिर्फ एक वैध विकल्प नहीं है उन्हें इस्तेमाल करें"।


नहीं है stackoverflow पर एक पुराने सवाल यह करने के लिए संबंधित।


1
अच्छी तुलना। हालांकि, मुझे लगता है कि किसी भी उपसर्ग का उपयोग नहीं करना व्यवहार में अच्छी तरह से काम करता है।
फिल1970

6

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

यह विचार किया जा रहा है कि Microsoft पुस्तकालयों को एक मानक रूप दिया गया है और उनका उपभोग करने वाले डेवलपर्स को महसूस किया जा रहा है।

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

यह कहते हुए कि चर उपसर्ग कई कारणों से सामान्य रूप से हतोत्साहित होते हैं

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

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

थोड़ी देर के बाद आप इतने अलग-अलग शैलियों को देखते हैं कि आप उन्हें अनदेखा करते हैं। यदि आप एक शैली को लागू करने की कोशिश करते हैं तो आप लगातार सबकुछ बदल देंगे
ईवान

4
यदि आप "वे गलत हो सकते हैं, और इसलिए भ्रामक हैं" तो कुछ भी करने के लिए, आपको जल्दी से पता चलता है कि आपको चर या कार्यों का नाम नहीं देना चाहिए - वे गलत हो सकते हैं! और मैं अनुमान लगा रहा हूं कि आपका दूसरा बुलेट पॉइंट "उन कक्षाओं को कहने वाला है जो आपने नहीं बनाए हैं?" या फिर मैं इसे समझ नहीं पा रहा हूँ ... किसी भी मामले में, यह गैर-सार्वजनिक क्षेत्रों के लिए एक एकल अंडरस्कोर उपसर्ग होने की तरह आवाज़ करना शुरू कर रहा है यह एक अनौपचारिक मानक है, शायद यही दिशा हम जाएंगे।
बेट्टी क्रोकर

कुछ बातें, संकलक द्वारा जाँच कर रहे हैं ताकि m_count एक सदस्य चर नहीं हो सकता है, लेकिन this.count हमेशा रहेंगे
ईवान

बहुत सारे पीपीएल का उपयोग _ लेकिन समय के साथ चीजें बदल जाती हैं, आप पाएंगे कि पिछले साल 'बेस्ट प्रैक्टिस' के लिए लिखे गए कोड इस साल के सम्मेलनों से मेल खाते हैं
इवान

4

मेरे लिए, अगर मैं किसी और के कोड के माध्यम से पढ़ रहा हूं, और मैं इसे देखता हूं:

count = 3;

मुझे लगता है कि 'गणना' उस फ़ंक्शन के लिए एक परिवर्तनीय स्थानीय है और मैं कुछ ऐसा कर रहा हूं जिसका उपयोग फ़ंक्शन में कहीं और किया जाएगा

और आप बिल्कुल सही होंगे यदि आप स्रोत कोड पढ़ रहे हैं जो C # की शैली सम्मेलनों का सम्मान करता है। ऐसे कोड में:

this.count = 3;

किसी फ़ील्ड में एक मान प्रदान करता है।

count = 3;

एक स्थानीय चर के लिए एक मूल्य प्रदान करता है।

इसलिए, C # की शैली परंपराएँ स्पष्ट और अस्पष्ट हैं। वे आपको किसी भी उपसर्ग का उपयोग नहीं करने के लिए मजबूर करते हैं क्योंकि आपको एक की आवश्यकता नहीं है।

स्रोत कोड के लिए जिसके लिए लेखकों ने अपने व्यक्तिगत सम्मेलनों का उपयोग करने का फैसला किया, आपको उनसे व्यक्तिगत रूप से पूछना चाहिए कि उन्होंने ऐसा करने का विकल्प क्यों बनाया। यदि वे उपसर्गों जैसे अंडरस्कोर का उपयोग नहीं करते this.हैं, तो या तो उपयोग नहीं करते हैं, तो यह प्रभावी रूप से न केवल कोड को पढ़ने में मुश्किल होगा, बल्कि ऐसे मामलों में भी जहां एक अतिरिक्त सम्मेलन की आवश्यकता होगी:

public class Hello
{
    private string greetings;

    public Hello(string greetings)
    {
        greetings = greetings; // Wait, what is that?!
    }
}

क्या यह कीवर्ड नहीं है? क्या आप इसका उपयोग करने वाले सदस्यों को संदर्भित नहीं कर सकते हैं, जैसे कि यह ..count?

हां, लेकिन (1) यह अधिक टाइपिंग है, और (2) इसे भूलना आसान है। यदि फ़ील्ड को m_count नाम दिया गया है तो मुझे यह टाइप करने के लिए याद रखने की जरूरत नहीं है

हालांकि, आप गलत हैं।

जब आप नोटपैड में अपना कोड लिखते हैं तो यह अधिक टाइपिंग होता है। ऑटो-पूर्ण या बेहतर के साथ एक IDE के साथ, IntelliSense, के बीच तुलना this.countऔर m_countस्पष्ट नहीं है। अंडरस्कोर टाइप करने के लिए आवश्यक Shift+ नोट करें -

"आसान भूलने के लिए" के रूप में, फिर से, यह केवल नोटपैड के उपयोगकर्ताओं के लिए प्रासंगिक है। इतना ही नहीं StyleCop और Resharper आपको this.जरूरत पड़ने पर भूल जाने नहीं देंगे , लेकिन प्रोग्रामिंग के कुछ घंटों के बाद, this.जब जरूरत हो तब लगाना आदत बन जाएगी।


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

1
रबरडक सही है। "इस।" एक उपसर्ग है, हालांकि, इसका संकलक अर्थ है।
फ्रैंक हिलमैन

4

"सदस्य" उपसर्ग एक कार्यान्वयन विवरण की तरह है। यह समस्या समाधान डोमेन से तकनीकी समाधान डोमेन पर आपका ध्यान विचलित करता है जो संभव रिफ्लेक्टरिंग के बारे में सोचते समय आपके मन को पूर्वाग्रहित करता है। - मुझे

क्या आप आगे बता सकते हैं? तुम्हारा एकमात्र कारण है जो मैंने देखा है कि उपसर्ग का उपयोग न करने के लिए और मुझे यह समझ में नहीं आता है ... (जिसका अर्थ है कि, लोग जो दूसरी चीजें कह रहे हैं वे कारण हैं कि मुझे इसका उपयोग करने की आवश्यकता नहीं है) जो मैं क्यों नहीं होना चाहिए) के समान नहीं है - बेट्टी क्रोकर

मेरी बात @CandiedOrange और @Ewan के जवाबों को बढ़ा रही है।

उपसर्ग रिफैक्टिंग को कठिन बनाते हैं

जैसा कि आपका कोड चर विकसित करता है और विधियाँ अपना दायरा बदल सकती हैं। उदाहरण के लिए। आप एक निजी विधि बना सकते हैं और बाद में पता लगा सकते हैं कि यह अन्य (नई) कक्षाओं के लिए भी उपलब्ध होनी चाहिए। विधि पैरामीटर और स्थानीय चर के लिए भी ऐसा ही हो सकता है।

मान लीजिए कि आप एक टैक्स कैलकुलेटर बनाते हैं। चर के लिए लीज़ विज़िबिलिटी स्कोप के सिद्धांत के अनुसार, आप एक ऐसी विधि के साथ शुरू करते हैं जो दोनों को ले जाती है, कर की दर और आधार मान पैरामीटर के रूप में:
(उदाहरण जावा-ईश दिख सकता है ...)

class TaxCalculator{
   double Calculate(double p_TaxRateInpercent, double p_BaseValue){
     return (100+p_TaxRateInpercent)/100 * p_BaseValue;
   }
} 

आगे आपको रिवर्स ऑपरेशन लागू करना होगा और टीडीडी के अनुसार आप इसे कम से कम प्रयास के साथ करेंगे:

class TaxCalculator{
   double Calculate(double p_TaxRateInpercent, double p_BaseValue){
     return (100+p_TaxRateInpercent)/100 * p_BaseValue;
   }
   double CalculateBase(double p_TaxRateInpercent, double p_TaxedValue){
     return p_TaxedValue/((100+p_TaxRateInpercent)/100);
   }
} 

अगला टीडीडी आपको क्लीनर बनने के लिए कोड को रिफलेक्टर करना चाहता है जो दोनों तरीकों की पैरामीटर सूची को कम करना है।
(हां, आप पहले दोगुनी गणना निकालेंगे, लेकिन मुझे अपनी बात कहने दें ...)
स्पष्ट उपाय यह है कि कर दर को एक निर्माणीय पैरामीटर के रूप में पारित करके सदस्य चर में बदल दिया जाए।

class TaxCalculator{
   double m_TaxRateInpercent;
   TaxCalculator(double p_TaxRateInpercent){
     m_TaxRateInpercent = p_TaxRateInpercent;
   }
   double Calculate(double p_BaseValue){
     return (100+m_TaxRateInpercent)/100 * p_BaseValue;
   }
   double CalculateBase(double p_TaxedValue){
     return p_TaxedValue/((100+m_TaxRateInpercent)/100);
   }
} 

जैसा कि आप देख सकते हैं कि हमें अपने मौजूदा तरीकों की सभी पंक्तियों को बदलना होगा (किसी भी पंक्ति का उपयोग हम p_TaxRateInpercentसटीक करते थे।

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

उपसर्ग के बिना केवल विधि हस्ताक्षर बदल गए होंगे। कोई भी नाम बदलने की आवश्यकता नहीं होती।


बदले जाने पर SCM इतिहास को अव्यवस्थित करता है

इसके अलावा SCM तर्क में परिवर्तन के रूप में उपसर्ग के परिवर्तन को रिकॉर्ड करता है, हालांकि तर्क नहीं बदला! एससीएम का इतिहास इस तकनीकी परिवर्तन से छिपा है जो महत्वपूर्ण है और दूसरों के (वास्तविक तर्क) परिवर्तनों के साथ संघर्ष के लिए जोखिम उठा रहा है।


1

मैं सभी सदस्य चर के लिए _ उपसर्ग का उपयोग करता हूं। मुझे इस 'उपसर्ग से नफरत है क्योंकि, कुछ का दावा है कि यह चीजों को करने का सही तरीका है - यह आपके कोडबेस में बहुत अधिक शोर / अव्यवस्था जोड़ता है। Microsoft के नमूनों में एक एकल अंडरस्कोर भी एक आम बात है।

तो आपके उदाहरण में मेरे पास होगा:

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