क्या एकल अंडरस्कोर के साथ अप्रयुक्त चर का नाम देना बुरा है?


44

अक्सर जब भाषा के वाक्यविन्यास के लिए मुझे एक चर का नाम देना पड़ता है जिसका उपयोग कभी नहीं किया जाता है, तो मैं इसका नाम लूंगा _

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

जहाँ मैं ऐसा करता हूँ, उसका एक सामान्य उदाहरण SQL में उप-श्रेणियों का नामकरण है।

SELECT *
FROM
(
    SELECT *
    FROM TableA
    JOIN TableB
        ON TableA.ColumnB = TableB.ColumnB
    WHERE [ColumnA] > 10
) _ --This name is required, but never used here
ORDER BY ColumnC

एक अन्य उदाहरण एक लूप चर है जिसका उपयोग नहीं किया गया है।

array = [[] for _ in range(n)] # Defines a list of n empty lists in Python

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

मेरे सहकर्मी असहमत हैं। वे कहते हैं कि एकल (वर्णिका) वर्ण का नाम होने से भी बेहतर है _

क्या मै गलत हु? क्या ऐसा करना बुरा है?


4
मुझे लगता है कि चर नामों को सूचना सिद्धांत का पालन करना चाहिए, यानी लंबाई उनके उपयोग की लॉग पारस्परिक संभावना है (सामान्य चर के छोटे नाम हैं)। एक एकल वर्णमाला पत्र जाने के लिए गलत तरीके की तरह लगता है।
dan_waterworth

2
@dan_waterworth टेबल अलायसेस के रूप में एकल या दोहरे वर्णों का उपयोग SQL स्क्रिप्ट में एक बहुत ही सामान्य अभ्यास है। चूँकि आपको आम तौर पर बहुत सारे [table].[column]पहचानकर्ता लिखना होता है , यह सिर्फ उपयोग करने के लिए पठनीयता में मदद करता है [T].[column]। यह पाठ्यक्रम की पटकथा पर निर्भर करता है। उस तरह का एक छोटा सा चयन पूरी तरह से ठीक है, लेकिन अगर एक स्क्रिप्ट बहुत बड़ी थी, तो मैं अधिक वर्णनात्मक नामों का उपयोग कर सकता हूं।
कोडेक्सअर्बनम

5
मैं बल्कि आप "डमी" का इस्तेमाल करेंगे। यह मुझे चिल्लाता है कि वे वहां हैं क्योंकि भाषा को एक चर की आवश्यकता होती है जिसका इन कुछ पंक्तियों के बाहर कोई शब्दार्थ नहीं है। _ एक मानव के लिए अच्छी तरह से पढ़ा नहीं है। (एक कारण जो मुझे पर्टल से नफरत है - मैं इसे टाइप नहीं कर सकता या इसे नहीं पढ़ सकता)
क्रिस कूडमोर

1
साइड नोट: आप जो नाम दे रहे हैं वह एक व्युत्पन्न तालिका है , एक उपश्रेणी नहीं।
निक चामास

2
C # में var कीवर्ड का यह अर्थ नहीं है, यह केवल एक सामान्य परिवर्तनीय घोषणा है जहां प्रकार का अनुमान लगाया गया है।
फ्रांसेस्को डी विटोरी

जवाबों:


60

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


13
+1। dummyअच्छा joined_abहोगा , बेहतर होगा।
ब्लरफ्ल

5
+1, एक सम्मेलन है जहां मैं अप्रयुक्त चर के लिए '_' का उपयोग करने के लिए काम करता हूं। मुझे लगता है कि यह एक अच्छा सम्मेलन है, लेकिन मैं ओपी के मामले के इस जवाब से सहमत हूं। आदर्श रूप से कोडबेस को देखना चाहिए जैसे कि वे किसी एक व्यक्ति द्वारा लिखे गए थे।
dan_waterworth

20
"_" पायथन के साथ एक प्रसिद्ध मानक है।
नील जी

2
यदि आपकी कंपनी किसी भी पर्ल का उपयोग करती है, तो दूसरी तरफ $ _ का उपयोग करना कभी-कभी आश्चर्यजनक व्यवहार का कारण बन सकता है।
प्लूटोर

2
प्रोलॉग में, एक अंडरस्कोर इंगित करता है कि चर अनाम होगा और अप्रयुक्त है।
इवान

44

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

कई भाषाओं (हास्केल, लुआ, और डीआई को लगता है कि मेरे सिर के ऊपर से) भी एक सम्मेलन की पेशकश करते हैं जहां एक अंडरस्कोर के साथ अगुवाई करने वाले चर "अप्रयुक्त स्थानीय चर" के बारे में संकलक चेतावनी उत्पन्न नहीं करते हैं जो _सबसे छोटा अप्रयुक्त चर नाम बनाता है। आप कुछ का उपयोग कर सकते हैं _unusedलेकिन मैं आपसे सहमत हूं कि यह सिर्फ अव्यवस्था बनाता है।


SQL के विशिष्ट मामले में, मैंने इस पर विचार किया है और सहकर्मी यहां सही हो सकते हैं। मैं आमतौर पर टेबल उपनामों के लिए एक एकल पूंजी पत्र का उपयोग करता हूं (और अक्सर उप-परीक्षाओं के लिए R (esults))। मुझे लगता है कि *चयन में उपयोग करना बहुत बुरी बात है, क्योंकि यदि तालिका आपके परिणाम-परिवर्तन को अप्रत्याशित रूप से अच्छी तरह से बदल देती है। इसलिए मुझे आमतौर पर उन कॉलमों की पहचान करने के लिए एकल चरित्र उपनाम की आवश्यकता होगी जो मैं चुन रहा हूं। यदि आप उपयोग करना बंद कर देते हैं *, तो आपको "अप्रयुक्त" नाम की आवश्यकता बंद हो जाती है।
कोडेक्सअर्नम

11
सख्ती से, कम से कम हास्केल में, _एक पैटर्न है, एक चर नहीं है। यह एक सूक्ष्म अंतर है, लेकिन इसका मतलब है कि आप इसे कई बार किसी चीज़ में उपयोग कर सकते हैं (x, _, _) = ..., जबकि एक ही चर को कई बार बाँधने का प्रयास एक त्रुटि होगी।
हमार

12

अजगर _में निश्चित रूप से स्वीकार्य है। हालांकि यह gettextउर्फ के साथ संघर्ष कर सकता है _()

अन्य आम सम्मेलनों हैं dummy, unused; अकेले या उपसर्ग के रूप में।

कुछ कोड विश्लेषण उपकरण इन सम्मेलनों के बारे में जानते हैं और अप्रयुक्त चर चेतावनी जारी नहीं करेंगे:

  • PyLint के लिए _याdummy
  • PyDev के साथ शुरू होने वाले किसी भी चर के लिए _, unusedयाdummy

2
इसके अलावा, _अजगर में डमी वैरिएबल का उपयोग करने _पर अंतिम रिटर्न वैल्यू के साथ टकराव होगा । जैसे, दुभाषिया में, यदि आप 5*5पंक्ति 1 पर करते हैं ; फिर लाइन 2 पर _मान होगा 25। हालाँकि यदि आप फिर सेट करते हैं x,_ = (3,'not used'), तो आप पाएंगे कि _अब not usedतक अंतिम रिटर्न वैल्यू के बजाय अब तक है del _। आपको शायद _वास्तविक कोड में अंतिम लौटे मूल्य के लिए उपयोग नहीं करना चाहिए ; लेकिन इसकी अक्सर दुभाषिया में काम जब नए सामान की कोशिश कर रहा है।
दि जिंबोब

4
खैर, _जैसा कि अंतिम रिटर्न वैल्यू केवल इंटरेक्टिव शेल में काम करता है ।
वार्टेक

वही लुआ के लिए जाता है। _ का उपयोग करना मानक अभ्यास है
सिल्वानार

11

यह पारिस्थितिक तंत्र पर निर्भर करता है कि यह कोड किस में रहने वाला है। यदि _"डमी चर" / "अप्रयुक्त आउटपुट" को इंगित करने के लिए एक स्वीकृत मानक है, तो सभी तरीकों से, इसके साथ छड़ी करें। यदि यह नहीं है, तो पता करें कि क्या है और इसका उपयोग करें।

