परिचय: JavaScript पारिस्थितिकी तंत्र में SOLID
\nSOLID — रॉबर्ट मार्टिन द्वारा प्रतिपादित ऑब्जेक्ट-ओरिएंटेड डिज़ाइन के पाँच मूलभूत सिद्धांतों का एक संक्षिप्त नाम है। JavaScript के संदर्भ में, विशेष रूप से TypeScript और आधुनिक फ्रेमवर्क (NestJS, Express) का उपयोग करके Node.js पर विकास करते समय, स्केलेबल और रखरखाव योग्य एप्लिकेशन बनाने के लिए ये सिद्धांत महत्वपूर्ण हो जाते हैं। उन्नत स्तर पर, SOLID सरल कक्षाओं और इंटरफेस से परे जाकर मॉड्यूल आर्किटेक्चर, डिपेंडेंसी इंजेक्शन और परीक्षण को प्रभावित करता है।
\nइस लेख में, हम Node.js के लिए कोड उदाहरणों के साथ प्रत्येक SOLID सिद्धांत पर चर्चा करेंगे, व्यावहारिक बारीकियों और सामान्य गलतियों पर ध्यान केंद्रित करेंगे। आप सीखेंगे कि JavaScript (ES6+) और TypeScript की क्षमताओं का उपयोग करके वास्तविक परियोजनाओं में SOLID को कैसे लागू किया जाए।
\n\n1. JavaScript में एकल उत्तरदायित्व सिद्धांत (SRP)
\nसिद्धांत: एक क्लास या मॉड्यूल में बदलाव का केवल एक ही कारण होना चाहिए। JavaScript में, जब एक ही फ़ाइल में व्यावसायिक तर्क, डेटाबेस कार्य और प्रतिक्रिया स्वरूपण मिश्रित होते हैं, तो इसका अक्सर उल्लंघन होता है।
\nअभ्यास (Node.js): सेवाओं और रिपॉजिटरी के स्तर पर उत्तरदायित्व को विभाजित करें।
\n// ❌ SRP का उल्लंघन: क्लास अनुरोधों को संसाधित करता है, मान्य करता है और सहेजता है\nclass UserService {\n createUser(data) {\n if (!data.email) throw new Error('Email required');\n const db = new Database();\n return db.save('users', data);\n }\n}\n\n// ✅ SRP का पालन: वैलिडेटर, रिपॉजिटरी और सेवा में विभाजन\nclass UserValidator {\n validate(data) {\n if (!data.email) throw new Error('Email required');\n }\n}\n\nclass UserRepository {\n constructor(db) {\n this.db = db;\n }\n save(data) {\n return this.db.save('users', data);\n }\n}\n\nclass UserService {\n constructor(validator, repository) {\n this.validator = validator;\n this.repository = repository;\n }\n createUser(data) {\n this.validator.validate(data);\n return this.repository.save(data);\n }\n}\nसेवा में वैलिडेटर और रिपॉजिटरी को पास करने के लिए डिपेंडेंसी इंजेक्शन (DI) का उपयोग करें। इससे परीक्षण और घटकों के प्रतिस्थापन में आसानी होती है।
\n\n2. बहुरूपता के माध्यम से खुलापन/बंदपन सिद्धांत (OCP)
\nसिद्धांत: क्लासेस विस्तार के लिए खुली होनी चाहिए, लेकिन संशोधन के लिए बंद। JavaScript में, यह इनहेरिटेंस, कंपोज़िशन या स्ट्रेटेजी के माध्यम से प्राप्त किया जाता है।
\nअभ्यास (TypeScript के साथ Node.js): कॉन्ट्रैक्ट को परिभाषित करने के लिए एब्सट्रैक्ट क्लासेस या इंटरफेस का उपयोग करें।
\n// रिपोर्ट के लिए एब्सट्रैक्ट क्लास\nabstract class ReportGenerator {\n abstract generate(data: any): string;\n}\n\nclass PDFReport extends ReportGenerator {\n generate(data: any): string {\n return `PDF: ${JSON.stringify(data)}`;\n }\n}\n\nclass CSVReport extends ReportGenerator {\n generate(data: any): string {\n return `CSV: ${data.join(',')}`;\n }\n}\n\n// नए फॉर्मेट जोड़ने पर क्लाइंट कोड नहीं बदलता\nclass ReportService {\n constructor(private generator: ReportGenerator) {}\n createReport(data: any) {\n return this.generator.generate(data);\n }\n}\nशुद्ध JavaScript के लिए, मौजूदा कोड में संशोधन से बचने के लिए फ़ैक्टरी या स्ट्रेटेजी (Strategy पैटर्न) का उपयोग करें।
\n\n3. एसिंक्रोनस कोड में लिस्कोव प्रतिस्थापन सिद्धांत (LSP)
\nसिद्धांत: बेस क्लास की वस्तुओं को प्रोग्राम के कामकाज को बाधित किए बिना व्युत्पन्न क्लास की वस्तुओं द्वारा प्रतिस्थापित किया जाना चाहिए। JavaScript में, LSP का उल्लंघन अक्सर विभिन्न कॉन्ट्रैक्ट (जैसे, रिटर्न प्रकार या अपवाद) के साथ विधियों को ओवरराइड करने पर होता है।
\nअभ्यास (async/await के साथ Node.js): सुनिश्चित करें कि उपवर्ग पूर्व-शर्तों को कमजोर न करें और बाद-शर्तों को मजबूत न करें।
\nclass Database {\n async connect() { return 'con