क्या "बेकार ब्रेस" को हटाने के अपने प्यार पर चाचा बॉब को कोई चुनौती दे सकता है?


94

मुझे भुगतान की गई सामग्री का संदर्भ देने से नफरत है, लेकिन यह वीडियो ठीक उसी तरह दिखाता है जैसे मैं बात कर रहा हूं। रॉबर्ट मार्टिन में शायद 12 मिनट इस पर दिखता है:

कुछ कोड

और कहते हैं, "मेरी पसंदीदा चीजों में से एक को बेकार ब्रेसिज़ से छुटकारा मिल रहा है" क्योंकि वह इसे इस में बदल देता है:

अधिक कोड

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

अंकल बॉब के प्रति निष्पक्ष होने के लिए, वह एक छोटे से छोटे कार्यों के लिए एक लंबी जावा विधि को फिर से तैयार कर रहा है, जिससे मैं सहमत हूँ, वे अधिक पठनीय हैं। जब उसने इसे बदलने का काम किया, (22.18) यह इस तरह दिखता है:

फिर भी अधिक कोड

मुझे लगता है कि अगर ब्रेसिज़ को हटाने के लिए मान्य माना जाता है। मैं पहले से ही सर्वश्रेष्ठ अभ्यास से परिचित हूं । क्या अंकल बॉब को इस बिंदु पर चुनौती दी जा सकती है? क्या अंकल बॉब ने इस विचार का बचाव किया है?


6
मैं इस प्रश्न को ऑफ-टॉपिक के रूप में बंद करने के लिए मतदान कर रहा हूं क्योंकि इसका कोई भी उत्तर "नहीं" या "हां, और यहां एक उद्धरण है।"
ब्लरफुल

35
इसे कुछ साल दें, शायद वह बेकार लाइनब्रेक को भी हटा देगा, और "अगर (देखें (कुछ)) कहें (कुछ);" वास्तव में होगा होना कोड की ;-) एक पंक्ति
स्टीव जेसप

8
@SteveJessop यह सुनकर अच्छा लगा कि मैं वर्षों से आगे हूं। : डी नई लाइन के बिना, बदनाम बग का कोई खतरा नहीं है। आवश्यकतानुसार ब्रेसिज़ जोड़ना / निकालना एक अतिरिक्त ओवरहेड है, लेकिन पढ़ने के दौरान बहुत अधिक सहेजा जाता है।
मआर्टिनस

9
अंकल बॉब ने इसे क्लीन कोड, पृष्ठ 35 में करने के लिए कुछ अच्छे बिंदु बनाए हैं । यदि कोई ifब्लॉक केवल एक ही पंक्ति है, तो इससे कोई फर्क नहीं पड़ता। यदि आपको अधिक लाइनें जोड़ने की आवश्यकता है, तो यह एक और फ़ंक्शन होना चाहिए जो ifब्लॉक को एक पंक्ति (फ़ंक्शन कॉल) में वापस घटाता है । यदि आप इसका पालन करते हैं, तो ब्रेसिज़ बस कोई फर्क नहीं पड़ता - बिल्कुल भी नहीं

13
उसे बस करना चाहिए return (page==null) ? "" : includePage(mode,page);अगर वह बहुत अधिक प्रचलित हो रहा है ... मैंने सोचा है कि कोई भी ब्रेस स्टाइल शांत नहीं है जब तक कि मैंने पेशेवर रूप से ऐप विकसित करना शुरू नहीं किया। डिफ शोर, संभव टाइपो बग आदि। ब्रेसिज़, हर समय वहाँ होने से, आपको समय और ओवरहेड बचाने के लिए आपको बाद में उन्हें पेश करना होगा।
वैक्सविज

जवाबों:


47

पठनीयता कोई छोटी चीज नहीं है।

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

मैं कभी किसी को चुनौती नहीं देता जो उस छोटे से उपद्रव के बाद हमेशा ब्रेसिज़ का उपयोग करने के बारे में धार्मिक हो।

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

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


