Jumat, 19 Oktober 2012

Ruang Lingkup dan Usia Variabel

Tidak semua variabel diciptakan sama. Variabel-variabel yang sudah pasti, akan ada selama aplikasi dijalankan, dan yang lainnya dibuat dan dihancurkan ribuan kali setiap detik. Sebuah variabel dapat kelihatan hanya dari sebuah prosedur atau sebuah modul, atau dapat ada hanya selama waktu ketika suatu jendela di aplikasi dijalankan. Untuk lebih jelasnya, ada dua definisi formal mengenai suatu variabel yang akan dibahas berikut ini
·         Ruang lingkup dari sebuah variabel, adalah porsi dari code di mana variabel tersebut dapat diakses. Sebagai contoh, sebuah variabel dideklarasikan dengan kata Public di sebuah module (.bas), akan kelihatan, dan oleh karena itu dapat dibaca dan ditulis dari manapun di aplikasi Anda. Sementara jika variabel dideklarasikan dengan menggunakan kata Private variabel tersebut hanya dapat diakses dari module itu sendiri.
·         Usia dari sebuah variabel, adalah suatu waktu selama variabel tersebut dapat bertahan di program dan menggunakan memory. Usia dari variabel yang dideklarasikan dengan kata Public bisa berlaku selama aplikasi dijalankan, tapi umumnya hal ini tidak selalu seperti itu. Sebagai contoh, sebuah variabel lokal yang dideklarasikan sebagai Dynamic dalam sebuah prosedur akan diciptakan setiap kali Visual Basic mengeksekusi prosedur tersebut dan akan dihancurkan ketika prosedur tersebut telah selesai dieksekusi.

Berikut akan kita bahas jenis-jenis variabel dilihat dari level variabel yang bertalian
  • Variabel Global
  • Variabel Level Module
  • Variabel Dynamic Local
  • Variabel Static Local

Variabel Global

Dalam Visual Basic, variabel global adalah variabel yang dideklarasikan dengan menggunakan kata kunci Public di module (.bas). Secara konsep, variabel tersebut adalah yang paling sederhana dari seluruhnya, karena dapat bertahan selama aplikasi dijalankan, dan ruang lingkup mereka berada di seluruh aplikasi. (Dengan kata lain, mereka dapat dibaca dan dimodifikasi dari manapun di dalam program tersebut). Potongan coding berikut menunjukkan pendeklarasian sebuah variabel global:
Code::
   'Dalam sebuah module (.bas)
   Public InvoiceCount as Long    'Ini adalah sebuah variabel global.
  
Visual Basic 6 masih mendukung kata kunci Global seperti yang berlaku pada Visual Basic 3 dan versi sebelumnya, tapi Microsoft tidak menganjurkan untuk menggunakannya.
Secara umum, tidak disarankan untuk menggunakan terlalu banyak variabel global. Jika memungkinkan, Anda seharusnya membatasi untuk menggunakan pada tingkat module atau variabel lokal, karena mereka membolehkan menggunakan coding secara lebih mudah. Jika module dan prosedur Anda menggunakan variabel global untuk menghubungkan di antara keduanya, Anda tidak dapat menggunakan kembali coding tanpa juga meng-copy definisi dari variabel global yang terlibat. Secara praktis, walaupun, hal ini sering tidak mungkin untuk membangun sebuah aplikasi tanpa menggunakan variabel global, Anda dianjurkan untuk menggunakan cara berikut: Gunakan mereka dengan hemat dan pilih nama yang memberi tanda bahwa ruang lingkup mereka dengan jelas (sebagai contoh, gunakan sebuah awalan g_ atau glo). Walaupun penting juga untuk menambahkan komentar di mana variabel tersebut berada dan mana saja yang digunakan atau dimodifikasi di setiap prosedur:
Code::
    'Catatan: Prosedur ini tergantung pada variabel global berikut:
    '     g_InvoiceCount  : Jumlah tagihan (dapat dibaca dan dimodifikasi)
    '     g_UserName      : Nama user yang aktif (hanya dapat dibaca)
    Sub CreateNewInvoice()
      ...
    End Sub
  
Ada sebuah alternatif, di mana saya sering memakainya dengan berguna, yaitu mendefinisikan sebuah struktur khusus GlobalUDT yang merangkum semua variabel global dari aplikasi dengan mendeklarasikan sebuah variabel global yang bertipe GlobalUDT dalam sebuah module (.bas):
Code::
  'Dalam sebuah module (.bas):
  Public Type GlobalUDT
    InvoiceCount As Long
    UserName As String
    ....
  End Type
  Public glo As GlobalUDT
  