कुछ प्रोग्रामिंग भाषाओं (जैसे हास्केल) में भी यह 'विशेष' पहचानकर्ता है जो आपके द्वारा उल्लिखित उद्देश्यों के लिए उनके सिंटैक्स में बनाया गया है।


5

सावधान, _ पहले से ही कुछ भाषाओं में आंतरिक अर्थ है

पायथन में:

9.6। निजी चर और वर्ग-स्थानीय संदर्भ

यहाँ लिंक विवरण दर्ज करें "निजी" उदाहरण चर जिसे किसी ऑब्जेक्ट के अंदर से छोड़कर नहीं पहुँचा जा सकता है, पायथन में मौजूद नहीं है। हालांकि, एक सम्मेलन है जो अधिकांश पायथन कोड के बाद होता है: एक अंडरस्कोर (जैसे _spam) के साथ उपसर्गित नाम को एपीआई के गैर-सार्वजनिक हिस्से के रूप में माना जाना चाहिए (चाहे वह एक फ़ंक्शन, एक विधि या डेटा सदस्य हो) । इसे बिना किसी नोटिस के कार्यान्वयन का विवरण और परिवर्तन के अधीन माना जाना चाहिए।

PEP 8 (पायथन कोड के लिए स्टाइल गाइड) में एक और उल्लेख भी है:

वर्णनात्मक: नामकरण शैलियाँ

_single_leading_underscore: कमजोर "आंतरिक उपयोग" सूचक। जैसे M आयात * उन वस्तुओं को आयात नहीं करता है जिनका नाम अंडरस्कोर से शुरू होता है।

C # में:

यह आमतौर पर उन निजी चरों को चिह्नित करने के लिए उपयोग किया जाता है जिनमें सार्वजनिक / आंतरिक गुण होते हैं। लेकिन आम तौर पर इन दिनों इस प्रथा को देखा जाता है

जावास्क्रिप्ट में:

अंडरस्कोर।जज नामक एक पुस्तकालय है जो गैर-मानक प्रोटोटाइप एक्सटेंशन के लिए उपसर्ग के रूप में अंडरस्कोर का उपयोग करता है।

उदाहरण:

var object = { some:'stuff' };
var newObject = _.clone(object);

जो मुझे अपनी बात पर ले जाता है। क्लासिक प्लेसहोल्डर चर सम्मेलनों में क्या गलत है।

var i, j, k, l; // iterator placeholders
var x, y, z, xx, yy, zz // value placeholders
var foo, bar, bas, fixx, buzz, qux, etc... // demonstration placeholders

कस्टम कन्वेंशन का उपयोग क्यों करें जो पहले से उपलब्ध सामान्य सम्मेलनों के बहुत सारे होने पर गलत व्याख्या कर सकते हैं?


स्काला में: यह वाइल्डकार्ड / प्लेसहोल्डर प्रतीक है, लेकिन एक प्लेसहोल्डर के रूप में आप केवल एक बार इसका उल्लेख कर सकते हैं ।
रेक्स केर

@RexKerr दिलचस्प। यदि आप चाहते हैं कि उत्तर में इसे संपादित करने के लिए स्वतंत्र महसूस करें। मैं लेकिन मैं स्कैला से परिचित नहीं हूँ।
इवान प्लाइस

एक टिप्पणी करनी चाहिए। स्काला का उपयोग करने वाला कोई भी व्यक्ति जानता होगा, और स्काला का उपयोग नहीं करने वाला कोई भी व्यक्ति कुछ करने / न करने के अपने कारणों की सूची में शीर्ष पर स्काला संगतता नहीं होगा।
रेक्स केर

मुझे लगता है कि अप्रयुक्त चर के लिए उन "सम्मेलन" प्लेसहोल्डर्स में से एक का उपयोग करना एक बुरा अभ्यास होगा क्योंकि यह मुझे लगता है कि, पहले, "क्यों इस आदमी ने इस बात को बेहतर नाम नहीं दिया ??" और थोड़ी देर बाद मुझे पता चलता है क्योंकि चर का उपयोग नहीं किया गया है।
igorsantos07

