OOP: Interface? What?

Jihad Dzikri Waspada
4 min readJun 13, 2016

--

Contoh interface di Slim Framework 3

Pernah ga sih agan kepikiran kok bisa ya Laptop agan yang mereknya SNSV itu bisa konek ke mouse yang mereknya bukan SNSV? Apa jangan-jangan si SNSV ini bekerja sama dengan perusahaan-perusahaan pembuat mouse biar compatible sama laptopnya? Eh tapi ternyata bukan merek SNSV doang, laptop Lenovo, Toshiba, HP, dan laptop-laptop lainnya pun pada kenyataannya juga compatible kok sama mouse-mouse yang dijual di pasaran itu. Kok bisa-bisanya ya merek Laptop yang berbeda-beda berkomunikasi dengan merek mouse yang berbeda-beda juga?

Nah di sinilah peran Interface dalam dunia komputer. Dan gak cuman buat para laptop itu aja lho, kita-kita sebagai developer juga bisa terbantu kok dengan adanya Interface.

Arti Interface

Interface itu artinya antarmuka. Nah yang namanya “antarmuka” pasti punya kegunaan untuk mengkomunikasikan. Itulah mengapa muncul istilah UI (User Interface) yang tidak lain tidak bukan bertujuan untuk mengkomunikasikan suatu content dengan cara yang baik. Jadi kata kunci yang ingin saya tekankan adalah Komunikasi.

Nah, agar komunikasi terjalin dengan lancar, kita perlu sesuatu yang sama-sama bisa dipahami, yang sama-sama kita gunakan bersama. Semisal, ketika saya bilang “Rumah”, yang muncul di benak kita ya pasti rumah, dengan jendela dan pintunya. Ketika saya bilang “Piano”, ya pasti yang kepikiran adalah sekumpulan tuts berwarna putih dan hitam. Ya gak sih? Kok bisa ya? Jawabannya simple, karena kita sama-sama menggunakan dan mengerti Bahasa Indonesia. Ada common terms yang digunakan bersama sehingga komunikasi berjalan dengan lancar. Kata kunci yang kedua adalah Kesamaan Istilah (common terms) atau Kontrak (sama-sama setuju/paham).

Balik ke masalah laptop dan mouse tadi, kita jadi bisa bertanya, “Wah berarti biar laptop-laptop itu bisa berkomunikasi dengan para mouse, kedua belah pihak harus sama-sama make dan mengerti istilah yang sama dong? Harus ada kontrak (persetujuan) dong?”

Lalu Hubungannya sama Pemrograman?

Berkaca pada kasus laptop dan mouse, secara umum kita bisa membuat Interface (kontrak) seperti ini:

interface MouseInterface {
public function leftClick();
public function doubleLeftClick();
public function rightClick();
public function doubleRightClick();
public function scrollUp();
public function scrollDown();
public function moveX();
public function moveY();
}

Kalo ga make interface kenapa sih emang? Lha itu method-method nya aja ompong gitu ga ada isinya? Percuma aja lah pake interface buang-buang waktu!

*Ehem*

Untuk pertanyaan pertama, nnti kalo ga make interface, perusahaan mouse merek A bisa aja bikin fungsionalitas klik kiri mouse mereka pake method klikKiri(). Yang perusahaan mouse B ntar maunya make method clickLeft(), perusahaan C maunya method klikKiriAjah(), perusahaan mouse D method mencetKiri(), dll. Lha kalo gini jadinya, gimana caranya si laptop SNSV, Lenovo, Toshiba dkk itu komunikasi sama mouse perusahaan A, B, C, D? Wong untuk klik kiri aja macem-macem nama methodnya. Blom lagi kalo nanti ada perusahaan mouse E, F, G, H.. Dan fungsionalitas mouse kan gak cuman klik kiri, msh ada klik kanan, dsb. Yo tewas. Dan ini melanggar aturan pertama yang sudah kita bahas tadi di awal: “Untuk berkomunikasi dengan baik, gunakanlah istilah yang sama.”

