C++ में स्वच्छ कोड: पांडित्य नहीं, बल्कि सम्मान की बात
\n\nयदि आपने कभी एक साल पहले "जल्दी-जल्दी" लिखी गई परियोजना खोली हो और doStuff() नामक फ़ंक्शन को समझ न पाए हों, तो आप जानते हैं कि मैं किस बारे में बात कर रहा हूँ। C++ में स्वच्छ कोड केवल सौंदर्यशास्त्र नहीं है। यह समय, तनाव और पैसे की बचत है। C++ एक शक्तिशाली भाषा है, लेकिन धोखेबाज भी: मेमोरी मैन्युअल रूप से प्रबंधित की जाती है, टेम्पलेट राक्षस पैदा कर सकते हैं, और ऑपरेटर ओवरलोडिंग असली जादू है। अनुशासन के बिना, कोड जल्दी से "स्पेगेटी" में बदल जाता है।
इस लेख में, हम चर्चा करेंगे कि C++ में स्वच्छ कोड कैसे लिखें ताकि इसे पढ़ना, बनाए रखना और विस्तारित करना आसान हो। कोई बेकार बात नहीं - केवल अभ्यास, उदाहरण और सिद्ध सिद्धांत।
\n\nनियम #1: नामकरण 50% सफलता है
\n\nचर, फ़ंक्शन और वर्गों के नाम "यह क्या है?" या "यह क्या करता है?" प्रश्न का उत्तर देने चाहिए। int x और void f() को भूल जाइए। सार्थक नामों का उपयोग करें।
खराब उदाहरण
\nint d; // d क्या है? दूरी? तारीख? मूर्ख?\nvoid p() { // प्रिंट करता है? पार्स करता है? रोता है?\n // ...\n}\n\nअच्छा उदाहरण
\nint distanceInMeters;\nvoid printUserProfile() {\n // ...\n}\n\nसुझाव: एक ही शैली का पालन करें। C++ के लिए मानक है: चर और फ़ंक्शन के लिए camelCase, वर्गों के लिए PascalCase। एक ही परियोजना में snake_case और camelCase न मिलाएं - इससे पठनीयता कम होती है।
नियम #2: फ़ंक्शन छोटे होने चाहिए और एक ही काम करने चाहिए
\n\nएकल जिम्मेदारी का सिद्धांत (Single Responsibility) न केवल वर्गों के लिए, बल्कि फ़ंक्शन के लिए भी काम करता है। आदर्श फ़ंक्शन 5-20 पंक्तियों का होता है। यदि कोई फ़ंक्शन एक से अधिक कार्य करता है - तो उसे विभाजित करें।
\n\nखराब
\nvoid processData(vector<int>& data) {\n // सॉर्टिंग\n sort(data.begin(), data.end());\n // फ़िल्टरिंग\n vector<int> filtered;\n for (int x : data) if (x > 0) filtered.push_back(x);\n // आउटपुट\n for (int x : filtered) cout << x << " ";\n}\n\nअच्छा
\nvector<int> filterPositive(const vector<int>& data) {\n vector<int> result;\n for (int x : data) if (x > 0) result.push_back(x);\n return result;\n}\n\nvoid printData(const vector<int>& data) {\n for (int x : data) cout << x << " ";\n}\n\nvoid processData(vector<int>& data) {\n sort(data.begin(), data.end());\n auto filtered = filterPositive(data);\n printData(filtered);\n}\n\nअब प्रत्येक फ़ंक्शन को अलग-अलग पुन: उपयोग और परीक्षण किया जा सकता है। C++ में स्वच्छ कोड का अर्थ है मॉड्यूलरिटी।
\n\nनियम #3: जादुई संख्याओं और स्ट्रिंग्स से बचें
\n\nवे संख्याएँ और स्ट्रिंग्स जिनका अर्थ संदर्भ से स्पष्ट नहीं है, बुरी हैं। उन्हें स्थिरांक में रखें।
\n\nखराब
\nif (temperature > 100) {\n cout << "खतरनाक!";\n}\n\nअच्छा
\nconstexpr int MAX_SAFE_TEMPERATURE = 100;\n\nif (temperature > MAX_SAFE_TEMPERATURE) {\n cout << "खतरनाक!";\n}\n\nअब, यदि सीमा बदलती है, तो आप इसे एक ही स्थान पर बदलेंगे। कोड में सभी 100 खोजने की आवश्यकता नहीं होगी।
नियम #4: टिप्पणियाँ खराब कोड का बहाना नहीं हैं
\n\nसबसे अच्छी टिप्पणी वह है जिसकी आवश्यकता नहीं है, क्योंकि कोड स्वयं बोलता है। "कोड क्या करता है" न लिखें - यह दिखाई देता है। "वह ऐसा क्यों करता है" लिखें।
\n\nखराब टिप्पणी
\n// i को 1 से बढ़ाएँ\ni++;\n\nअच्छी टिप्पणी
\n// POD प्रकारों के लिए प्री-इन्क्रीमेंट का उपयोग करें - तेज़ है\n++i;\n\nअधूरे भागों के लिए // TODO: का उपयोग करें, लेकिन इसका दुरुपयोग न करें। आदर्श कोड को स्पष्टीकरण की आवश्यकता नहीं होती।
नियम #5: RAII और स्मार्ट पॉइंटर्स का उपयोग करें
\n\nC++ मैन्युअल मेमोरी प्रबंधन के लिए प्रसिद्ध है, लेकिन आधुनिक C++ (C++11 और उसके बाद) में शक्तिशाली उपकरण हैं