Swift में डिपेंडेंसी इंजेक्शन: iOS के लिए व्यावहारिक मार्गदर्शिका

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

परिचय: डिपेंडेंसी इंजेक्शन क्यों एक आवश्यकता है

\n

iOS और macOS के तहत आधुनिक विकास में, कोड की स्वच्छता और परीक्षण क्षमता सबसे आगे आती है। इन लक्ष्यों को प्राप्त करने वाले प्रमुख सिद्धांतों में से एक है डिपेंडेंसी इंजेक्शन (DI) या निर्भरता इंजेक्शन। DI के बिना, क्लासेस अक्सर "कसकर जुड़ी" (tightly coupled) हो जाती हैं, जिससे उनका पुन: उपयोग, संशोधन और सबसे महत्वपूर्ण, यूनिट-टेस्ट लिखना मुश्किल हो जाता है।

\n

व्यवहार में, Swift में डिपेंडेंसी इंजेक्शन का अर्थ है कि कोई ऑब्जेक्ट अपनी निर्भरताएँ बाहर से प्राप्त करता है, न कि उन्हें स्वयं बनाता है। यह एक मामूली बदलाव लग सकता है, लेकिन यह एप्लिकेशन की आर्किटेक्चर को मौलिक रूप से बदल देता है। इस लेख में, हम Swift पर DI के मुख्य पैटर्न को समझेंगे: Constructor Injection, Property Injection और Swinject के उदाहरण पर DI-कंटेनर का उपयोग। प्रत्येक विधि को iOS/macOS के लिए व्यावहारिक उदाहरणों के साथ चित्रित किया जाएगा।

\n

अपने कोड को अधिक लचीला और परीक्षण योग्य बनाने के लिए तैयार हैं? तो चलिए शुरू करते हैं।

\n\n

1. Constructor Injection: सबसे विश्वसनीय तरीका

\n

Constructor Injection क्लास के इनिशियलाइज़र (init) के माध्यम से निर्भरताओं को इंजेक्ट करना है। इस विधि को सबसे पसंदीदा माना जाता है, क्योंकि यह सुनिश्चित करता है कि ऑब्जेक्ट हमेशा एक वैध स्थिति में रहे: इसकी सभी निर्भरताएँ अनिवार्य और अपरिवर्तनीय हैं।

\n

एक उदाहरण पर विचार करें। मान लीजिए, हमारे पास एक क्लास NetworkService है जो HTTP अनुरोधों के लिए जिम्मेदार है, और एक क्लास UserViewModel है जो इस सेवा का उपयोग करती है।

\n
// एब्स्ट्रक्शन के लिए प्रोटोकॉल\nprotocol NetworkServiceProtocol {\n    func fetchUsers() async throws -> [User]\n}\n\n// वास्तविक कार्यान्वयन\nclass RealNetworkService: NetworkServiceProtocol {\n    func fetchUsers() async throws -> [User] {\n        // वास्तविक HTTP अनुरोध\n        return []\n    }\n}\n\n// Constructor Injection के साथ ViewModel\nclass UserViewModel {\n    private let networkService: NetworkServiceProtocol\n\n    // निर्भरता इनिशियलाइज़र के माध्यम से पास की जाती है\n    init(networkService: NetworkServiceProtocol) {\n        self.networkService = networkService\n    }\n\n    func loadUsers() async {\n        do {\n            let users = try await networkService.fetchUsers()\n            print("Loaded \\(users.count) users")\n        } catch {\n            print("Error: \\(error)")\n        }\n    }\n}\n\n// उपयोग\nlet service = RealNetworkService()\nlet viewModel = UserViewModel(networkService: service)\n
\n

लाभ:

\n
    \n
  • निर्भरता स्पष्ट रूप से घोषित और अनिवार्य है।
  • \n
  • बिना निर्भरता के ऑब्जेक्ट नहीं बनाया जा सकता।
  • \n
  • यूनिट-टेस्ट के लिए आदर्श: वास्तविक कार्यान्वयन को आसानी से Mock से बदला जा सकता है।
  • \n
\n

नुकसान:

\n
    \n
  • यदि कई निर्भरताएँ हों, तो इनिशियलाइज़र भारी हो जाता है।
  • \n
  • वैकल्पिक निर्भरताओं के लिए उपयुक्त नहीं है।
  • \n
\n

यह विधि DI का "स्वर्ण मानक" है। जहाँ भी संभव हो, इसका उपयोग करें।

\n\n

2. Property Injection: वैकल्पिक निर्भरताओं के लिए लचीलापन

\n

Property Injection ऑब्जेक्ट के गुणों (property) के माध्यम से निर्भरताओं को इंजेक्ट करना है। इसका उपयोग आमतौर पर तब किया जाता है जब निर्भरता ऑब्जेक्ट के संचालन के लिए अनिवार्य नहीं होती है या जब इसे इनिशियलाइज़र के माध्यम से पास नहीं किया जा सकता (जैसे, Storyboard/UIKit में)।

\n

एक क्लासिक उदाहरण iOS में ViewController है, जो Storyboard से बनाया जाता है। आप इसका init नहीं बदल सकते, इसलिए आप गुण का उपयोग करते हैं।

\n
protocol LoggerProtocol {\n    func log(message: String)\n}\n\nclass ConsoleLogger: LoggerProtocol {\n    func log(message: String) {\n        print("LOG: \\(message)")\n    }\n}\n\nclass MyViewController: UIViewController {\n    // वैकल्पिक निर्भरता\n    var logger: LoggerProtocol?\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        logger?.log(message: "View did load")\n        // यदि logger सेट नहीं है, तो कुछ नहीं होगा\n    }\n}\n\n// सेटअप (उदाहरण के लिए                

ब्लॉग

पुस्तक अनुशंसाएँ