@ igorsantos07 मैं पूरी तरह से सहमत हूं। मेरी प्राथमिकता अस्थायी वर्णमाला के लिए भी एक वर्णनात्मक नाम देना होगा। इस उत्तर का बिंदु यह प्रदर्शित करना है कि नामकरण सम्मेलन के लिए अंडरस्कोर एक अच्छा विकल्प क्यों नहीं है; कई भाषाओं में इसके अजीब अर्थ के कारण।
इवान प्लाइस

2

मैं उस तरह की चीज़ के लिए "डमी" का उपयोग करता हूं। या "बकवास", अगर मैं अभी कुछ परीक्षण कर रहा हूं :) अपने चर का नाम बताएं कि वे क्या हैं। यदि वे डमी, अप्रयुक्त चर हैं, तो उन्हें इस तरह नाम दें।


0

मुझे लगता है कि यह बुरा अभ्यास है क्योंकि

  • आपके पास अपने कोड में अदृश्य चर नहीं होना चाहिए। अगर आपको लगता है कि आपको इस कारण पर चर्चा करनी चाहिए।

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

(मैं अजगर नहीं जानता: क्या यह निर्माण वास्तव में आवश्यक है?)


2
यदि आप इसका उपयोग कई रिटर्न को छानने के लिए करते हैं, तो इसका परिणाम केवल डमी फ़ंक्शन के तर्कों के लिए भी है। वास्तव में, दोनों के बीच बहुत अंतर नहीं है: पैटर्न-मिलान कार्यात्मक भाषाओं में, आप let (a,b,_) = f(x,y,z)बस let f(x,y,_) = (g(x),h(x),g(y))या तो लिख सकते हैं , या जो भी हो। - और, हाँ, यह अक्सर डमी मापदंडों के लिए उपयोगी होता है: एक फ़ंक्शन की एकमात्र परिभाषा के रूप में नहीं, बल्कि एक पॉलीमॉर्फिक फ़ंक्शन के लिए या वैकल्पिक पैटर्न-मिलान परिभाषाओं के साथ यह अक्सर ऐसा करना स्वाभाविक बात है।
लेफ्टनैबाउट

1
आपका दूसरा बिंदु आपके मुख्य बिंदु का विरोध करता है: गो में, इसका अनिवार्य रूप से मतलब है कि "मेरे पास इस मूल्य के लिए कोई उपयोग नहीं है"।
केसी कुबैल

0

यह वाक्यात्मक रूप से मान्य हो सकता है, और यह एक मानक के हिस्से के रूप में ठीक हो सकता है।

उस के साथ, यह कुछ ऐसा है जिसे मैं किसी कोड समीक्षा में बदलने के लिए कहूंगा। मैं इसे कभी भी कोडिंग मानक में नहीं डालूंगा, और इसे मौजूदा से हटाने की कोशिश करूंगा। यह सिर्फ पढ़ना अधिक कठिन है, और सुपर अर्थपूर्ण नहीं है।


0

मुझे लगता है कि यह गलत है क्योंकि:

1) यह देखने के लिए कठिन है क्योंकि कई पिक्सेल नहीं हैं।

2) यदि एक से अधिक हैं _, तो आप कैसे जानते हैं कि कौन सा है? - या कि एक नए डेवलपर ने 'नियमों का पालन किया है' और अपने उपयोग को बहुत ही स्थानीय दायरे में रखा है?

3) यह एक अभ्यास है जो मददगार नहीं है। एकल अक्षर चर नामों का उपयोग करना इतना पुराना स्कूल है (अर्थात मेरी मूल शिक्षा!)। मैं उन्हें देखूंगा ... और फिर देखूंगा कि कोड क्या करता है और आज की दुनिया में यह एक बुरा अभ्यास है। मैं लंबे समय तक चर नाम का उपयोग जितना संभव हो उतना सभी के लिए करता हूं, भले ही कोड के साथ प्रोग्रामिंग स्तर या परिचित होने के बावजूद यह अंग्रेजी में लगभग "इसे पढ़ें" हो। 1 अक्षर नामों का उपयोग पुराने कोड के साथ और पुराने प्रोग्रामर (फिर से, मुझे शामिल करता है) के साथ एक अत्यंत सामान्य अभ्यास है, लेकिन यह ठीक नहीं है।


