निर्भरता इंजेक्शन

Dec 29 2022
DI सॉफ्टवेयर प्रोग्रामिंग में व्यापक रूप से उपयोग की जाने वाली तकनीक है। यहां तक ​​​​कि Google एंड्रॉइड देवों को DI की सिफारिश करता है, Android के पास इस उद्देश्य के लिए डैगर, हिल्ट जैसी लाइब्रेरी हैं।

DI सॉफ्टवेयर प्रोग्रामिंग में व्यापक रूप से उपयोग की जाने वाली तकनीक है। यहां तक ​​​​कि Google एंड्रॉइड देवों को DI की सिफारिश करता है, Android के पास इस उद्देश्य के लिए डैगर, हिल्ट जैसी लाइब्रेरी हैं। डीआई निम्नलिखित लाभ प्रदान करता है:

  1. कोड पुन: प्रयोज्यता
  2. रिफैक्टरिंग में आसानी
  3. परीक्षण में आसानी

निर्भरता इंजेक्शन एक ऐसी तकनीक है जो वस्तुओं को उन वस्तुओं से अलग करने की अनुमति देती है जिन पर वे निर्भर हैं। आइए एक उदाहरण लेते हैं कि iOS में DI को कैसे लागू किया जाए।

class HTTPClient {
    func downloadFrom(url: URL) {
        //download data from remote
    }
}

class DataDownload {
    let client = HTTPClient()
    
    func getData(url: URL) {
        client.downloadFrom(url: url)
    }
}

class client {
    let dataDownload: DataDownload
    
    init() {
        self.dataDownload = DataDownload()
        self.dataDownload.getData(url: URL(string: "https://any_http_url.com")!)
    }
}

class FTPClient {
    func downloadFrom(url: URL) {
        //download data from remote
    }
}

class DataDownload {
    let client = FTPClient()
    
    func getData(url: URL) {
        client.downloadFrom(url: url)
    }
}

class client {
    let dataDownload: DataDownload
    
    init() {
        self.dataDownload = DataDownload()
        self.dataDownload.getData(url: URL(string: "https://any_ftp_url.com")!)
    }
}

protocol RemoteClient {
    func downloadFrom(url: URL)
}

class FTPClient: RemoteClient {
    func downloadFrom(url: URL) {
        //download data from remote
    }
}

class DataDownload {
    let client: RemoteClient
    
    init(client: RemoteClient) {
        self.client = client
    }
    
    func getData(url: URL) {
        client.downloadFrom(url: url)
    }
}

class Client1 {
    let dataDownload: DataDownload
    
    init() {
        self.dataDownload = DataDownload(client: FTPClient())
        self.dataDownload.getData(url: URL(string: "https://any_ftp_url.com")!)
    }
}

class Client2 {
    let dataDownload: DataDownload
    
    init() {
        self.dataDownload = DataDownload(client: HTTPClient())
        self.dataDownload.getData(url: URL(string: "https://any_htttp_url.com")!)
    }
}

RemoteClientDataDownloadकंपोजर/असेंबलर से इंजेक्ट किया जाता है Client1और Client2. यह कोड को भी डिकूप करता है। अब हम अवांछित निर्भरता को पूरा किए बिना अलगाव में उनका परीक्षण कर सकते हैं। उपरोक्त कोड रीफैक्टरिंग से कुछ पेशेवर

  1. परीक्षण में आसानी।
  2. नई सुविधाओं का तेजी से विकास।
  3. बेहतर एक्सकोड संकलन समय (मैं इस पर एक अलग ब्लॉग लिखूंगा)।
  4. समय और पैसा बचाता है।
  1. कंस्ट्रक्टर इंजेक्शन (ऊपर समझाया गया)
  2. कार्यात्मक इंजेक्शन
  3. संपत्ति इंजेक्शन

class ChildViewController: UIViewController {
    func viewDidLoad() { }
    func viewWillAppear() { }
    func viewDidAppear() { }

    func getDataFrom(_ client: RemoteClient, url: URL) {
        client.downloadFrom(url: url)
    }
}

class ParentViewController: UIViewController {
    func viewDidLoad() { }
    func viewWillAppear() { }
    func viewDidAppear() { }

    func present() {
        let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)
        let vc = storyboard.instantiateViewController(withIdentifier: "ChildViewController") as! ChildViewController
        vc.getDataFrom(client: HTTPClient(), url: URL(string:"https://any-url.com")!)
    }
}

प्रॉपर्टी इंजेक्शन: HTTPClient को प्रॉपर्टी इंजेक्शन के रूप में पास किया जाता है var client।

class ChildViewController: UIViewController {
    var client: RemoteClient?

    func viewDidLoad() { }
    func viewWillAppear() { }
    func viewDidAppear() { }

    func getDataFrom(url: URL) {
        client.downloadFrom(url: url)
    }
}

class ParentViewController: UIViewController {
    func viewDidLoad() { }
    func viewWillAppear() { }
    func viewDidAppear() { }

    func present() {
        let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)
        let vc = storyboard.instantiateViewController(withIdentifier: "ChildViewController") as! ChildViewController
        vc.client = HTTPClient()
    }
}

आशा करता हूँ की ये काम करेगा! अगर आपको लेख पसंद आया है और आप और अधिक अद्भुत लेख पढ़ना चाहते हैं, तो मुझे यहां फॉलो करें और अपना समर्थन दिखाएं क्योंकि यह मुझे और लिखने के लिए प्रेरित करता है।

सामग्री को बेहतर बनाने के लिए और अगले विषय के बारे में जिसे आप एक्सप्लोर करना चाहते हैं, कृपया अपनी प्रतिक्रिया साझा करें।

पढ़ने के लिए आप सभी का धन्यवाद, हैप्पी कोडिंग !!

संदर्भ

  1. https://essentialdeveloper.com
  2. https://developer.android.com/training/dependency-injection