C में विभिन्न लाइनों पर फ़ंक्शन प्रकार और विधि का नाम रखने का कारण


16

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

void foo() {
}

यह होना चाहिए

void
foo() {
}

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


3
यह जीएनयू मानक में है (जरूरी नहीं कि यह अच्छी बात है, ब्रेसिंग शैली अजीब है)। gnu.org/prep/standards/standards.html#Formatting
Gauthier

जवाबों:


19

सोच रहा था कि क्या व्यक्तिगत पसंद के अलावा कोई कारण है कि लोग दूसरी शैली का उपयोग क्यों करें?

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

एक और कारण यह है कि फ़ंक्शन नाम हमेशा पहले कॉलम में शुरू होते हैं। वापसी के प्रकार लंबाई में भिन्न होते हैं और कुछ हद तक जटिल हो सकते हैं - प्रकार को अपनी लाइन पर रखने से फ़ंक्शन नाम खोजने में आसान हो जाता है।

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


2
मुझे लगता है कि यह अभी भी 80 प्रोग्रामर लाइन सीमा से जुड़ा हुआ है जो कई प्रोग्रामर द्वारा उपयोग और बचाव किया गया है। यदि आप एक 80 वर्णों की सीमा चाहते हैं और आप वर्णनात्मक विधि / फ़ंक्शन नामों का उपयोग करना चाहते हैं, तो आपको कुछ समझौते करने होंगे। विधि हेडर को विभाजित करना उनमें से एक है।
सुल्तान

घोषणा भी लंबी हो सकती है - अलग-अलग (गैर-मानक) संशोधकों के बारे में सोचें, जैसे कि कन्वेंशन आइडेंटिफ़ायर (stdcall, आदि), प्रतीक दृश्यता (DLLEXPORT) या __attributes पर जानकारी । और फिर जब आप C ++ को देख रहे हैं तो आपके पास अपेक्षाकृत जटिल रिटर्न प्रकार हो सकते हैं ताकि कहीं एक लाइन ब्रेक को जोड़ना पड़े।
जोहान्स

@ सुल्तान यह केवल प्रोग्रामर (जो टर्मिनल खिड़कियों के लिए और टर्मिनल संपादकों का उपयोग करने के लिए उपयोग किया जाता है), दिलचस्प नहीं है। टाइपसेटिंग में, 72-80 वर्णों को आमतौर पर पठनीयता के संदर्भ में पाठ के कॉलम के लिए आदर्श चौड़ाई माना जाता है। (इसलिए क्यों TeX और इसके डेरिवेटिव डिफ़ॉल्ट हैं जो कुछ लोग अजीब से संकीर्ण कॉलम मानते हैं।)
JAB

1
@JAB मैं वास्तव में अब है कि। मुझे यह भी पता है कि एक उचित पाठ पढ़ना और स्रोत कोड पढ़ना दो बहुत अलग चीजें हैं और इनमें लगभग कुछ भी सामान्य नहीं है इसलिए आदर्श चौड़ाई अप्रासंगिक है।
सुल्तान

1
"एक और कारण यह है कि फ़ंक्शन नाम हमेशा पहले कॉलम में शुरू होते हैं [और इसलिए] खोजने में आसान होते हैं।" और यह केवल एक दृश्य लाभ की तुलना में बहुत अधिक है: अब हम रेगेक्स की खोज कर सकते हैं ^start_of_a_long_funcऔर उस फ़ंक्शन को तुरंत ले जा सकते हैं जिसे हम खोज रहे हैं।
अंडरस्कोर_ड

7

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

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

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

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

double dot(x, y);

अभी भी बहुत सुपाच्य है।

C ++ ने इसे थोड़ा बदतर बना दिया। इसने हस्ताक्षर में तर्क प्रकार के विनिर्देशों को हस्तांतरित कर दिया जिससे हस्ताक्षर अधिक लंबे हो गए। इस सिंटैक्स को बाद में सी के मानकीकरण के दौरान अपनाया गया था।

