Swift में डिपेंडेंसी इंजेक्शन: सिद्धांत, उदाहरण और कार्यान्वयन

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

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

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

डिपेंडेंसी इंजेक्शन क्या है और Swift में इसकी आवश्यकता क्यों है

डिपेंडेंसी इंजेक्शन (DI) एक डिज़ाइन पैटर्न है जिसमें कोई ऑब्जेक्ट अपनी निर्भरताएँ बाहर से प्राप्त करता है, न कि उन्हें स्वयं बनाता है। iOS और macOS के लिए Swift के संदर्भ में, DI कोड को अधिक लचीला, परीक्षण योग्य और रखरखाव योग्य बनाने में मदद करता है। init() या let के माध्यम से कक्षाओं को कठोर रूप से जोड़ने के बजाय, आप कंस्ट्रक्टर, प्रॉपर्टी या मेथड के माध्यम से निर्भरताएँ पास करते हैं।

DI के मुख्य लाभ:

  • परीक्षण क्षमता: आप यूनिट टेस्ट में वास्तविक ऑब्जेक्ट्स को आसानी से मॉक या स्टब से बदल सकते हैं।
  • कमजोर युग्मन: कक्षाएं अमूर्तताओं (प्रोटोकॉल) पर निर्भर करती हैं, न कि विशिष्ट कार्यान्वयन पर।
  • रीफैक्टरिंग को सरल बनाना: कोड के एक हिस्से में बदलाव दूसरे हिस्से को नहीं तोड़ते।
  • स्वच्छ आर्किटेक्चर: कोड एकल जिम्मेदारी के सिद्धांत और निर्भरता उलटने के सिद्धांत (SOLID से DIP) का पालन करता है।

Swift में, UIKit, SwiftUI, CoreData, नेटवर्क और अन्य सेवाओं के साथ काम करते समय DI विशेष रूप से महत्वपूर्ण है। इसके बिना, आप "गॉड ऑब्जेक्ट्स" और कोड पुन: उपयोग में कठिनाइयों का जोखिम उठाते हैं।



Swift में निर्भरता इंजेक्शन के मुख्य तरीके

1. इनिशियलाइज़र के माध्यम से इंजेक्शन (Constructor Injection)

सबसे सामान्य और अनुशंसित तरीका। ऑब्जेक्ट बनाते समय निर्भरताएँ पास की जाती हैं और अपरिवर्तनीय (let) हो जाती हैं।

protocol NetworkServiceProtocol {    func fetchData() -> String}

class NetworkService: NetworkServiceProtocol { func fetchData() -> String { return "सर्वर से डेटा" }}

class ViewModel { private let networkService: NetworkServiceProtocol

// इनिशियलाइज़र के माध्यम से इंजेक्शन init(networkService: NetworkServiceProtocol) { self.networkService = networkService }

func loadData() -> String { return networkService.fetchData() }}

// उपयोगlet service = NetworkService()let viewModel = ViewModel(networkService: service)print(viewModel.loadData()) // "सर्वर से डेटा"

लाभ: निर्भरताएँ स्पष्ट हैं, ऑब्जेक्ट हमेशा वैध स्थिति में रहता है। नुकसान: बड़ी संख्या में निर्भरताओं के साथ कंस्ट्रक्टर भारी हो जाता है।



2. प्रॉपर्टी के माध्यम से इंजेक्शन (Property Injection)

ऑब्जेक्ट बनाने के बाद निर्भरता सेट की जाती है। अक्सर वैकल्पिक सेवाओं या Storyboard/XIB के साथ काम करते समय उपयोग किया जाता है।

class UserViewController: UIViewController {    var analyticsService: AnalyticsServiceProtocol?

override func viewDidLoad() { super.viewDidLoad() analyticsService?.trackEvent("स्क्रीन खोली गई") }}

// इंजेक्शनlet vc = UserViewController()vc.analyticsService = AnalyticsService()

नुकसान: प्रॉपर्टी को वैकल्पिक या डिफ़ॉल्ट मान वाला होना चाहिए, जिससे यदि निर्भरता सेट करना भूल जाएँ तो runtime त्रुटियाँ हो सकती हैं।



3. मेथड के माध्यम से इंजेक्शन (Method Injection)

निर्भरता को मेथड के पैरामीटर के रूप में पास किया जाता है। उन स्थितियों के लिए उपयुक्त जहाँ केवल एक ऑपरेशन के लिए निर्भरता की आवश्यकता होती है।

class DataManager {    func processData(using service: NetworkServiceProtocol) -> String {        let rawData = service.fetchData()        return "संसाधित: \\(rawData)"    }}

let manager = DataManager()let result = manager.processData(using: NetworkService())print(result) // "संसाधित: सर्वर से डेटा"


iOS एप्लिकेशन में DI कार्यान्वयन का उदाहरण

एक वास्तविक उदाहरण पर विचार करें: उपयोगकर्ताओं की सूची प्रदर्शित करने वाला एप्लिकेशन। हम निर्भरता इंजेक्शन के साथ प्रोटोकॉल और कक्षाएं बनाएंगे।

// 1. प्रोटोकॉलprotocol UserRepositoryProtocol {    func getUsers() -> [String]}

protocol UserViewModelProtocol { var users: [String] { get } func loadUsers()}

// 2. रिपॉजिटरी का कार्यान्वयनclass UserRepository: UserRepositoryProtocol {

ब्लॉग

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