जावा चर और विधि नामों में अंडरस्कोर का उपयोग करना [बंद]


83

आजकल भी मैं अक्सर जावा चर और विधियों में अंडरस्कोर देखता हूं, एक उदाहरण सदस्य चर (जैसे "m_count" या "_count") हैं। जहां तक ​​मुझे याद है, इन मामलों में अंडरस्कोर का उपयोग करना सूर्य द्वारा खराब शैली कहा जाता है।

केवल उनका उपयोग किया जाना चाहिए स्थिरांक में है (जैसे "सार्वजनिक अंतिम स्थिर int IS_OKAY = 1?"), क्योंकि स्थिरांक सभी ऊपरी मामला होना चाहिए और ऊंट का मामला नहीं होना चाहिए। यहां, अंडरस्कोर को कोड को अधिक पठनीय बनाना चाहिए।

क्या आपको लगता है कि जावा में अंडरस्कोर का उपयोग करना खराब शैली है? यदि ऐसा है (या नहीं), क्यों?

जवाबों:


146

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

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


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

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

1
यह इस तरह नामकरण इंटरफेस की तरह है: ReadableInterface- बिल्कुल बेमानी। आधुनिक आईडीई में आपको किसी प्रकार के चर या उसकी सीमा को निर्दिष्ट करने की आवश्यकता नहीं है - रंग और त्वरित कूद आपके लिए सभी काम करता है। तो IMO यह एक खराब शैली है क्योंकि आप अनावश्यक अक्षर टाइप करते हैं और लोगों को इसे पढ़ने / इसे बनाए रखने के लिए मजबूर करते हैं।
कीडायस्कॉट्स

120
sunDoesNotRecommendUnderscoresBecauseJavaVariableAndFunctionNamesTendToBeLongEnoughAsItIs ();

as_others_have_said_consistency_is_the_important_thing_here_so_chose_whatever_you_think_is_more_readable ();

यह प्रश्न कि सम्मलेन के बारे में सुसंगति के नियम स्पष्ट रूप से सुसंगतता के लिए उत्तर देने के लिए हैं, लेकिन सवाल पूछने के दौरान मैंने जो सोचा था वह नहीं। वैसे भी, कई बार आपको पुराने निशान छोड़ने चाहिए, एह?
जॉर्जी

2
यदि एक "परस्पर विरोधी" नामकरण सम्मेलन पहले से ही उपयोग में है, तो मुझे लगता है कि यह इस बात पर निर्भर करता है कि हम कितने कोड के बारे में बात कर रहे हैं। मैं कोड की हज़ारों पंक्तियों को फिर से लिखने की सिफारिश नहीं करूंगा, क्योंकि पुराने कन्वेंशन का उपयोग लगातार किया जाता है।
एंडर्स सैंडविग

