रखरखाव के लिहाज से, `और जबकि` बिना हस्तक्षेप के ब्रेसिज़ को सुरक्षित माना जाता है?


26

क्या else whileबिना हस्तक्षेप वाले ब्रेसिज़ को "सुरक्षित" रखरखाव बुद्धिमान माना जाता है?

if-elseनीचे दिए गए ब्रेसिज़ के बिना कोड लिखना ...

if (blah)
    foo();
else
    bar();

... जोखिम उठाता है क्योंकि ब्रेसिज़ की कमी से अनजाने में कोड का अर्थ बदलना बहुत आसान हो जाता है।

हालांकि, नीचे भी जोखिम भरा है?

if (blah)
{
    ...
}
else while (!bloop())
{
    bar();
}

या else whileबिना हस्तक्षेप किए ब्रेसिज़ को "सुरक्षित" माना जाता है?


20
मुझे else whileicky दिखता है। मैं उपयोग करूंगा else { while (condition) { ... } }
जोआचिम सॉर

7
मुझे लगता है कि यह उचित उत्तर के लिए बहुत व्यक्तिपरक है ... मैं खुद ऐसा नहीं करूंगा क्योंकि मुझे वहां एक पाश की उम्मीद नहीं होगी, और मुझे लगता है कि मैं पठनीयता की उम्मीद नहीं करता हूं।
जोहान्स

7
मैं होता विधि निकालने जबकि-सामान के लिए
कुटकी

12
ईमानदारी से, यह मुझे ढोंगी देता है। ifकेवल एक बार मूल्यांकन किया जाता है, लेकिन whileएक लूप को दर्शाता है, इसलिए दोनों को जोड़ने से मुझे एक असंतुष्ट भावना मिलती है कि ifयह लूप का हिस्सा है ... किसी भी तरह ...
user281377

4
और क्या होगा अगर उस elseखंड में आप कुछ while और करना चाहते हैं? कृपया ब्रेसिज़ का उपयोग करें।
कार्लोस कैंपड्रेस

जवाबों:


57

जो मुझे यह कोड याद दिलाता है:

if ( ... ) try {
..
} catch (Exception e) {
..
} else {
...
}

हर बार जब आप दो प्रकार के ब्लॉक का संयोजन कर रहे होते हैं, तो ब्रेसिज़ को भूलकर इंडेंटेशन नहीं बढ़ाते हैं, आप कोड को समझना और बनाए रखना बहुत मुश्किल बना रहे हैं।


18
अच्छा उदाहरण। इसे लिखने का कितना भयानक तरीका है।
सिंह 15

4
वाह, यह जवाब हास्यास्पद रूप से आश्वस्त है!
मेहरदाद

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

55

शायद इसलिए कि मैं अपने व्यापार (वैसे पहले जब) का उपयोग सीखा जैक्सन इकाई संरचना आरेख विधि है, लेकिन मैं यह मानना है कि केवल करने के लिए सदस्यता सही एक के बाद unbraced अवधि ifया एक elseबाद में एक है if(यानी एक की इजाजत दी else ifसीढ़ी)

और कुछ भी (कोई यमक इच्छित नहीं) गलतफहमी और / या रखरखाव के मुद्दों के लिए संभावित छोड़ देता है। यह ओपी विचार का केंद्रीय पहलू "असुरक्षित" है।

मैं भी while()उसी के बारे में एक ही पंक्ति में शामिल होना चाहूंगा else- चाहे लट हो या न हो। यह मेरे लिए सही नहीं है ... किसी भी अतिरिक्त खरोज मास्क की कमी है कि यह elseखंड है। और स्पष्टता का अभाव गलतफहमी के लिए बनाता है (ऊपर देखें)।

इसलिए उदाहरण में, मैं (मेरी टीम में) जोरदार सलाह / सलाह (और जोर दूंगा):

if ( blah )
{
    ...
}
else
{
    while ( !bloop() )
    {
        bar();
    }
}

बेशक, मैं उपयुक्त टिप्पणियों को भी देखने की उम्मीद करूंगा।

- संपादित करें -

हाल ही में Apple एक एसएसएल भेद्यता का सामना करना पड़ा, जो खराब रखरखाव के कारण होता है - जिसने एक अन-ब्रेस्ड सिंगल लाइन के लिए दूसरी पंक्ति को जोड़ा। तो आइए बिस्तर पर डालते हैं कि विचार है कि एकतरफा एकल लाइनें ठीक हैं?


