Dagger dalam tiga langkah part II
PrologueDibahasan sebelumnya kita membahas apa yang dimaksud dengan dependencies injection, framework dan dagger(tersamar), dengan mengambil contoh persiapan pernikahan Tuti yang membuat heboh seluruh jagad kampung, tapi ada yang sepertinya disembunyikan oleh Tuti, sebuah secret recipe yang menyatukan dan mengkoordinasi semua vendor digunakan oleh Tuti.
Naik KelasSebelum kita mulai, penulis menganjurkan teman-teman sekalian untuk mengunduh dan menjalankan sample project yang penulis sudah persiapkan, hal ini dilakukan untuk mempersingkat waktu dan tidak membuat pembahasan melebar. Sample project bisa di unduh dengan menjalankan perintah:
git clone git@github.com:vr1090/pernikahanTuti.git
Sebuah janjiKetika Tuti memutuskan untuk menggunakan event organizer cap dagger, permintaan Tuti tidaklah neko-neko seperti tuan puteri, berikut adalah contoh permintaan dari Tuti:
interface general{
val namaProvider:String
fun generateOutput():String=""
}
interface IBunga: general {
val isHarum: Boolean
fun tipeBunga(): String
}
interface ICatering: general {
val menu: List<String>
val isEnak: Boolean
}
interface IGedung:general {
val isTidakRoboh: Boolean
fun namaRuangan(): String
}
interface IMusik:general {
val isBergoyang: Boolean
fun tipeMusik(): String
}
Bisa dilihat kalau semua permintaan dari Tuti ini adalah sebuah interface, yang mana dibutuhkan object concrete untuk memenuhi ini semua, salah satu yang bisa memenuhi permintaan ini adalah sebagai berikut :
class DangdutKoplo : IMusik {
override val namaProvider = "koplo gang"
override val isBergoyang = true
override fun tipeMusik() = "dangdut progresif"
override fun generateOutput(): String {
return "nama provider:$namaProvider\n"+
"tipe musik:${tipeMusik()}\n"+
"isBergoyang:$isBergoyang"
}
}
atau mungkin yang ini juga ok?
class Orchestra:IMusik{
override val namaProvider = "Berlin Symphoniker"
override val isBergoyang = false
override fun tipeMusik() = "Classic orkestra"
override fun generateOutput(): String {
return "nama provider:$namaProvider\n"+
"tipe musik:${tipeMusik()}\n"+
"isBergoyang:$isBergoyang"
}
}
Tuti bingung, mana yang harus dipilih untuk musik yang akan digunakan dalam pernikahan? Belum lagi calon mempelai pria lebih memilih untuk bermain game daripada ikut mempersiapkan pernikahan ini. “Hehe kan gw m*k*n*d*”, ujar calon mempelai pria.
Event organizer mengirim satu orang untuk membantu Tuti, kita sebut saja namanya Tifa. berikut adalah dari deskripsi dari Tifa.
interface TifaComponent{
fun inject(acara:PernikahanTutiActivity)
}
“Loh kok another interface? concrete-nya mana?”, Gusar Tuti, bos besar event organizer dagger meyakinkan Tuti, “semua akan indah pada akhirnya”. Perhatikan juga kalau interface TifaComponent hanya memiliki satu tujuan yaitu meng-inject acara pernikahan Tuti.
Pengalaman pertama TifaTifa seorang fresh graduate yang bekerja pada event organizer dagger, dagger sendiri saat ini sedang naik daun dan mendapatkan bintang 5 di event organizer award. Yang membuat dagger terkenal adalah kemampuannya untuk mengeksekusi secara cepat pada hari H. Tifa telah mengikuti acara pengenalan proses didalam perusahaan dagger, ada tiga departemen besar didalam perusahaan dagger, departemen component, departemen module dan departemen code generator.
Departemen component adalah kumpulan orang-orang yang ditugaskan untuk datang langsung ke client, mereka adalah wajah dari perusahaan dagger, semua permintaan client dimintakan langsung kepada para component ini, component akan menulis permintaan client dan ketika sampai di kantor akan ditanyakan kepada departemen module.
Departemen module adalah departemen yang menyediakan yang diminta oleh departemen component, setiap hari mereka berkomunikasi dengan para vendor dan memantau apakah ada perubahan di dalam vendor, atau ada service baru yang disediakan oleh vendor. Tiap module punya kekhususan masing-masing, umpama ada module untuk musik Tanjidor dan ada module untuk musik dangdut, tergantung apa yang dibutuhkan oleh component.
Departemen code generation, Tifa tidak terlalu kenal, sering bolos kalau ada acara kantor, datang telat dan saat istirahat mereka memilih untuk bermain game. Tifa agak kesal orang-orang di departemen code generation menurut legenda, mereka dibayar lebih mahal dari departemen lain.
Tiga mantera“Untuk bisa sukses, kita cuma perlu tiga hal ini, tunjuk orang, kasih list provider yang kita punya dan muncul pada acara”, gumam bos besar event organizer dagger, Tifa seorang fresh graduate yang masih bau kencur mengangguk saja. “ Kalau gagal kita ulangi saja lagi prosesnya, lakukan ini terus sampai tujuan kita tercapai”, lanjut dari bos besar, sambil menghisap dalam-dalam cerutu. Mari kita bantu Tifa sedikit agar tidak salah arah, sebenarnya yang ingin dikatakan oleh bos besar adalah 3 mantra sakti yang diklaim ampuh mandraguna oleh penulis:
@Component
interface TifaComponent{
fun inject(acara:PernikahanTutiActivity)
}
2. Buat module: ini adalah object yang dibuat untuk melayani permintaan dari component:
@Module
open class PernikahanTutiModule {
@Provides fun bunga():IBunga{
return TokoBungaHarum()
}
@Provides fun gedung():IGedung{
return GedungBaru()
}
open @Provides fun katering():ICatering{
return KateringMbakYu()
}
@Provides fun musik():IMusik{
return DangdutKoplo()
}
}
3. Inject pada tempat yang seharusnya, mengikuti hukum permintaan pasar, yaitu ada yang jual dan ada yang beli. Beli disini maksudnya permintaan untuk di-inject dan jual adalah pihak yang bisa menyediakan atau me-inject barang yang dibutuhkan. Intinya kalau ada yang minta di-inject, pastikan ada yang siap meng-inject. Kalau tidak seimbang bisa gawat.
permintaan dilakukan dengan memberikan anotasi @Inject :
@Inject
lateinit var musik: IMusik
@Inject
lateinit var gedung: IGedung
@Inject
lateinit var bunga: IBunga
@Inject
lateinit var catering: ICatering
Perhatikan bahwa 4 variable ini tidak ada yang melakukan inisiasi. Sehingga jikalau ini dijalankan sangat mungkin untuk terjadinya crash. Tapi, ada satu baris kode yang membuat crash tidak terjadi yaitu:
val tifaComponent:TifaComponent = DaggerTifaComponent
.builder()
.build()
tifaComponent.inject(this)
Dengan memanggil Tifa sebagai penyelamat, crash tidak terjadi, kenapa? karena Tifa melakukan inisiasi didalam method inject. Yang dilakukan Tifa adalah melihat semua permintaan dari PernikahanTutiActivity, check ke module apakah mungkin bisa dipenuhi lalu memberikan kepada PernikahanTutiActivity.
Coba kita jalankan sample project-nya:
PernikahanTutiActivity tidak tahu menahu ada musik dangdut koplo. Tifa sebenarnya juga tidak tahu ada, yang dia tahu adalah dia perlu memberikan object-concrete IMusik kepada PernikahanTutiActivity, ketika Tifa bertanya kepada module : “Ada IMusik mas?”, “nih” kata orang module sambil melempar kaset yang sudah digulung setengah, lalu melanjutkan bermain RO.
To be continue?Sebenarnya ingin lanjut, tapi sayang sudah lebih dari 4 lembar, kita lanjutkan pembahasan di bagian III yah, kalau di film rambo ini bagian yang paling seru. Kalau film the matrix, mending nonton dragon ball aja, lebih logis. Ga ngerti cara normal akhiri pembahasan, so be kind to one another? Clap and comment are highly appreciated.