Tutorial Dasar Dependency Injection Pada Kotlin di Android Studio

Tutorial Dasar Dependency Injection Pada Kotlin di Android Studio

Assalamu'alaikum Warahmatullahi Wabarakatuh.

Pada kesempatan kali ini saya akan sharing mengenai konsep Dependency Injection pada pemrograman Kotlin. Mungkin banyak di antara kalian yang sering atau pernah mendengar mengenai Dependency Injection, karena konsep pemrograman ini populer dan banyak digunakan oleh professional android developer, karena dengan menggunakan konsep tersebut maka koding yang kita buat menjadi lebih sederhana, rapih dan efisien serta mudah untuk di maintance.

Lalu apa Dependency Injection itu?. Pengertian singkatnya, merupakan suatu cara untuk mengirimkan objek ke kelas yang membutuhkan. atau  Dependency Inversion Principle is simply a guideline to write loosely-coupled code. Yang artinya konsep untuk mengurangi ketergantungan (interdependency) dari suatu sistem, untuk meminimalisir suatu class agar tidak terikat dengan class lain. Jika sampai disini kalian belum paham betul mengenai DI, mari kita lanjutkan untuk membahasnya lebih detail lagi.

Kebanyakan tutoria yang saya lihat di website luaran sana membahas mengenai DI di menggunakan pemrograman Java, tapi disini saya akan sharing mengenai DI menggunakan Pemrograman Kotlin, yang merupakan bahasa pemrograman no 1 paling populer saat ini untuk mobile app developer.

Materi lainnya yang direkomndasikan:

Untuk itu disini saya akan membuat tutorial yang sangat sederhana, untuk contoh kasusnya, disini kita akan membuat 2 buah project yang berbeda, yang pertaman yaitu project aplikasi Tanpa DI dan yang kedua yaitu aplikasi dengan Menggunakan DI, agar kalian dapat memahami perbedaan dari ke 2 cara tersebut.

Pada contoh kasus ini, kita akan membuat sebuah cerita dimana ada 2 buah kelompok yang ingin berperang, kelompok tersebut bernama LightKnight dan DarkKhight, pada masing-masing kelompok tersebut membutuhkan senjata, Nah di akhir nanti kita akan menampilkan sanjata apa yang digunakan oleh ke dua kelompok tersebut untuk berperang.

Untuk tampilan User Interfacenya juga tidak akan terlalu ribet, kita hanya akan mengunakan Button dan TextView saja.

Membuat Project Tanpa Dependency Injection

Sebelum kita belajar menggunakan Dependency Injection, ada baiknya kita juga mencoba membuat project tanpa Dependency Injection terlebih dahulu, agar kalian dapat memahami perbedaan dari kedua cara tersebut

1) Buka Android Studio kalian, buat project baru, misalnya bernama "Belajar DI".

2) Selanjutnya buat beberapa Class bernama DarkKnight, LightKhight dan Senjata. Kedua class tersebut akan di implementasikan didalam class MainActivity.

3) Pertama kita buat class Senjata. class ini akan di akses oleh class lain yang membutuhkan. kode yang akan kita buat pada class tersebut cukup sederhana, seperti ini
package com.wildan.belajardi

//Class ini nantinya akan diakses oleh Class LightKnight dan DarkKnight
class Senjata {

    //Membuat 2 Buah Fungsi yang Mengenbalikan Nilai String dengan Data Berbeda
    fun tombak(): String {
        return "Tombak"
    }

    fun pedang(): String {
        return "Pedang"
    }
}

Didalam class tersebut terdapat 2 buah fungsi yang mengembalikan nilai String yang berbeda, diibaratkan sebelum perang kita perlu menyiapkan senjatanya dulu, iya kan.

4) Selanjutnya kita buat Class DarkKnight, codenya seperti berikut ini.
package com.wildan.belajardi

class DarkKnight {

    //Membuat Objek Variable dari Class Senjata
    private val senjata = Senjata()

    //Membuat Fungsi yang Mengembalikan Nilai String
    fun setEquip(): String {
        return "Kolempok DarkKnight Bertempur Menggunakan " + senjata.tombak()
    }
}