Anda dapat mengakses variabel-variabel global tersebut dengan menggunakan sebuah cara yang sangat sederhana, jelas, dan menghilangkan sintaks yang salah:
Code::
   'Dari bagian manapun di aplikasi Anda
   'Ketika Anda mengetik "glo." maka akan muncul nama-nama variabel InvoiceCount, UserName, 
   'dan seterusnya jika ada yang Anda deklarasikan lagi dalam GlobalUDT tersebut.
   glo.InvoiceCount = glo.InvoiceCount + 1
  
Teknik ini mempunyai banyak keuntungan. Pertama, ruang lingkup variabel ditandai/dikenal dari namanya. Kemudian jika Anda tidak mengingat nama dari variabel Anda, Anda hanya mengetik tiga karakter pertama "glo", lalu ketik karakter titik (".") dan biarkan Microsoft untuk menampilkan daftar dari semua komponen variabel glo tersebut. Dalam banyak kasus, Anda hanya mengetik beberapa karakter dan membiarkan Visual Basic melengkapi nama variabel untuk Anda. Dapat menghemat waktu dengan luar biasa. Keuntungan yang ketiga adalah Anda dapat dengan mudah menyimpan semua variabel global ke dalam sebuah file:
Code::
   'Prosedur yang sama dapat menyimpan dan mengambil data global di glo.
   Sub SaveLoadGlobalData(filename As String, Save As Boolean)
      Dim filenum As Integer, isOpen As Boolean
      On Error Goto Error_Handler
      filenum = FreeFile
      Open filename For Binary As filenum
      isOpen = True
      If Save Then
         Put #filenum, , glo
      Else
         Get #filenum, , glo
      End If
   Error_Handler:
      If isOpen Then Close #filenum
   End Sub
  
Keuntungan lainnya adalah Anda dapat menambah atau menghapus variabel global yang sesungguhnya, komponen dari struktur GlobalUDT, tanpa harus memodifikasi prosedur SaveLoadGlobalData. (Tentu saja, Anda tidak dapat mengambil data secara benar dengan sebuah versi yang berbeda dari GlobalUDT)

Variabel Level Module

Jika Anda mendeklarasikan sebuah variabel menggunakan kata kunci Private atau dengan menggunakan Dim pada bagian paling atas (bagian deklarasi) pada sebuah module (.bas), sebuah module form, sebuah class module, dan sebagainya, Anda membuat sebuah variabel dengan level module. Variabel seperti ini kelihatan hanya dari module di mana mereka berada dan tidak dapat diakses dari luar. Secara umum, variabel-variabel ini dapat digunakan bagi setiap prosedur yang berada dalam module yang sama.
Code::
 
   'Di bagian deklarasi (paling atas) dari setiap module apapun 
   '(module, form, class module, dll)
   Private LoginTime As Date     'Sebuah variabel private pada level module
   Dim LoginPassword As String   'Variabel private lainnya pada level module
  
Anda dapat juga menggunakan kata kunci Public untuk variabel pada level module, untuk semua tipe module kecuali module bas. (Variabel Public di module .bas merupakan variabel yang bertipe global). Dalam hal ini, Anda membuat suatu terobosan: Sebuah variabel Public pada tingkat module, yang dapat diakses oleh semua prosedur dalam module untuk membagi/memberikan data dan juga dapat diakses dari luar module tersebut. Dalam hal ini, biar bagaimanapun, hal ini lebih pantas untuk mendeskripsikan sebuah variabel sebagai property:
Code::
 
   'Di bagian deklarasi dalam module Form1
   Public CustomerName As String     'Sebuah property Public
  
Anda dapat mengakses sebuah property module sebagai variabel regular dari dalam module dan sebagai property custom dari luar:
Code::
   'Dari luar module Form1...
   Form1.CustomerName = "John Smith"
  
Usia dari sebuah variabel level module bersamaan dengan usia dari module itu sendiri. Variabel Private dalam standar module (.bas) bertahan selama usia dari aplikasi, walaupun jika mereka dapat diakses hanya ketika Visual Basic sedang mengeksekusi coding di module itu. Variabel-variabel di dalam form dan class module ada hanya ketika module tersebut diload ke memory. Dengan kata lain, sementara sebuah form aktif (tapi tidak perlu harus kelihatan kepada user), semua variabel yang ada dalam form tersebut membutuhkan memory, dan memory ini dibebaskan kembali hanya ketika form tersebut benar-benar di-unload dari memory. Ketika waktu berikutnya form dibuat, Visual Basic mengalokasi kembali memory untuk semua variabel tersebut dan mengeset nilai mereka ke nilai default masing-masing (nol (0) untuk nilai numeric, string kosong ("") untuk strings, Nothing untuk variabel object).