Untuk pertanyaan kedua, kenapa ga ada isinya? Nah di sinilah manfaat dan barokahnya, selain untuk Standarisasi/Kontrak (jawaban di atas), interface memberikan Fleksibilitas kepada para penggunanya. Misal perusahaan mouse A mau ketika mousenya di klik kiri, lampu di belakang mousenya nyala-nyala merah. Yang perusahaan B maunya nyala warna-warni. Yang perusahaan C maunya ngeluarin suara telolet.

Terus gunanya buat para Laptop? Laptop-laptop itu mah ga mau tau mousenya mau nyala merah, biru, atau ngeluarin suara telolet, yang mereka cuman mau tau adalah: fungsionalitas klik kiri ya manggil method leftClick(). Itu doang. Simple. Kata leptop, “Ngapain musti gue pikirin! Gue cuma mau pas lo eksekusi leftClick(), gue tau itu tandanya user lagi klik kiri pada mouse. Gue ga peduli mau ada lampu atau suara telolet.”

// Contoh implementasi yang berbeda-beda dari tiap perusahaan mouse
class MouseA implements MouseInterface {
// Implementasi pas klik kiri
public function leftClick() {
$this->lampuMerahNyalaNyala();
logToServer('leftClick'); // Anzay, klik kiri doang di-log
}
}
class MouseB implements MouseInterface {
public function leftClick() {
$this->nyalainLampuBiru();
$this->nyalainLampuIjoJuga();
}
}
class MouseC implements MouseInterface {
public function leftClick() {
$this->generateTeloletSound();
}
}
// Laptop
class SNSV extends Laptop {
protected $mouse;
public function __construct(MouseInterface $mouse) {
$this->setMouse($mouse);
}

public function setMouse(MouseInterface $mouse) {
$this->mouse = $mouse;
}
public function onMouseLeftClick() {
/**
* Disini si laptop ga peduli merek mouse yang dipake,
* entah itu mouse A, B, atau C. Yang pasti,
* method leftClick() itu ada di semua merek mouse
* karena mereka sama2 make suatu kontrak yang bernama
* MouseInterface
*/
$this->mouse->leftClick();
}
}
/**
* Nah disini baru real codingnya:
* Ketika berbagai macam mouse konek ke Laptop SNSV.
* Perhatikan object $snsv hanya cukup memanggil
* method onMouseLeftClick() saja dan ga perlu ngubah2
* isi methodnya hanya untuk compatible sama berbagai macam mouse
*/
$mouseC = new MouseC;
$snsv = new SNSV($c); // Inject ke constructor SNSV
$snsv->onMouseLeftClick(); // Keluar suara telolet
// Cabut mouse C, ganti sama mouse merek A
$mouseA = new MouseA;
$snsv->setMouse($a);
$snsv->onMouseLeftClick(); // Lampu merah nyala-nyala
$mouseB = new MouseB;
$snsv->setMouse($b);
$snsv->onMouseLeftClick(); // Lampu nyala warna-warni
/**
* Untuk ngubah mouse, cukup ubah object mouse nya aja.
* Keliatan kan $snsv->onMouseLeftClick(); ga perlu tak ubah
* jeroannya. Tetep $this->mouse->leftClick() aja walau
* merek mousenya beda-beda.
*
* Sekian..
*/

Kesimpulan

Nah, sekarang udah kebayang kan kenapa interface itu sangat penting dalam dunia pemrograman. Interface berperan sebagai Kontrak yang digunakan untuk berkomunikasi antara satu pihak dengan pihak yang lain, supaya kedua belah duren, eh, pihak, sama-sama ngerti. Dua manfaat dasarnya adalah terciptanya *tsah* Standarisasi dan Fleksibilitas. Kalo boleh nambahin sih, interface juga berperan penting dalam konsep Separation of Concern yang sangat diusung OOP.

Bagi agan yang punya masukan/pendapat/opini tambahan soal interface, monggo komen di bawah..

Happy coding!

--

--

Jihad Dzikri Waspada

Software Developer @Chordify, Utrecht. NOTE: Please navigate to https://jihadwaspada.com. I no longer write on Medium