← beranda

Membuat Library android independen dengan Library lainnya

Terkadang, ketika kita membuat library, kita memasukkan semua deps atau library yang terkait kedalam build.gradle yang ada pada proyek kita. Tetapi, hal tersebut memiliki dampak tightly coupled terhadap deps yang lain.

Contoh sederhana

Kita asumsikan, membuat library dengan nama tracker. Secara sederhana, library ini hanya mengirimkan tracker ke analytics yang kita gunakan.

Penggunaannya kira-kira seperti ini:

Tracker.instance.init()
Tracker.instance.eventClick("do something")

Namun, di modul tracker ini, kita membutuhkan data user dari module user_session, misalnya:

open class Tracker {

    private val userSession by lazy { UserSession() }
    
    ...

    fun eventClick(message: String) {
        val `data` = mapOf(
            "user_id" to userSession.id,
            ...
        )

        sendToAnalytics(`data`)
    }

    ...

}

Pada kode diatas, menunjukkan bahwa library tracker membutuhkan data userId dari library user_session, berarti, kita harus memasukkan deps user_session kedalam library tracker:

implementation project(rootProject.ext.libraries.user_session)
Lalu, bagaimana caranya menghapus userSession dari tracker?

Kita bisa memanfaatkan Bridge Proxy untuk menyelesaikan studi kasus diatas. Karena kita hanya membutuhkan data userId, kita dapat membuat sebuah interface class sebagai penghubung dan pengantar data antar library.

Kira-kira solusinya dapat kita selesaikan seperti ini:

interface TrackerProxy {
    val userId: String
}

open class Tracker constructor(
    private val proxy: TrackerProxy
) {

    ...

    fun eventClick(message: String) {
        val `data` = mapOf(
            "user_id" to proxy.userId,
            ...
        )

        sendToAnalytics(`data`)
    }

    ...

}

Lalu pada penggunaannya, akan terlihat seperti ini:

Tracker.instance.init(object : TrackerProxy {
    override fun userId = userSession.id
})
Tracker.instance.eventClick("do something")

Dengan begitu, kita sudah dapat memisahkan library user_session dari library tracker.

Metode ini dapat membuat kode kita lebih mudah untuk di pelihara, lebih bersih, dan lebih substantif, dan kita bisa memberikan userId darimanapun kita butuhkan (tanpa harus dari user_session).

Sekian!