स्वच्छ कोड विलासिता नहीं, बल्कि आवश्यकता क्यों है
\n\nकल्पना करें कि आप किसी और के प्रोजेक्ट में प्रवेश कर रहे हैं। क्लासेस का नाम Class1, Manager, UltraProcessor है। मेथड्स सब कुछ एक साथ करते हैं: डेटाबेस क्वेरी, HTML रेंडरिंग, और ईमेल भेजना। और वेरिएबल्स — x, y, temp। परिचित लगता है? यदि हाँ, तो आप जानते हैं कि ऐसा कोड कितनी जल्दी डेवलपर के जीवन को नरक बना देता है।
जावा में स्वच्छ कोड पांडित्य के बारे में नहीं है। यह सहकर्मियों, भविष्य के स्वयं और व्यवसाय के प्रति सम्मान के बारे में है। गंदा कोड विकास को 2-3 गुना धीमा कर देता है, बग्स को मायावी बना देता है, और रिफैक्टरिंग को असंभव बना देता है। इस लेख में, हम विशिष्ट नियमों पर चर्चा करेंगे जो आपको ऐसा कोड लिखने में मदद करेंगे जिसे पढ़ना और बनाए रखना सुखद हो।
\n\nनियम #1: नामकरण — 50% सफलता
\n\nरॉबर्ट मार्टिन (अंकल बॉब) अपनी पुस्तक 'क्लीन कोड' में कहते हैं: एक अच्छा नाम टिप्पणी की जगह लेता है। Java डेवलपर्स अक्सर अमूर्त नामों का उपयोग करते हैं। आइए इसे ठीक करें।
\n\nवेरिएबल्स: बताएं कि आप क्या संग्रहीत कर रहे हैं
\n\nखराब:
\nint d; // elapsed time in days\n\nअच्छा:
\nint elapsedTimeInDays;\n\nखराब:
\nList<String> list = new ArrayList<>();\n\nअच्छा:
\nList<String> customerNames = new ArrayList<>();\n\nमेथड्स: क्रिया + संदर्भ
\n\nमेथड को इस प्रश्न का उत्तर देना चाहिए 'यह क्या करता है?'। process, handle, doStuff जैसे सामान्य शब्दों से बचें।
खराब:
\npublic void process(int id) {\n // 50 строк кода: проверка, расчёт, отправка email\n}\n\nअच्छा:
\npublic void sendEmailConfirmation(int orderId) {\n // только логика отправки email\n}\n\nक्लासेस: परजीवी प्रत्ययों के बिना संज्ञाएं
\n\nManager, Processor, Util से बचें, जब तक कि उचित न हो। क्लास को एक इकाई को प्रतिबिंबित करना चाहिए।
खराब: DataProcessor, UserManager
अच्छा: UserRepository, InvoiceCalculator, EmailSender
नियम #2: मेथड्स — छोटे और एकल-कार्य वाले
\n\nसुनहरा नियम: एक मेथड — एक जिम्मेदारी। यदि किसी मेथड में 15-20 से अधिक पंक्तियाँ हैं, तो संभवतः इसे विभाजित करने की आवश्यकता है। इससे Java कोड की पठनीयता बढ़ती है और परीक्षण सरल होता है।
\n\nरिफैक्टरिंग का उदाहरण
\n\nपहले:
\npublic boolean isValidOrder(Order order) {\n if (order == null) return false;\n if (order.getItems().isEmpty()) return false;\n double total = 0;\n for (Item item : order.getItems()) {\n total += item.getPrice() * item.getQuantity();\n }\n if (total > 10000) {\n // проверка кредитного лимита\n User user = userRepository.findById(order.getUserId());\n return user.getCreditLimit() >= total;\n }\n return true;\n}\n\nबाद में:
\npublic boolean isValidOrder(Order order) {\n if (isOrderNullOrEmpty(order)) return false;\n double total = calculateTotal(order);\n if (isHighValueOrder(total)) {\n return hasSufficientCredit(order.getUserId(), total);\n }\n return true;\n}\n\nprivate boolean isOrderNullOrEmpty(Order order) {\n return order == null || order.getItems().isEmpty();\n}\n\nprivate double calculateTotal(Order order) {\n return order.getItems().stream()\n .mapToDouble(item -> item.getPrice() * item.getQuantity())\n .sum();\n}\n\nprivate boolean isHighValueOrder(double total) {\n return total > 10000;\n}\n\nprivate boolean hasSufficientCredit(int userId, double total) {\n User user = userRepository.findById(userId);\n return user.getCreditLimit() >= total;\n}\n\nनियम #3: टिप्पणियाँ — केवल जब उनके बिना काम न चले
\n\nटिप्पणी अक्सर खराब कोड का बहाना होती है। '// получает' लिखने के बजाय