Injeksi Ketergantungan

Dec 29 2022
DI adalah teknik yang banyak digunakan dalam pemrograman perangkat lunak. Bahkan Google merekomendasikan DI ke Android devs, Android memiliki perpustakaan seperti Dagger, Hilt untuk tujuan ini.

DI adalah teknik yang banyak digunakan dalam pemrograman perangkat lunak. Bahkan Google merekomendasikan DI ke Android devs, Android memiliki perpustakaan seperti Dagger, Hilt untuk tujuan ini. DI memberikan keuntungan sebagai berikut:

  1. Penggunaan Ulang Kode
  2. Kemudahan refactoring
  3. Kemudahan pengujian

Injeksi ketergantungan adalah teknik yang memungkinkan objek dipisahkan dari objek yang mereka andalkan. Mari kita ambil contoh bagaimana mengimplementasikan DI di iOS.

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")!)
    }
}

RemoteClientdisuntikkan DataDownloaddari komposer/assembler Client1dan Client2. Ini juga memisahkan kode. Sekarang kita dapat mengujinya dalam pemisahan tanpa memenuhi ketergantungan yang tidak diinginkan. Beberapa kelebihan dari pemfaktoran ulang kode di atas

  1. Kemudahan dalam pengujian.
  2. Pengembangan fitur baru yang lebih cepat.
  3. Waktu kompilasi Xcode yang ditingkatkan (saya akan menulis blog terpisah tentang ini).
  4. Menghemat waktu dan uang.
  1. Injeksi konstruktor (dijelaskan di atas)
  2. Injeksi fungsi
  3. Injeksi properti

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")!)
    }
}

Injeksi properti: HTTPClient diteruskan sebagai injeksi Properti ke 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()
    }
}

Semoga membantu! Jika Anda menyukai artikel ini dan ingin membaca lebih banyak artikel luar biasa, ikuti saya di sini dan tunjukkan dukungan Anda karena itu memotivasi saya untuk menulis lebih banyak.

Silakan bagikan umpan balik Anda untuk meningkatkan konten dan tentang topik selanjutnya yang ingin Anda jelajahi.

Terima kasih semua telah membaca, selamat coding!!

Referensi

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