JavaScript में SOLID सिद्धांत: A से Z तक सिद्धांत और व्यवहार
SOLID पाँच मौलिक ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग सिद्धांतों का संक्षिप्त नाम है, जिन्हें रॉबर्ट मार्टिन (अंकल बॉब) ने प्रतिपादित किया था। हालाँकि JavaScript एक शास्त्रीय OOP भाषा नहीं है (यह प्रोटोटाइपल इनहेरिटेंस का उपयोग करती है), फिर भी ये सिद्धांत इस पर लागू होते हैं, विशेष रूप से Node.js और आधुनिक फ्रेमवर्क के संदर्भ में। SOLID का पालन करने से कोड अधिक लचीला, परीक्षण योग्य और रखरखाव योग्य बनता है। इस लेख में, हम JavaScript पर व्यावहारिक उदाहरणों के साथ प्रत्येक सिद्धांत का विश्लेषण करेंगे।
1. S — Single Responsibility Principle (एकल उत्तरदायित्व का सिद्धांत)
एक क्लास या मॉड्यूल में बदलाव का केवल एक ही कारण होना चाहिए। दूसरे शब्दों में, प्रत्येक इकाई को एक विशिष्ट कार्य के लिए जिम्मेदार होना चाहिए।
खराब उदाहरण: User क्लास एक साथ उपयोगकर्ता डेटा का प्रबंधन करता है और ईमेल सूचनाएँ भेजता है।
class User { constructor(name, email) { this.name = name; this.email = email; }
saveToDatabase() { // DB में सेव करने का लॉजिक console.log(`उपयोगकर्ता ${this.name} को DB में सेव किया जा रहा है`); }
sendWelcomeEmail() { // ईमेल भेजने का लॉजिक console.log(`${this.email} पर स्वागत संदेश भेजा जा रहा है`); }}अच्छा उदाहरण: जिम्मेदारी को दो क्लास में विभाजित करें।
class User { constructor(name, email) { this.name = name; this.email = email; }}
class UserRepository { save(user) { console.log(`उपयोगकर्ता ${user.name} को DB में सेव किया जा रहा है`); }}
class EmailService { sendWelcome(user) { console.log(`${user.email} पर स्वागत संदेश भेजा जा रहा है`); }}
// उपयोगconst user = new User('इवान', 'ivan@example.com');const repo = new UserRepository();const emailService = new EmailService();
repo.save(user);emailService.sendWelcome(user);2. O — Open-Closed Principle (खुले/बंद का सिद्धांत)
सॉफ्टवेयर इकाइयाँ विस्तार के लिए खुली होनी चाहिए, लेकिन संशोधन के लिए बंद। इसका मतलब है कि नई कार्यक्षमता को मौजूदा कोड को बदलने के बजाय नए कोड के माध्यम से जोड़ा जाना चाहिए।
खराब उदाहरण: AreaCalculator क्लास को नई आकृति जोड़ने पर संशोधन की आवश्यकता होती है।
class AreaCalculator { calculate(shape) { if (shape.type === 'circle') { return Math.PI * shape.radius ** 2; } else if (shape.type === 'rectangle') { return shape.width * shape.height; } // नई आकृति जोड़ने पर इस विधि को बदलना होगा }}अच्छा उदाहरण: पॉलीमॉर्फिज्म और इनहेरिटेंस का उपयोग करें।
class Shape { area() { throw new Error('area() विधि को ओवरराइड किया जाना चाहिए'); }}
class Circle extends Shape { constructor(radius) { super(); this.radius = radius; }
area() { return Math.PI * this.radius ** 2; }}
class Rectangle extends Shape { constructor(width, height) { super(); this.width = width; this.height = height; }
area() { return this.width * this.height; }}
class AreaCalculator { calculate(shape) { return shape.area(); }}
// उपयोगconst calculator = new AreaCalculator();const circle = new Circle(5);const rectangle = new Rectangle(4, 6);
console.log(calculator.calculate(circle)); // 78.54console.log(calculator.calculate(rectangle)); // 243. L — Liskov Substitution Principle (बारबरा लिस्कोव का प्रतिस्थापन सिद्धांत)
प्रोग्राम में ऑब्जेक्ट को उनके उपवर्गों के इंस्टेंस से प्रतिस्थापित किया जा सकना चाहिए