Lompat ke konten Lompat ke sidebar Lompat ke footer

[Oop] Sekilas Wacana Fungsi Interface Di Java, C#, Dan Bahasa Pemrograman Oop Lainnya

Hampir semua bahasa pemrogramaan berbasis OOP menyediakan akomodasi Interface, sebut saja yang cukup populer mirip Java dan C#. Mungkin Sobat programmer sedikit banyak sudah sangat hafal apa itu pengertian interface, yaitu suatu kelas yang mempunyai deklarasi method tanpa adanya implementasi di dalamnya. Namun hafal pengertiannya saja tidak cukup bukan? Faktanya, dari sebagian besar sahabat programmer yang aku temui masih cukup banyak yang galau perihal apa itu interface dan apa fungsinya. Padahal adanya interface ini berdasarkan aku sangat-sangat penting. Nah pada artikel ini akan aku uraikan secara singkat apa saja manfaat interface dengan sedikit teladan masalah sederhana sbb :

Note : Sebelum melihat lebih jauh Anda sanggup mendownload teladan projectnya disni.

Contoh masalah :
Misal aku ingin menciptakan game balap mobil. Tahu kan game balap mobil?  Makara kurang lebih mirip ini nih game yang pengen aku buat 

 Hampir semua bahasa pemrogramaan berbasis OOP menyediakan akomodasi Interface [OOP] Sekilas Tentang Fungsi Interface di Java, C#, dan Bahasa Pemrograman OOP Lainnya

Kemudian pengennya abis game kendaraan beroda empat ini selesai aku mau bikin game balapan boat. Makara kayak gini nih contohnya 

 Hampir semua bahasa pemrogramaan berbasis OOP menyediakan akomodasi Interface [OOP] Sekilas Tentang Fungsi Interface di Java, C#, dan Bahasa Pemrograman OOP Lainnya

Masalahnya nih... Saya itu orangnya super males... Saya gak mau bikin jadwal berkali-kali, aku maunya bikin code 1x doank, nanti kalo ada tambahan ya ditambahi, tapi aku gak mau ngoding sesuatu yang hampir sama 2x, gak efisien.
  
Nah.. akibatnya untuk masalah ini aku memecah jadwal menjadi tiga kelas utama. Perkara kelas ini nanti extends ke macem-macem g masalah, yang penting aku 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.. menyerupai sebuah mobil, kelas ini yakni kelas untuk kemudi dan segala peralatan navigasinya. Kelas ini berfungsi untuk menangani input user mirip setir kanan dan kiri, gas, rem, menampilkan status kecepatan, nitro, posisi, lap, mini map, dsb. Intinya kelas ini menangani antarmuka kendaraan dengan user atau sanggup dikatakan navigasi.

 Hampir semua bahasa pemrogramaan berbasis OOP menyediakan akomodasi Interface [OOP] Sekilas Tentang Fungsi Interface di Java, C#, dan Bahasa Pemrograman OOP Lainnya

Karena aku itu males, aku pengennya kelas ini dipake 2x, pada proyek pertama aku akan menggunakan kelas ini untuk mengontrol mobil, tapi pada proyek kedua aku akan menggunakannya kembali untuk mengontrol boat, dimana kendaraan beroda empat dan boat jelas-jelas berbeda, engine nya juga terperinci jauh berbeda.
2. Kelas Car. Sesuai namanya, kelas ini yakni kelas untuk menjalankan mobil. Ibaratnya kelas ini yakni mesin dari mobil.
3. Kelas Boat. Sama mirip kelas mobil, kelas ini sanggup diibaratkan dengan sebagai mesin dari boat. 

Kemudian gimana caranya, bikin dua kelas berbeda tapi sanggup di kontrol oleh satu HUD? Inilah salah satu fungsi dari interface. Ok.. Langsung saja kita bahas lebih detail perihal fungsi dari interface. Berikut yakni beberapa fungsi dari interface :

FUNGSI 1 : Membuat jadwal lebih reuseable. Menurut aku inilah fungsi utama interface. Dengan memanfaatkan interface setiap bab jadwal sanggup dijadikan suatu modul tersendiri. Modul ini sanggup diberi interface tertentu sehingga untuk memanfaatkan modul ini pada proyek lain cukup dengan mengimplementasikan interface yang telah disediakan, sehingga tidak perlu merubah code jadwal sedikitpun. Cukup implementasi, beres.. 

Contoh masalah : 
Dari teladan masalah di atas terperinci kan, kita pengen menggunakan 1 HUD untuk mengontrol lebih dari satu type kendaraan yang sangat berbeda. Bahkan sanggup jadi pada proyek berikutnya muncul kelas-kelas gres mirip tank, train, truck, dsb. Kelas-kelas ini sanggup sangat rumit, sanggup extends ke kelas apapun. 

Tentu akan memakan waktu cukup usang kan bila kita menciptakan 1 kelas HUD untuk 1 type kendaraan? Bukannya lebih baik kita buat 1 HUD untuk semua kendaraan? Kalaupun texturenya beda-beda (misal bentuk kemudi kendaraan beroda empat dan kemudi truck beda) kan itu cuman beda texture saja, sanggup diganti dengan mengganti atribut texture dari kelas HUD saja, tidak perlu menambah kelas HUD gres alasannya yakni pada dasarnya 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, sanggup kita extends dari kelas HUD, tp pada dasarnya 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 biar sanggup di kontrol oleh HUD. Kita sanggup buat interface ControllableVehicle atau bila aku pribadi aku lebih bahagia menambahkan karakter 'I' di awal nama interface untuk membedakan namanya dengan kelas. Makara namanya menjadi IControllableVehicle. Nah interface inilah yang nanti sanggup diimplementasikan oleh kelas-kelas yang sanggup dikontrol oleh HUD. Makara pada dasarnya HUD tidak mengenal apa itu mobil, boat, train, tank, dsb. Yang HUD tahu yakni HUD sanggup mengontrol interface IControllableVehicle. Makara kalo kita pengen menambah apapun yang sanggup 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 sanggup 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 terperinci mempunyai HUD yang jauh berbeda, alasannya yakni 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 sanggup kita seragamkan untuk mengontrol interface yang sama, yaitu IControllableVehicle. Nah loh... 1x develop uda sanggup digunakan dimana aja, plus buat project beda-beda kan?? Inilah kekuatan OOP, cukup sakti bila kita sanggup memanfaatkan fitur-fiturnya.. :)

Dan berikut yakni teladan scriptnya. Saya buat menggunakan java alasannya yakni aku rasa java lebih familiar dengan Sobat programmer :

Kelas HUD.java
public class HUD {      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();     } }  
Interface IControllableVehicle.java
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 yakni sbb :

 Hampir semua bahasa pemrogramaan berbasis OOP menyediakan akomodasi Interface [OOP] Sekilas Tentang Fungsi Interface di Java, C#, dan Bahasa Pemrograman OOP Lainnya

Sekarang terperinci bukan? Pada teladan diatas hanya ada 1 kelas HUD. Namun kelas HUD ini sanggup digunakna untuk melaksanakan control beberapa kelas yang berbeda, dengan catatan kelas tersebut harus mengimplementasikan IControllableVehicle. Sangat efisien bukan?



FUNGSI 2 : Menangani event. Interface sanggup juga digunakan untuk menangani suatu event tertentu dari suatu kelas. Mungkins sedikit saja penjelasannya, pribadi masuk ke teladan kasusnya 

Contoh masalah :
Masih dengan masalah 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 yakni object utama yang menjadi sentra perhatian Fireman. Sedangkan Fireman hanya Object tambahan sebagai pelengkap. Intinya, tanpa Fireman Mobil atau Boat sanggup berjalan dan tidak ada masalah. Namun Fireman tanpa Mobil atau Boat tidak bekerja alasannya yakni tidak tahu apa yang diawasi. Poin penting berikutnya dalam hal ini yakni adanya sebuah event, yaitu saat kendaraan beroda empat terbakar, atau sanggup kita sebut OnBurn event.

