Go में Code Review: क्या जाँचें और फीडबैक कैसे दें
\nCode Review (कोड रिव्यू) सिर्फ पुल-रिक्वेस्ट मर्ज करने से पहले की औपचारिकता नहीं है। यह कोड की गुणवत्ता बढ़ाने, टीम में ज्ञान साझा करने और शुरुआती चरणों में गलतियों को रोकने का एक शक्तिशाली टूल है। नए Go डेवलपर्स के लिए, रिव्यू में भाग लेना तनावपूर्ण हो सकता है: आलोचना मिलने का डर या, इसके विपरीत, कोई गंभीर गलती छूट जाने का डर। इस लेख में, हम जानेंगे कि Go कोड के रिव्यू में किन बातों पर ध्यान देना चाहिए और फीडबैक कैसे दें ताकि वह उपयोगी हो, न कि अपमानजनक।
\n\nGo में Code Review क्यों महत्वपूर्ण है?
\nGo भाषा को सादगी, पठनीयता और विश्वसनीयता पर ध्यान देकर बनाया गया है। हालांकि, सिंटैक्स की सादगी लॉजिक की जटिलता को खत्म नहीं करती। Go प्रोजेक्ट्स में सामान्य समस्याएं हैं: एरर को इग्नोर करना, गोरूटीन के साथ गलत काम करना, और रिसोर्स लीक। एक अच्छा code review इन और अन्य समस्याओं को प्रोडक्शन में जाने से पहले पकड़ने में मदद करता है।
\n\nGo कोड में क्या जाँचें: शुरुआती के लिए चेकलिस्ट
\nरिव्यू को व्यवस्थित बनाने के लिए, एक चेकलिस्ट का उपयोग करें। यहाँ वे मुख्य बिंदु हैं जिन्हें हर पुल-रिक्वेस्ट में जाँचना चाहिए।
\n\n1. एरर हैंडलिंग (Error Handling)
\nGo में, एरर वैल्यू हैं, इन्हें इग्नोर नहीं किया जा सकता। जाँचें कि हर फंक्शन जो error रिटर्न करता है, उसे हैंडल करता है या स्पष्ट रूप से ऊपर भेजता है।
// बुरा: एरर को इग्नोर करना\nfile, _ := os.Open("config.yaml")\n\n// अच्छा: एरर को हैंडल करना\nfile, err := os.Open("config.yaml")\nif err != nil {\n log.Fatalf("config नहीं खुल सकता: %v", err)\n}\ndefer file.Close()\nयह भी जाँचें कि एरर को fmt.Errorf("...: %w", err) के साथ रैप किया गया है ताकि कॉन्टेक्स्ट मिले, न कि सिर्फ लॉग करके निगल लिया जाए।
2. नामकरण और पठनीयता
\nGo में वेरिएबल के लिए छोटे नाम (जैसे, r reader के लिए, w writer के लिए) और एक्सपोर्टेड फंक्शन के लिए लंबे नाम आम हैं। जाँचें कि:
- \n
- एक्सपोर्टेड फंक्शन, टाइप और वेरिएबल में कमेंट हों (एंटिटी के नाम से शुरू हों)। \n
- वेरिएबल के नाम उनके उद्देश्य को दर्शाते हों (
a,b,tmpन हों)। \n - कोई अनावश्यक संक्षिप्त नाम न हो (
calcकी जगहcalculateबेहतर है)। \n
3. गोरूटीन और कंकरेंसी
\nगोरूटीन एक शक्तिशाली लेकिन खतरनाक टूल है। जाँचें:
\n- \n
- क्या साझा डेटा के लिए सिंक्रोनाइज़ेशन मैकेनिज्म (चैनल, म्यूटेक्स) मौजूद है। \n
- क्या कोई "लीक" होने वाली गोरूटीन (goroutine leak) तो नहीं बन रही है। कैंसिलेशन के लिए कॉन्टेक्स्ट (
context.Context) का उपयोग करें। \n - क्या गोरूटीन हमेशा के लिए ब्लॉक (deadlock) तो नहीं हो रही है। \n
// गोरूटीन के साथ सुरक्षित काम का उदाहरण\nfunc worker(ctx context.Context, jobs <-chan int, results chan<- int) {\n for {\n select {\n case job, ok := <-jobs:\n if !ok {\n return\n }\n results <- job * 2\n case <-ctx.Done():\n return\n }\n }\n}\n\n4. रिसोर्स मैनेजमेंट (defer)
\nजाँचें कि सभी खोली गई फाइलें, नेटवर्क कनेक्शन, DB ट्रांजैक्शन defer के माध्यम से बंद हो रहे हैं। यह रिसोर्स खोलने के तुरंत बाद किया जाना चाहिए।
// सही: तुरंत बंद करना\nconn, err := net.Dial("tcp", "example.com:80")\nif err != nil {\n return err\n}\ndefer conn.Close()\n\n5. टेस्टिंग
\nनए डेवलपर्स अक्सर टेस्ट लिखना भूल जाते हैं। सुनिश्चित करें कि नए लॉजिक के लिए unit-टेस्ट लिखे गए हैं। जाँचें:
\n- \n
- टेस्ट सिर्फ हैप्पी पाथ (happy path) ही नहीं, बल्कि बॉर्डर केस (edge cases) को भी कवर करते हैं। \n
- सब-टेस्ट के लिए
t.Runका उपयोग किया गया है या नहीं। \n - कोई ऐसा टेस्ट तो नहीं जो बिना मॉक के बाहरी रिसोर्स (DB, नेटवर्क) पर निर्भर हो। \n
फीडबैक कैसे दें: शुरुआती के लिए 5 नियम
\nतकनीकी हिस्सा आधा काम है। दूसरा आधा है संवाद करने की कला। यहाँ कुछ नियम हैं: