यह ठीक है अगर मैं जावा में घुंघराले ब्रेसिज़ को छोड़ देता हूं? [बन्द है]


83

मैंने इसके लिए खोज की है, लेकिन एक उत्तर नहीं मिला और जिस कारण से मुझे प्रोफेसर से पूछने में बहुत शर्म आई, उस भावना के कारण जब सैकड़ों लोग आपको घूरते हैं ...

किसी भी तरह, मेरा सवाल है कि कोष्ठक होने का क्या महत्व है? अगर मैं उन्हें छोड़ दूं तो क्या यह ठीक है? उदाहरण:

for (int i = 0; i < size; i++)  {
   a += b;
}

बनाम

for (int i = 0; i < size; i++)
   a += b;

मुझे पता है कि वे दोनों काम करेंगे, लेकिन अगर मैं कोष्ठक को छोड़ देता हूं (जो मैं दृश्यता के कारण बहुत कुछ करता हूं) तो क्या वह कुछ भी, कुछ भी बदल देगा? जैसा कि मैंने कहा, मुझे पता है कि यह काम करता है, मैंने इसे दर्जनों बार परीक्षण किया, लेकिन अब मेरे कुछ यूनी असाइनमेंट बड़े हो रहे हैं, और किसी कारण से मुझे तर्कहीन डर है कि लंबे समय में, यह मेरी कुछ समस्याओं का कारण है? क्या डरने का कोई कारण है?


मैं हमेशा पठनीयता के लिए एक कोड फॉर्मेटर का उपयोग करता हूं क्योंकि यह भ्रम के कई संभावित कारणों को हल करता है। यह
19-13 पर

जवाबों:


146

यह आपके कोड की स्थिरता के अलावा कुछ भी नहीं बदलेगा । मैंने इस तरह कोड देखा है:

for (int i = 0; i < size; i++)
   a += b;
   System.out.println("foo");

जिसका अर्थ है:

for (int i = 0; i < size; i++)
   a += b;
System.out.println("foo");

... लेकिन जो यह होना चाहिए था:

for (int i = 0; i < size; i++) {
   a += b;
   System.out.println("foo");
}

व्यक्तिगत रूप से मैं हमेशा कोड को पढ़ने या संशोधित करते समय भ्रम की संभावना को कम करने के लिए शामिल करता हूं ।

मैंने जिस कंपनी के लिए काम किया है, उस पर हर बार कोडिंग कन्वेंशन की आवश्यकता होती है - जो यह कहना नहीं है कि कुछ अन्य कंपनियों में अलग-अलग कॉन्वेंट नहीं हैं ...

और बस अगर आपको लगता है कि इससे कोई फर्क नहीं पड़ेगा: मुझे एक बार एक बग ठीक करना था जो ऊपर दिए गए कोड के बराबर था। यह स्पष्ट रूप से कठिन था ... (जाहिर है यह साल पहले था, इससे पहले कि मैं यूनिट परीक्षण शुरू करूं, जो कोई संदेह नहीं है कि निदान करना आसान हो जाएगा)।


12
@ देवकरण: तो आप इस मुद्दे से अवगत हैं, लेकिन आप यह मान रहे हैं कि यह आपको कभी नहीं काटेगा? और यह कि आपके कोड को पढ़ने वाले सभी को पता होगा कि क्या उम्मीद करनी है? मैं सिर्फ इतना कह रहा हूं - एक कारण है कि मैंने जिन कोडिंग सम्मेलनों में काम किया है, उनकी आवश्यकता है :)
जॉन स्कीट

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

13
जॉन हेपेट को छोड़कर @vedran अच्छा रूपक कोई छलावा नहीं है, वह मुख्य कमांडर है :-)
stivlo

5
@stivlo ओह मुझे यकीन है कि उनकी कृपा से नाबालिग अवज्ञा को माफ किया जाएगा;) व्यक्तिगत रूप से मैं बयानों के बाद कोष्ठक लगाता हूं, क्योंकि यह मेरे द्वारा देखे गए हर कोडिंग गाइड का हिस्सा है, लेकिन मुझे लगता है कि यह आज एक बहुत कमजोर तर्क है। हर जगह स्वचालित कोड फ़ॉर्मेटिंग के साथ आपको कोड को किसी भी तरह से पहले रूप में नहीं देखना चाहिए और यदि इंडेंटेशन सही है तो ब्रैकेट कोई अतिरिक्त जानकारी नहीं देते हैं।
वू