जबरदस्त हंसी! यह कहा जा रहा है, जब कोड उन संपादकों में चिपकाया जाता है जिनमें वर्तनी जाँच होती है, तो 'गलत वर्तनी वाले' शब्दों को रेखांकित किया जाता है, जिससे अंडरस्कोर अस्पष्ट हो जाता है। अंडरस्कोर का इस्तेमाल न करने का यह एक अच्छा कारण है। इसके अलावा, कैमल मामला छोटा है। अंत में, ऊपरी पंक्ति की तुलना में अक्षरों पर शिफ्ट कुंजी का उपयोग करना आसान है (यानी शिफ्ट डैश - ')।
तिहामर

@ तीमर अन्य लोग यह तर्क देंगे कि snake_caseफॉर्म को पढ़ना आसान है। विशेष रूप से छोटे शब्दों (1-2 अक्षर) के साथ, मैं निश्चित रूप से तर्क दूंगा कि यह मामला है। "टाइप करने के लिए कठिन" के रूप में, lotOfMixedCaseWithinIt के साथ एक शब्द टाइप करना बिल्कुल भी सुविधाजनक नहीं है। मैं वकालत करूँगा कि यह आप के लिए उपयोग की जाने वाली बात है। जावा में, मैं कहता हूं कि "सामान्य रूप का उपयोग करें" जेएलएस / आदि द्वारा अनुशंसित है। रूबी / पायथन / सी में, साँप के मामले का उपयोग करें। और इसी तरह ...
प्रति लुंडबर्ग

37

नियम:

  1. वह कोड जो आप संपादित कर रहे हैं वह करें
  2. यदि # 1 लागू नहीं होता है, तो camelCase का उपयोग करें, कोई अंडरस्कोर नहीं

31

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

आप उपयोगकर्ताओं को "यह" के साथ इंस्टेंस चर को प्रीपेन्ड करने के लिए मजबूर करके भी इसे प्राप्त कर सकते हैं, लेकिन मुझे यह सुस्त ड्रेकोनियन लगता है। कई मायनों में यह DRY का उल्लंघन करता है क्योंकि यह एक उदाहरण चर है, दो बार इसे क्यों योग्य है।

मेरी अपनी व्यक्तिगत शैली _ के बजाय m_ का उपयोग करना है। इसका कारण यह है कि वैश्विक और स्थिर चर भी हैं। M _ / _ का फायदा यह है कि यह एक वैरिएबल स्कोप को अलग करता है। इसलिए आप वैश्विक या स्थिर के लिए _ का पुन: उपयोग नहीं कर सकते हैं और इसके बजाय मैं क्रमशः g_ और s_ चुनता हूं।


1
यह प्रश्न जावा अंडरस्कोर के बारे में सामान्य रूप से पूछने के बारे में था, न कि केवल सदस्य चर पर उनसे पूछने के बारे में (हालांकि यह प्रश्न में एक उदाहरण था)।
जॉर्जी

10
तो आप मुझे सवाल के एक सबसेट पर टिप्पणी करने के लिए नीचे चिह्नित करते हैं? थोड़ा अतिवादी लगता है
JaredPar

1
@JaredPar - आप केवल एक ही हैं जो एक अच्छा वैकल्पिक स्टाइल सुझाव देते हैं। उसके लिए +1।
djangofan

यह लिखना। Foo (या C- ++ में यह- foo) शायद स्थानीय और क्षेत्र / सदस्य चर को अलग करने का एक बहुत ही स्पष्ट तरीका होगा।
केविन

7

"बुरी शैली" बहुत व्यक्तिपरक है। यदि आपके और आपकी टीम के लिए एक निश्चित परंपराएं काम करती हैं, तो मुझे लगता है कि यह एक बुरी / अच्छी शैली होगी।

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

(मैं लगभग "इस" का उपयोग कभी नहीं करता, हालांकि नाम के टकराव को रोकने के लिए।)


जैसा आपने कहा, शैली बहुत व्यक्तिपरक है। thisयदि मुझे लगता है कि इसके बारे में ध्यान आकर्षित करने की आवश्यकता है, तो मैं एक सदस्य चर को इंगित करने के लिए काफी उदारतापूर्वक उपयोग करता हूं। हालाँकि, मैं इसके बारे में एक जोनल नहीं हूँ।
क्रिस कूडम

6

एक चर के सामने 'm_' या '_' का उपयोग करने से किसी ऑब्जेक्ट में विधियों में सदस्य चर को स्पॉट करना आसान हो जाता है।

साइड लाभ के रूप में 'm_' या '_' टाइप करने से इन्टेलसेंस पॉप अप हो जाएगा;)


5
यदि आप जावा प्रोग्रामिंग कर रहे हैं, तो सबसे अधिक संभावना है कि आपके पास एक आईडीई होगा जो आपके सदस्य चर को एक अलग रंग में रंग देगा। "m_" सिर्फ बुरा है।
JeeBee

मैं "इसके" को पसंद करता हूं क्योंकि यह अच्छी तरह से पढ़ता है:if (itsEmail.equals(email))
davetron5000

