TypeScript में डिज़ाइन पैटर्न: कब और क्यों
\n\nकल्पना करें कि आप एक घर बना रहे हैं। आप ईंटों को बेतरतीब ढंग से रख सकते हैं, और शायद वह गिरेगा नहीं। लेकिन क्या उसमें रहना आरामदायक होगा? शायद नहीं। सॉफ्टवेयर आर्किटेक्चर भी वही निर्माण है, बस ईंटों की जगह क्लास और फंक्शन हैं। TypeScript में डिज़ाइन पैटर्न सामान्य आर्किटेक्चरल समस्याओं के लिए सिद्ध ब्लूप्रिंट हैं। लेकिन किसी भी उपकरण की तरह, इन्हें समझदारी से इस्तेमाल करना चाहिए।
\n\nइस लेख में हम GoF (गैंग ऑफ फोर) की किताबों से सूखा सिद्धांत नहीं दोहराएंगे। इसके बजाय, हम देखेंगे कि आधुनिक विकास में कौन से TypeScript डिज़ाइन पैटर्न वास्तव में आवश्यक हैं, वे प्रोजेक्ट को कब बचाते हैं, और कब केवल सिरदर्द बढ़ाते हैं। चलिए शुरू करते हैं!
\n\nTypeScript खेल के नियम क्यों बदलता है?
\n\nपैटर्न में गोता लगाने से पहले, आइए TypeScript की मुख्य विशेषता को याद करें — स्टैटिक टाइपिंग। JavaScript में, हम अक्सर भाषा की डायनामिक प्रकृति की भरपाई के लिए पैटर्न का उपयोग करते थे। उदाहरण के लिए, फैक्ट्री मेथड (Factory Method) ऑब्जेक्ट बनाने की जटिलता को छिपाने में मदद करता था। TypeScript में, यह जटिलता अक्सर केवल इंटरफेस और जेनेरिक से हल हो जाती है।
\n\nलेकिन इसका मतलब यह नहीं है कि पैटर्न मर गए हैं। इसके विपरीत, TypeScript उन्हें अधिक अभिव्यंजक और सुरक्षित बनाता है। कंपाइलर जाँचता है कि आपने संरचना को सही ढंग से लागू किया है, और मूर्खतापूर्ण गलती नहीं होने देता। यहाँ TypeScript GoF पैटर्न की शक्ति को प्रकट करता है।
\n\nशीर्ष 5 पैटर्न जिनका आप सबसे अधिक उपयोग करेंगे
\n\n1. Singleton (सिंगलटन) — जब एक अच्छा है, और दो अनावश्यक
\n\nकब उपयोग करें: आपको पूरे एप्लिकेशन के लिए क्लास का बिल्कुल एक इंस्टेंस चाहिए। क्लासिक उदाहरण — लॉगर, एप्लिकेशन कॉन्फ़िगरेशन, डेटाबेस कनेक्शन।
\n\nTypeScript में क्यों: TypeScript सिंगलटन को थ्रेड-सेफ और टाइप-सेफ बनाने की अनुमति देता है। इसके बिना, आप दर्जनों ऑब्जेक्ट बनाने का जोखिम उठाते हैं जो मेमोरी बर्बाद करेंगे और स्थिति को भ्रमित करेंगे।
\n\nकोड उदाहरण:
\n\nclass DatabaseConnection {\n private static instance: DatabaseConnection;\n private connectionString: string;\n\n private constructor(connectionString: string) {\n this.connectionString = connectionString;\n // कनेक्शन का अनुकरण\n console.log(`कनेक्ट हो रहा है ${connectionString} से`);\n }\n\n static getInstance(connectionString: string): DatabaseConnection {\n if (!DatabaseConnection.instance) {\n DatabaseConnection.instance = new DatabaseConnection(connectionString);\n }\n return DatabaseConnection.instance;\n }\n\n query(sql: string): void {\n console.log(`क्वेरी निष्पादित कर रहा है: ${sql}`);\n }\n}\n\n// उपयोग\nconst db = DatabaseConnection.getInstance('postgres://localhost:5432/mydb');\ndb.query('SELECT * FROM users');\n\n// दूसरा कनेक्शन बनाने का प्रयास वही इंस्टेंस लौटाएगा\nconst db2 = DatabaseConnection.getInstance('postgres://localhost:5432/mydb');\nconsole.log(db === db2); // true\n\nएंटीपैटर्न: सिर्फ सिंगलटन के लिए सिंगलटन न बनाएं। यदि ऑब्जेक्ट अलग-अलग स्थितियों के साथ कई इंस्टेंस में मौजूद हो सकता है (जैसे, अलग-अलग डेटाबेस के लिए अलग-अलग कनेक्शन), तो सिंगलटन बुराई है।
\n\n2. Factory Method (फैक्ट्री मेथड) — बिना दर्द के ऑब्जेक्ट बनाना
\n\nकब उपयोग करें: आप पहले से नहीं जानते कि कौन सा ऑब्जेक्ट बनाना है। या बनाने की प्रक्रिया जटिल है और इसमें तर्क की आवश्यकता है।
\n\nTypeScript में क्यों: फैक्ट्री मेथड इंटरफेस और जेनेरिक के साथ अच्छी तरह से काम करता है। आपको टाइप खोए बिना लचीलापन मिलता है।
\n\nकोड उदाहरण:
\n\n// अमूर्त उत्पाद\ninterface Notification {\n send(message: string): void;\n}\n\n// ठोस उत्पाद\nclass EmailNotification implements Notification {\n send(message: string): void {\n console.log(`ईमेल भेज रहा है: ${message}`);\n }