4
ALWAYS ब्रेसिज़ का उपयोग करने के लिए अधिक तर्क: imperialviolet.org/2014/02/22/applebug.html
MrTJ

32

ब्रेसिज़ का उपयोग करना कोड को अधिक बनाए रखने और समझने योग्य बनाता है। इसलिए आपको डिफ़ॉल्ट रूप से उन पर विचार करना चाहिए ।

मैं कभी-कभी कोड को अधिक कॉम्पैक्ट बनाने के लिए गार्ड क्लॉस पर ब्रेसिज़ का उपयोग करना छोड़ देता हूं । इसके लिए मेरी आवश्यकता यह है कि वे ऐसे ifवक्तव्य हैं जो एक जम्प स्टेटमेंट के बाद आते हैं, जैसे returnया throw। इसके अलावा, मैं उन्हें मुहावरे की ओर ध्यान आकर्षित करने के लिए एक ही पंक्ति में रखता हूं, जैसे:।

if (!isActive()) return;

वे लूप के अंदर कोड पर भी लागू होते हैं:

for (...) {
  if (shouldSkip()) continue;
  ...
}

और तरीकों से अन्य कूद-स्थितियों के लिए जो आवश्यक रूप से विधि शरीर के शीर्ष पर नहीं हैं।

कुछ भाषाओं (जैसे पर्ल या रूबी) में एक तरह का सशर्त विवरण होता है , जहाँ ब्रेसिज़ लागू नहीं होते हैं:

return if (!isActive());
// or, more interestingly
return unless (isActive());

मैं इसे केवल मेरे द्वारा वर्णित के बराबर मानता हूं, लेकिन स्पष्ट रूप से भाषा द्वारा समर्थित है।


7
लूप के अंदर +1 गार्ड क्लॉस आमतौर पर घुंघराले ब्रेसिज़ के बिना अधिक स्पष्ट होते हैं।
विकारी

2
गार्ड क्लॉज पर सहमत हो गया। मेरी राय में कोड को अधिक पठनीय बनाता है और वास्तव में स्थिरता को बढ़ाता है। स्वीकृत जवाब देने वाले बिंदु हालांकि बहुत मान्य हैं, इसलिए मैं ब्रेसिज़ की चूक को गार्ड क्लॉस तक सीमित कर दूंगा।
क्रिस

11

इसमें कोई फर्क नही है। दूसरे संस्करण के साथ मुख्य समस्या यह है कि आप इसे लिख सकते हैं:

for (...) 
  do_something();
  do_something_else();

जब आप उस विधि को अपडेट करते हैं, तो यह सोचकर कि do_something_else()लूप के अंदर कहा जाता है। (और इससे सिर पर खरोंच करने वाले सत्र की शुरुआत होती है।)

एक दूसरी समस्या यह है कि ब्रेस संस्करण नहीं है, और संभवतः इसकी जगह भी मुश्किल है:

for (int i=0; i<3; i++);
  System.out.println("Why on earth does this print just once?");

इसलिए ब्रेसिज़ रखें जब तक आपके पास एक अच्छा कारण नहीं है, यह सिर्फ कुछ कीस्ट्रोक्स अधिक है।


3
पहला बिंदु अच्छा है, लेकिन दूसरा बिंदु गलत है। ब्रेस वर्जन में अभी भी यह समस्या हो सकती है। for (int i = 0; i <3; i ++); {System.out.println ("यह प्रिंट सिर्फ एक बार क्यों होता है?"); }। मुझे पता है क्योंकि मैं हमेशा ब्रेसिज़ का उपयोग करता हूं, लेकिन कभी-कभी गलत तरीके से अतिरिक्त अर्धविराम जोड़ते हैं।
एमोरी

3
ब्रेस संस्करण में यह हो सकता है, लेकिन यदि ब्रेस एक ही पंक्ति पर है तो यह अधिक दिखाई देता है। अगली पंक्ति में ब्रेस के साथ, वास्तव में, यह बहुत बुरा है।
Mat

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

5