7
यह मेरे लिए ज़्यादा प्रधान है। सदस्य नामों के लिए। बिलकुल अचूक।
एस.लॉट

5
  • मैं (निजी) उदाहरण चर के लिए अग्रणी अंडरस्कोर पसंद करना पसंद करता हूं, यह पढ़ना और अंतर करना आसान लगता है। बेशक यह बात आपको किनारे के मामलों में परेशान कर सकती है (उदाहरण के लिए सार्वजनिक उदाहरण चर (आम नहीं, मुझे पता है) - या तो आप का नाम आप यकीनन आपके नामकरण सम्मेलन को तोड़ रहे हैं:
  • private int _my_int; public int myInt;? _my_int? )

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

अनधिकृत कोड पीढ़ी (उदाहरण के लिए ग्रहण उत्पन्न करने वाले, बसने वाले) को यह समझने की संभावना नहीं है, इसलिए आपको इसे पहचानने के लिए पर्याप्त ग्रहण के साथ हाथ से या फिर इसे ठीक करना होगा।

अंतत:, आप दुनिया के बाकी (जावा) प्रीफों के खिलाफ जा रहे हैं और इससे कुछ परेशानियां होने की संभावना है। और जैसा कि पिछले पोस्टरों ने उल्लेख किया है, कोडबेस में निरंतरता उपरोक्त सभी मुद्दों को ट्रम्प करती है।


3
अपने उपसर्ग (या प्रत्यय) वरीयताओं को समझने के लिए ग्रहण की स्थापना करना बहुत सीधा है। में वरीयताएँ-> जावा> संहिता शैली एक मेज जहां खेतों, स्थिर क्षेत्रों, स्थिर अंतिम खेतों, मापदंडों और स्थानीय चर के लिए चर नाम सम्मेलनों सेट कर सकते हैं नहीं है। सभी कोड जनरेटर इन सेटिंग्स का सम्मान करते दिखाई देते हैं।
मेटासिम

5

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


यही कारण है कि OCaml पुरानी मशीनों पर कभी नहीं चलेगा।
डेविड टोनहोफर

4

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


4

यहां जावा के लिए सूर्य की सिफारिशों का लिंक दिया गया है। ऐसा नहीं है कि आपको इनका उपयोग करना है या यहां तक ​​कि उनका पुस्तकालय कोड इन सभी का अनुसरण करता है, लेकिन अगर आप खरोंच से जा रहे हैं तो यह एक अच्छी शुरुआत है। एक्लिप्स जैसे टूल ने फॉर्मेटर्स और क्लीनअप टूल्स में निर्मित किया है जो आपको इन सम्मेलनों (या अन्य जिन्हें आप परिभाषित करते हैं) के अनुरूप बनाने में मदद कर सकते हैं।

मेरे लिए, '_' टाइप करना बहुत कठिन है :)


3

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

setBar( int bar)
{
   _bar = bar;
}

के बजाय

setBar( int bar)
{
   this.bar = bar;
}

अन्य एक अस्थायी स्थानीय चर को इंगित करने के लिए अंडरस्कोर का उपयोग करेंगे जो विधि कॉल के अंत में दायरे से बाहर हो जाएगा। (मुझे यह बहुत बेकार लगता है - एक अच्छी विधि इतनी लंबी नहीं होनी चाहिए, और घोषणा सही है! इसलिए मुझे पता है कि यह दायरे से बाहर हो जाता है) संपादित करें: भगवान इस स्कूल से एक प्रोग्रामर और सदस्य से एक प्रोग्रामर का सहयोग करें! ! यह नरक होगा।

कभी-कभी, उत्पन्न कोड _ या __ के साथ चर पेश करेगा। यह विचार कि कोई भी इंसान कभी ऐसा नहीं करेगा, इसलिए यह सुरक्षित है।


आपके मामले में मैं निम्नलिखित का उपयोग करता हूं: setBar (int aBar) {बार = aBar; } पठनीय, इसके बिना। या _बार ...
जॉर्जी

