C++ में कोड रिव्यू: क्या जाँचें और व्यवहार में फीडबैक कैसे दें
\n\nCode review केवल एक औपचारिकता नहीं है, बल्कि कोड की गुणवत्ता बढ़ाने का एक शक्तिशाली उपकरण है। C++ में, भाषा की जटिलता के कारण रिव्यू विशेष रूप से महत्वपूर्ण है: मैन्युअल मेमोरी प्रबंधन, टेम्पलेट्स, एकाधिक इनहेरिटेंस। इस लेख में, हम चर्चा करेंगे कि C++ कोड की जाँच करते समय किन बातों पर ध्यान देना चाहिए और टिप्पणियाँ कैसे तैयार करें ताकि वे उपयोगी हों, न कि आपत्तिजनक।
\n\n1. मेमोरी सुरक्षा और RAII
\n\nसबसे पहले जाँचने वाली बात है — संसाधन प्रबंधन। C++ में गार्बेज कलेक्टर नहीं है, इसलिए मेमोरी लीक और डबल फ्री होना एक सामान्य समस्या है। मुख्य पैटर्न RAII (Resource Acquisition Is Initialization) है।
\n\nक्या जाँचें:
\n- \n
- क्या नंगे
new/deleteके बजाय स्मार्ट पॉइंटर्स (std::unique_ptr,std::shared_ptr) का उपयोग किया जा रहा है? \n - क्या कोड में मैन्युअल रूप से
deleteकॉल किया गया है? (निम्न-स्तरीय कार्य के दुर्लभ मामलों को छोड़कर) \n - क्या RAII क्लासेस सही ढंग से लागू की गई हैं: कंस्ट्रक्टर में संसाधन प्राप्त होता है और डिस्ट्रक्टर में मुक्त होता है? \n
- क्या बेस क्लास में वर्चुअल डिस्ट्रक्टर भूल गया है? \n
// ❌ खराब: मैन्युअल प्रबंधन\nvoid process() {\n int* data = new int[100];\n // ... यदि अपवाद आता है, तो मेमोरी लीक हो जाएगी\n delete[] data;\n}\n\n// ✅ अच्छा: std::vector के माध्यम से RAII\nvoid process() {\n std::vector<int> data(100);\n // अपवादों के मामले में सुरक्षित\n}\n\nफीडबैक कैसे दें: "आप मेमोरी डिलीट करना भूल गए" कहने के बजाय कहें: "यहाँ std::vector या std::unique_ptr का उपयोग करना बेहतर होगा — यह स्वचालित रूप से संसाधनों को मुक्त करेगा और कोड को अपवाद-सुरक्षित बनाएगा"।
2. Const-correctness और संदर्भ
\n\nC++ स्पष्ट रूप से यह बताने की अनुमति देता है कि डेटा नहीं बदलना चाहिए। इससे पठनीयता बढ़ती है और कंपाइलर को कोड को बेहतर ढंग से ऑप्टिमाइज़ करने में मदद मिलती है।
\n\nक्या जाँचें:
\n- \n
- क्या वे सभी पैरामीटर जो बदलते नहीं हैं,
constसे चिह्नित हैं? \n - क्या बड़े ऑब्जेक्ट्स को मान के बजाय कॉन्स्टेंट संदर्भ (
const T&) द्वारा पास किया जा रहा है? \n - क्या वे विधियाँ जो ऑब्जेक्ट को नहीं बदलतीं,
constके रूप में चिह्नित हैं? \n - क्या बिना अत्यधिक आवश्यकता के
const_castका उपयोग नहीं किया जा रहा है? \n
// ❌ खराब: बड़े ऑब्जेक्ट की कॉपी करना\nstd::string toUpper(std::string s); // कॉपी\n\n// ✅ अच्छा: कॉन्स्टेंट संदर्भ\nstd::string toUpper(const std::string& s); // बिना कॉपी के\n\n// ❌ खराब: विधि const नहीं है, जबकि स्थिति नहीं बदलती\nclass Point {\n int x, y;\npublic:\n int getX() { return x; } // const होना चाहिए\n};\n\n// ✅ अच्छा\nint getX() const { return x; }\n\nफीडबैक कैसे दें: "आइए उन पैरामीटर्स के लिए const जोड़ें जो बदलते नहीं हैं — इससे इंटरफ़ेस स्पष्ट होगा और आकस्मिक परिवर्तनों को रोका जा सकेगा"।
\n\n3. STL और एल्गोरिदम का उपयोग
\n\nC++ की मानक लाइब्रेरी में कई तैयार समाधान हैं। पहिये का पुनः आविष्कार करना शुरुआती लोगों की एक सामान्य गलती है।
\n\nक्या जाँचें:
\n- \n
- क्या ऐसे मैन्युअल लूप हैं जिन्हें एल्गोरिदम (
std::find,std::sort,std::transform) से बदला जा सकता है? \n - क्या कंटेनर सही ढंग से चुना गया है? (यादृच्छिक पहुँच के लिए
std::vector, बीच में बार-बार इन्सर्शन के लिएstd::list) \n - क्या बिना कॉपी किए स्ट्रिंग पास करने के लिए
std::string_viewका उपयोग किया जा रहा है? \n - क्या ज्ञात आकार होने पर
std::vectorके लिएreserve()भूल गया है? \n
// ❌ खराब: मैन्युअल खोज\nbool contains(const std::vector<int>& v, int val) {\n for (size_t i = 0; i < v.size(); ++i) {\n if (v[i] == val) return true;\n }\n return false;\n}\n\n// ✅ अच्छा: STL का उपयोग\nbool contains(c