Ada yang menarik tentang public variable dan property. Sekilas tampak sederhana, public variable, that’s it ^^ Lalu bagaimana dengan property? Tidak jauh berbeda, keduanya tampak sederhana. Tapi, sebenarnya dibalik kesederhanaan mereka, tersimpan rahasia keunikan masing-masing. Serupa tapi tak sama. Seolah tidak berbeda, ketika saya menggunakan sebuah public variable, maka saya bisa menggantinya dengan property, dan vice versa. Semudah itu kah? Mengapa harus ada property jika keberadaan public variable sudah cukup untuk mengakomodasikan kebutuhan pemrograman, termasuk Pemrograman Berorientasi Obyek / Object Oriented Programming (OOP)?
Mari kita coba mengenal mereka lebih dekat.. Oya sebelumnya, tulisan saya ini merujuk pada teknologi .NET dan contoh-contoh kode yang ada pada tulisan ini menggunakan bahasa C#. Tapi tidak menutup kemungkinkan untuk mengimplementasikan public variable dan property ke dalam bahasa yang lain, seperti JAVA, VB.NET, dan bahasa lainnya yang mendukung implementasi property-walaupun beberapa bahasa pemrograman mengimplementasikan property dengan cara yang berbeda, JAVA contohnya, dengan konsep mutator/accessor nya.
Misalnya Anda adalah seorang Mahasiswa yang diminta untuk membuat sebuah SIMAK (Sistem Informasi Akademis) oleh Wakil Dekan bagian Kemahasiswaan. Beliau mengatakan “Tenang saja, ini bukan proyek sosial.. Dan semua Software yang dibutuhkan tersedia dan sudah berlisensi”. Waah mimpi apa yaa semalam? tanpa pikir panjang, taaariik maaaaang.
Selanjutnya, apa yang Anda punya pada SIMAK yang Anda buat? Ternyata ada sebuah class bernama “Mahasiswa”. Obyek “Mahasiswa” ini nantinya diharapkan memiliki sebuah field atau storage atau state yang bernama “Nama”, yang akan digunakan oleh class-class lainnya. Jika Anda merealisasikannya ke dalam sebuah public variable, maka akan menjadi seperti ini:
public string Nama;
Baiklah, semuanya berjalan dengan lancar sejauh ini. Anda sudah punya class bernama “Mahasiswa” dengan sebuah public variable bernama “Nama”.
Lalu, public variable “Nama” ini digunakan di berbagai tempat pada Sistem Informasi Akademis Anda. Katakanlah ada class-class lain bernama “Dosen”, “MataKuliah”, “Kelas”, “Jadwal”, “SKS”, “SPP”, dan lainnya. variable “Nama” tadi digunakan pada 300 tempat (misalnya pada class “SKS” dan class “SPP”) di luar class “Mahasiswa”. Hmmm.. How’s that? So far, everything goes well ^ ^
Satu hari sebelum presentasi penyerahan produk SIMAK ini, Bapak Wakil Dekan menghampiri Anda dan mengatakan “Maaf saya lupa tentang satu hal. Hari ini semua jurusan mengumpulkan datanya pada database Fakultas. Semuanya sudah lengkap, hanya saja ada sedikit masalah.. format nama Mahasiswa dari setiap jurusan tidak sama. Ada yang huruf besar semua, ada yang huruf kecil semua, ada yang begini dan begitu. Padahal untuk presentasi besok, saya ingin setiap kali nama Mahasiswa tampil di layar, huruf awal dari setiap kata pada nama Mahasiswa, ditampilkan dengan huruf besar. Semisal nama Anda adalah Fajar Endra Nusa, maka huruf ‘F’, ‘E’, dan ‘N’ ditampilkan dengan huruf besar, di manapun itu, termasuk di laporan. Apakah bisa?”. Walaupun panik, sebagai seorang Mahasiswa yang super fantastis dan nyaris Cum Laude, Anda paling tidak bisa menerima kondisi ketidak-mampuan dalam menyelesaikan masalah. Langsung saja Anda menjawab dengan tunai “Bisa, Pak.”.
Kenyataan yang sedang Anda hadapi adalah, terbatasnya waktu yang Anda miliki untuk menyamakan format nama Mahasiswa pada database. Pilihan lain yang ada adalah melakukan proses format nama Mahasiswa melalui program SIMAK Anda (melalui coding). Kita lihat kembali SIMAK yang telah Anda buat. Anda masih ingat kan, variable “Nama” telah digunakan pada 300 tempat (pada class-class lain di luar class Mahasiswa itu sendiri). Sementara, Anda harus memaksa memastikan bahwa penggunaan variable “Nama” (pada 300 tempat tersebut) menghasilkan nama Mahasiswa dalam bentuk format yang sesuai dengan permintaan Pak Wakil Dekan. Berarti di 300 tempat tersebut, Anda harus melakukan proses format nama Mahasiswa terhadap variable “Nama”. *blarr* Bagaikan petir di siang bolong, ini mimpi buruk tentunya. Bagaimana jika pemakaian variable “Nama” ada pada 4000 tempat? apakah Anda harus mengolah variable “Nama” menjadi format yang diinginkan pada 4000 tempat yang berbeda?
Heiyy.. kita melupakan sesuatu!! Bagaimana dengan property?? Bukankah di sini kita akan membahas public variable dan property?! Yaa, apa jadinya jika kita ubah variable “Nama” menjadi property? Begini lah jadinya:
private string _nama;
public string Nama
{
get { return _nama; }
set { _nama = value; }
}
Hohoho.. bukan sulapan, tapi kini kita mendapatkan solusi dari masalah ini. Kita tidak perlu mengolah nama Mahasiswa di 300 tempat yang berbeda untuk menghasilkan format yang diinginkan oleh Pak Wakil Dekan. Cukup kita olah atau kita format nama Mahasiswa sesuai dengan keinginan pada bagian getter dari property “Nama”, menjadi seperti ini:
private string _nama;
public string Nama
{
get
{
// Mengolah '_nama' menjadi format nama Mahasiswa
// yang diinginkan.
// ...
// ...
// ...
// ...
return _nama;
}
set { _nama = value; }
}
Dan dunia pun tersenyum manis ;D
Well, contoh kasus ini memang contoh kasus yang aneh, maaf saya lagi nggak punya ide untuk bikin contoh kasus yang lebih baik ;D Jadi intinya.. jika kita memerlukan pemrosesan pada sebuah field (dalam kasus lain, misalnya proses validasi, atau notifikasi event), maka property menjadi pilihan yang lebih pas dibandingkan dengan public variable.
Namun penggunaan public variable yang kemudian diganti dengan property (seperti pada kasus SIMAK ini), sebaiknya dihindari. Akan lebih baik jika dari awal langsung menggunakan property. Ada beberapa alasan yang menjadi pertimbangan untuk langsung menggunakan property dari awal, ketimbang menggunakan public variable yang pada akhirnya diganti dengan property.
Alasan pertama, ketika Anda membuat sebuah API (dalam bentuk dll misalnya) yang digunakan oleh aplikasi pihak lain (third party), maka perubahan apapun yang terjadi pada API yang anda kembangkan, seharusnya tidak mengganggu aplikasi third party yang menggunakan API tersebut. Ketika third party mengganti API yang Anda buat dengan versi yang lebih baru, seharusnya aplikasi third party tersebut tetap berjalan dengan baik tanpa perlu proses compile ulang. Sementara, jika Anda merubah sebuah public variable menjadi property pada API yang anda buat.. kemudian anda compile ulang, dan applikasi third party meng-update API tersebut dengan versi yang baru saja ter-compile ulang.. maka ketika applikasi third party tersebut di jalankan, akan menghasilkan sebuah Exception; MissingFieldException: Field not found: ‘[Nama-public-variable]’. Dan dunia pun cemberut, karena aplikasi third party tersebut perlu di-compile ulang juga.
Kedua, Anda tidak bisa melakukan data binding terhadap public variable. Hanya property yang bisa. Dan ketiga, Reflection memperlakukan property dan public variable secara berbeda (PropertyInfo dan FieldInfo).
Untuk poin kedua dan ketiga, tentang data binding dan Reflection, semoga saya bisa membahasnya secara terpisah lain kali.. InsyaaAlloh.
Sebenarnya, selain ketiga alasan tersebut, ada beberapa keuntungan lainnya dari penggunaan property dibandingkan dengan public variable. Diantaranya, kita bisa menaruh breakpoint pada property yang akan mempermudah proses debug. Selain itu, kita bisa tentukan akses read-only/write-only terhadap property. Dan accessibility level nya pun bisa kita tentukan untuk masing-masing setter dan getter nya, apakah mau menjadikan setter nya menjadi internal, atau lainnya.
Yep, kesimpulannya, penggunaan property dari awal akan lebih baik, kecuali ada pertimbangan tertentu dalam masalah performance. Humm.. Jika ada yang kurang atau salah dari tulisan ini, mohon masukannya.. saya sendiri masih perlu banyak belajar ^ ^
June 13th, 2008 at 4:08 pm
Namun penggunaan public variable yang kemudian diganti dengan property (seperti pada kasus SIMAK ini), sebaiknya dihindari. <= bukan sebaiknya jar, tapi HARUS
June 13th, 2008 at 4:58 pm
Thanks sam, iya sih, HARUS ;D
ntar tak update deh hehe..
June 15th, 2008 at 10:46 pm
Klo kasusnya bukan di database programing gmn? apa hukumnya menggunakan property? wajib juga kayaknya ya?
June 16th, 2008 at 8:20 am
@Enzie:
Klo masalah database application, itu cuma contoh kasus. Intinya adalah, konsep penggunaan property itu sendiri, approach nya seperti itu, tidak menggunakan public variable lagi ^ ^
June 16th, 2008 at 2:25 pm
Mantabs, cool, keren
June 16th, 2008 at 2:49 pm
Wah ada om uud.. jadi malu… ;D
July 13th, 2008 at 1:50 pm
public variable biasanya digunakan untuk bikin enumerasi atau konstanta
July 13th, 2008 at 4:20 pm
@Agus Surachman:
Sebuah masukan yang bagus dari Pak Agus : )
Trims, Pak..
July 14th, 2008 at 4:55 pm
[…] beberapa yang lalu saya membahas tentang perbedaan antara public variable dan property, kali ini saya akan coba untuk membahas tentang perbedaan antara const dan static […]