Bahasa Generik


Pemrograman generik adalah penulisan kode yang bisa digunakan oleh berbagai macam tipe data. Kita telah menemukan istilahnya pada bagian sebelumnya tentang array dinamis integer. Kode yang ditulis di sana untuk array dinamis integer hanya bisa bekerja untuk tipe data int. Akan tetapi kode array dinamis untuk double, String, atau tipe data lainnya hampir sama. Akan sangat tidak nyaman apabila kita harus mengkopi kodenya berulang-ulang untuk tipe data yang berbeda-beda.
Seperti disebutkan sebelumnya, Java mencoba menyelesaikan masalah ini dengan membuat kelas ArrayList. Kelas ini pada dasarnya merupakan array dinamis dengan tipe Object. Karena semua kelas merupakan kelas turunan dari Object, maka objek yang bertipe kelas apapun bisa disimpan dalam ArrayList.
Ini adalah contoh pemrograman generik : kode untuk kelas ArrayList cukup ditulis satu kali, tetapi bisa digunakan untuk objek dengan tipe data yang berbeda-beda (akan tetapi, tidak bisa digunakan untuk tipe data primitif, seperti int atau double.)
Kelas ArrayList hanyalah satu dari beberapa kelas dan interface yang merupakan pemrograman generik pada Java. Kita akan lihat beberapa kelas lain dan bagaimana kelas-kelas ini digunakan. Semua kelas yang didiskusikan pada bagian ini merupakan bagian dari paket java.util dan kita perlu menambahkan pernyataan import di awal program untuk bisa menggunakannya. (Sebelum kita menggunakan perintah import java.util.*; di semua program, kita harus tahu bahwa beberapa kelas di dalam java.util memiliki nama yang sama pada pake lain. Misalnya, java.util.List dan java.awt.List adalah kelas yang bernama sama dengan paket yang berbeda).
Adalah sesuatu hal yang tidak mudah untuk mendesain pustaka untuk pemrograman generik. Solusi yang disediakan Java memiliki banyak fitur bagus, akan tetapi bukan berarti cara ini adalah cara satu-satunya. Sudah pasti bukan yang terbaik, akan tetapi dalam konteks desain Java secara keseluruhan, mungkin lebih cocok disebut optimal. Untuk dapat memberikan gambaran seperti apa pemrograman generik secara umum, mungkin akan lebih baik untuk melihat sekilas pemrograman generik di bahasa pemrograman lain.

Pemrograman Generik pada Smalltalk
Smalltalk adalah salah satu bahasa pemrograman berorientasi objek pertama. Bahasa ini masih digunakan hingga kini. Meskipun tidak menjadi sepopuler Java atau C++, bahasa ini adalah sumber ide yang diadopsi banyak bahasa pemrograman. Pada Smalltalk, pada dasarnya semua pemorgraman adalah generik, karena dua sifat bahasa ini.
Pertama, variabel pada Smalltalk tidak memiliki tipe. Suatu nilai memiliki tipe, seperti integer atau string, tetapi variabel tidak memiliki nilai. Suatu variabel bisa menampung jenis data apa saja. Parameter juga tidak memiliki tipe, sehingga subrutin bisa digunakan pada parameter apa saja. Demikian juga dengan struktur data bisa menampung data apa saja. Misalnya, sekali kita mendefinisikan struktur data pohon biner pada Smalltalk, kita bisa menggunakannya untuk integer, string, tanggal, atau data apa saja. Kita tidak perlu menulis kode baru untuk masing-masing tipe data.
Kedua, semua nilai adalah objek, dan semua operasi pada objek dilakukan dengan metode dalam kelas. Hal ini juga berlaku bahkan untuk tipe data primitif seperti integer. Ketika operator “+” digunakan untuk menjumlah integer, operasi ini dilakukan dengan memanggil metode pada kelas integer. Ketika kita membuat kelas baru, kita bisa membuat operator “+” sendiri kemudian kita bisa menjumlahkan dua objek dengan tipe kelas tersebut dengan menggunakan “a + b” seperti kita menjumlahkan angka seperti biasa.
Sekarang misalnya kita membuat subrutin baru yang menggunakan operator “+” untuk menjumlahkan masing-masing item di dalam list. Subtuin ini bisa digunakan untuk list integer, tapi juga bisa digunakan ke tipe data apapun yang mendefinisikan “+”. Demikian juga dengan subrutin yang menggunakan operator “<" untuk mengurutkan list juga bisa digunakan untuk list yang mengandung tipe data apapun yang memiliki definisi "<". Kita tidak perlu menulis subrutin pengurutan untuk masing-masing tipe data.
Jika kedua fitur ini kita gabungkan, kita bisa memiliki bahasa di mana struktur data dan algoritmanya akan bekerja untuk jenis tipe data apapun (yang masuk akal), yaitu jika operasi yang sesuai telah didefinisikan. Inilah yang merupakan pemrograman generik yang sesungguhnya.
Mungkin ini terdengar sangat baik, dan Anda mungkin bertanya-tanya kenapa tidak semua bahasa pemrograman bekerja seperti ini. Kebebasan pemrograman seperti ini akan memudahkan kita membuat program, akan tetapi akan lebih sulit untuk membuat program yang benar dan tangguh.
Sekali kita membuat struktur data yang bisa menampung tipe data apa saja, akan sulit untuk menjamin ia bisa menampung tipe data yang kita inginkan. Jika kita ingin suatu subrutin mengurutkan tipe data apapun, maka akan sangat sulit untuk menjamin bahwa subrutin ini hanya digunakan untuk data di mana operator "<" telah didefinisikan. Lebih khusus, kompiler tidak bisa memastikannya. Masalah ini akan muncul di saat program dijalankan ketika kita mencoba untuk menjalankan operasi tertentu pada suatu tipe data yang belum ada, kemudian program akan crash.

Pemrograman Generik pada C++
Tidak seperti Smalltalk, C++ adalah bahasa pemrograman dengan tipe kuat, bahkan lebih kuat dari Java. Setiap variabel memiliki tipe, dan hanya bisa menampung tipe data itu saja. Artinya pemrograman generik seperti pada Smalltalk tidak mungkin diterapkan.
Lebih Jauh, C++ tidak memiliki sesuatu yang mirip dengan kelas Object pada Java. Artinya, tidak ada kelas yang merupakan kelas super dari semua kelas. Artinya C++ tidak bisa menggunakan pemrograman generik seperti Java.

Akan tetapi, C++ memiliki sistem pemrograman geneik yang canggih dan fleksibel, yaitu yang disebut template. Dalam C++, kita tidak membuat subrutin pengurutan yang berbeda untuk setiap tipe data. Akan tetapi kita bisa mmebuat template subrutin. Template ini bukan subrutin; akan tetapi mirip seperti pabrik pembuat subrutin. Kita lihat contoh berikutnya, karena sintaks C++ mirip dengan Java :
template
void urut( TipeItem A[], int banyak ) {
// Urut banyak item dalam array A, ke dalam urutan menaik
// Algoritma yang digunakan adalah pengurutan pilihan
for (int i = banyak-1; i > 0; i–) {
int posisi_maks = 0;
for (int j = 1; j A[posisi_maks] )
posisi_maks = j;
TipeItem temp = A[banyak];
A[banyak] = A[posisi_maks];
A[posisi_maks] = temp;
}
}
Dalam kode di atas, kita mendefinisikan template subrutin. Jika kita menghapus baris pertama, yaitu template”, dan mengganti kata “TipeItem” dengan “int”, pada semua isi template, maka kita bisa mendapatkan subrutin untuk mengurut array int. (Meskipun kita tulis seperti “class TipeItem”, kita bisa menggantinya dengan tipe apapun, termasuk tipe primitif). Jika kita mengganti “TipeItem” dengan string, maka kita bisa mendapatkan subrutin untuk mengurut array string. Ini yang sebenarnya dilakukan oleh compiler.
Jika program kita menyebut “urut(list,10)” di mana list adalah array int, maka kompiler menggunakan template ini untuk membuat subrutin untuk mengurut array int. Jika kita sebut “urut(kartu,10)” di mana kartu adalah array objek bertipe Kartu, maka kompiler akan membuat subrutin untuk mengurutkan array Kartu.

Template di atas menggunakan operator “>” untuk membandingkan nilai. Jika operator ini didefinisikan untuk nilai bertipe Kartu, maka kompiler akan menggunakan template dengan sukses. Jika “>” tidak didefinisikan untuk kelas Kartu, maka kompiler akan gagal, akan tetapi ini akan terjadi pada saat program dikompilasi bukan seperi Smalltalk di mana program akan crash pada saat dijalankan.
C++ juga memiliki template untuk membuat kelas. Jika kita menulis template untuk pohon biner, kita bisa menggunakan template itu untuk membuat kelas pohon biner int, pohon biner string, pohon biner tanggal, dan seterusnya — semua dari satu template. Versi paling baru C++ memiliki template bawaan yang cukup komplit yang disebut dengan Pustaka Template Standar (Standard Template Library atau STL). STL sendiri cukup kompleks, dan bahkan beberapa orang mengatakan sangat amat kompleks. Akan tetapi ini juga fitur paling menarik dari C++

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: