Kenapa harus menggunakan abstract class

Posted: 25 Oct 2015, Last updated: 01 Nov 2016

Ada pertanyaan: Kapan harus menggunakan abstract class, dan kapan harus menggunakan interface? Kenapa gak langsung dibikin class aja?

Jawaban simpelnya: DRY (Dont Repeat Yourself)

Jawaban panjangnya: Begini ceritanya...

Kenapa harus membuat class

Karena OOP memiliki sifat abstraction, encapsulation dan inheritance yang bila kita manfaatkan dengan benar, dapat mempercepat proses development ataupun modifikasi program.

Abstraction

Abstraksi adalah suatu proses dimana programmer membayangkan suatu objek nyata, memilah-milah sifat dan perilaku objek tersebut dan menuangkannya ke dalam suatu class. Kita ambil contoh misalnya class member pada suatu aplikasi perpustakaan. Setiap member tentunya memiliki nama, biodata, dan tanggal join. Dan mereka bisa meminjamBuku() dan mengembalikanBuku()

Encapsulation

Enkapsulasi adalah ketika kita membuat objek dari suatu class, otomatis kita memiliki semua sifat dan perilaku class tersebut. Dalam pemrograman, sifat dan perilaku objek lebih dikenal dengan sebutan properties dan method. Contohnya setelah memikirkan konsep member perpustakaan di atas, ketika di dalam program kita mengetikkan misalnya $member = Member::getMember(1); dalam bahasa PHP. Program akan memanggil static method getMember() yang telah kita buat sebelumnya dan memberikan kita suatu objek Member dan kita simpan dalam variabel $member. Begitu juga misalkan kita menggunakan fungsi getAll() dengan kode $members = Member::getAll();. Kita otomatis akan tahu bahwa $members[0], $members[1] dan seterusnya, akan memiliki nama, tanggal_join, biodata, dan bisa meminjamBuku() dan mengembalikanBuku().

Inheritance

Nah... ini baru back to laptop. Pertanyaan di atas sama saja dengan bertanya: "Apa sih untungnya inheritance?". Inheritance atau pewarisan, adalah suatu konsep dimana sifat dan perilaku class leluhur (ancestor) diturunkan kepada class turunannya. Istilah class leluhur terkesan agak lebay dalam bahasa Indonesia, jadi di sini saya akan menggunakan isilah class induk (parent) saja.

Suatu class induk dapat diturunkan menjadi kelas lain yang lebih komplit. Class induk ini dapat berupa class biasa atau abstract class. Abstract class adalah suatu class yang tidak bisa dijadikan objek. Ia harus diturunkan dulu, baru kemudian class turunannya dapat dijadikan objek.

Terus... kenapa kita harus menggunakan abstract class, kenapa gak langsung aja bikin banyak beberapa class yang berdiri sendiri. Jawabannya adalah DRY (Dont Repeat Yourself), Reusability dan easier code maintenance. Kita ambil contoh lagi member perpustakaan di atas.

"Koding ini hanyalah fiktif belaka, jika ada kesamaan koding, nama variabel dan juga nama proyek, adalah hanya kebetulan semata dan tidak ada unsur kesengajaan"

Tadinya waktu awal bikin program, Saya mendefinisikan Member sebagai suatu class biasa:

class Member {
  public $id, $nama, $tanggal_join
  public function __construct($arr) {
    $this->id = $arr['id'];
    $this->nama = $arr['nama'];
    $this->tanggal_join = $arr['tanggal_join'];
  }
}

Eh kemudian kata admin perpusnya, kita mau masukin juga data-data member seperti alamat, telepon, nama ibu, nama bapak, nama pacar #eh. Singkat cerita, kita tambahkan satu field lagi:

class Member {
  public $id, $nama, $tanggal_join, $biodata;
  public function __construct($arr) {
    $this->id = $arr['id'];
    $this->nama = $arr['nama'];
    $this->tanggal_join = $arr['tanggal_join'];
    $this->biodata = $arr['biodata'];
  }
}

