Hampir semua bahasa pemrogramaan berbasis OOP menyediakan fasilitas Interface, sebut saja yang cukup terkenal seperti Java dan C#. Mungkin Sobat programmer sedikit banyak sudah sangat hafal apa itu pengertian interface, yaitu suatu kelas yang memiliki deklarasi method tanpa adanya implementasi di dalamnya. Namun hafal pengertiannya saja tidak cukup bukan? Faktanya, dari sebagian besar sahabat programmer yang saya temui masih cukup banyak yang bingung tentang apa itu interface dan apa fungsinya. Padahal adanya interface ini menurut saya sangat-sangat penting. Nah pada artikel ini akan saya uraikan secara singkat apa saja manfaat interface dengan sedikit contoh kasus sederhana sbb :
Contoh kasus :
Misal saya ingin membuat game balap mobil. Tahu kan game balap mobil? Jadi kurang lebih seperti ini nih game yang pengen saya buat
Kemudian pengennya abis game mobil ini selesai saya mau bikin game balapan boat. Jadi kayak gini nih contohnya
Masalahnya nih... Saya itu orangnya super males... Saya gak mau bikin program berkali-kali, saya maunya bikin code 1x doank, nanti kalo ada tambahan ya ditambahi, tapi saya gak mau ngoding sesuatu yang hampir sama 2x, gak efisien.
Nah.. akhirnya untuk kasus ini saya memecah program menjadi tiga kelas utama. Perkara kelas ini nanti extends ke macem-macem g masalah, yang penting saya mau bahas ketiga kelas utama ini. Kelas-kelas itu antara lain :
1. Kelas HUD (Head Up Display). Apa itu HUD? Bisa baca lebih detail di wikipedia. Intinya gini.. ibarat sebuah mobil, kelas ini adalah kelas untuk kemudi dan segala peralatan navigasinya. Kelas ini berfungsi untuk menangani input user seperti setir kanan dan kiri, gas, rem, menampilkan status kecepatan, nitro, posisi, lap, mini map, dsb. Intinya kelas ini menangani antarmuka kendaraan dengan user atau bisa dikatakan navigasi.
Karena saya itu males, saya pengennya kelas ini dipake 2x, pada proyek pertama saya akan menggunakan kelas ini untuk mengontrol mobil, tapi pada proyek kedua saya akan menggunakannya kembali untuk mengontrol boat, dimana mobil dan boat jelas-jelas berbeda, engine nya juga jelas jauh berbeda.
2. Kelas Car. Sesuai namanya, kelas ini adalah kelas untuk menjalankan mobil. Ibaratnya kelas ini adalah mesin dari mobil.
3. Kelas Boat. Sama seperti kelas mobil, kelas ini bisa diibaratkan dengan sebagai mesin dari boat.
Kemudian gimana caranya, bikin dua kelas berbeda tapi bisa di kontrol oleh satu HUD? Inilah salah satu fungsi dari interface. Ok.. Langsung saja kita bahas lebih detail tentang fungsi dari interface. Berikut adalah beberapa fungsi dari interface :
FUNGSI 1 : Membuat program lebih reuseable. Menurut saya inilah fungsi utama interface. Dengan memanfaatkan interface setiap bagian program dapat dijadikan suatu modul tersendiri. Modul ini dapat diberi interface tertentu sehingga untuk memanfaatkan modul ini pada proyek lain cukup dengan mengimplementasikan interface yang telah disediakan, sehingga tidak perlu merubah code program sedikitpun. Cukup implementasi, beres..
Contoh kasus :
Dari contoh kasus di atas jelas kan, kita pengen memakai 1 HUD untuk mengontrol lebih dari satu type kendaraan yang sangat berbeda. Bahkan bisa jadi pada proyek berikutnya muncul kelas-kelas baru seperti tank, train, truck, dsb. Kelas-kelas ini bisa sangat rumit, bisa extends ke kelas apapun.
Tentu akan memakan waktu cukup lama kan jika kita membuat 1 kelas HUD untuk 1 type kendaraan? Bukannya lebih baik kita buat 1 HUD untuk semua kendaraan? Kalaupun texturenya beda-beda (misal bentuk kemudi mobil dan kemudi truck beda) kan itu cuman beda texture saja, bisa diganti dengan mengganti atribut texture dari kelas HUD saja, tidak perlu menambah kelas HUD baru karena intinya fungsi dari HUD itu sama, untuk mengontrol kendaraan, entah itu kendaraan darat, air, bahkan udara. Kalaupun nanti ada fungsi tambahan, misal tank tambah fungsi Shot, bisa kita extends dari kelas HUD, tp intinya ya tetap 1 HUD untuk semua vehicle. Kemudian gimana cara kita untuk memodelkannya?
Untuk itulah kita perlu interface yang menyeragamkan semua type kendaraan yang berbeda itu agar bisa di kontrol oleh HUD. Kita bisa buat interface ControllableVehicle atau jika saya pribadi saya lebih senang menambahkan huruf 'I' di awal nama interface untuk membedakan namanya dengan kelas. Jadi namanya menjadi IControllableVehicle. Nah interface inilah yang nanti bisa diimplementasikan oleh kelas-kelas yang bisa dikontrol oleh HUD. Jadi intinya HUD tidak mengenal apa itu mobil, boat, train, tank, dsb. Yang HUD tahu adalah HUD dapat mengontrol interface IControllableVehicle. Jadi kalo kita pengen menambah apapun yang bisa di kontrol HUD apakah itu truck, tank, train, motor cycle, kuda, sapi, onta, singa, keong, ubur-ubur, kecoak, semut, amoeba, kuman, virus apapun itu cukup mengimplementasikan interface IControllableVehicle. Beres...
Dengan cara ini kelas HUD menjadi sangat reuseable bukan?? 1x develop bisa buat control apapun. Kelas car, boat, dsb juga menjadi reuseable. Kenapa? Karena mereka bersifat independent. Mereka mengimplementasikan IControllableVehicle. Bisa jadi kelas-kelas ini kita buat untuk platform PC, android, iOS, Play Station, Xbox, dll. Diantara platform ini jelas memiliki HUD yang jauh berbeda, karena PC mengandalkan keyboard sebagai input, android dan iOS mengandalkan touch screen, Play Station mengandalkan Joystick. Jelas sangat jauh beda kan HUD diantara platform-platform ini? Tapi HUD yang beda-beda ini bisa kita seragamkan untuk mengontrol interface yang sama, yaitu IControllableVehicle. Nah loh... 1x develop uda bisa dipakai dimana aja, plus buat project beda-beda kan?? Inilah kekuatan OOP, cukup sakti jika kita bisa memanfaatkan fitur-fiturnya.. :)
Dan berikut adalah contoh scriptnya. Saya buat menggunakan java karena saya rasa java lebih familiar dengan Sobat programmer :
Kelas HUD.java
Kelas Car.java
Kelas Boat.java
Dan berikut adalah contoh scriptnya. Saya buat menggunakan java karena saya rasa java lebih familiar dengan Sobat programmer :
Kelas HUD.java
public class HUD {Interface IControllableVehicle.java
private final IControllableVehicle vehicle;
public static void main(String[] args) {
System.out.println("Start to controll Car");
HUD hudCar = new HUD(new Car());
hudCar.drive();
System.out.println("Start to controll Boat");
HUD hudBoat = new HUD(new Boat());
hudBoat.drive();
}
public HUD(IControllableVehicle vehicleToControl) {
this.vehicle = vehicleToControl;
}
private void drive() {
vehicle.accelerate();
vehicle.turnLeft();
vehicle.turnRight();
vehicle.brake();
}
}
public interface IControllableVehicle {
void accelerate();
void brake();
void turnLeft();
void turnRight();
}
Kelas Car.java
public class Car implements IControllableVehicle {
@Override
public void accelerate() {
System.out.println("Car accelerate");
}
@Override
public void brake() {
System.out.println("Car brake");
}
@Override
public void turnLeft() {
System.out.println("Car turn left");
}
@Override
public void turnRight() {
System.out.println("Car turn right");
}
}
Kelas Boat.java
public class Boat implements IControllableVehicle {
@Override
public void accelerate() {
System.out.println("Boat accelerate");
}
@Override
public void brake() {
System.out.println("Boat brake");
}
@Override
public void turnLeft() {
System.out.println("Boat turn left");
}
@Override
public void turnRight() {
System.out.println("Boat turn right");
}
}
Adapun output yang ditampilkan adalah sbb :
Sekarang jelas bukan? Pada contoh diatas hanya ada 1 kelas HUD. Namun kelas HUD ini dapat digunakna untuk melakukan control beberapa kelas yang berbeda, dengan catatan kelas tersebut harus mengimplementasikan IControllableVehicle. Sangat efisien bukan?
FUNGSI 2 : Menangani event. Interface dapat juga digunakan untuk menangani suatu event tertentu dari suatu kelas. Mungkins sedikit saja penjelasannya, langsung masuk ke contoh kasusnya
Contoh kasus :
Masih dengan kasus bikin game racing tadi. Kita akan menambah 1 kelas lagi yaitu pemadam kebakaran atau kita sebut Fireman. Ceritanya, Fireman ini bertugas memadamkan object yang terbakar, entah itu Mobil atau Boat.
Satu poin penting disini, object vehicle dalam hal ini Car dan Boat adalah object utama yang menjadi pusat perhatian Fireman. Sedangkan Fireman hanya Object tambahan sebagai pelengkap. Intinya, tanpa Fireman Mobil atau Boat dapat berjalan dan tidak ada masalah. Namun Fireman tanpa Mobil atau Boat tidak bekerja karena tidak tahu apa yang diawasi. Poin penting berikutnya dalam hal ini adalah adanya sebuah event, yaitu ketika mobil terbakar, atau dapat kita sebut OnBurn event.
Dalam logika kita sebagai manusia, seorang Fireman akan selalu memantau Car setiap detik bahkan setiap milisecond. Ketika mobil meledak maka Fireman akan langsung berlari mendatangi mobil untuk memadamkan. Kita dapat membuat hal tersebut di dalam program sbb :
Kelas Car.java
Kelas Fireman.java
Namun pertanyaanya? Seberapa efisienkah cara ini? Bagaimana jika Fireman harus mengamati 10.000 mobil sekaligus? Tentu hal ini akan sangat membebani kerja CPU.
Salusi kedua yang lebih efisien adalah sebelum permainan dimulai kita beri tahu mobil, kalau-kalau terjadi kebakaran maka segera hubungi Fireman. Jadi ketika sewaktu waktu ada event burn, maka mobil akan segera menghubungi Fireman. Ini akan jauh-jauh lebih efisien karena fireman tidak harus selalu melihat mobil setiap detik, namun mobil apa saja yang terbakar akan segera menghubungi Fireman untuk dipadamkan.
Nah untuk membuatnya kita akan membuat interface dapat terbakar yang kita sebut IBurnable. Berikut adalah kelas Fireman, Car, dan interface IBurnable. Untuk mempermudah saya akan memodifikasi kelas mobil dengan memberinya nama.
Interface IBurnable.java
Kelas Fireman.java
Kelas Car.java
Sekarang jelas bukan? Pada contoh diatas hanya ada 1 kelas HUD. Namun kelas HUD ini dapat digunakna untuk melakukan control beberapa kelas yang berbeda, dengan catatan kelas tersebut harus mengimplementasikan IControllableVehicle. Sangat efisien bukan?
FUNGSI 2 : Menangani event. Interface dapat juga digunakan untuk menangani suatu event tertentu dari suatu kelas. Mungkins sedikit saja penjelasannya, langsung masuk ke contoh kasusnya
Contoh kasus :
Masih dengan kasus bikin game racing tadi. Kita akan menambah 1 kelas lagi yaitu pemadam kebakaran atau kita sebut Fireman. Ceritanya, Fireman ini bertugas memadamkan object yang terbakar, entah itu Mobil atau Boat.
Satu poin penting disini, object vehicle dalam hal ini Car dan Boat adalah object utama yang menjadi pusat perhatian Fireman. Sedangkan Fireman hanya Object tambahan sebagai pelengkap. Intinya, tanpa Fireman Mobil atau Boat dapat berjalan dan tidak ada masalah. Namun Fireman tanpa Mobil atau Boat tidak bekerja karena tidak tahu apa yang diawasi. Poin penting berikutnya dalam hal ini adalah adanya sebuah event, yaitu ketika mobil terbakar, atau dapat kita sebut OnBurn event.
Dalam logika kita sebagai manusia, seorang Fireman akan selalu memantau Car setiap detik bahkan setiap milisecond. Ketika mobil meledak maka Fireman akan langsung berlari mendatangi mobil untuk memadamkan. Kita dapat membuat hal tersebut di dalam program sbb :
Kelas Car.java
public class Car implements IControllableVehicle {
boolean isCarBurn;
public boolean isBurn(){
return this.isCarBurn;
}
//Method lain-lain
}
Kelas Fireman.java
public class Fireman {
Car car;
//Fungsi ini dipanggil setiap 0.2 detik
void Update(){
if(car.isBurn()){
//Mendatangi mobil dan memadamkan api
}
}
}
Namun pertanyaanya? Seberapa efisienkah cara ini? Bagaimana jika Fireman harus mengamati 10.000 mobil sekaligus? Tentu hal ini akan sangat membebani kerja CPU.
Salusi kedua yang lebih efisien adalah sebelum permainan dimulai kita beri tahu mobil, kalau-kalau terjadi kebakaran maka segera hubungi Fireman. Jadi ketika sewaktu waktu ada event burn, maka mobil akan segera menghubungi Fireman. Ini akan jauh-jauh lebih efisien karena fireman tidak harus selalu melihat mobil setiap detik, namun mobil apa saja yang terbakar akan segera menghubungi Fireman untuk dipadamkan.
Nah untuk membuatnya kita akan membuat interface dapat terbakar yang kita sebut IBurnable. Berikut adalah kelas Fireman, Car, dan interface IBurnable. Untuk mempermudah saya akan memodifikasi kelas mobil dengan memberinya nama.
Interface IBurnable.java
public interface IBurnable {
void burn();
void registerFireman(Fireman fireman);
void removeFireman(Fireman fireman);
}
Kelas Fireman.java
public class Fireman {
String name;
ArrayList firemans = new ArrayList
public Fireman(String name) {
this.name = name;
}
public void AnObjectIsOnFire(IBurnable burnable){
System.out.println(name + " goto : " + burnable.toString());
}
}
Kelas Car.java
public class Car implements IControllableVehicle, IBurnable {
String name;
public Car() { }
public Car(String name) {
this.name = name;
}
@Override
public void accelerate() {
System.out.println("Car accelerate");
}
@Override
public void brake() {
System.out.println("Car brake");
}
@Override
public void turnLeft() {
System.out.println("Car turn left");
}
@Override
public void turnRight() {
System.out.println("Car turn right");
burn(); //simulasi misal ketika belok kanan mobil akan terbakar
}
@Override
public void burn() {
for(Fireman fireman : firemans){
fireman.AnObjectIsOnFire(this);
}
}
@Override
public void registerFireman(Fireman fireman) {
if(!firemans.contains(fireman)){
firemans.add(fireman);
}
}
@Override
public void removeFireman(Fireman fireman) {
if(firemans.contains(fireman)){
firemans.remove(fireman);
}
}
@Override
public String toString() {
return this.name;
}
}
Dalam kelas diatas lihat kelas mobil dalam method turnRight. Pada method tersebut kita asumsikan jika mobil belok ke kanan, maka mobil akan terbakar. Hal ini cuma digunakan untuk test program. Selain itu kita asumsikan ketika mobil meledak player akan berganti mobil dan mengendarai mobil lainya. Berikut adalah script HUD nya :
Kelas HUD.java
public class HUD {
private final IControllableVehicle vehicle;
public static void main(String[] args) {
//Create fireman
Fireman paijo = new Fireman("Paijo");
Fireman paimin = new Fireman("Paimin");
Fireman santoso = new Fireman("Santoso");
//Create car
Car ferrari = new Car("Ferrari");
Car toyota = new Car("Toyota");
//Register fireman
ferrari.registerFireman(paijo);
toyota.registerFireman(paimin);
toyota.registerFireman(santoso);
//Test
HUD hud = new HUD(ferrari);
hud.drive();
System.out.println("");
hud = new HUD(toyota);
hud.drive();
}
public HUD(IControllableVehicle vehicleToControl) {
this.vehicle = vehicleToControl;
}
private void drive() {
vehicle.accelerate();
vehicle.turnLeft();
vehicle.brake();
vehicle.turnRight();
}
}
Adapun outputnya adalah sbb :
1. Terdapat 3 orang fireman : Paijo, Paimin, dan Santoso.
2. Terdapat 2 buah mobil : Ferrari dan Toyota
3. Mobil Ferrari diawasi oleh Paijo, sedangkan Toyota diawasi oleh Paimin dan Santoso.
4. Ketika terjadi event burn dari mobil, maka mobil akan melaporkan event tersebut terhadap listenernya.
KESIMPULAN :
Interface merupakan satu bagian penting dari sebuah bahasa pemrograman OOP. Mungkin suatu program dapat berjalan dengan baik tanpa menggunakan interface. Namun, penggunaan fungsi interface dapat membuat program lebih flexible dan mudah dikembangkan. Penggunaan interface juga dapat membuat program menjadi lebih efisien karena Interface dapat digunakan untuk menangani event tertentu dalam suatu object.
PENUTUP :
Ok.. Penjelasan tadi adalah sedikit fungsi dari interface yang mungkin sering digunakan. Semoga artikel ini bermanfaat sehingga Sobat dapat menggunakan fungsi Interface dengan baik. Mungkin sekian yang dapat saya sampaikan. Untuk download contohnya saya sertakan di link bawah. Tetap semangat dan terus berkarya... ^^
Link download contoh klik disini (netbeans project)
EmoticonEmoticon