Jadi ceritanya sebelum berperang kelompok tersebut membutuhkan senjata. Didalam class tersebut pertama kita membuat objek dari class Senjata, agar data didalam class tersebut bisa di akses. lalu dialam fungsi setEquip() akan mengembalikan nilai String serta memanggil fungsi tombak() dari class Senjata. Ceritanya kelompok ini memilih senjata tombak untuk berperang.

5) Lalu buat class berikutnya yaitu Class LightKnight, untuk source codenya hampir sama dengan class sebelumnya, seperti berikut ini.
package com.wildan.belajardi

class LightKnight {

    //Membuat Objek Variable dari Class Senjata
    private val senjata = Senjata()

    //Membuat Fungsi yang mengembalikan Nilai String
    fun setEquip(): String {
        return "Kolempok LightKnight Bertempur Menggunakan " + senjata.pedang()
    }
}

Hampir sama dengan class sebelumnya, cuma yang membedakan yaitu isi dari Fungsi setEquip(), dialamnya kita memanggil fungsi pedang() dari Class Senjata.

6) Jika sudah, terakhir kita buka Class MainActivity nya. sebelum itu kita desain dulu tampilan layoutnya, kita cukup menambahkan TextView dan Button saja.

xml:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity" 
        android:padding="32dp">

    <Button
            android:text="Coba Klik"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/click_me"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"/>
    
    <TextView
            android:text="Report Battle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/report" 
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintTop_toTopOf="parent" 
            android:textStyle="bold"
            android:textSize="16sp"
            android:gravity="center"/>
    
</android.support.constraint.ConstraintLayout>

view:

Screenshot_layout_belajar_DI

7) Setelah kita membuat layout activity_main.xml nya, lalu buka class MainActivity. disini kita akan memanggil kedua class tersebut yaitu DarkKnight dan LightKnight lalu manampilkan hasilnya pada TextView saat Button di Klik.
package com.wildan.belajardi

import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        //Membuat Instance atau Objec dari Class Light dan Dark Night
        val lightKnight = LightKnight()
        val darkKnight = DarkKnight()

        //Menambahkan listener pada Button
        click_me.setOnClickListener {
            //Menampilkan Data pada TextView yang diambil dari Fungsi setEquip dari kedua Class tersebut
            val getReport = lightKnight.setEquip() + " dan " + darkKnight.setEquip()
            report.text = getReport
        }
    }
}

Coba kalian peratikan, pertama kita memebuat instance atau objek dari class DarkKnight dan LightKnight, setelah itu tambahkan listener pada Button tersebut lalu didalamnya kita membuat Variable String bernama getReport, pada variable tersebut kita memanggil fungsi setEquip() dari objek lightKnight dan darkKnight, lalu memasukan variable tersebut pada TextView.

Demo:

Screenshot_project_DI_sederhana

Jika kita lihat tidak ada yang salah dengan implementasi kode di atas, ya kan? tapi jika class Senjata, digunakan pada banyak class (selain DarkKnight dan LightKnight)
tentunya hal ini berujung pada hardcoded dependency, apabila ada perubahan pada class Senjata, maka harus ada perubahan juga pada class DarkKnight dan LightKnight.

Terus kalo cuma 2 clas itu saja yang di rubah gak ribet dong ya. iya sih tapi suatu saat nanti class Senjata tersebut bisa saja kan di gunakan untuk class lainnya, misalnya ada 10 class yang menerima objek dari class tersebut, maka jika ada perubahan, otomatis kita juga harus mengubah satu-satu dari 10 class yang menerima objek tersebut, tentunya ini menyulikan programmer dan aplikasi akan sulit untuk di extend.

Membuat Project Dengan Dependency Injection

Selanjutnya kita akan mengubah kode project tersebut dengan meng-implementasikan Dependency Injection. Sudah saya jelaskan sebelumnya jika tanpa DI class yang ingin menerima data dari class lainnya, maka class tersebut haru dibuatkan objek.

Dengan menerapkan prinsip DI, maka class DarkKnight dan LightKnight tidak harus mengurusi inisialisasi objek dari class Senjata, kedua class tersebut cukup menerima objek dari class Senjata saja. lalu bagaimana caranya. satu-satunya cara yaitu dengan menggunakan Constructor. Seperti berikut ini,

DarkKnight.java
package com.wildan.belajardi

//Membuat Class dan Menambahkan Construtor
class DarkKnight(private val senjata: Senjata) {