7
हाल ही में, जब इंडेंटिंग बंद और भ्रामक था, तो मैं इससे थोड़ा परेशान था।
एंडी

12
क्योंकि यह बिना जीसीसी 6 के-Wmisleading-indentation सी था ।
5

2
@ कंडिडऑरेन्ज: यह अंकल बॉब हैं जो स्थापित हठधर्मिता को चुनौती दे रहे हैं।
रॉबर्ट हार्वे

1
@RobertHarvey क्या मैंने स्पष्ट नहीं किया? हां, वह हठधर्मिता को चुनौती दे रहा है। वह मेरी हठधर्मिता को चुनौती दे रहा है। मैं सिर्फ एक अच्छा छात्र बनने की कोशिश कर रहा हूं और कम से कम इस पर विचार कर रहा हूं। लेकिन चाचा बॉब इतना लानत है करिश्माई यह मुझे आश्चर्य होता है अगर मैं निष्पक्षता खो रहा हूं। इसलिए मैं कुलीड पीने से पहले एक मारक खोजने में मदद के लिए भीख माँग रहा हूँ।
कैंडिड_ऑरेंज

1
@ कंडिडऑरेन्ज: यह बिल्कुल एक संदर्भ चीज है। जो लोग हठधर्मिता से आँख बंद करके स्वीकार करते हैं, वे संदर्भ को नहीं मानते हैं; वे वही हैं जो अभी भी प्रबंधित भाषाओं में "वन रिटर्न ओनली" नियम का उपयोग करते हैं, लंबे समय के बाद नियम ने इसकी उपयोगिता को रेखांकित किया है और वास्तव में एक बाधा बन गया है।
रॉबर्ट हार्वे

133

आप यहां या यहां या जहां भी बाइक शेड पेंट किए गए हैं, वहां कई प्रकाशित प्रचार या बिना ब्रेस स्टाइल के अस्वीकृति पा सकते हैं ।

बाइक शेड से दूर, 2014 के महान ओएस एक्स / आईओएस एसएसएल बग को याद रखें?

if ((err = SSLHashSHA1.update(&hashCtx, &serverRandom)) != 0)
    goto fail;
if ((err = SSLHashSHA1.update(&hashCtx, &signedParams)) != 0)
    goto fail;
    goto fail;
if ((err = SSLHashSHA1.final(&hashCtx, &hashOut)) != 0)
    goto fail;

हां, बिना किसी ब्रेस ब्लॉक के "कारण" https://www.imperialviolet.org/2014/02/22/applebug.html

प्राथमिकताएं ब्रेस स्टाइल पर निर्भर हो सकती हैं। अगर मुझे लिखना होता

if (suiteSetup)
{
    includePage(mode, suiteSetup);
}

मैं अंतरिक्ष को बचाने के लिए भी इच्छुक हो सकता हूं। परंतु

if (suiteSetup) {
    includePage(mode, suiteSetup);
}

केवल एक "अतिरिक्त" लाइन का उपयोग करता है।


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

if (suiteSetup != null) includePage(mode, suiteSetup);

इसमें आईओएस एसएसएल-स्टाइल बग के समान दृश्य समस्या नहीं है, लेकिन अंकल बॉब की तुलना में और भी अधिक "अनावश्यक" लाइनें बचाता है;) यदि आप इसे उपयोग करते हैं, तो अच्छी तरह से पढ़ता है और रूबी ( includePage(mode, suiteSetup) unless suiteSetup.nil?) में मुख्यधारा का उपयोग करता है । ओह ठीक है, बस इतना पता है कि बहुत सारे विचार हैं।