Variabel Dynamic Local

Variabel Dynamic local didefinisikan di dalam sebuah prosedur; ruang lingkup mereka adalah prosedur itu sendiri, dan usia mereka selama/bersamaan dengan usia prosedur itu:
Code::
   Sub PrintInvoice()
      Dim text As String    'Ini variabel dynamic local.
      ...
   End Sub
  
Setiap kali prosedur tersebut dieksekusi, sebuah variabel Dynamic dibuat kembali dan diinisialisasi ke nilai default-nya (0, string kosong, atau Nothing). Ketika prosedur ini telah selesai, memory di stack dialokasi oleh Visual Basic untuk variabel yang dibebaskan. Variabel Lokal membuatnya mungkin digunakan kembali pada level prosedur. Jika sebuah prosedur mempunyai referensi hanya parameternya dan variabel local miliknya (berpindah tidak antar variabel global maupun variabel level module), dia dapat "dipotong" dari satu aplikasi dan dipastekan ke aplikasi lainnya tanpa adanya masalah kebergantungan apapun.

Variabel Static Local

Variabel static local merupakan suatu pengembangan karena ruang lingkupnya lokal dan usianya sama dengan variabel tingkat module. Nilai mereka disediakan antara pemanggilan prosedur di mana mereka berada sampai module milik variabel ini di-unload dari memory (atau sampai aplikasi berakhir, sama seperti kasus untuk prosedur yang berada di dalam module standar (.bas)). Variabel-variabel ini dideklarasikan di dalam sebuah prosedur dengan menggunakan kata kunci Static:
Code::
   Sub PrintInvoice()
      Static InProgress As Boolean   'Ini adalah variabel Static local.
      ...
   End Sub
  
Alternatif untuk variabel Static, Anda dapat mendeklarasikan suatu prosedur menjadi Static, di mana dalam hal ini, semua variabel yang dideklarasikan di dalam prosedur tersebut akan menjadi Static:
Code::
   Static Sub PrintInvoice()
      Dim InProgress As Boolean    'Ini adalah sebuah variabel Static local.
     ...
   End Sub
  
Variabel Static local sama dengan variabel private pada tingkat module, di mana Anda dapat memindahkan sebuah deklarasi Static dari dalam sebuah prosedur ke bagian deklarasi dari module (Anda hanya mengubah kata Static menjadi Dim, karena Static tidak diperbolehkan dideklarasikan di luar dari prosedur), dan prosedur akan melanjutkan tugas seperti sebelumnya. Secara umum, Anda tidak dapat selalu melakukan lawannya, yaitu: Mengganti sebuah variabel di level module menjadi sebuah variabel Static di level prosedur. Berhasil jika variabel tersebut direferensikan (dihubungkan) hanya di dalam prosedur itu. Dalam hal ini, sebuah variabel Static local merupakan sebuah variabel di level module yang tidak dibutuhkan untuk digunakan oleh prosedur lainnya. Dengan menjaga deklarasi variabel di dalam batas prosedur, Anda dapat menggunakan kembali coding prosedur secara lebih mudah.
Variabel Static sering sekali berguna untuk mencegah suatu prosedur dari pemasukan data secara berulang. Hal ini sering sekali berguna untuk event prosedur, sebagai contoh, Anda tidak ingin memproses klik dari user dari tombol yang sama sampai event klik sebelumnya telah selesai dikerjakan, seperti yang ditunjukkan pada coding di bawah:
Code::
 
  Private Sub cmdSearch_Click()
     Static InProgress As Boolean
     'Keluar dari prosedur jika ada panggilan ketika proses berlangsung.
     If InProgress Then MsgBox "Maaf, coba lain kali": Exit Sub
     InProgress = True
     'Lakukan pencarian di sini.
       ...
     'Kemudian enable-kan kembali panggilan sebelum keluar dari prosedur ini.
     InProgress = False
  End Sub
  
Sumber: E-book Programming Microsoft Visual Basic 6.0 (Scope and Lifetime of Variables)

0 komentar:

Posting Komentar

 

© 2011 e - Tutorial | by Moeh Fitrah