Kemudian, bulan berikutnya... si admin perpus bilang lagi. Programnya masih kurang canggih nih. Kita di kampus sini kan anggotanya bisa dari mahasiswa, bisa dari dosen, dan bisa juga dari umum. Nah... di sini ini kita galau menghadapi dilema pemrograman. Mau bikin abstract class lalu diturunkan, atau mau bikin class biasa aja. Singkat cerita, kita memilih menggunakan abstract class:

abstract class Member {
  public $id, $nama, $tanggal_join, $biodata;
  public function __construct($arr) {
    $this->id = $arr['id'];
    $this->nama = $arr['nama'];
    $this->tanggal_join = $arr['tanggal_join'];
    $this->biodata = $arr['biodata'];
  }
}

class MemberMahasiswa extends Member {
  public $NIM;
  public $jurusan;
  public function __construct($arr) {
    parent::__construct($arr);
    $this->NIM = $arr['NIM'];
    $this->jurusan = $arr['jurusan']
  }
}

class MemberUmum extends Member {
  public $instansi;
  public $pekerjaan;
  public function __construct($arr) {
    parent::__construct($arr);
    $this->instansi = $arr['instansi'];
    $this->pekerjaan = $arr['pekerjaan'];
  }
}

class MemberDosen extends Member {
  public $NIP;
  public $jurusan;
  public function __construct($arr) {
    parent::__construct($arr);
    $this->NIP = $arr['NIP'];
    $this->jurusan = $arr['jurusan'];
  }
}

Dan kita pun merombak sebagian besar coding (Damn U admin perpus!!!). Tentunya selain koding class di atas, kita minimal juga perlu mengedit UI dan database. Dan singkat cerita programnya selesai dirombak, dan admin perpusnya senang. Beberapa bulan berlalu... kemudian si admin muncul lagi. Tanpa tanda-tanda. Gak ada awan hitam, langit gak bergemuruh, petir tak menyambar. Tapi dia muncul #eh.

Si admin perpus pun bilang: Jaman sekarang sudah canggih. Perpustakaan kampus sebelah sekarang absen pengunjung pake barcode. Kira-kira bisa nggak program perpustakaan kami ditambahin "sedikit saja" (kata-kata sakti dari client yang wajib diwaspadai), biar kita bisa cetak kartu member yang ada barcodenya. Terus nanti member perpusnya bisa absen pake barcode. Akhirnya dengan berat hati, setelah nego harga panjang lebar, program pun diupdate. Kita perlu menambahkan barcode ke data setiap member. Dan berhubung kita menggunakan inheritance, pada class kita, kita cukup menambahkan:

abstract class Member {
  public $id, $nama, $tanggal_join, $biodata;
  public $kodeBarcode;
  public function __construct($arr) {
    $this->id = $arr['id'];
    $this->nama = $arr['nama'];
    $this->tanggal_join = $arr['tanggal_join'];
    $this->biodata = $arr['biodata'];
    $this->kodeBarcode = $arr['kodeBarcode'];
  }
}

Dan selesailah sudah update class member kita. Bila kita tidak menggunakan inheritance, kita akan harus mengupdate seluruh class Member lainnya. Dan kita akan mengulang-ngulang dua baris kode di atas pada setiap class Member yang ada, kalau kita ingat, dan kalau cuma dua (dikali tiga class).

Jika kita lupa sedikit saja, maka ucapkan selamat datang kepada kutu program. Contoh di atas sangat disederhanakan. Tentu saja merevisi atau memodifikasi program tidak lepas dari memodifikasi UI dan struktur database. Dan client tidak akan pernah meminta revisi hanya satu poin. Biasanya selalu banyak revisi, dan masing-masing revisi diberi judul "ubah sedikit saja".

Jadi sebagai programmer, kita sebisa mungkin:

  • Selalu berpikir panjang sebelum mengiyakan revisi,
  • Memilih strategi pemrograman yang baik (class terpisah atau class turunan dari satu induk),
  • Tabah menghadapi client

Salam programmer :)