    //Membuat Fungsi yang Mengembalikan Nilai String
    fun setEquip(): String {
        return "Kolempok DarkKnight Bertempur Menggunakan " + senjata.tombak()
    }
}

LightKnight.java
package com.wildan.belajardi

//Membuat Class dan Menambahkan Construtor
class LightKnight(private val senjata: Senjata) {
    
    //Membuat Fungsi yang mengembalikan Nilai String
    fun setEquip(): String {
        return "Kolempok LightKnight Bertempur Menggunakan " + senjata.pedang()
    }
}

Berbeda dengan yang sebelumnya, pada class tersebut kita hanya membuat parameter pada constructornya. cukup simple bukan

Lalu pada class MainActivity, disini kita buat objek dari class tersebut. Nah pebedaan nya, dengan menggunakan prinsip DI, semua objek hanya akan dibuat pada class MainActivity saja, jadi tidak perlu membuat objek Senjata pada masing-masing class yang membutuhkan.
val lightKnight = LightKnight()
val darkKnight = DarkKnight()

Didalam method onCreate() kedua objek tersebut akan terjadi error, karena memerlukan parameter dari objek class Senjata, maka dari itu kita perlu membuat objek Senjata seperti berikut ini.
//Membuat Objek dari Class Senjata
val senjata = Senjata()
        
//Membuat Instance atau Objec dari Class Light dan Dark Night
val lightKnight = LightKnight(senjata)
val darkKnight = DarkKnight(senjata)

Terakhir jalankan project tersebut maka hasilnya akan sama seperti yang sebelumnya. Jadi intinya semua Instance atau Objek hanya akan dibuat didalam class MainActivity saja, lalu apa maksudnya dengan "Jika ada perubahan pada Class Senjata maka class yang lainnya juga harus di ubah".

Nah satu point lagi nih yang akan saya jelaskan, semoga saja kalian paham yaa. Contoh sederhananya seperti ini, misalnya kita tambahkan parameter didalam constructor pada Class Senjata. seperti ini.
package com.wildan.belajardi;

//Membuat Konstruktor untuk menentukan Nama senjata yang akan di pilih
class Senjata (private val namaPedang: String, private val namaTombak: String) {

    //Membuat 2 Buah Fungsi yang Mengenbalikan Nilai String dengan Data Berbeda
    fun tombak(): String {
        return namaTombak
    }

    fun pedang(): String {
        return namaPedang
    }
}

Maka kode yang harus kita ubah juga cukup pada MainActivity saja, seperti berikut ini.
//Membuat variable untuk memberi nama pada senjata yang akan digunakan
val namaPedang = "Pedang Api"
val namaTombak = "Tombak Petir"

//Membuat Objek dari Class Senjata dengan Paramete
val senjata = Senjata(namaPedang, namaTombak)

//Membuat Instance atau Objec dari Class Light dan Dark Night
val lightKnight = LightKnight(senjata)
val darkKnight = DarkKnight(senjata)

Cukup mudah bukan, jika tanpa menggunakan Di, maka kita harus mengubah kode pada class LightKnight dan DarkKnight, tapi dengan menggunakan prinsip DI, maka data yang harus di ubah cukup pada MainActivity saja.

Demo:

Screenshot_belajar_DI_kotlin

Itulah tutorial yang bisa saya share pada kalian, semoga bermanfaat. Oh iya ngomong-ngomog tentang Dependency Injection, pastinya di antara kalian pernah mendengar mengenai Library Dagger 2, Nah library ini sangat populer dan banyak digunakan oleh android developer karena dapat memudahkan kita dalam menerapkan konsep DI.

Jika pada tutorial sebelumnya hanya MainActivity saja yang digunakan untuk mengeksekusi kode, tapi bagaimana jika banyak class atau activity yang harus mengeksekusi kode tersebut, pastinya ribet juga kan, kita harus membuat objek lagi pada pada masing-masng class activity yang membutuhkan.

Salah satu solusinya yaitu dengan menggunakan Dagger 2, library ajaib ini sangat ampuh untuk menyelesaikan permasalahan tersebut. disini saya akan menjelaskannya pada Tutorial Berikutnya. Ditunggu aja yaa, Terimakasih.

Wassalamu'alaikum Warahmatullahi Wabarakatuh.

Wildan M Athoillah
Wildan M Athoillah Blogger dan spesialis pembuat aplikasi android.