मुझे लगता है कि घुंघराले ब्रेसिज़ को खोना अच्छा है, यदि आप ऑटो-प्रारूप का उपयोग भी कर रहे हैं, क्योंकि आपके इंडेंटेशन हमेशा सही होते हैं, इसलिए इस तरह से किसी भी त्रुटि को स्पॉट करना आसान होगा।

यह कहना कि घुंघराले ब्रेसिज़ को छोड़ना बुरा है, अजीब या अपठनीय है बस गलत है, क्योंकि पूरी भाषा उस विचार पर आधारित है, और यह बहुत लोकप्रिय है (अजगर)।

लेकिन मेरा कहना है कि बिना फॉर्मेटर का इस्तेमाल करना खतरनाक हो सकता है।


पायथन में इंडेंटेशन मायने रखता है। जावा, सी, सी ++ या अन्य सी शैली भाषाओं में, यह नहीं है।
क्रिस्टोफर श्नाइडर

1
@ChristopherSchneider यह pont है।
माटे मग्यर

5

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

if( "Prod".equals(stage) )
  callBankFunction ( creditCardInput )
else
  callMockBankFunction ( creditCardInput )

अब आपको बताते हैं कि आपके पास यह कोड कुछ आंतरिक समस्या के कारण काम नहीं कर रहा है। आप इनपुट की जांच करना चाहते हैं। तो आप निम्नलिखित परिवर्तन करें:

if( "Prod".equals(stage) )
  callBankFunction ( creditCardInput )
else
  callMockBankFunction ( creditCardInput )
  Logger.log( creditCardInput )

कहते हैं कि आप समस्या को ठीक करते हैं और इस कोड को तैनात करते हैं (और शायद समीक्षक और आपको लगता है कि यह समस्या उत्पन्न नहीं करेगा क्योंकि यह 'उत्पाद की स्थिति' के अंदर नहीं है)। जादुई रूप से, आपका उत्पादन लॉग अब ग्राहक क्रेडिट कार्ड की जानकारी को प्रिंट करता है जो उन सभी कर्मियों को दिखाई देता है जो लॉग देख सकते हैं। यदि कोई भी व्यक्ति (दुर्भावनापूर्ण इरादे से) इस डेटा को पकड़ लेता है, तो भगवान न करे।

इस प्रकार ब्रेस नहीं देना और थोड़ा लापरवाह कोडिंग अक्सर सुरक्षित जानकारी के उल्लंघन का कारण बन सकता है। इसे JERT में CERT - सॉफ्टवेयर इंजीनियरिंग खर्च, CMU द्वारा भेद्यता के रूप में वर्गीकृत किया गया है ।


मेरा तर्क है कि पहली जगह में एक बहुत ही भयानक डिजाइन है, लेकिन बात वैध है।
क्रिस्टोफर श्नाइडर 14

4

यदि आपके पास एक भी कथन है, तो आप कोष्ठक को छोड़ सकते हैं, और अधिक के लिए कि एक कथन कोष्ठक कोड के ब्लॉक को घोषित करने के लिए आवश्यक है।

जब आप कोष्ठक का उपयोग करते हैं तो आप एक ब्लॉक कोड की घोषणा कर रहे हैं:

{

//Block of code
}

जब आप पठनीयता में सुधार के लिए नेस्टेड स्टेटमेंट की स्थिति में होते हैं, तो कोष्ठक का उपयोग केवल एक कथन के साथ किया जाना चाहिए, इसलिए उदाहरण के लिए:

for( ; ; )
  if(a == b) 
    doSomething()

यदि आवश्यक न हो तो कोष्ठक के साथ यह अधिक पठनीय लिखा जाता है:

for( ; ; ) {
  if(a == b) {
    doSomething()
   }
}

4

यदि आप कोष्ठक का उपयोग करते हैं तो आपका कोड अधिक पठनीय है। और अगर आपको उसी ब्लॉक में कुछ ऑपरेटर जोड़ने की आवश्यकता है तो आप संभावित त्रुटियों से बच सकते हैं


3

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


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

2

मेरे लिए "हमेशा ब्रेसिज़" समूह के लिए अधिक समर्थन। यदि आप एकल-स्टेटमेंट लूप / शाखाओं के लिए ब्रेसिज़ छोड़ते हैं, तो नियंत्रण-स्टेटमेंट के समान स्टेटमेंट पर स्टेटमेंट डालें,

if (condition) doSomething();
for(int i = 0; i < arr.length; ++i) arr[i] += b;

इस तरह से शरीर के विस्तार के समय ब्रेसेस लगाना भूल जाना कठिन है। फिर भी, वैसे भी कर्ल का उपयोग करें।


2

कोड का अधिक रखरखाव योग्य होने का दावा करने के लिए निरर्थक ब्रेसिज़ का उपयोग करना निम्नलिखित प्रश्न उठाता है: यदि कोड लिखने वाले, सोचने वाले और आगे के कोड को बनाए रखने के लिए पहले बताए गए (इंडेंटेशन संबंधित या पठनीयता संबंधी) जैसे मुद्दे हैं, तो शायद उन्हें बिल्कुल भी प्रोग्राम नहीं करना चाहिए .. ।


1

परिणाम बुद्धिमान, यह एक ही बात है।

केवल दो बातों पर विचार करें।

- कोड मेंटेनेंस
- लूजली कोड। (कुछ और निष्पादित कर सकते हैं। क्योंकि आपने लूप की गुंजाइश नहीं बताई है।)

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


1

यदि आपके पास लूप के अंदर केवल एक बयान है तो यह समान है।

उदाहरण के लिए निम्नलिखित कोड देखें:

for(int i=0;i<4;i++)
            System.out.println("shiva");

उपरोक्त कोड में हमारा केवल एक कथन है। तो कोई बात नहीं

for(int i=0;i<4;i++)
            System.out.println("shiva");
            System.out.println("End");

यहां हम दो स्टेटमेंट दे रहे हैं लेकिन केवल पहला स्टेटमेंट लूप के अंदर आता है, लेकिन दूसरा स्टेटमेंट नहीं।

यदि आपके पास एकल लूप के तहत कई कथन हैं, तो आपको ब्रेसिज़ का उपयोग करना चाहिए।


1

यदि आप ब्रेसिज़ निकालते हैं, तो यह केवल अनुदेश की पहली पंक्ति पढ़ेगा। किसी भी अतिरिक्त लाइनों को नहीं पढ़ा जाएगा। यदि आपके पास निर्देशन की 1 से अधिक पंक्ति है, जिसे निष्पादित करने के लिए pls घुंघराले ब्रेस का उपयोग करें - या फिर अपवाद को फेंक दिया जाएगा।


1

आजकल, यह पता लगाने के लिए कोड जो ब्लॉक जिसमें है फिर से मांगपत्र कोड करना बहुत आसान है ifया for/ while। यदि आप जोर देते हैं कि री-इंडेंटिंग करना कठिन है, तो गलत इंडेंटेशन पर लगाए गए ब्रैकेट आपको समान रूप से बुरी तरह से भ्रमित कर सकते हैं।

for(int i = 0; i < 100; i++) { if(i < 10) {
    doSomething();
} else { for(int j = 0; j < 5; j++) {
        doSomethingElse();
    }
}}

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

यदि इंडेंटेशन महत्वपूर्ण है, तो आपको पहले से ही अपने कोड को सही इंडेंटेशन में लिखना चाहिए, इसलिए अन्य लोगों को आपके कोड को सही तरीके से पढ़ने के लिए फिर से इंडेंट करने की आवश्यकता नहीं है।

यदि आप तर्क करना चाहते हैं कि पिछला उदाहरण बहुत अधिक नकली / जानबूझकर है, और यह कि ब्रैकेट लापरवाह इंडेंटेशन समस्या को पकड़ने के लिए हैं (विशेषकर जब आप कोड को कॉपी / पेस्ट करते हैं), तो इस पर विचार करें:

for(int i = 0; i < 100; i++) {
    if(i < 10) {
    doSomething();
}
else {
    for(int j = 0; j < 5; j++) {
        doSomethingElse();
    }
}

हां, यह पिछले उदाहरण की तुलना में कम गंभीर है, लेकिन आप फिर भी इस तरह के इंडेंटेशन से भ्रमित हो सकते हैं।

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


0

यह कोड के रूप में अच्छी तरह से पुन: स्वरूपित करने के लिए एक सजगता होनी चाहिए ... जो कि पेशेवर टीमों में पेशेवर प्रोग्रामर के लिए है


0

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

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