static struct origin *find_origin(struct scoreboard *sb,
                  struct commit *parent,
                  struct origin *origin)

कम सुपाच्य है, लेकिन बहुत बुरा नहीं है। (गिट से अंश)

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

template <class A1, class A2, class A3, class A4, class A5, class A6>
inline typename normalise<policy<>, A1, A2, A3, A4, A5, A6>::type make_policy(const A1&, const A2&, const A3&, const A4&, const A5&, const A6&)
{ 
   typedef typename normalise<policy<>, A1, A2, A3, A4, A5, A6>::type result_type;
   return result_type(); 
}

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

सी, सी ++ और उनके डेरिवेटिव, जावा और सी #, पठनीय घोषणाएं / परिभाषाएं होने के अपवाद प्रतीत होते हैं। उनके लोकप्रिय पूर्ववर्तियों और साथियों (फोरट्रान, ALGOL, पास्कल) ने परिणाम प्रकारों से पहले नाम रखे और, शुक्र है, उनके कई उत्तराधिकारियों (गो, स्काला, टाइपस्क्रिप्ट, और स्विफ्ट का नाम कुछ) ने अधिक पठनीय वाक्यविन्यास भी चुना है।


1
आभारी रहें कि आपको फोरट्रान कार्यक्रम लिखने की ज़रूरत नहीं है। मैं आपको बताता हूं, अलग-अलग घोषित करने से आपके फ़ंक्शन के तर्क आपके तंत्रिकाओं पर बहुत जल्दी हो जाएंगे, जब आप इसे करने के लिए मजबूर होते हैं। विशेष रूप से जब यह समझने के लिए फ़ंक्शन हस्ताक्षर पढ़ने की कोशिश की जाती है कि यह क्या तर्क देता है: C ++ उन प्रकारों को सही रखता है जहां वे हैं, तो फोरट्रान आपको इसके प्रकार को निर्धारित करने के लिए चर नाम के लिए एक विज़ुअल कीवर्ड खोज शुरू करने के लिए मजबूर करता है।
cmaster - मोनिका

2
C ++ द्वारा वास्तव में आविष्कार किए गए फ़ंक्शन घोषणा में प्रकार डाल रहा था? मैंने ऐसा कभी नहीं सुना था कि मामला हो, और मैं उद्धरण खोजने के लिए संघर्ष कर रहा हूं।
अंडरस्कोर_ड

1
सी भाषा का विकास देखें । मानकीकरण अनुभाग में रिची का उल्लेख है कि वाक्य रचना C ++ से उधार ली गई थी।
user2313838 14

5

मैं पहली बार इस शैली को 19 वें वर्ष में C & C ++ के साथ काम कर रहा था। बहुत ज्यादा इस बात पर चकित था कि कोई इस बुरी चीज़ का आविष्कार कैसे कर सकता है।

एकमात्र (संभावित) सकारात्मक बिंदु जो मैं पा सकता था, वह यह है कि आप grep ^ FuncName का उपयोग करके फंसीटॉन परिभाषा पा सकते हैं। कुछ वास्तविक टूल से समुदायों को नफरत करने में प्रासंगिक कारक दशक पहले + हो सकता है ... मैंने जिस जगह पर देखा था, उसे C ++ और क्लास के सदस्य फ़िक्शनों पर लागू किया गया था, जो इस विशेषता को भी मारते हैं।

मेरी राय मानें। :)


1
grep -P '^(\w+::)?FuncName'
काइल स्ट्रैंड

हाँ, फ़ंक्शन नामों में वर्ग प्रकार इस के उपयोग में बिल्कुल भी बाधा नहीं डालते हैं। तो, यह अभी भी जल्दी से स्रोत फ़ाइलों को नेविगेट करने के लिए एक उपयोगी चीज है। यह बुराई या जो कुछ भी दिख रहा है, उसके लिए राय है: मुझे लगता है कि यह बेहतर लग रहा है।
अंडरस्कोर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.