TypeScript में स्वच्छ कोड क्यों एक विलासिता नहीं, बल्कि एक आवश्यकता है
\nहर डेवलपर कम से कम एक बार ऐसी स्थिति का सामना करता है: आप एक प्रोजेक्ट खोलते हैं, जो कुछ महीने पहले लिखा गया था, और समझ नहीं पाते कि वहाँ क्या हो रहा है। वेरिएबल का नाम a, b, data है, फंक्शन 200 लाइनों के हैं, और टाइप्स बीच-बीच में लगाए गए हैं। परिचित लगता है?
TypeScript हमें एक शक्तिशाली उपकरण देता है — स्टैटिक टाइपिंग। लेकिन यह अपने आप कोड को स्वच्छ नहीं बनाता। आप TypeScript और किसी भी अन्य भाषा में भयानक कोड लिख सकते हैं। स्वच्छ कोड एक अनुशासन, एक शैली और स्वयं और सहकर्मियों के प्रति सम्मान है।
\nइस लेख में, हम चर्चा करेंगे कि TypeScript में स्वच्छ कोड कैसे लिखें, जो आसानी से पढ़ा, बनाए रखा और स्केल किया जा सके। आप SOLID सिद्धांतों, सख्त टाइपिंग, नामकरण, इंटरफेस के साथ काम करने और बहुत कुछ के बारे में जानेंगे। चलिए शुरू करते हैं!
\n\n1. नामकरण — आपके कोड का चेहरा
\nवेरिएबल, फंक्शन और क्लास का सही नामकरण 50% सफलता है। एक अच्छे नाम को सवालों का जवाब देना चाहिए: "यह क्या है?" या "यह फंक्शन क्या करता है?"।
\n\nवेरिएबल और कॉन्स्टेंट
\nसंज्ञा और camelCase का उपयोग करें। एक अक्षर वाले नामों से बचें (लूप को छोड़कर)।
\n// बुरा\nconst d = new Date();\nconst u = users.find(u => u.id === 5);\n\n// अच्छा\nconst currentDate = new Date();\nconst activeUser = users.find(user => user.id === 5);\n\n\nफंक्शन
\nफंक्शन के नाम क्रिया से शुरू होने चाहिए। इससे तुरंत पता चलता है कि कौन सी क्रिया की जा रही है।
\n// बुरा\nfunction data(id: number) { ... }\n\n// अच्छा\nfunction fetchUserData(id: number): Promise<UserData> { ... }\n\n\nक्लास और इंटरफेस
\nक्लास — PascalCase में संज्ञा। इंटरफेस भी, लेकिन अक्सर I उपसर्ग के साथ (हालांकि समुदाय में बहस है)। बिना उपसर्ग के स्पष्ट नाम देना बेहतर है।
// बुरा\ninterface IUser {\n name: string;\n}\n\n// अच्छा\ninterface User {\n name: string;\n email: string;\n}\n\n\n2. सख्त टाइपिंग — आपका सबसे अच्छा दोस्त
\nTypeScript इसलिए बनाया गया है ताकि टाइप्स आपके लिए काम करें। बिना अत्यधिक आवश्यकता के any का उपयोग न करें। हर बार जब आप any लिखते हैं, तो आप कंपाइलर की सुरक्षा को बंद कर देते हैं।
any से बचें
\n// बुरा\nfunction process(data: any) {\n return data.name;\n}\n\n// अच्छा\ninterface Item {\n name: string;\n price: number;\n}\n\nfunction process(data: Item): string {\n return data.name;\n}\n\n\nUnion और Intersection टाइप का उपयोग करें
\nजब कोई वेरिएबल कई टाइप ले सकता है, तो Union (|) का उपयोग करें। संयोजन के लिए — Intersection (&) का।
type Status = 'active' | 'inactive' | 'pending';\ntype AdminUser = User & { role: 'admin' };\n\n\nGeneric — सार्वभौमिक फंक्शन
\nGeneric आपको टाइपिंग खोए बिना लचीला कोड लिखने की अनुमति देते हैं।
\nfunction firstElement<T>(arr: T[]): T | undefined {\n return arr[0];\n}\n\nconst num = firstElement([1, 2, 3]); // number\nconst str = firstElement(['a', 'b']); // string\n\n\n3. SOLID — वयस्कों के लिए सिद्धांत
\nSOLID सिद्धांत लचीली और रखरखाव योग्य आर्किटेक्चर बनाने में मदद करते हैं। आइए TypeScript उदाहरण के साथ प्रत्येक पर विचार करें।
\n\nSingle Responsibility (SRP)
\nएक क्लास या फंक्शन में बदलाव का केवल एक ही कारण होना चाहिए।
\n// बुरा: क्लास सब कुछ करता है\nclass UserService {\n createUser() { ... }\n sendEmail() { ... }\n generateReport() { ... }\n}\n\n// अच्छा: जिम्मेदारी को विभाजित करें\nclass UserCreator { ... }\nclass EmailService { ... }\nclass ReportGenerator { ... }\n\n\nOpen/Closed (OCP)
\nक्लास विस्तार के लिए खुले हैं, लेकिन संशोधन के लिए बंद हैं। इंटरफेस और इनहेरिटेंस का उपयोग करें।
\n\nLiskov Substitution (LSP)
\nउप-क्लास को प्रोग्राम के व्यवहार को बदले बिना बेस क्लास को प्रतिस्थापित करना चाहिए।
\n\n