कोड रिव्यू दोष ढूंढ़ने के बारे में नहीं, बल्कि गुणवत्ता के बारे में क्यों है
\nकल्पना करें: आप एक सहकर्मी का पुल-रिक्वेस्ट खोलते हैं। उसमें 500 लाइनों का कोड है, कॉपी-पेस्ट की बू आ रही है, और एक जगह पर कोई संसाधन बंद करना भूल गया है। आपका काम सिर्फ बग ढूंढ़ना नहीं है, बल्कि कोड को बेहतर बनाना है। जावा में कोड रिव्यू पुलिसिया निगरानी नहीं, बल्कि सामूहिक रचनात्मकता है। एक अच्छा रिव्यूअर टीम को तकनीकी कर्ज से बचाता है, एक बुरा रिव्यूअर हतोत्साहित करता है या कमजोरियों को छोड़ देता है।
\nइस लेख में, मैं बताऊंगा कि कोड रिव्यू में क्या जांचें जावा में, ताकि छोटी-छोटी बातों पर समय बर्बाद न हो, लेकिन महत्वपूर्ण चीज़ें छूटें नहीं। आपको एक तैयार चेकलिस्ट और अभ्यास से उदाहरण मिलेंगे।
\n\nआर्किटेक्चर और डिज़ाइन: जड़ को देखें
\nविवरण में जाने से पहले, बड़ी तस्वीर का आकलन करें। खराब आर्किटेक्चर फ़ॉर्मेटिंग से ठीक नहीं होता।
\nSOLID का उल्लंघन
\nजांचें कि कहीं क्लास 'दिव्य वस्तु' (god object) में तो नहीं बदल गया। Single Responsibility के उल्लंघन का उदाहरण:
\npublic class OrderService {\n public void createOrder(Order order) {\n // वैलिडेशन\n // छूट की गणना\n // ईमेल भेजना\n // लॉगिंग\n // डेटाबेस में सहेजना\n }\n}\n\nयहाँ बदलाव के पाँच कारण हैं। सही तरीका है लॉगिंग और ईमेल भेजने को अलग-अलग सेवाओं में रखना।
\nअत्यधिक जटिलता
\nकभी-कभी कोड एक सरल समस्या को जटिल तरीके से हल करता है। अपने आप से पूछें: "क्या इसे सरल बनाया जा सकता है?" यदि हाँ, तो रिव्यू में लिखें। KISS सिद्धांत याद रखें।
\n\nसुरक्षा: ऐसे छेद जिन्हें अनदेखा नहीं किया जा सकता
\nJava कोड रिव्यू में सुरक्षा जांच शामिल होना अनिवार्य है। भले ही प्रोजेक्ट आंतरिक हो।
\nSQL-इंजेक्शन
\nस्ट्रिंग कॉन्केटनेशन बुराई है:
\n// बुरा\nString query = "SELECT * FROM users WHERE name = '" + userName + "'";\nStatement stmt = connection.createStatement();\nResultSet rs = stmt.executeQuery(query);\n\nसही तरीका है PreparedStatement का उपयोग करना:
// अच्छा\nString query = "SELECT * FROM users WHERE name = ?";\nPreparedStatement pstmt = connection.prepareStatement(query);\npstmt.setString(1, userName);\nResultSet rs = pstmt.executeQuery();\n\nसंवेदनशील डेटा का रिसाव
\nजांचें कि कहीं पासवर्ड, टोकन या कार्ड नंबर लॉग तो नहीं हो रहे। Lombok में @ToString.Exclude या स्पष्ट अनदेखी का उपयोग करें।
असुरक्षित ऑब्जेक्ट तुलना
\n// बुरा (रेफरेंस तुलना)\nif (password == storedPassword) { ... }\n// अच्छा\nif (password.equals(storedPassword)) { ... }\n\n\nप्रदर्शन: अड़चनें
\nसमय से पहले ऑप्टिमाइज़ न करें, लेकिन स्पष्ट धीमेपन को भी न छोड़ें।
\nलूप में अनावश्यक संचालन
\n// बुरा: हर बार length() कॉल होता है\nfor (int i = 0; i < list.size(); i++) { ... }\n// अच्छा\nint size = list.size();\nfor (int i = 0; i < size; i++) { ... }\n\nसरल कार्यों के लिए Stream का उपयोग
\nकभी-कभी सामान्य लूप तेज़ और अधिक पठनीय होता है:
\n// अत्यधिक\nlist.stream().filter(x -> x > 5).collect(Collectors.toList());\n// सरल\nList<Integer> result = new ArrayList<>();\nfor (int x : list) {\n if (x > 5) result.add(x);\n}\n\nमेमोरी लीक
\nजांचें कि कहीं InputStream, Connection या Session बंद करना तो नहीं भूल गए। try-with-resources का उपयोग करें:
try (Connection conn = getConnection();\n PreparedStatement stmt = conn.prepareStatement(sql)) {\n // काम\n} catch (SQLException e) {\n log.error("DB error", e);\n}\n\n\nपठनीयता और शैली: कोड एक किताब की तरह
\nCode review checklist में पठनीयता शामिल होना अनिवार्य है। कोड एक बार लिखा जाता है, दर्जनों बार पढ़ा जाता है।
\nजादुई संख्याएँ और स्ट्रिंग्स
\n// बुरा\nif (status == 3) { ... }\n// अच्छा\nprivate static final int STATUS_COMPLETED = 3;\nif (status == STATUS_COMPLETED) { ... }\n\n