Dalam logika kita sebagai manusia, seorang Fireman akan selalu memantau Car setiap detik bahkan setiap milisecond. Ketika kendaraan beroda empat meledak maka Fireman akan pribadi berlari mendatangi kendaraan beroda empat untuk memadamkan. Kita sanggup menciptakan hal tersebut di dalam jadwal 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 kendaraan beroda empat dan memadamkan api         }     } } 

Namun pertanyaanya? Seberapa efisienkah cara ini? Bagaimana bila Fireman harus mengamati 10.000 kendaraan beroda empat sekaligus? Tentu hal ini akan sangat membebani kerja CPU.

Salusi kedua yang lebih efisien yakni sebelum permainan dimulai kita beri tahu mobil, kalau-kalau terjadi kebakaran maka segera hubungi Fireman. Makara saat sewaktu waktu ada event burn, maka kendaraan beroda empat akan segera menghubungi Fireman. Ini akan jauh-jauh lebih efisien alasannya yakni fireman tidak harus selalu melihat kendaraan beroda empat setiap detik, namun kendaraan beroda empat apa saja yang terbakar akan segera menghubungi Fireman untuk dipadamkan.

Nah untuk membuatnya kita akan menciptakan interface sanggup terbakar yang kita sebut IBurnable. Berikut yakni kelas Fireman, Car, dan interface IBurnable. Untuk mempermudah aku akan memodifikasi kelas kendaraan beroda empat 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 saat belok kanan kendaraan beroda empat 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 kendaraan beroda empat dalam method turnRight. Pada method tersebut kita asumsikan bila kendaraan beroda empat belok ke kanan, maka kendaraan beroda empat akan terbakar. Hal ini cuma digunakan untuk test program. Selain itu kita asumsikan saat kendaraan beroda empat meledak player akan berganti kendaraan beroda empat dan mengendarai kendaraan beroda empat lainya. Berikut yakni 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 yakni sbb :

 Hampir semua bahasa pemrogramaan berbasis OOP menyediakan akomodasi Interface [OOP] Sekilas Tentang Fungsi Interface di Java, C#, dan Bahasa Pemrograman OOP Lainnya

Nah dalam HUD tadi sanggup kita garis bawahi sbb :
1. Terdapat 3 orang fireman : Paijo, Paimin, dan Santoso.
2. Terdapat 2 buah kendaraan beroda empat : Ferrari dan Toyota
3. Mobil Ferrari diawasi oleh Paijo, sedangkan Toyota diawasi oleh Paimin dan Santoso.
4. Ketika terjadi event burn dari mobil, maka kendaraan beroda empat akan melaporkan event tersebut terhadap listenernya.

KESIMPULAN :
Interface merupakan satu bab penting dari sebuah bahasa pemrograman OOP. Mungkin suatu jadwal sanggup berjalan dengan baik tanpa menggunakan interface. Namun, penggunaan fungsi interface sanggup menciptakan jadwal lebih flexible dan gampang dikembangkan. Penggunaan interface juga sanggup menciptakan jadwal menjadi lebih efisien alasannya yakni Interface sanggup digunakan untuk menangani event tertentu dalam suatu object.  

PENUTUP :
Ok.. Penjelasan tadi yakni sedikit fungsi dari interface yang mungkin sering digunakan.  Semoga artikel ini bermanfaat sehingga Sobat sanggup menggunakan fungsi Interface dengan baik. Mungkin sekian yang sanggup aku sampaikan.  Untuk download misalnya aku sertakan di link bawah. Tetap semangat dan terus berkarya... ^^

Link download teladan klik disini (netbeans project)




Sumber http://duniadigit.blogspot.com/