2
मैं इस बात पर सहमत हूं कि किसी अन्य का अनुसरण करने के लिए एकमात्र सही शब्द है। अगर वहाँ else whileI होता तो शायद यह भी ध्यान नहीं होता कि कोड के त्वरित स्किमिंग में एक लूप था, खासकर अगर मैं जिस स्थिति की तलाश कर रहा था, अगर वह संतुष्ट थी।
ड्रेक क्लेरिस

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

2
@JeffDavis एक अच्छी पकड़ है। "पढ़ने में आसान" बेकार पवित्र युद्ध का एक विशिष्ट निमंत्रण है। मैं एक के लिए ब्रेसिज़ पसंद करता हूं, लेकिन अप्रासंगिक "ईजीटोरेड" कचरा के कारण नहीं (उदाहरण के लिए मेरे लिए यह बिल्कुल विपरीत है), लेकिन क्योंकि यह आगे के कोड रखरखाव में तोड़ना मुश्किल है। वैसे ओपी ने अपने सवाल में इसे बेहतर बताया: क्या else whileबिना हस्तक्षेप के ब्रेसिज़ को "सुरक्षित" माना जाता है ?
gnat

@ जेफ़डेविस - मुझे पता है कि यह धागा दो साल पुराना है, लेकिन Apple ने हाल ही में पता लगाया है कि ब्रेसिज़ का उपयोग क्यों नहीं करना एक अच्छा विचार है andrewbanks.com/…
एंड्रयू

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

6

मुझे हमेशा सब कुछ ब्रेसिज़, इंडेंट और कमेंट में रखना सिखाया गया है। मेरा मानना ​​है कि त्रुटियों को पढ़ना और स्पॉट करना बहुत आसान है। व्यक्तिगत रूप से मुझे लगता है कि प्रतिरूपकता महत्वपूर्ण है इसलिए मैं हमेशा इस तरह कोड लिखूंगा:

    if(blah)
    {
     ....
    }
    else
    {
       while(!bloop()
       {
        bar;
       }
    }

6

मैं विधि निकालूंगा और बनाऊंगा

if ( blah )
{
    ...
}
else
{
   newMethod();
}

रिफैक्टिंग कैटलॉग साइट पर बताया गया "एक्सट्रैक्ट मेथड" दृष्टिकोण देखें :

आपके पास एक कोड टुकड़ा है जिसे एक साथ समूहीकृत किया जा सकता है।

टुकड़े को एक ऐसी विधि में बदल दें जिसका नाम विधि के उद्देश्य को बताता है।

void printOwing() {
    printBanner();

    //print details
    System.out.println ("name:    " + _name);
    System.out.println ("amount    " + getOutstanding());
}

                                                                                                         http://www.refactoring.com/catalog/arrow.gif

void printOwing() {
    printBanner();
    printDetails(getOutstanding());
}

void printDetails (double outstanding) {
    System.out.println ("name:    " + _name);
    System.out.println ("amount    " + outstanding);
}

निर्भर करता है ... यदि उदाहरण के लिए, जबकि लूप फ़ंक्शन स्तर डेटा का उपयोग करता है, तो आप अब उस डेटा को मॉड्यूल (या वर्ग, यदि C ++) स्तर का उपयोग कर रहे हैं। और अगर कोड का केवल एक छोटा सा टुकड़ा, आप तुच्छ तरीकों में हैं। लेकिन कभी-कभी, परिस्थितियों के आधार पर, मैं सहमत होता हूं।
एंड्रयू

1
+1 स्मार्ट C ++ कंपाइलर एक फ़ंक्शन को इनलाइन कर सकता है। JNet के कारण .Net वातावरण में छोटे कार्य बेहतर हैं।
जॉब

4

मैं इसे कोडिंग की बुरी आदत मानूंगा। कभी-कभी यह पूरी तरह से ठीक काम करता है और आपको कोड को संकलित करने और चलाने में कोई समस्या नहीं होगी। अन्य समय में यह गंभीर कीड़े पैदा कर सकता है और आप उस बग को ठीक करने में घंटों खर्च करेंगे।

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

if ( blah )
{
    ...
}
else
{
    while ( !bloop() )
    {
        bar();
    }
}

ब्लॉक में कोड डालना एक अच्छा अभ्यास है। यह सरल और समझने के साथ-साथ डीबग करना भी आसान बनाता है।


4

यह ठीक हो सकता है यदि यह उस तरह से सरल रहता है, हालांकि व्यक्तिगत रूप से मुझे यह पसंद नहीं है और मेरी प्राथमिकता सबसे सरल अगर / अन्य कोड ब्लॉक के लिए भी ब्रेसिज़ का उपयोग करना है। यह मेरे लिए सिर्फ तीखा है।

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

मुद्दा सामान को स्पष्ट करना है ताकि अन्य प्रोग्रामर एक नज़र में देख सकें कि सही और गलत क्या है। कोड लिखें ताकि पैटर्न सही दिखे और जार नहीं।

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


3

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

if (...)
   foo();
else while(...)
   bar();

... मुझे वास्तव में यह पता चला "else while(...) " उल्लेखनीय रूप से पठनीय लगता है! यह भी सादे अंग्रेजी की तरह पढ़ता है! लेकिन मुझे लगता है कि लोगों को यह सब अजीब लगेगा क्योंकि यह कम से कम कहना असामान्य है।

अंत में, हम सभी इसे ब्रेसिज़ के साथ बेवकूफ बनाने के लिए करते हैं, हालांकि ... क्योंकि, ठीक है, आप जानते हैं।


3
कि विशेष रूप से कुछ निर्दोष else while(...) bar();else while(...) foobar(); bar();
अनुचर

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

2
"हमेशा ऐसा कोड करें जैसे कि जो व्यक्ति आपका कोड बनाए रखेगा वह एक हिंसक मनोरोगी है जो जानता है कि आप कहां रहते हैं।" ( एलन ब्रैगिंस )
gnat

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

1
अगर - अच्छी तरह से लिंक जो मैं ऊपर उल्लेख करता हूं, ने इस उद्धरण के संस्करण का विस्तार किया है : प्रोग्रामर 1: 'यहां एक अच्छा उद्धरण है - "हमेशा कोड के रूप में यदि वह व्यक्ति जो आपके कोड को बनाए रखेगा वह एक हिंसक मनोरोगी है जो जानता है कि आप कहां रहते हैं"' । प्रोग्रामर 2: (अनुरक्षक की ओर देखता है) 'आपका क्या मतलब है जैसे "?"
gnat

2

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

if(blah) {
    foo();
}
else {
    bar();
}

ब्रेसिज़ की पोजिशनिंग शायद धर्म से परे (या संभवत:) किसी भी चीज़ की तुलना में अधिक तर्क को ट्रिगर करती है!
एंड्रयू

माना। उनके अस्तित्व पर जोर देने के लिए मेरे जवाब को संपादित करेंगे, न कि स्थिति पर।
त्सविटोमिर दिमित्रोव

2

ब्रेसिज़ में ऐसा क्या गलत है कि इतने सारे लोग उन्हें लिखने से बचने की कोशिश कर रहे हैं?

वास्तव में क्या समस्या else whileहल होती है?

ब्रेसिज़ सस्ते और अच्छे हैं, और वे चतुर और मजाक के विपरीत कोड इरादे स्पष्ट और सादे बनाते हैं।

यूनिक्स दर्शन का उद्धरण:

स्पष्टता का नियम: स्पष्टता चालाकी से बेहतर है।

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


1

वहाँ कुछ भी गलत नहीं है

if (blah)
    foo();
else
    bar();

जैसे कुछ गलत नहीं है

if (blah) foo(); else bar();

सही परिस्थितियों में (आपकी परिस्थितियाँ भिन्न हो सकती हैं, लेकिन उस विशेष शैली का सबसे अच्छा उपयोग किया जाता है जब आपके पास बहुत अधिक दोहरावदार कोड होता है - फिर प्रत्येक पंक्ति का दृश्य शैलीगत इंडेंटेशन से अधिक महत्वपूर्ण होता है)

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


इसके अलावा, मैंने पहले भी यह कोड देखा है:

if (x) foo()
{
  bar();
}

और यह स्वयं मानक कोडी द्वारा लिखा गया था (जो सब कुछ के लिए कोष्ठक पर जोर देते थे)।


1

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

if (blah) {
  blub();
} else
  while (!bloop()) {
    bar();
  }

इंडेंटेशन हमेशा घोंसले को आसानी से दिखाई देता है, यहां तक ​​कि बिना अनावश्यक ब्रेसेस के भी। इसलिए, यदि आप ऐसी आईडीई सेटिंग्स लागू करने का प्रबंधन करते हैं, तो मुझे कोई जोखिम नहीं दिखता है।

व्यक्तिगत रूप से, मुझे ऐसा कोड मिला है जो ब्रेसिज़ को छोड़ देता है और अव्यवस्था से बचता है, क्योंकि यह अधिक पठनीय है।

if (blah) blub();
else while (!bloop()) bar();

लेकिन निश्चित रूप से, कई डेवलपर्स हमेशा और एक दिन ऐसी चीजों के बारे में बहस करने के लिए बहुत खुश हैं।

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