13
इसके अलावा, यदि आप उपयोग करते } else[if(...)] {हैं, तो इससे कोई अतिरिक्त अतिरिक्त रेखा नहीं जुड़ती है, इसलिए यह पूरी चीज़ में केवल एक अतिरिक्त रेखा तक जुड़ जाती है।
रैंडम 832

12
मुझे खुशी है कि आप iOS SSL बग को लाए हैं। तब से, मैंने खुद को ऐसी स्थितियों में ब्रेसिज़ का उपयोग करते हुए पाया है।
जैच लिप्टन

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

16
"गोटो फेल" सिंगल लाइन ब्लॉक्स के कारण नहीं था, यह मैला प्रोग्रामिंग, यहां तक ​​कि स्लोपियर कोड की समीक्षा के कारण भी था, और कोड द्वारा मैन्युअल रूप से एक बार भी कदम नहीं उठाने के कारण।
gnasher729

35
मेह, ब्रेसिज़ की कमी उस बग का कारण नहीं बनी। प्रोग्रामर को याद करना (और किसी सार्थक कोड समीक्षा, परीक्षण की कमी) ने किया। उन जिम्मेदारियों को दूर करके समस्या को ठीक करें, बाकी लोगों के हाथ बांधने से नहीं!
ऑर्बिट

62

अंकल बॉब के पास इस तरह की गलती के खिलाफ रक्षा की कई परतें हैं जो तब आम नहीं थीं जब "हमेशा ब्रेसिज़ का उपयोग करें" प्रचलित ज्ञान था:

  1. सिंगल-लाइन सशर्त के लिए एक मजबूत व्यक्तिगत प्राथमिकता, इसलिए मल्टी-लाइन वाले बाहर खड़े होते हैं और अतिरिक्त जांच प्राप्त करते हैं।
  2. जब आप दूसरी पंक्ति सम्मिलित करते हैं तो एक संपादक जो स्वचालित रूप से अलग हो जाता है।
  3. यूनिट के परीक्षणों का एक पूरा सूट जो वह लगातार चलाता है।
  4. एकीकरण परीक्षणों का एक पूरा सूट।
  5. उनके कोड में विलय से पहले एक सहकर्मी की समीक्षा की जाती है।
  6. एक निरंतर एकीकरण सर्वर द्वारा सभी परीक्षणों का एक पुनरावृत्ति।
  7. उत्पाद की गुणवत्ता विभाग द्वारा परीक्षण किया गया।

मुझे लगता है कि अगर किसी ने अंकल बॉब को चुनौती दी, तो वह उपरोक्त बिंदुओं के साथ बहुत अच्छा खंडन होगा। यह जल्दी पकड़ने की सबसे आसान गलतियों में से एक है।


16
मैं कभी नहीं डरता हूँ जिस तरह से मैं चीजों को डरता हूँ जो चुपचाप विफल हो जाते हैं। कम से कम आप जानते हैं कि दुर्घटना कब होती है। मेरे दिमाग का पिछला हिस्सा जब मैं इस सामान को देखता हूं। यह उसी तरह से झुनझुना लगाता है जब मैं देखता हूं while(true);{break;}। यदि वास्तव में इसके लिए कोई मान्य संदर्भ है, तो मुझे इसे प्राप्त करने में थोड़ा समय लगेगा।
candied_orange

9
क्या हमारे पास जाँच का एक स्वचालित तरीका है जो includePage()एक से अधिक विवरणों के साथ खराब लिखित मैक्रो नहीं है?
मार्टिन यॉर्क

51
@LokiAstari हां, इसे "जावा में मैक्रोज़ नहीं" कहा जाता है।
svick

11
उपरोक्त सभी "व्यर्थ ब्रेसिज़ नीति" से संबंधित गिरावट से बचने के अधिक "तरीके हैं" वास्तव में "बेकार ब्रेस पॉलिसी" का उपयोग करने के कारणों से। जिन तथ्यों की आपको आवश्यकता है (विशेष रूप से # 1) उन्हें एक लाभ की तुलना में अधिक निराकरण माना जाना चाहिए।
SJuan76

16
@ जूल्स ओह हां! मेरे द्वारा काम पर प्राप्त या जारी किए गए सभी उत्पादों में 100% परीक्षण कवरेज है (बहुत कम से कम), सहकर्मी की समीक्षा की जाती है (कई बार) और आसपास के सभी व्यवसाय में सॉफ्टवेयर क्यूए विभाग हैं। हाँ। मुझे लगता है कि आपने अपने पेशेवर करियर में समान पाया है, क्योंकि हर व्यवसाय में एकल प्रोग्रामर के बजाय प्रोग्रामर की टीम होती है, और वे उन्हें वे सभी परीक्षण करने के लिए पर्याप्त समय देते हैं जो वे करना चाहते हैं। हाँ जो पूरी तरह से सभी कार्यस्थलों का वर्णन करता है। जब हम अपने सॉफ़्टवेयर हमेशा 100% बग मुक्त होते हैं, तो हमें कुछ अतिरिक्त बगों को जोड़ने के बारे में चिंता क्यों करनी चाहिए?
एसजुआन76

31

अधिकांश भाग के लिए यह व्यक्तिगत प्राथमिकता है, हालांकि इस पर विचार करने के लिए कुछ चीजें हैं।

संभावित कीड़े

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

वैध कोड (जो पढ़ता है जैसे यह एक बग हो सकता है)

यहां तक ​​कि यह मानते हुए कि आपका प्रोजेक्ट ऐसे बग से ग्रस्त नहीं है, जब कोड पढ़ते हुए आपको कोड के कुछ ब्लॉक दिखाई दे सकते हैं, जैसे कि वे बग हो सकते हैं - लेकिन ऐसा नहीं है, तो आपके कुछ मानसिक चक्र ले रहे हैं।

हम इसके साथ शुरू करते हैं:

if (foo)
    bar();

एक डेवलपर एक उपयोगी टिप्पणी जोड़ता है।

if (foo)
    // At this point we know foo is valid.
    bar();

बाद में एक डेवलपर ने इस पर विस्तार किया।

if (foo)
    // At this point we know foo is valid.
    // This never fails but is too slow even for debug, so keep disabled.
    // assert(is_valid(foo));
    bar();

या एक नेस्टेड ब्लॉक जोड़ता है:

if (foo)
    while (i--) {
        bar(i);
        baz(i);
    }

या मैक्रो का उपयोग करता है:

if (foo)
    SOME_MACRO();

"... चूंकि मैक्रोज़ कोड की कई पंक्तियों को परिभाषित कर सकते हैं, क्या मैक्रो do {...} while (0)कई लाइनों के लिए उपयोग करता है ? इसकी वजह यह है कि हमारी शैली-गाइड में, लेकिन मैं सिर्फ मामले में बेहतर जांच करता हूं!"


ऊपर दिए गए उदाहरण सभी मान्य कोड हैं, हालांकि कोड-ब्लॉक में जितनी अधिक सामग्री है, उतनी ही आपको यह सुनिश्चित करने के लिए पढ़ना होगा कि कोई गलती नहीं है।

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

मुश्किल शोर

एकल लाइनों के लिए ब्रेसिज़ का उपयोग करने का एक व्यावहारिक कारण अलग शोर को कम करना है

वह है, बदलना:

if (foo)
    bar();

सेवा:

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

... सशर्त रेखा को परिवर्तित होने के कारण एक भिन्न रूप में दिखाने का कारण बनता है, यह कुछ छोटे लेकिन अनावश्यक ओवरहेड जोड़ता है।

  • पंक्तियाँ कोड-समीक्षाओं में परिवर्तित होने के रूप में दिखाई देती हैं, यदि आपके अलग-अलग उपकरण शब्द-आधारित हैं, तो आप आसानी से देख सकते हैं कि केवल ब्रेस बदल गया है, लेकिन यह जाँचने में अधिक समय लेता है, यदि रेखा बिल्कुल नहीं बदली।
    कहा जा रहा है कि, सभी उपकरण शब्द-आधारित भिन्नता का समर्थन नहीं करते हैं, अंतर (svn, git, hg ... आदि) दिखाएगा जैसे कि पूरी लाइन बदल गई, यहां तक ​​कि फैंसी उपकरण भी, कभी-कभी आपको एक सादे रेखा पर जल्दी से देखने की आवश्यकता हो सकती है। -बड़े हुए अंतर को देखने के लिए कि क्या बदल गया है।
  • एनोटेशन टूल (जैसे कि git blame) लाइन को परिवर्तित होने के रूप में दिखाएगा, जिससे वास्तविक परिवर्तन खोजने के लिए लाइन के मूल को ट्रैक करना अधिक कदम होगा ।

ये दोनों छोटे हैं, और यह इस बात पर निर्भर करते हैं कि आप कोड-समीक्षा या ट्रैकिंग-डाउन में कितना समय बिताते हैं जो कोड की बदली हुई रेखाएं हैं।

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


इसके लिए एक अपवाद है, कोड-बेस के लिए जो {अपनी लाइन पर है - यह कोई समस्या नहीं है।

Diff शोर तर्क नहीं रखता है अगर तुम इस शैली में लिखें:

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

हालाँकि, यह इतना आम सम्मेलन नहीं है, इसलिए मुख्य रूप से पूर्णता के लिए उत्तर को जोड़ना (सुझाव नहीं है कि परियोजनाओं को इस शैली का उपयोग करना चाहिए)


8
मुझे लगता है कि कम परिभाषित शोर एक परिभाषित प्लस है।
मार्टिन यॉर्क

2
यदि केवल हर कोई जो JSON के बारे में पागल है, तो शोर के लिए कोई विचार नहीं था! मैं आपको देख रहा हूं, कोई अंतिम-कॉमा नियम नहीं।
रोमन स्टार्कोव

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

1
@ पीटर-कॉर्ड भी, {ऑन- ऑफ़ -इट्स-लाइन शैली का प्रशंसक नहीं है , केवल उत्तर पूर्णता के लिए इसे शामिल किया है। मैक्रोस पर भरोसा करने के लिए उपयोग करने के लिए do{}while(0), मुझे लगता है कि समस्या यह है कि आप लगभग हर समय इस पर भरोसा कर सकते हैं । समस्या यह है कि दुर्घटनाएं होती हैं, कोड समीक्षा से त्रुटियां हो सकती हैं ... और बग को शुरू किया जा सकता है जो अन्यथा नहीं होता।
1:42 पर ideasman42

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

15

कुछ साल पहले, मुझे कुछ C कोड डीबग करने के लिए लाया गया था। बग को खोजने के लिए मुश्किल था, लेकिन अंततः यह एक बयान की तरह उबला हुआ था:

if (debug)
   foo (4);

और यह पता चला कि जिस व्यक्ति ने लिखा था, उसने fooएक स्थूल के रूप में परिभाषित किया था । इसमें कोड की दो पंक्तियों के साथ एक मैक्रो । और निश्चित रूप से, उन दो पंक्तियों में से पहला विषय था if। (तो दूसरी पंक्ति को बिना शर्त के निष्पादित किया गया था।)

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

अब मैं इंडेंट करता हूं और हर किसी से अलग-अलग ब्रेसिज़ का उपयोग करता हूं, जाहिरा तौर पर। एक पंक्ति के लिए if, मैं यह करूंगा:

if (debug) { foo (4); }

इसलिए इसमें ब्रेसिज़ को शामिल करने के लिए कोई अतिरिक्त लाइनें नहीं हैं।


6
उस मामले में, जिसने भी लिखा कि स्थूल दोष है।
gnasher729

6
सी प्रीप्रोसेसर मैक्रोज़ को सही ढंग से लिखना सहज नहीं हो सकता है, लेकिन यह किया जा सकता है। और यह किया जाना चाहिए, क्योंकि gnasher729 बताते हैं। और आपका उदाहरण यही कारण है कि किसी भी मैक्रो जिसमें एक से अधिक कथन शामिल हैं, उसके शरीर को एक do { ... } while(0)लूप में शामिल करना चाहिए । यह न केवल यह सुनिश्चित करेगा कि if()बयानों को संलग्न करके हमेशा सही ढंग से व्यवहार किया जाएगा , बल्कि यह भी कि बयान के अंत में अर्धविराम को सही तरीके से निगल लिया गया है। जो कोई भी इस तरह के सरल नियमों के बारे में नहीं जानता है, बस प्रीप्रोसेसर मैक्रोज़ नहीं लिखना चाहिए। कॉलिंग साइट पर बचाव करना बचाव के लिए गलत जगह है।
13 नवंबर को cmaster

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

@ gnasher729, अगर किसी और की गलती है तो कौन परवाह करता है? यदि आप कोड-समीक्षाएं कर रहे हैं और कुछ उचित कोड मानकों का पालन कर रहे हैं, तो यह आपकी टीमों की गलती हो सकती है। और अगर यह उपयोगकर्ताओं तक पहुँचता है, तो वे छोटी गाड़ी सॉफ्टवेयर जारी करने वाले संगठन को दोष देंगे।
विचारमान ४२

1
जो भी मैक्रों के साथ आया वह गलती पर है।
नेमे

14

"अंकल बॉब" को अपनी राय रखने की अनुमति है, आपको अपनी राय रखने की अनुमति है। उसे चुनौती देने की जरूरत नहीं है।

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

किसी और के कोड के माध्यम से जाना और "बेकार ब्रेसिज़ से छुटकारा पाना" एक बुरी आदत है। केवल अतिरिक्त काम का कारण बनता है जब कोड की समीक्षा करने की आवश्यकता होती है, और जब टकराव अनावश्यक रूप से निर्मित होते हैं। शायद "अंकल बॉब" इतना अविश्वसनीय रूप से अच्छा प्रोग्रामर है कि उसे कोड समीक्षाओं की आवश्यकता नहीं है? मैंने अपने जीवन का एक सप्ताह बर्बाद कर दिया क्योंकि एक शीर्ष प्रोग्रामर ने "if (p! NULL)" को "if (- p)" कोड समीक्षा के बिना सबसे खराब स्थान पर छिपा दिया।

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


1
मुझे लगता है कि यह "चुनौतीपूर्ण" है क्योंकि UB (sic!) अपनी राय को तथ्यों के रूप में प्रस्तुत करता है - जब मैं उसे सुनता हूं तो कम से कम यह मुझ पर प्रहार करता है।
vaxquis

3
"आप जो भी पसंद करते हैं" कहना वास्तव में इस पर अंकल बॉब के साथ सहमत होना है क्योंकि वह जो तर्क देता है वह "कोई फर्क नहीं पड़ता"। कई भाषाओं में यह एक गैर मुद्दा है। मैंने पहले सभी लोगों में सोचा था कि यह एक ऐसा मुद्दा है जिसमें आपको हमेशा ब्रेसिज़ का उपयोग करना चाहिए और किसी को भी चुनौती देते हुए नहीं देखा होगा। अब यहाँ अंकल बॉब इसे चुनौती दे रहे हैं और मुझे आश्चर्य हो रहा है कि क्या वह इसके साथ दूर हो रहा है क्योंकि वह इस तरह के अत्यधिक परिष्कृत छोटे तरीकों में काम करता है या क्योंकि वह इससे भरा हुआ है। मैंने इसके जवाब में बग्स के प्रकार @PaulDraper के उल्लेख के कारण बिल्कुल हानिरहित नहीं सोचा था।
कैंडिड_ऑरेंज

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

9

ब्रेसिज़ न हटाने के मेरे कारण हैं:

  1. निर्णय की थकान को कम करें। यदि आप हमेशा ब्रेसिज़ का उपयोग करते हैं, तो आपको कभी भी यह तय नहीं करना है कि आपको ब्रेस की आवश्यकता है या नहीं।

  2. डेवलपमेंट ड्रैग को कम करें: भले ही आप अंततः लॉजिक की सभी कई लाइनों को निकालने का प्रयास करते हों , लेकिन अगर ब्रेस्लेट को एक ब्रोसेड में बदलना है तो लॉजिक को जोड़ना एक डेवलपिंग ड्रैग का कष्टप्रद सा ​​है। इसलिए ब्रेसिज़ निकालने का प्रयास, और अधिक कोड की आवश्यकता होने पर उन्हें फिर से जोड़ने का प्रयास है। छोटे, लेकिन कष्टप्रद।


0

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

Fwiw, हम एक समझौता है कि उन्हें एक लाइन पर डाल इतने कम पूर्व शर्त नहीं है पर सहमत हुए संयुक्त राष्ट्र मेरे लिए ध्यान भंग पठनीय /। उदाहरण के लिए

if (!param) { throw invalid_argument (blahblah); }
if (n < 2) { return 0; }
// real code for function starts here...

मैं यह भी इंगित करता हूं कि ये परिचयात्मक प्राथमिकताएं अक्सर शरीर के लिए नियंत्रण-प्रवाह कथन हैं (उदाहरण के लिए return) इसलिए एक दूसरे बयान को जोड़ने का डर है जो एक ही स्थिति के तहत होता है और ब्रेस लिखना लिखना भूल जाता है। इस शर्त के तहत एक दूसरा बयान वैसे भी मृत कोड होगा और इसका कोई मतलब नहीं होगा।

मुझे संदेह है कि पढ़ने के मुद्दे में प्रवाह व्यक्ति के ब्रेन पार्सर के कारण सशर्त विवरण के हिस्से के रूप में ब्रेसिज़ होने के कारण होता है। यह C ++ के व्याकरण का एक सटीक प्रतिनिधित्व नहीं है, लेकिन पहले कुछ अन्य भाषाओं को सीखने का एक दुष्प्रभाव हो सकता है , जहां यह मामला है।


1
चाचा बॉब शायद सोचते हैं कि वह उनके बिना बेहतर कोड जल्दी लिखता है।
djechlin

2
जैसा कि मैं, और अन्य लोग C ++ में धाराप्रवाह हैं।
JDługosz

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

... और इस तरह यह अकेले करने का कारण है जिस तरह से अंकल बॉब चाहते हैं।
djechlin

-1

अभी-अभी उस वीडियो को देखने के बाद, मैंने देखा कि ब्रेसिज़ को हटाने से यह देखना आसान हो जाता है कि कोड को अभी भी कहां रिफ्लेक्ट करना है। यदि आपको ब्रेस की आवश्यकता है, तो आपका कोड शायद थोड़ा क्लीनर हो सकता है।

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


इससे पहले किए गए 10 अंकों से अधिक कुछ भी नहीं दिया गया है और पहले 10 उत्तरों में समझाया गया है
gnat

-3

मुझे ऐसा नहीं करने के लिए सिखाया गया था क्योंकि यह एक अन्य इंडेंटेड लाइन को जोड़कर बग को पेश करना आसान बनाता है यह सोचकर कि अगर यह नहीं है तो इसे नियंत्रित किया जाता है।

यदि आपका कोड अच्छी तरह से इकाई-परीक्षण किया गया है , तो इस तरह का "बग" चेहरे में फट जाएगा।

किसी भी बेकार और बदसूरत कोष्ठक से बचकर कोड को साफ करना एक अभ्यास है जिसका मैं पालन करता हूं।


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

3
रूख की टिप्पणी को जोड़ने के लिए: 100% यूनिट एक कोड का परीक्षण करना संभव नहीं है।
B46ови।

कृपया मेरा कोड देखें;) TDD का अभ्यास करते समय, इस तरह के बग को बहुत जल्दी दिखाना हमेशा संभव होता है।
मिक 378

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