9
"आप कैसे जानते हैं कि कौन सा" आप नहीं : यह वास्तव में बात है, आप चर का उपयोग नहीं करते हैं। तो यह भी कोई फर्क नहीं पड़ता कि _क्या पहले से ही एक बाहरी दायरे में उपयोग किया जाता है; फिर एक को छायांकित किया जाएगा (या आपकी भाषा ऐसे मामलों में जो भी करती है), लेकिन उनमें से कोई भी वास्तव में वैसे भी उपयोग नहीं किया जाता है।
लेफ्टरनैबाउट

0

नाम स्थान टकराव से बचने के लिए, और डिबगिंग की अनुमति दें, यदि वैरिएबल नाम आपका एकमात्र सुराग है, तो इसे "join_ab_unused" कहना बेहतर हो सकता है।

बिरफ्ले से प्रेरित।


0

हाँ, यह दो कारणों से एक बुरा अभ्यास है:

  1. अंडरस्कोर के साथ अप्रयुक्त चर को उपसर्ग करना एक व्यापक रूप से स्वीकृत मानक नहीं है। यह संभवतः "बिन बुलाए" को अनदेखा किया जाएगा।
  2. मैंने कुछ लोगों को एक अंडरस्कोर के साथ निजी सदस्य चर उपसर्ग देखा है , और आपका मानक ऐसे लोगों को बहुत भ्रमित करेगा ।

0

आप जो करने की कोशिश कर रहे हैं वह एसक्यूएल के एक अच्छे संस्करण में कोड करना है जो आपको बेकार के लिए एक नाम का आविष्कार करने के लिए मजबूर करने का मुद्दा नहीं है।

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

लेकिन आप एक अलग भाषा में नहीं हैं, और आप जो कर रहे हैं वह भाषा का विस्तार करने का एक अच्छा तरीका नहीं है।


0

यह भाषा पर निर्भर करता है। में जावा , हाँ यह बुरा है और अपने कोड में जोड़ने के लिए एक खतरनाक प्रवृत्ति हो सकता है, मुख्यतः क्योंकि उपकरण है कि उपयोग प्रतिबिंब अंडरस्कोर बहुत अच्छी तरह से संभाल नहीं है, क्योंकि वे जावा चर नामकरण सम्मेलनों के बाहर हैं। में अजगर , यह भी बुरा नहीं बल्कि बुरा रूप है। में clojure , इसकी 100% ठीक है, और वास्तव में, अपनी मुहावरेदार _ जगह धारकों के रूप में की एक लेट बयान में उपयोग करने के लिए।

याद रखें कि प्रत्येक भाषा का अपना पूरा वाक्यविन्यास और मुहावरों का समूह होता है, इसलिए आपको इन मुहावरों के संदर्भ में अच्छे / बुरे का मूल्यांकन करना होगा, न कि निरपेक्ष शब्दों में।


5
मैं असहमत हूं कि यह अजगर में बुरा व्यवहार है। यह एक व्यापक रूप से समझा जाने वाला सम्मेलन है
डेनिथ

0

यह पर्ल में खराब होगा, जो एक विशेष चर के रूप में $ _ (और कभी-कभी _) का उपयोग करता है।

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


0

मैं vars की शुरुआत में अंडरस्कोर से बचूंगा जब तक कि आप निश्चित नहीं थे कि वे किसी दिए गए भाषा या भारी उपयोग में कुछ और इंगित नहीं करते हैं। उदाहरण के लिए, पायथन में, एक डबल अंडरस्कोर मैजिक वर् को इंगित करता है। JQuery और अन्य JS पुस्तकालयों में एक एकल अंडरस्कोर नेमस्पेस ओवरराइट्स के लिए फ़ॉलबैक संस्करण को इंगित करता है। यह उन फ़ाइलों के लिए एक लोकप्रिय नामकरण सम्मेलन भी है, जो बारी-बारी से कोड को ले जाने की प्रवृत्ति रखते हैं जो कि हैंडल के रूप में शामिल हैं।

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