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!