यह काफी उचित है, लेकिन फिर aBar एपीआई में विधि हस्ताक्षर में दिखाता है, और मुझे लगता है कि यह गड़बड़ लग रहा है।
क्रिस कुडमोर सेप

1
मैं वास्तव में एक ऐसे मामले में भाग गया, जहां ऑटोगेनेरेटेड कोड भाषा के किसी एक कीवर्ड से मेल खाता था, इसलिए इससे बचने का सबसे अच्छा तरीका शुरुआत में एक _ को रोकना था।
जो प्लांट

2

मुझे लगता है कि कोई भी शैली जो किसी भाषा की अपनी शैली के दिशानिर्देशों को तोड़ती है (बिना किसी कारण के) बदसूरत है और इसलिए "बुरा" है।

इसमें कोई संदेह नहीं है कि आपके द्वारा देखा गया कोड किसी ऐसे व्यक्ति द्वारा लिखा गया था जो उस भाषा पर काम करता था जहां अंडरस्कोर स्वीकार्य थे।

कुछ लोग बस नई कोडिंग शैलियों के अनुकूल नहीं हो सकते ...


मैं ज्यादातर कोडिंग करते समय "अन्य के रूप में करते हैं" दर्शन से सहमत हूं, लेकिन एक निरपेक्ष के रूप में नहीं। मुझे लगता है कि एक बहुत ही मजबूत तर्क है, जिसे उचित पहचानकर्ता लंबाई दी गई है, जो कि Snake_cased_variables CamelCasedVariables की तुलना में पढ़ना आसान है। मेरा औचित्य यह है कि संज्ञानात्मक भार को कम करना एक छोटी सी बात है, लेकिन फिर भी उपयोगी है। लोग कोड में सफेद स्थान की सराहना करते हैं, जब दस्तावेज़ पढ़ते हैं, और संगीत सुनते हैं। मुझे लगता है कि ऊंट का मामला, 'दक्षता' के नाम पर श्वेत स्थान का एक टकराव है। दक्षता किसके लिए?
डेविड जे।

2

लोग ऐसा करते हैं (मेरे अनुभव में) सदस्य चर और फ़ंक्शन मापदंडों के बीच अंतर करना है। जावा में आपके पास इस तरह एक वर्ग हो सकता है:

public class TestClass {
  int var1;

  public void func1(int var1) {
     System.out.println("Which one is it?: " + var1);
  }
}

यदि आपने सदस्य को _var1 या m_var1 बनाया है, तो आपको फ़ंक्शन में अस्पष्टता नहीं होगी।

तो यह एक शैली है, और मैं इसे बुरा नहीं कहूंगा।


इस परिदृश्य में मैं आमतौर पर "aVar1" के रूप में पैरामीटर का नाम बदल देता हूं। इसके विपरीत "var1" के साथ।
लुलिस मार्टिनेज

1

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

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

नोट: मैं सी / सी ++ से अपनी पुरानी आदतों को रखने वालों में से हूं, जो सदस्य चर (और स्थिर लोगों के लिए s_) के साथ m_ उपसर्गों के साथ जावा को कोडित कर रहा है, प्रारंभिक नामों के साथ बूलियन को उपसर्ग कर रहा है, फ़ंक्शन नामों के लिए एक प्रारंभिक अपरकेस अक्षर का उपयोग कर रहा है और ब्रेसिंग संरेखित कर रहा है। .. जावा कट्टरपंथियों के लिए आतंक! ;-)
मजेदार बात यह है कि जहां मैं काम करता हूं वहां कन्वेंशनों का उपयोग किया जाता है ... शायद इसलिए कि मुख्य प्रारंभिक डेवलपर एमएफसी दुनिया से आता है! :-D


0

यह सिर्फ आपकी अपनी शैली है, कुछ भी बुरा स्टाइल कोड नहीं है, और कुछ भी अच्छा स्टाइल कोड नहीं है, बस दूसरों के साथ हमारे कोड में अंतर है।

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