जावास्क्रिप्ट में कोड रिव्यू: क्या जाँचें और फीडबैक कैसे दें
Code review (कोड रिव्यू) पुल-रिक्वेस्ट मर्ज करने से पहले सिर्फ एक औपचारिक जाँच नहीं है। यह कोड की गुणवत्ता बढ़ाने, टीम में ज्ञान साझा करने और शुरुआती चरणों में बग को रोकने का एक शक्तिशाली उपकरण है। जावास्क्रिप्ट और Node.js की दुनिया में, जहाँ एसिंक्रोनसिटी और डायनामिक टाइपिंग कई छिपे हुए जाल बनाती है, एक अच्छा रिव्यू बेहद महत्वपूर्ण हो जाता है।
इस लेख में, हम विस्तार से देखेंगे कि जावास्क्रिप्ट कोड की समीक्षा करते समय विशेष रूप से किन बातों पर ध्यान देना चाहिए, और फीडबैक कैसे दें ताकि वह उपयोगी हो, न कि आपत्तिजनक।
1. तर्क, आर्किटेक्चर और सुरक्षा
सबसे पहले जाँचें कि क्या कोड दिए गए कार्य को हल करता है। तुरंत फ़ॉर्मेटिंग में न उलझें। अपने आप से ये प्रश्न पूछें:
- क्या तर्क सही ढंग से काम करता है? क्या कोई किनारे के मामले (edge cases) हैं? यदि
null,undefinedया खाली ऐरे आता है तो क्या होगा? - क्या कोई कमज़ोरियाँ हैं? Node.js में यह विशेष रूप से प्रासंगिक है। जाँचें कि क्या अनुरोध से कच्चा डेटा सीधे SQL क्वेरी (SQL-इंजेक्शन) या
eval()में पास नहीं किया जा रहा है। क्या HTML के लिए सैनिटाइज़र का उपयोग किया जा रहा है? - क्या आर्किटेक्चर का पालन किया गया है? क्या कोड SOLID सिद्धांतों का उल्लंघन करता है? उदाहरण के लिए, क्या एक फ़ंक्शन बहुत अधिक काम कर रहा है? क्या बिज़नेस लॉजिक को रूट हैंडलर से अलग किया गया है?
// खराब: लॉजिक और HTTP लेयर का मिश्रणapp.get('/user/:id', async (req, res) => { const user = await db.query(`SELECT * FROM users WHERE id = ${req.params.id}`); // SQL Injection! res.json(user);});
// अच्छा: जिम्मेदारियों का पृथक्करणconst getUserById = async (id) => { if (!id || typeof id !== 'string') throw new Error('Invalid ID'); return await db.query('SELECT * FROM users WHERE id = $1', [id]);};app.get('/user/:id', async (req, res) => { const user = await getUserById(req.params.id); res.json(user);});2. एसिंक्रोनसिटी और प्रॉमिस के साथ काम करना
यह कई जावास्क्रिप्ट डेवलपर्स की अकिलीज़ हील है। Node.js कोड की समीक्षा करते समय, निम्नलिखित की जाँच अवश्य करें:
- एरर हैंडलिंग. क्या सभी एसिंक्रोनस फ़ंक्शन try/catch में लपेटे गए हैं? क्या प्रॉमिस का
.catch()भूला तो नहीं गया है? क्या कोई "अनाथ" प्रॉमिस (unhandled promise rejections) लटके हुए हैं? - async/await का सही उपयोग. क्या वहाँ अनावश्यक
awaitहै जहाँ प्रॉमिस कोPromise.allके माध्यम से समानांतर में चलाया जा सकता है? - रेस कंडीशन (race conditions). क्या एक ही संसाधन (जैसे फ़ाइल या ग्लोबल वेरिएबल) पर समानांतर अनुरोधों के साथ कोड गलत तरीके से निष्पादित हो सकता है?
// खराब: स्वतंत्र अनुरोधों का क्रमिक निष्पादनconst user = await getUser(id);const posts = await getPosts(id);
// अच्छा: समानांतर निष्पादनconst [user, posts] = await Promise.all([getUser(id), getPosts(id)]);
// खराब: भूली हुई एरर हैंडलिंगrouter.get('/data', async (req, res) => { const data = await fetchData(); // अगर fetchData विफल होता है, तो सर्वर भी "गिर" जाएगा res.json(data);});
// अच्छाrouter.get('/data', async (req, res, next) => { try { const data = await fetchData(); res.json(data); } catch (error) { next(error); // एरर को ग्लोबल हैंडलर को भेजें }});3. कोड गुणवत्ता, शैली और नामकरण
कोड एक अच्छी किताब की तरह पढ़ने योग्य होना चाहिए। भले ही तर्क सही हो, खराब शैली भविष्य में विकास को धीमा कर देगी।
- वेरिएबल और फ़ंक्शन का नामकरण. नामों से "यह क्या है?" और "यह क्या करता है?" का पता चलना चाहिए। एक-अक्षर वाले वेरिएबल (लूप काउंटर को छोड़कर) और
getUsrInfजैसे संक्षिप्ताक्षरों से बचें। - मैजिक नंबर और स्ट्रिंग्स. क्या उन्हें कॉन्स्टेंट में रखा गया है?
const MAX_RETRIES = 3;समझने में कहीं अधिक आसान है,