क्या घुंघराले ब्रेसिज़ के बिना एक बयान का उपयोग करना एक बुरा अभ्यास है? [बन्द है]


130

मैंने इस तरह कोड देखा है:

if(statement)
    do this;
else
    do this;

हालाँकि, मुझे लगता है कि यह अधिक पठनीय है:

if(statement){
    do this;
}else{
    do this;
}

चूंकि दोनों विधियां काम करती हैं, क्या यह केवल वरीयता का मामला है, जिसका उपयोग करना है या एक तरह से दूसरे पर सिफारिश की जाएगी?



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

जवाबों:


212

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

रखरखाव-वार, यह हमेशा दूसरे रूप का उपयोग करने के लिए होशियार होता है

संपादित करें: नेड टिप्पणी में यह बताते हैं, लेकिन यह यहाँ से जोड़ने के लायक है, मुझे भी लगता है। यह सिर्फ कुछ हाथीदांत-टॉवर काल्पनिक बकवास नहीं है: https://www.imperialviolet.org/2014/02/22/applebug.html


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

12
या आप ऐसी भाषा का उपयोग कर सकते हैं जो कोड ब्लॉक के लिए कोष्ठक का उपयोग नहीं करता है ...
टोर वालोमो

10
@ lins314159 - नहीं, मेरा मतलब अजगर की तरह है। क्योंकि मैं इस संबंध में चौकीवादी हूं।
टोर वलामो 25:10

17
इसके अलावा सबूत की गलतियाँ (और कर) हो सकती हैं: imperialviolet.org/2014/02/22/applebug.html
नेड

8
यह दावा करना कि एसएसएल बग ब्रेसिज़ के पक्ष में एक तर्क है, असंगत है। ऐसा नहीं है कि डेवलपर लिखने का इरादा रखता है, if (…) { goto L; goto L; }लेकिन ब्रेसिज़ भूल गया। यह विशुद्ध रूप से संयोग है कि `` अगर (…) {गोटो एल; गोटो एल; } `ऐसा सुरक्षा बग नहीं होता है, क्योंकि यह अभी भी एक बग (सुरक्षा परिणामों के साथ एक नहीं) है। एक अन्य उदाहरण में, चीजें विपरीत दिशा में जा सकती हैं और ब्रेसेलेस कोड गलती से सुरक्षित हो सकता है। तीसरे उदाहरण में, ब्रेसलेस कोड शुरू में बग-मुक्त होगा और ब्रेसिज़ जोड़ते समय डेवलपर एक टाइपो पेश करेगा।
पास्कल क्यूक

112

स्टेटमेंट ब्लॉक छोड़ने के साथ एक समस्या अन्य-अस्पष्टता है। यह C- प्रेरित भाषाओं की अनदेखी को दर्शाता है और इसलिए इसे अलग करने का कोई तरीका नहीं है:

if(one)
    if(two)
        foo();
    else
        bar();

इस से:

if(one)
    if(two)
        foo();
else
    bar();

8
यह शीर्ष उत्तर में वर्णित एक (दूसरे कथन को जोड़ने) की तुलना में कहीं अधिक गंभीर समस्या है।

3
वास्तव में, इस जवाब ने मुझे वास्तव में हल्के ढंग से चिंतित होने के लिए इन जवाबों को पढ़ने से लिया, क्योंकि मैंने वास्तव में यह गलती की है।
omikes

2
अगर कोई और सोच रहा था जैसे मैं वास्तव में सी की व्याख्या किस तरह से कर रहा था, एक परीक्षण जो मैंने जीसीसी के साथ किया था वह इस कोड को पहले तरीके से व्याख्या करता है। tpcg.io/NIYeqx
horta

2
"अस्पष्टता" गलत शब्द है। इसमें कोई भी अस्पष्टता नहीं है कि पार्सर इसे कैसे देखेगा: elseनिकटतम, अंतरतम के लिए लालच बांधता है if। समस्या यह है कि जहां सी या इसी तरह की भाषाओं को उन लोगों द्वारा कोड किया जा रहा है जो इसे नहीं जानते हैं, इसके बारे में मत सोचो, या अभी तक पर्याप्त कॉफी नहीं है - इसलिए वे कोड लिखते हैं कि उन्हें लगता है कि एक काम करेंगे, लेकिन भाषा का कहना है कि पार्सर को कुछ और करना होगा, जो बहुत अलग हो सकता है। और हाँ, यह हमेशा के लिए एक और रॉक-ठोस तर्क है जिसमें ब्रेसिज़ भी शामिल हैं, भले ही व्याकरण उन्हें सैद्धांतिक रूप से 'अनावश्यक' के रूप में चिह्नित करता है।
अंडरस्कोर_ड

35

मेरा सामान्य पैटर्न यह है कि अगर यह एक पंक्ति में फिट बैठता है, तो मैं करूँगा:

if(true) do_something();

यदि कोई अन्य खंड है, या यदि मैं जिस कोड को निष्पादित करना चाहता हूं true, वह महत्वपूर्ण लंबाई का है, तो सभी तरह से ब्रेसिज़ होता है:

if(true) {
    do_something_and_pass_arguments_to_it(argument1, argument2, argument3);
}

if(false) {
    do_something();
} else {
    do_something_else();
}

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


4
हालांकि, यह लिखना जितना आसान है if(true){ do_something(); }, एक और प्रोग्रामर को सड़क के नीचे एक गंभीर बग को पेश करने का मौका क्यों लेना है (ऐप्पल की "गोटो फेल" कुल एसएसएल कोड स्क्रूप)।
क्रेग

9
ब्रैकेट की कोई भी राशि अनुरक्षक को उसके मस्तिष्क का उपयोग करने से मुक्त नहीं करेगी। मैं "एक पंक्ति में फिट होने पर कोई कोष्ठक नहीं" के विचार का समर्थन करता हूं, क्योंकि, मेरे लिए, ऐसा है यदि एक बस सहायक का एक संस्करण है यदि ऑपरेटर जहां किसी को "के बाद" में कुछ भी करने की आवश्यकता नहीं है: का हिस्सा त्रिगुट। और किसी को कोष्ठक को टर्नरी में क्यों पेश किया जाएगा यदि ?
मिशाल एम

मैं इस बात से बिलकुल सहमत नहीं हूँ कि अंततः यह व्यक्तिपरक है, और न ही यह केवल शैली और पठनीयता को प्रभावित करता है। जैसा कि कोई है जो समय बर्बाद करने की कोशिश कर रहा है कि यह गायब हो गया था, यह ब्लॉक ब्लॉक सीमांकक (और उनकी अनुपस्थिति को नोटिस नहीं) के कारण हुआ था, क्योंकि मुझे एक कोडिंग शैली का उपयोग करना था जो 'अनावश्यक' होने पर उन्हें छोड़ देता है - और जिसने कई के बारे में पढ़ा है इस तरह की कोडिंग शैलियों के कारण भयानक रूप से भयानक कीड़े - मुझे लगता है कि यह एक बहुत ही उद्देश्यपूर्ण, व्यावहारिक मुद्दा है। निश्चित रूप से, एक शैली के परिसीमन के साथ, हम अभी भी उन्हें भूल सकते हैं, लेकिन निश्चित रूप से - कम से कम - मांसपेशियों की स्मृति हमें बहुत कम संभावना है।
अंडरस्कोर_ड

10

मैं उस आईडीई कोड कोड का उपयोग कर रहा हूं जिसका मैं उपयोग करता हूं। यह भिन्न हो सकता है, लेकिन इसे प्राथमिकता / विकल्प में सेटअप किया जा सकता है।

मैं यह पसंद है:

if (statement)
{
    // comment to denote in words the case
    do this;
    // keep this block simple, if more than 10-15 lines needed, I add a function for it
}
else
{
    do this;
}

5
यह पूरी तरह से व्यक्तिपरक शैली का मुद्दा है, मैं व्यक्तिगत रूप से ब्रेस-ओनली लाइन्स के अतिरेक को पसंद नहीं करता। लेकिन नमसते।
माचिस

14
मैं इस शैली का समर्थन करता हूं। अधिकांश लोग बाएं से दाएं कोड पढ़ते हैं और यह हमारी आंखों को स्क्रीन के बाएं किनारे पर लंगर डालने के लिए बनाता है। यह चरणों के तार्किक ब्लॉकों के लिए कोड को नेत्रहीन रूप से अलग करने और निकालने में मदद करता है।
mloskot

6
मैंने हमेशा इस शैली को प्राथमिकता दी है। बहुत आसान समापन कोष्ठक खोजने के लिए। तो यह बहुत जगह लेता है? एक छोटे फ़ॉन्ट का उपयोग करें।
timday

4
मुझे हमेशा कोड के माध्यम से "स्कैन" करना आसान लगता है जब ब्रेसिज़ अलग-अलग लाइनों पर होते हैं। वह सब कुछ के लिए चला जाता है; कक्षाएं, विधियाँ, यदि- और समय-कथन, वगैरह। कभी नहीं पसंद किया है कि पहली ही पंक्ति में ब्रेस ...
Svish

2
व्हॉट्सएप सस्ता है, खासकर जब आपके पास एक कोड तह सक्षम आईडीई हो।
मू

10

"नियम" मैं इसका पालन करता हूं:

यदि "if" कथन कुछ करने के लिए परीक्षण कर रहा है (IE कॉल फ़ंक्शंस, कॉन्फ़िगर चर आदि), ब्रेसिज़ का उपयोग करें।

if($test)
{
    doSomething();
}

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

यदि "if" स्टेटमेंट कुछ करने से रोकने के लिए परीक्षण कर रहा है (एक लूप या फ़ंक्शन के भीतर IE प्रवाह नियंत्रण), तो एक ही लाइन का उपयोग करें।

if($test) continue;
if($test) break;
if($test) return;

इस मामले में, प्रोग्रामर के लिए जो महत्वपूर्ण है, वह यह पता लगा सकता है कि वे असाधारण मामले क्या हैं जहां आप कोड को नहीं चलाना चाहते हैं, और यह सब $ परीक्षण में कवर किया गया है, निष्पादन ब्लॉक में नहीं।


8

पहले क्षण से ब्रेसिज़ सही होने से आपको इसे डीबग करने से रोकने में मदद मिलेगी:

if (statement)
     do this;
else
     do this;
     do that;

1
ऐसा लगता है कि स्वीकार किए जाते हैं औचित्य, लेकिन (यहाँ शैतान के वकील खेलने के लिए) एक भी अतिरिक्त वाक्यविन्यास-हाइलाइटिंग नियम भी हल नहीं होगा, जबकि एक पंक्ति को बचाते हुए?
केन

2
तो एक आईडीई होगा जो आपके हिट होने पर इंडेंटेशन को ठीक करता है ;:)
सैम हरवेल

6

सभी के लिए ब्रेसिज़ का उपयोग करें यदि कथन भी सरल हैं। या, एक सरल को फिर से लिखें यदि कथन टर्नरी ऑपरेटर का उपयोग करने के लिए:

if (someFlag) {
 someVar= 'someVal1';
} else {
 someVar= 'someVal2';
}

इस तरह बहुत अच्छे लग रहे हैं:

someVar= someFlag ? 'someVal1' : 'someVal2';

लेकिन केवल टर्नररी ऑपरेटर का उपयोग करें यदि आप पूरी तरह से सुनिश्चित हैं कि कुछ और नहीं है जो कि / अन्य ब्लॉक में जाने की आवश्यकता है!


4

मैं ब्रेसिज़ का उपयोग करना पसंद करती हूं। ब्रेसिज़ जोड़ने से पढ़ना और संशोधित करना आसान हो जाता है।

यहाँ ब्रेसिज़ के उपयोग के लिए कुछ लिंक दिए गए हैं:


2

मेरे अनुभव से पहले रूप का एकमात्र (बहुत) मामूली लाभ कोड पठनीयता है, दूसरा रूप "शोर" जोड़ता है।

लेकिन आधुनिक आईडीई और कोड ऑटोगेनेरेशन (या ऑटोकंप्लीशन) के साथ मैं दृढ़ता से दूसरे रूप का उपयोग करने की सलाह देता हूं, आप अतिरिक्त समय को घुंघराले ब्रेस टाइप करने में खर्च नहीं करेंगे और आप कुछ सबसे लगातार बग से बचेंगे।

पर्याप्त ऊर्जा खपत करने वाले कीड़े हैं, लोग समय के बड़े कचरे के लिए दरवाजे नहीं खोलते हैं।

कोड लिखते समय याद रखने के लिए सबसे महत्वपूर्ण नियम में से एक है। कोड की प्रत्येक पंक्ति को उसी तरह लिखा जाना चाहिए, जिस पर किसी ने भी लिखा हो। कठोर होना कीड़े को "होने" से रोकता है;)

यह स्पष्ट रूप से और स्पष्ट रूप से आपके चर, विधियों, फ़ाइलों के नामकरण के साथ या उन्हें सही ढंग से इंडेंट करने के साथ समान है ...

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


2

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

if(statement)
{
    do this;
}
else
{
    do this;
}

हालांकि, मुझे लगता है कि इस समस्या का सबसे अच्छा समाधान पायथन में है। व्हॉट्सएप-आधारित ब्लॉक संरचना के साथ, यदि आपके पास एक कथन बनाने के दो अलग-अलग तरीके नहीं हैं: आपके पास केवल एक है:

if statement:
    do this
else:
    do this

जबकि इसके पास "मुद्दा" है जिसे आप ब्रेसिज़ का उपयोग नहीं कर सकते हैं, आप लाभ प्राप्त करते हैं कि यह कोई और रेखा नहीं है जो पहली शैली है और इसमें अधिक स्टेटमेंट जोड़ने की शक्ति है।


मैं खुद सोचता हूं कि पाइथन कैसे संभालता है अगर-और बयान बहुत बदसूरत हैं, लेकिन फिर, मैं पायथन प्रोग्रामर नहीं हूँ (अभी तक)
हेल्परमेथोड

1

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

काम नहीं करेगा:

यदि (कथन) ऐसा करें; और इस; और यह करो;


1

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

उदाहरण:

if (argument == null)
    throw new ArgumentNullException("argument");

if (argument < 0)
    return false;

अन्यथा मैं दूसरी शैली का उपयोग करता हूं।


1

मेरी व्यक्तिगत पसंद इस तरह से व्हॉट्सएप और ब्रैकेट के मिश्रण का उपयोग कर रही है:

if( statement ) {

    // let's do this

} else {

    // well that sucks

}

मुझे लगता है कि यह साफ दिखता है और मेरे कोड को पढ़ने में बहुत आसान बनाता है और सबसे महत्वपूर्ण बात - डिबग।


0

मैं इस तथ्य के अधिकांश उत्तरों से सहमत हूं कि आपके कोड में स्पष्ट होना और ब्रेसिज़ का उपयोग करना बेहतर है। व्यक्तिगत रूप से मैं कोडिंग मानकों का एक सेट अपनाऊंगा और यह सुनिश्चित करूंगा कि टीम के सभी लोग उन्हें जानते हों और उनके अनुरूप हों। जहां मैं काम करता हूं हम .NET प्रोजेक्ट्स के लिए IDesign.net द्वारा प्रकाशित कोडिंग मानकों का उपयोग करते हैं।


0

मैं घुंघराले ब्रेस लगाना पसंद करती हूं। लेकिन कभी-कभी, टर्नरी ऑपरेटर मदद करता है।

के बजाय :

int x = 0;
if (condition) {
    x = 30;
} else {
    x = 10;
}

एक बस करना चाहिए: int x = condition ? 30 : 20;

एक मामले की भी कल्पना करें:

if (condition)
    x = 30;
else if (condition1)
    x = 10;
else if (condition2)
    x = 20;

यह बहुत बेहतर होगा यदि आप घुंघराले ब्रेस लगाते हैं।

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