C++ में Dependency Injection क्या है और इसकी ज़रूरत क्यों है?
\n\nDependency Injection (DI) ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग का एक महत्वपूर्ण सिद्धांत है जो कोड को अधिक लचीला, टेस्ट करने योग्य और मेंटेन करने में आसान बनाता है। अगर आप C++ में नए हैं और "लूज़ कपलिंग" या "इनवर्ज़न ऑफ़ कंट्रोल" जैसे शब्द सुने हैं, लेकिन पूरी तरह नहीं समझे हैं, तो यह लेख आपके लिए है।
\n\nसरल शब्दों में, Dependency Injection (डिपेंडेंसी इंजेक्शन) एक ऐसी तकनीक है जिसमें कोई ऑब्जेक्ट अपनी डिपेंडेंसी खुद नहीं बनाता, बल्कि उन्हें बाहर से प्राप्त करता है। क्लास खुद दूसरी क्लास के ऑब्जेक्ट बनाने के बजाय, ये ऑब्जेक्ट कंस्ट्रक्टर, सेटर या इंटरफ़ेस के ज़रिए "इंजेक्ट" किए जाते हैं।
\n\nसमस्या: टाइट कपलिंग (Tight Coupling)
\n\nमान लीजिए आप नोटिफिकेशन भेजने वाला एक ऐप बना रहे हैं। DI के बिना आपका कोड कुछ इस तरह दिखेगा:
\n\n#include <iostream>\n#include <string>\n\nclass EmailService {\npublic:\n void send(const std::string& message) {\n std::cout << "ईमेल भेजा जा रहा है: " << message << std::endl;\n }\n};\n\nclass Notification {\nprivate:\n EmailService emailService; // कड़ी निर्भरता!\npublic:\n void notify(const std::string& msg) {\n emailService.send(msg);\n }\n};\n\nint main() {\n Notification notif;\n notif.notify("Hello, World!");\n return 0;\n}\n\nइस उदाहरण में Notification क्लास EmailService से पूरी तरह बंधी हुई है। अगर आप SMS नोटिफिकेशन या लॉगिंग जोड़ना चाहें, तो Notification क्लास को दोबारा लिखना होगा। ऐसे कोड को टेस्ट करना, विस्तार देना और मेंटेन करना मुश्किल होता है।
समाधान: Dependency Injection (डिपेंडेंसी इंजेक्शन)
\n\nटाइट कपलिंग की समस्या हल करने के लिए हम DI का उपयोग करते हैं। मुख्य विचार यह है कि नोटिफिकेशन सर्विस के लिए एक इंटरफ़ेस (एब्सट्रैक्ट क्लास) बनाएं और इसे Notification क्लास में बाहर से पास करें।
चरण 1: एब्सट्रैक्ट इंटरफ़ेस बनाएं
\n\n#include <iostream>\n#include <string>\n#include <memory>\n\n// सभी नोटिफिकेशन सर्विसेज़ के लिए एब्सट्रैक्ट इंटरफ़ेस\nclass IMessageService {\npublic:\n virtual ~IMessageService() = default;\n virtual void send(const std::string& message) = 0;\n};\n\nचरण 2: विशिष्ट सर्विसेज़ लागू करें
\n\nclass EmailService : public IMessageService {\npublic:\n void send(const std::string& message) override {\n std::cout << "📧 ईमेल: " << message << std::endl;\n }\n};\n\nclass SMSService : public IMessageService {\npublic:\n void send(const std::string& message) override {\n std::cout << "📱 SMS: " << message << std::endl;\n }\n};\n\nचरण 3: कंस्ट्रक्टर के ज़रिए डिपेंडेंसी इंजेक्ट करें
\n\nclass Notification {\nprivate:\n std::unique_ptr<IMessageService> service; // डिपेंडेंसी बाहर से आती है\npublic:\n // कंस्ट्रक्टर इंजेक्शन (Constructor Injection)\n Notification(std::unique_ptr<IMessageService> svc) \n : service(std::move(svc)) {}\n \n void notify(const std::string& msg) {\n service->send(msg);\n }\n};\n\nint main() {\n // विशिष्ट इम्प्लीमेंटेशन बनाएं\n auto emailService = std::make_unique<EmailService>();\n \n // इसे Notification में इंजेक्ट करें\n Notification notif(std::move(emailService));\n notif.notify("Dependency Injection काम कर रहा है!");\n \n // आसानी से SMS में बदलें\n auto smsService = std::make_unique<SMSService>();\n Notification smsNotif(std::move(smsService));\n smsNotif.notify("अब SMS के ज़रिए!");\n \n return 0;\n}\n\nC++ में डिपेंडेंसी इंजेक्शन के तीन मुख्य तरीके
\n\n1. Constructor Injection (कंस्ट्रक्टर के ज़रिए)
\nयह सबसे आम और अनुशंसित तरीका है। डिपेंडेंसी ऑब्जेक्ट बनाते समय दी जाती हैं और जीवनभर अपरिवर्तित रहती हैं।
\n\n<