परिचय: क्लीन कोड क्यों ज़रूरी है, कोई विलासिता नहीं
\nहर Java डेवलपर ने कभी न कभी पुराना प्रोजेक्ट खोलकर घंटों यह समझने में बिताए हैं कि उसने खुद कुछ महीने पहले क्या लिखा था। और दूसरों के कोड की तो बात ही छोड़िए। गंदा कोड डेवलपमेंट को धीमा करता है, बग्स की संख्या बढ़ाता है और टीम को डिमोटिवेट करता है। रॉबर्ट मार्टिन की किताब "Clean Code" प्रोग्रामर्स के लिए बाइबल बन गई है, लेकिन इसके सिद्धांत अक्सर अमूर्त ही रह जाते हैं। इस लेख में हम Clean Code की मुख्य अवधारणाओं को Java में वास्तविक उदाहरणों के साथ समझेंगे, जिन्हें आप आज ही अपना सकते हैं।
\nक्लीन कोड का मतलब परफेक्ट सिंटैक्स या फैशन का पीछा करना नहीं है। यह सहकर्मियों, भविष्य के स्वयं और अंततः व्यवसाय के प्रति सम्मान है। पढ़ने योग्य कोड को मेंटेन करना, टेस्ट करना और रिफैक्टर करना आसान होता है। आइए देखें कि Java कोड को "काम करने वाले" से "क्लीन" में कैसे बदलें।
\n\n1. सार्थक नाम: डोमेन की भाषा में बोलें
\nनियम: नाम को "क्यों?", "क्या?", "कैसे?" सवालों का जवाब देना चाहिए
\nखराब नामकरण क्लीन कोड का सबसे बड़ा दुश्मन है। वेरिएबल int a, String d या List<Integer> list1 कोई जानकारी नहीं देते। एक अच्छे नाम को प्रोग्रामर के इरादे को प्रकट करना चाहिए।
// बुरा\nint d; // elapsed time in days\nList<Integer> lst;\n\n// अच्छा\nint daysSinceCreation;\nList<Integer> customerIds;\n\nगलत जानकारी से बचें
\naccountList का उपयोग न करें अगर वह List नहीं है, बल्कि Set या Map है। स्पष्ट चीजों को छोटा न करें: usrNm के बजाय userName लिखें।
क्लास और मेथड के नाम
\n- \n
- क्लास: संज्ञा (
Customer,OrderProcessor)। \n - मेथड: क्रिया (
calculateTotal(),saveToDatabase())। \n - बूलियन वेरिएबल: प्रेडिकेट (
isActive,hasPermission)। \n
// बुरा\npublic class Data {\n public void proc() { ... }\n}\n\n// अच्छा\npublic class InvoiceCalculator {\n public BigDecimal calculateTotalAmount() { ... }\n}\n\n2. फंक्शन: छोटे, परमाणु और साइड इफेक्ट से मुक्त
\nपहला सिद्धांत: फंक्शन को केवल एक काम करना चाहिए
\nJava में एक आदर्श फंक्शन 4-20 लाइनों का होता है। अगर फंक्शन एक से अधिक काम करता है, तो उसे तोड़ना चाहिए। क्लासिक संकेत: अगर आप फंक्शन से एक और सार्थक नाम वाला फंक्शन निकाल सकते हैं, तो ऐसा करें।
\n\n// बुरा: फंक्शन तीन काम करता है\npublic void processOrder(Order order) {\n if (order == null) throw new IllegalArgumentException();\n // 1. वैलिडेशन\n if (order.getItems().isEmpty()) {\n logger.warn("Empty order");\n return;\n }\n // 2. कुल कीमत की गणना\n BigDecimal total = BigDecimal.ZERO;\n for (Item item : order.getItems()) {\n total = total.add(item.getPrice().multiply(BigDecimal.valueOf(item.getQuantity())));\n }\n // 3. ईमेल भेजना\n emailService.sendConfirmation(order.getCustomerEmail(), total);\n}\n\n// अच्छा: हर फंक्शन एक काम करता है\npublic void processOrder(Order order) {\n validateOrder(order);\n BigDecimal total = calculateTotal(order);\n sendConfirmationEmail(order, total);\n}\n\nprivate void validateOrder(Order order) {\n if (order == null || order.getItems().isEmpty()) {\n throw new IllegalArgumentException("Invalid order");\n }\n}\n\nprivate BigDecimal calculateTotal(Order order) {\n return order.getItems().stream()\n .map(item -> item.getPrice().multiply(BigDecimal.valueOf(item.getQuantity())))\n .reduce(BigDecimal.ZERO, BigDecimal::add);\n}\n\nबॉय स्काउट का नियम: कैंप को उससे साफ छोड़ें जितना आपने पाया
\nहर बार जब आप किसी फाइल को एडिट करें, तो उसे बेहतर बनाएं: खराब वेरिएबल का नाम बदलें, लंबे फंक्शन को तोड़ें। यह कोड की एंट्रॉपी को रोकता है।
\n