K & R और वन ट्रू ब्रेस स्टाइल (1TBS) स्टाइल में क्या अंतर है?


48

मैंने विकिपीडिया लेख इंडेंट स्टाइल्स पर पढ़ा है , लेकिन मुझे अभी भी समझ नहीं आया है। K & R और 1TBS में क्या अंतर है?


मैंने कहीं पढ़ा है कि K & R में शैली अंतरिक्ष के विचारों द्वारा शासित थी - यानी किताब में कोड को ले जाने वाले ऊर्ध्वाधर स्थान को कम करने के लिए।
ChrisF

@ क्रिस यह स्क्रीन पर वर्टिकल स्पेस को भी कम करता है। जब हमारे पास 80 कॉल x 25 लाइन टर्मिनल थे तो यह इसके लायक था!
मार्टिन बेकेट

7
Apple का "गोटो फेल" एक गंभीर बग का एक बेहतरीन उदाहरण है जिसे निश्चित रूप से 1TBS का उपयोग करके रोका जा सकता है: imperialviolet.org/2014/02/22/applebug.html

4
Apple के बग को एक सिंगल लाइन पर स्टेटमेंट डालने, डेड कोड चेकर का उपयोग करने या इंडेंट-सेंसिटिव भाषा का उपयोग करके भी रोका जा सकता था।
सेस टिम्मरमैन

1
@CeesTimmerman, .. या परीक्षण कर रहे हैं ...
thoni56

जवाबों:


76

कश्मीर एंड आर और एक सच्चे ब्रेस शैली (1TBS) के बीच सबसे बड़ा अंतर यह है कि 1TBS में, सभी है if, else, while, और forभले ही वे आवश्यक नहीं हैं, बयान उद्घाटन और समापन ब्रेसिज़ है। उद्देश्य यह है कि नए बयानों को सम्मिलित करना आसान है और यह जानना कि वे कैसे समूहीकृत होंगे।

उदहारण के लिए:

कश्मीर एंड आर:

int i;
for (i = 0; i < 10; i++)
  printf("Hi.");

1TBS:

int i;
for (i = 0; i < 10; i++) {
  printf("Hi");
}

20

K & R इस तरह है:

if (x) 
    a();
else {
    b();
    c();
}

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

"एक सही ब्रेस स्टाइल" (1TBS या OTBS) एक एकल नियंत्रित कथन को एक संक्षिप्त विवरण में ब्रेसिज़ में संलग्न करके बदल देता है:

if (x) {
    a();
} else {
    b();
    c();
}

ऑलमैन शैली 1TBS से थोड़ा आगे निकल जाती है, और ऊर्ध्वाधर ब्रेस को एक लाइन पर अपने आप ही खोलकर खड़ी रिक्ति को मजबूर करती है:

if (x) 
{
    a();
}
else 
{
    b();
    c();
}

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

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

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

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

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

चूंकि इसे लाया गया था, मैं मल्टी-स्टेटमेंट मैक्रोज़ के साथ स्थिति पर टिप्पणी करूंगा। एक मैक्रो जिसमें कई स्टेटमेंट शामिल हैं, लेकिन उन्हें ब्रेसिज़ के साथ खुद को घेरना नहीं है, एक बग है। मेरा काम उस बग को कवर करने वाले कोड को लिखना नहीं है। इसके विपरीत, मेरा काम उस बग को जल्द से जल्द ढूंढना और मिटाना है।

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


1
सभी टिप्पणियों को हटा दिया गया क्योंकि वे मनमुटाव और शोर में उतरे थे। यदि आपके पास एक वैध बिंदु है तो उसे उत्तर के रूप में पोस्ट करें। आप एक चर्चा चाहते हैं पर ले चैट
ChrisF

8
क्या 1tbs} और एक लाइन पर नहीं रखा जाता है? चमत्कारिक सुंदर समरूपता को संरक्षित करते हुए ऊर्ध्वाधर स्थान को सहेजना बिंदु है!
मार्टिन बेकेट

4
@ जेरी - अच्छी तरह से किसी भी अच्छे पवित्र युद्ध के लिए कुछ विद्वानों की जरूरत है ;-)
मार्टिन बेकेट

6
गोटो असफल; गोटो असफल;
जेमी पाटे

9
हाँ @ JamiePate की टिप्पणी का अनुसरण करने के लिए जो कि Apple SSL बग है जिसका विश्लेषण यहां किया गया हैifइसके बाद इंडेंट किए गए स्टेटमेंट के साथ एक स्टेटमेंट होता है, इस प्रकार यह प्रदर्शित होता है कि वे दोनों सशर्त निष्पादित हैं। लेकिन कोई ब्रेसिज़ नहीं हैं! दूसरा कथन वास्तव में परे है ifऔर हमेशा निष्पादित किया जाएगा, इस प्रकार बग।
कॉलिन डी बेनेट

9

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


2
ऐसा लगता है कि केवल दोहराने के लिए बनाया गया था और पूर्व के उत्तर में बताया गया था
gnat

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