मैं के पक्ष में सभी कर रहा हूँ अच्छी तरह से किया उपसर्गों ।
मुझे लगता है कि (सिस्टम) हंगेरियन संकेतन "खराब रैप" के लिए जिम्मेदार है जो उपसर्गों को मिलता है।
दृढ़ता से टाइप की गई भाषाओं में यह नोटेशन काफी हद तक व्यर्थ है जैसे कि C ++ "lpsz" में आपको यह बताने के लिए कि आपका स्ट्रिंग एक शून्य टर्मिनेटेड स्ट्रिंग के लिए एक लंबा पॉइंटर है, जब: खंडित आर्किटेक्चर प्राचीन इतिहास है, C ++ स्ट्रिंग्स आम कन्वेंशन पॉइंटर्स द्वारा nul- टर्मिनेटेड हैं। char arrays, और यह वास्तव में यह जानना मुश्किल नहीं है कि "customerName" एक स्ट्रिंग है!
हालांकि, मैं निर्दिष्ट करने के लिए उपयोग उपसर्गों कर उपयोग (हालांकि मैं वजह से यह एक बुरा और सिस्टम हंगरी के साथ अनुचित संघ होने के लिए अवधि हंगरी से बचने के लिए पसंद करते हैं, अनिवार्य रूप से "Apps हंगेरी") एक चर के लिए, और यह एक बहुत ही उपयोगी है समय बचाने वाली और बग को कम करने का तरीका।
मैं उपयोग करता हूं:
- सदस्यों के लिए एम
- c स्थिरांक / रीडोनॉल के लिए
- पॉइंटर के लिए (और पॉइंटर से पॉइंटर के लिए)
- v वाष्पशील के लिए
- स्थिर के लिए है
- मैं अनुक्रमित और पुनरावृत्तियों के लिए
- ई घटनाओं के लिए
जहाँ मैं टाइप को स्पष्ट करना चाहता हूं , मैं मानक प्रत्ययों (जैसे सूची, कॉम्बोबॉक्स, आदि) का उपयोग करता हूं।
जब भी वे इसे देखते / उपयोग करते हैं, तो यह प्रोग्रामर को चर के उपयोग से अवगत कराता है। संभवतः सबसे महत्वपूर्ण मामला पॉइंटर के लिए "p" है (क्योंकि उपयोग var से बदलता है- var-> और आपको पॉइंटर्स - NULLs, पॉइंटर अंकगणितीय, आदि) के साथ और अधिक सावधान रहना होगा, लेकिन अन्य सभी बहुत काम हैं।
उदाहरण के लिए, आप किसी एकल फ़ंक्शन में एक ही चर नाम का कई तरीकों से उपयोग कर सकते हैं: (यहां C ++ उदाहरण, लेकिन यह कई भाषाओं में समान रूप से लागू होता है)
MyClass::MyClass(int numItems)
{
mNumItems = numItems;
for (int iItem = 0; iItem < mNumItems; iItem++)
{
Item *pItem = new Item();
itemList[iItem] = pItem;
}
}
आप यहाँ देख सकते हैं:
- सदस्य और पैरामीटर के बीच कोई भ्रम नहीं
- सूचकांक / पुनरावृत्ति और वस्तुओं के बीच कोई भ्रम नहीं
- स्पष्ट रूप से संबंधित चर (आइटम सूची, सूचक और सूचकांक) के एक सेट का उपयोग करें जो "गणना", "सूचकांक" जैसे सामान्य (अस्पष्ट) नामों के कई नुकसान से बचते हैं।
- उपसर्ग "आइटमइंडेक्स" और "क्रेडिट कार्ड" जैसे विकल्पों की तुलना में टाइपिंग को कम करते हैं (स्वतः पूर्णता के साथ बेहतर काम करते हैं)
"IName" पुनरावृत्तियों का एक और शानदार बिंदु यह है कि मैं कभी भी किसी सरणी को गलत इंडेक्स के साथ अनुक्रमित नहीं करता हूं, और यदि मैं किसी अन्य लूप के अंदर एक लूप की प्रतिलिपि बनाता हूं तो मुझे लूप इंडेक्स चर में से एक को रिफैक्ट करने की आवश्यकता नहीं है।
इस अनुचित रूप से सरल उदाहरण की तुलना करें:
for (int i = 0; i < 100; i++)
for (int j = 0; j < 5; j++)
list[i].score += other[j].score;
(जो पढ़ना मुश्किल है और अक्सर "i" का उपयोग करता है जहां "j" का उद्देश्य था)
साथ में:
for (int iCompany = 0; iCompany < numCompanies; iCompany++)
for (int iUser = 0; iUser < numUsers; iUser++)
companyList[iCompany].score += userList[iUser].score;
(जो बहुत अधिक पठनीय है, और अनुक्रमण पर सभी भ्रम को दूर करता है। आधुनिक आईडीई में ऑटो-पूर्ण के साथ, यह त्वरित और टाइप करने में आसान भी है)
अगला लाभ यह है कि कोड स्निपेट को समझने के लिए किसी संदर्भ की आवश्यकता नहीं है। मैं एक ईमेल या एक दस्तावेज़ में कोड की दो पंक्तियों की प्रतिलिपि बना सकता हूं, और कोई भी व्यक्ति जो यह पढ़ सकता है कि स्निपेट सभी सदस्यों, स्थिरांक, सूचक, अनुक्रमित, आदि के बीच का अंतर बता सकता है, मुझे "ओह जोड़ने की ज़रूरत नहीं है, और सावधान रहें क्योंकि 'डेटा' एक पॉइंटर को पॉइंटर "है, क्योंकि इसे 'पीपीपाटा' कहा जाता है।
और इसी कारण से, मुझे इसे समझने के लिए अपनी आँखों को कोड की एक पंक्ति से बाहर ले जाने की आवश्यकता नहीं है। मुझे यह जानने के लिए कोड के माध्यम से खोजना नहीं है कि क्या 'डेटा' एक स्थानीय, पैरामीटर, सदस्य या स्थिर है। मुझे अपना हाथ माउस पर ले जाने की ज़रूरत नहीं है ताकि मैं 'डेटा' पर पॉइंटर को मँडरा सकूँ और फिर एक टूलटिप (जो कभी-कभी कभी प्रकट नहीं होता) को पॉप अप करने के लिए प्रतीक्षा करें। इसलिए प्रोग्रामर कोड को बहुत तेजी से पढ़ और समझ सकते हैं , क्योंकि वे ऊपर और नीचे या प्रतीक्षा करने में समय बर्बाद नहीं करते हैं।
(यदि आपको नहीं लगता है कि आप सामान को काम करने के लिए ऊपर और नीचे खोजने में समय बर्बाद करते हैं, तो एक साल पहले आपके द्वारा लिखे गए कुछ कोड को ढूंढें और तब से नहीं देखा है। फ़ाइल खोलें और इसे पढ़ने के बिना लगभग आधे रास्ते से नीचे कूदें। देखें। अभी तक आप इस बिंदु से पढ़ सकते हैं इससे पहले कि आप यह नहीं जानते कि क्या कोई सदस्य, पैरामीटर या स्थानीय है। अब किसी अन्य यादृच्छिक स्थान पर जाएं ... यह वह है जो हम सभी दिन भर करते हैं जब हम किसी और के कोड के माध्यम से एकल कदम रखते हैं या यह समझने की कोशिश कर रहा है कि उनके कार्य को कैसे कहा जाए)
'M' उपसर्ग भी (IMHO) बदसूरत और कृमि "इस->" "संकेतन, और उस असंगति से बचता है जो इसकी गारंटी देता है (भले ही आप सावधान रहें कि आप आमतौर पर 'इस-> डेटा' के मिश्रण से समाप्त हो जाएंगे) एक ही कक्षा में 'डेटा', क्योंकि कुछ भी नाम की लगातार वर्तनी को लागू नहीं करता है)।
'इस' संकेतन का उद्देश्य अस्पष्टता को हल करना है - लेकिन कोई जानबूझकर ऐसा कोड क्यों लिखेगा जो अस्पष्ट हो सकता है? अस्पष्टता जल्द या बाद में बग का नेतृत्व करेगी । और कुछ भाषाओं में 'इस' का उपयोग स्थैतिक सदस्यों के लिए नहीं किया जा सकता है, इसलिए आपको 'विशेष मामलों' को अपनी कोडिंग शैली में प्रस्तुत करना होगा। मैं एक एकल सरल कोडिंग नियम रखना पसंद करता हूं जो हर जगह लागू होता है - स्पष्ट, अस्पष्ट और सुसंगत।
अंतिम प्रमुख लाभ इंटेलीसेंस और ऑटो-पूरा करने के साथ है। किसी ईवेंट को खोजने के लिए विंडोज फॉर्म पर इन्टेलिसेन्स का उपयोग करने का प्रयास करें - आपको सैकड़ों रहस्यमयी बेस क्लास तरीकों से स्क्रॉल करना होगा जिन्हें आपको ईवेंट खोजने के लिए कॉल करने की आवश्यकता नहीं होगी। लेकिन अगर हर घटना में "ई" उपसर्ग होता है, तो वे स्वचालित रूप से "ई" के तहत एक समूह में सूचीबद्ध होंगे। इस प्रकार, प्रीफिक्सिंग सदस्यों, कास्ट, ईवेंट आदि को समूह की सूची में शामिल करने के लिए काम करता है, जिससे आप चाहते हैं कि नामों को खोजने में बहुत तेज और आसान हो। (आमतौर पर, एक विधि में लगभग 20-50 मान हो सकते हैं (स्थानीय, परम्स, सदस्य, कास्ट, ईवेंट) जो इसके दायरे में हैं। लेकिन उपसर्ग टाइप करने के बाद (मैं अब एक इंडेक्स का उपयोग करना चाहता हूं, इसलिए मैं टाइप करता हूं i)। .. '), मुझे केवल 2-5 ऑटो-पूर्ण विकल्पों के साथ प्रस्तुत किया गया है।' अतिरिक्त टाइपिंग '
मैं एक आलसी प्रोग्रामर हूं, और उपरोक्त सम्मेलन मुझे बहुत काम बचाता है। मैं तेजी से कोड कर सकता हूं और मैं बहुत कम गलतियां करता हूं क्योंकि मुझे पता है कि हर चर का उपयोग कैसे किया जाना चाहिए।
के खिलाफ तर्क
तो, क्या विपक्ष हैं? उपसर्गों के खिलाफ विशिष्ट तर्क हैं:
"उपसर्ग योजनाएँ बुरी / बुरी हैं" । मैं मानता हूं कि "m_lpsz" और इसके ilk को खराब तरीके से समझा और पूरी तरह से बेकार कर दिया गया है। इसलिए मैं आपकी आवश्यकताओं का समर्थन करने के लिए डिज़ाइन किए गए एक अच्छी तरह से नोटेशन का उपयोग करने की सलाह दूंगा, बजाय इसके कि आपके संदर्भ के लिए कुछ अनुचित हो। (इस काम के लिए सही उपकरण का उपयोग करें)।
"अगर मुझे किसी चीज़ का उपयोग बदलना है तो मुझे उसका नाम बदलना होगा" । हाँ, निश्चित रूप से आप करते हैं, कि क्या सभी के बारे में refactoring है, और क्यों IDEs के पास इस काम को जल्दी और दर्द रहित तरीके से करने के लिए रिफैक्टरिंग उपकरण हैं। उपसर्गों के बिना भी, चर के उपयोग को बदलने का लगभग निश्चित रूप से मतलब है कि इसका नाम बदलना चाहिए ।
"उपसर्ग सिर्फ मुझे भ्रमित करते हैं" । जैसा कि हर उपकरण तब तक करता है जब तक आप इसे इस्तेमाल करना नहीं सीखते। एक बार जब आपका मस्तिष्क नामकरण पैटर्न के लिए उपयोग हो जाता है, तो यह जानकारी को स्वचालित रूप से फ़िल्टर कर देगा और आप वास्तव में यह नहीं सोचेंगे कि उपसर्ग और भी हैं। लेकिन आपको इस योजना का उपयोग एक या दो सप्ताह के लिए ठोस रूप से करना होगा, इससे पहले कि आप वास्तव में "धाराप्रवाह" बनें। और ऐसा तब होता है जब बहुत से लोग पुराने कोड को देखते हैं और आश्चर्यचकित होते हैं कि कैसे वे कभी एक अच्छी उपसर्ग योजना के बिना प्रबंधित हुए ।
"मैं बस इस सामान को बाहर निकालने के लिए कोड को देख सकता हूं" । हां, लेकिन आपको कोड में कहीं और देखने में समय बर्बाद करने की जरूरत नहीं है या इसका हर छोटा-सा विवरण याद रखना होगा, जब जवाब सही हो तो आपकी आंख पहले से ही धब्बेदार हो जाती है।
(कुछ) कि जानकारी मेरे चर पर पॉप अप करने के लिए सिर्फ एक टूलटिप की प्रतीक्षा करके पाया जा सकता है । हाँ। जहां कुछ प्रकार के उपसर्ग के लिए समर्थित है, जब आपका कोड साफ-साफ संकलन करता है, एक प्रतीक्षा के बाद, आप एक विवरण के माध्यम से पढ़ सकते हैं और ऐसी जानकारी प्राप्त कर सकते हैं जो उपसर्ग ने तुरंत बताई होगी। मुझे लगता है कि उपसर्ग एक सरल, अधिक विश्वसनीय और अधिक कुशल दृष्टिकोण है।
"यह अधिक टाइपिंग है" । वास्तव में? एक पूरे चरित्र अधिक? या यह है - आईडीई ऑटो-पूर्ण उपकरणों के साथ, यह अक्सर टाइपिंग कम कर देगा, क्योंकि प्रत्येक उपसर्ग चरित्र खोज स्थान को महत्वपूर्ण रूप से बढ़ाता है। प्रेस "ई" और आपकी कक्षा की तीन घटनाएं अंतर्कलह में पॉप अप होती हैं। प्रेस "सी" और पांच स्थिरांक सूचीबद्ध हैं।
"मैं this->
इसके बजाय उपयोग कर सकता हूं m
" । खैर, हाँ, आप कर सकते हैं। लेकिन यह सिर्फ एक बहुत बदसूरत और अधिक क्रिया उपसर्ग है! केवल यह बहुत अधिक जोखिम (विशेषकर टीमों में) वहन करता है क्योंकि संकलक के लिए यह वैकल्पिक है , और इसलिए इसका उपयोग अक्सर असंगत है। m
दूसरी ओर संक्षिप्त, स्पष्ट, स्पष्ट और वैकल्पिक नहीं है, इसलिए इसका उपयोग करने में गलती करना बहुत कठिन है।