परिचय: स्वच्छ कोड सौंदर्यशास्त्र के बारे में नहीं, बल्कि पैसे के बारे में क्यों है
\nकल्पना करें कि आप एक नई नौकरी पर आते हैं, C# में एक प्रोजेक्ट खोलते हैं और 500 पंक्तियों लंबी एक विधि देखते हैं, वेरिएबल a, b, temp, और टिप्पणियाँ रूसी और अंग्रेजी के मिश्रण में लिखी हुई हैं। परिचित लगता है? सबसे अधिक संभावना है, हाँ। ऐसा कोड काम करता है, लेकिन इसका रखरखाव नरक बन जाता है। C# में स्वच्छ कोड एक पूर्णतावादी की सनक नहीं है, बल्कि एक उपकरण है जो टीम के घंटे, तंत्रिकाएँ और पैसे बचाता है।
इस लेख में हम नैतिकता नहीं पढ़ाएँगे। इसके बजाय, हम विशिष्ट तकनीकों पर चर्चा करेंगे जो आपको C# में इस तरह लिखने में मदद करेंगी कि कोड एक नौसिखिए के लिए समझ में आए और एक अनुभवी डेवलपर को प्रसन्न करे। चलिए शुरू करते हैं!
\n\n1. नाम मायने रखते हैं: वेरिएबल, विधियों और क्लासेस को कैसे नाम दें
\nकोड को साफ करने का सबसे आसान तरीका सार्थक नाम देना है। C# केस-सेंसिटिव है, लेकिन यह int x या string d के लिए बहाना नहीं है।
वेरिएबल: बताएं कि आप क्या संग्रहीत कर रहे हैं
\nखराब:
\nint d; // यह क्या है? तारीख? दूरी? पैसे?\nstring n; // नाम? नंबर? लैपटॉप?\nअच्छा:
\nint daysUntilDeadline;\nstring userName;\nनियम सरल है: यदि एक महीने में आप बिना टिप्पणी के यह नहीं समझ सकते कि वेरिएबल क्या संग्रहीत करता है, तो नाम खराब है। usr या cnt जैसे संक्षिप्ताक्षरों से बचें - वे टाइप करने में एक सेकंड बचाते हैं, लेकिन पढ़ने में मिनट लेते हैं।
विधियाँ: क्रिया + संज्ञा
\nविधि एक क्रिया है। इसे इस तरह नाम दें कि यह स्पष्ट हो कि यह क्या करती है:
\n- \n
CalculateTotalPrice()- कुल मूल्य की गणना करती है; \n SendEmailNotification()- सूचना भेजती है; \n ValidateUserInput()- उपयोगकर्ता इनपुट की जाँच करती है। \n
खराब उदाहरण: ProcessData() - बहुत अमूर्त। "प्रोसेस" का क्या मतलब है? हटाना? रूपांतरित करना? सहेजना?
क्लासेस: एकवचन या बहुवचन में संज्ञाएँ
\nक्लास एक इकाई है। User, Order, PaymentProcessor। Manager या Helper जैसे प्रत्ययों से बचें, जब तक कि आर्किटेक्चर द्वारा उचित न ठहराया जाए। अक्सर ऐसी क्लासेस हर चीज़ के लिए "डंपिंग ग्राउंड" बन जाती हैं।
2. विधियाँ छोटी होनी चाहिए और एक काम करनी चाहिए
\nस्वच्छ कोड का सुनहरा नियम: एक विधि को एक कार्य हल करना चाहिए और उसे अच्छी तरह से हल करना चाहिए। यदि कोई विधि 20-30 पंक्तियों से अधिक लंबी है, तो संभवतः इसे विभाजित करने की आवश्यकता है।
\n\nउदाहरण: एक राक्षस का रिफैक्टरिंग
\nएक विधि की कल्पना करें जो उपयोगकर्ता को पंजीकृत करती है:
\npublic void RegisterUser(string name, string email)\n{\n // वैलिडेशन\n if (string.IsNullOrWhiteSpace(name)) throw new ArgumentException();\n if (!email.Contains("@")) throw new ArgumentException();\n // डेटाबेस में सहेजना\n using var db = new AppDbContext();\n var user = new User { Name = name, Email = email };\n db.Users.Add(user);\n db.SaveChanges();\n // ईमेल भेजना\n var smtp = new SmtpClient();\n smtp.Send("admin@site.com", email, "Welcome", "Hello!");\n}\nयहाँ क्या गलत है? तीन जिम्मेदारियाँ: वैलिडेशन, डेटाबेस कार्य, ईमेल भेजना। यदि भेजने का तर्क बदलता है, तो पंजीकरण विधि को बदलना होगा। आइए विभाजित करें:
\npublic void RegisterUser(string name, string email)\n{\n ValidateUser(name, email);\n var user = CreateUser(name, email);\n SaveUser(user);\n SendWelcomeEmail(email);\n}\n\nprivate void ValidateUser(string name, string email)\n{\n if (string.IsNullOrWhiteSpace(name)) \n throw new ArgumentException("Name is required", nameof(name));\n if (!email.Contains("@")) \n throw new ArgumentException("Invalid email", nameof(email));\n}\n\nprivate User CreateUser(string name, string email)\n{\n return new User { Name = name, Email = email };\n}\n\nprivate void SaveUser(User user)\n{\n using var db = new AppDbContext();\n db.Users.Add(user);\n db.SaveCh