Q&A Dump (Bahasa Indonesia)

11 May 2024

Kompilasi jawaban saya atas pertanyaan-pertanyaan yang saya jawab di berbagai komunitas pemrograman

Kriteria Pertanyaan

Apabila ada pertanyaan yang dapat saya jawab dengan jelas berdasarkan pengalaman, ataupun pertanyaannya saya rasa sering ditanya atau penting dan saya dapat membantu menjawab ataupun meluruskan miskonsepsi, maka akan saya catat di sini.

1. Alasan menggunakan Interface (OOP)

Pertanyaan

Saat ini saya sedang mempelajari konsep OOP pada JAVA dan sedang mempelajari interface.
Setelah melakukan pembelajaran di banyak sumber, saya masih belum mendapatkan alasan yang tepat untuk menggunakan interface pada suatu aplikasi dan kapan harus menggunakannya. (Satu-satunya alasan yang masuk akal bagi saya untuk menggunakan interface adalah untuk melakukan multiple inheritance).

Pada salah satu sumber yang saya temukan, disebutkan alasan digunakan interface pada aplikasi JAVA adalah untuk meningkatkan keamanan aplikasi dengan menyembunyikan detil (method) yang tidak diperlukan dan hanya menunjukkan method yang diperlukan saja (abstraction). Tetapi menurut saya, bukankah hal ini dapat dicapai dengan menerapkan access modifier saja yaitu private pada method-nya? Kenapa kita harus repot-repot untuk membuat interface baru?

Dan ada juga sumber yang menyebutkan agar kode yang kita buat memenuhi properti loose coupling. Apakah dapat dijelaskan kepada saya, contoh secara praktikalnya loose coupling itu seperti apa?

Mohon maaf jika pertanyaan saya panjang sekali. Terima kasih.

Jawaban

misalny waktu awal develop aplikasi frontend kita pakai dummy data. tapi nanti abis frontendnya selesai bakal dikoneksikan ke database

bisa aja biar aku gak perlu nulis ulang kodingan buat ngambil data pas pindah dari dummy data ke database, aku bikin aja interface yg jadi kontrak acuan untuk ambil dummy data atau data dri database

contoh

DataSource.java

interface DataSource {
  List<String> getUsernames();
}

DummyDataSource.java

class DummyDataSource implements DataSource {
  List<String> getUsernames() {
    return List.of("Budi", "Didi", "Nana");
  }
}

SqlDataSource.java

class SqlDataSource implements DataSource {
  List<String> getUsernames() {
    return db.select().from(Schema.user);
  }
}

Hasilnya apa? Kode frontend gak perlu diubah samsek waktu ganti sumber data. Tinggal implementasi ulang interfacenya, tapi versi real db

Btw Java gak ad multiple inheritance

Trus mungkin loose coupling di sini bisa diartikan aplikasinya gak coupled sama data dummy ataupun sumber data db. (Kalimatku tadi yg bilang “gak perlu nulis ulang kodingan pas migrasi dari dummy data -> db”). Jd aplikasiny cmn perlu tau interfaceny aj. Tinggal diswap2 kan buktinya.

DataSource dataSource = new DummyDataSource();
// menjadi
DataSource dataSource = new SqlDataSource();