Further with Clipper

Table of Contents
#1: Development Cycle
#2: Variables and Statements
#3: Preprocessor
#4: Code-Block
#5: Array
#6: Programming Convention
#7: Functions and Libraries


pengunjung sejak
September 1, 2000

Web Counter is a service provided by Digits.com


Terakhir diperbaharui tgl
5 August 2005
by Hianoto Santoso

Copyright © 2002-2005
by Hianoto Santoso

Search Now:
In Association with Amazon.com

In Association with Amazon.com


Bab 2. Variabel dan Statemen


Bab ini akan membahas mengenai scope variable dan bagaimana menggunakannya secara lebih tepat. Selain itu, ada beberapa statemen penting yang harus diketahui saat mengembangkan aplikasi Clipper.

Variabel Public
Variabel Private
Variabel Local
Variabel Static
Catatan Tambahan


Variabel Public
Variabel Public merupakan variabel yang dikenal oleh semua rutin yang ada, tanpa tergantung hirarki rutin dan lokasi dimana variabel public tersebut dideklarasikan. Dalam penerapannya, referensi variabel public akan disimpan pada suatu tabel simbol. Dalam penggunaan Clipper 5.x, perintah PUBLIC merupakan perintah yang sebaiknya dihindari, karena berbahaya bagi projek dengan beberapa pemrogram (team programming), dimana seseorang dapat secara tak sengaja merubah isi variabel public yang digunakan oleh pemrogram yang lain. Selain itu, jalannya aplikasi menjadi lebih lambat karena aplikasi harus melihat tabel simbol terlebih dahulu, barulah dapat mengambil maupun mengubah nilai variabel tersebut.

// Demo akan berbahayanya variabel public
function main()

   public TimeStart

   // Jalankan beberapa modul
   modul01()
   modul02()     // Baru saja disisipkan
   modul03()
return nil


// Dibuat oleh Programmer A
function modul01()

   TimeStart := time()
   // Proses jalan
return nil


// Dibuat oleh Programmer B
function modul02()

   TimeStart := seconds()
   // Proses jalan
   ? "Time elapsed:", seconds() - TimeStart
return nil


// Dibuat oleh Programmer A
function modul03()

   // Akan error karena TimeStart sekarang typenya numeric
   ? val( subStr( TimeStart, 1, 2 ) ) * 3600
return nil

Untuk bisa mengurangi penggunaan variabel public, kita dapat memanfaatkan fungsi dPublic(). Fungsi ini akan saya jelaskan dengan lebih rinci pada bagian pembahasan Variabel Static pada bab ini. Namun untuk penggunaannya, dapat Anda lihat pada contoh sebagai berikut:

// Contoh penggunaan dPublic()
function main()

   dPublic( "cPID", "Aplikasi Utama" )
   modul01()
	? dPublic( "cPID" )			// Menjadi "Modul 01"
return nil


// Modul lain yang mengubah nilai elemen dPublic
function modul01()

   ? dPublic( "cPID" )			// Masih "Aplikasi Utama"
   dPublic( "cPID", "Modul 01" )
return nil

Go Top


Variabel Private
Variabel Private hampir serupa dengan variabel Public, hanya saja variabel Private akan dikenal pada modul yang mendeklarasikan variabel tersebut sampai pada semua modul yang dipanggil dari modul tadi; sedangkan modul yang diatas tidak akan mengenal variabel private yang dideklarasikan dibawahnya. Karena hampir sama dengan variabel Public, maka variabel Private juga tidak disarankan dalam Clipper 5.x.

Go Top


Variabel Local
Variabel Local merupakan variabel yang hanya dikenal pada function / procedure dimana dia dideklarasikan dan secara otomatis dibuang dari memory saat kontrol program telah keluar dari function / procedure tersebut. Hal penting lain, variabel Local tidak disimpan pada tabel simbol namun pada xxx sehingga tidak dapat digunakan dalam operasi macro namun lebih cepat diakses daripada variabel Public / Private.

Go Top


Variabel Static
Variabel Static merupakan variabel yang unik di lingkungan pemrograman xBase. Variabel Static akan memelihara isinya sampai aplikasi berhenti, walaupun kontrol program tidak berada dalam PRG ataupun function yang mendeklarasikannya.

Ada dua jenis scope untuk variabel Static, yaitu:

  1. Scope dalam Function / Procedure, jadi variabel ini hanya dikenal dalam function / procedure tempat dia dideklarasikan, namun isi variabel akan tetap dipertahankan.
  2. Scope dalam PRG, dimana semua function / procedure akan mengenal variabel ini selama terletak pada PRG yang sama. Namun untuk ini, kita harus mendeklarasikan variabel Static diluar semua deklarasi function dan procedure dan dikompilasi dengan option /n

// Contoh penggunaan Static
// Harus dikompilasi dengan option /n

static cFileWide := "ABC"

function main()
   local nCounter

   ? cFileWide
   for nCounter := 1 to 100
      subMain()
   next
return nil


function subMain()
   static nCounter2 := 0

   nCounter2 := nCounter2 + 1
   ? cFileWide + lTrim( str( nCounter2 ) )
return nil

Dari contoh diatas, terlihat variabel cFileWide dikenal di function main() maupun subMain() karena dideklarasikan pada bagian awal program dan dikompilasi dengan option /n. Perhatikan variabel nCounter2 bernilai awal 0 dan ditambah dengan 1 untuk setiap kali pemanggilan program, hal ini menunjukkan bahwa variabel nCounter2 tidak kehilangan nilainya walaupun telah keluar dari modul subMain() dan kode program untuk inisialisasi variabel nCounter2 hanya dijalankan satu kali saja.

Go Top


Catatan Tambahan
Ada beberapa hal yang harus diperhatikan saat membahas variabel, sebagai berikut:

Deklarasi MEMVAR dan FIELD
Bilamana kita menggunakan variabel Public atau Private (misalnya cKode), maka Clipper akan memberikan warning C1003: Ambiguous reference: 'cKode', karena Clipper tidak tahu apakah cKode merupakan variabel memori ataupun field. Untuk itu, kita perlu memberikan deklarasi Memvar atau Field untuk referensi variabel memori ataupun field. Untuk jelasnya, lihat pada contoh berikut:

function main()
   local  cLocal
   static cStatic
   field  cField
   memVar cPublic, cPrivate

   public  cPublic  := "Public"
   private cPrivate := "Private"
   // ......
return nil

Perhatikan urutan penulisan, dimana perintah Local, Static, Field, dan Memvar merupakan compile-time statement, sehingga harus diletakkan pada bagian awal setelah pendeklarasian function / procedure. Sedangkan perintah Public dan Private merupakan executable statement, jadi ditulis pada urutan setelah compile-time statement.

Macro dan Variabel
Seperti yang tadi saya utarakan, penggunaan variabel Public dan Private sebaiknya dikurangi bahkan dihentikan bilamana memungkinkan, karenanya kita perlu menggantinya dengan variabel Local dan Static yang akan menyebabkan aplikasi kita berjalan lebih cepat karena Clipper tidak perlu mengakses tabel simbol saat aplikasi dijalankan. Namun demikian, bagi Anda yang terbiasa menggunakan macro (&), muncul masalah karena macro (&) tidak dapat mengakses variabel Local dan Static, seperti terlihat dalam contoh berikut ini:

nCounter := 1
cVarName := "nCounter"
? &cVarName  // akan muncul error bila nCounter adalah Local/Static

Hati-hati saat Anda memeriksa type variabel dengan fungsi TYPE(), karena fungsi ini menggunakan macro secara internal, sehingga hanya dapat digunakan untuk variabel Public ataupun Private. Sebaliknya Anda haruslah menggunakan fungsi VALTYPE() untuk memeriksa type variabel Local atau Static.

function main()
   local nLocal := 1
   memVar nPublic
   public nPublic := 1

   ? valType( nLocal )  // Hasilnya "N"
   ? type( "nPublic" )  // Hasilnya "N"
return nil 

Perhatikan bahwa Anda menyebutkan nama variabel secara langsung dalam parameter VALTYPE(), dan Anda harus menggunakan nama variabel dalam tanda kutip sebagai parameter TYPE(); sehingga tampak jelas bahwa TYPE() menggunakan macro secara internal.

Namun, pada beberapa kasus, kita dapat menyiasati agar dapat menggunakan macro tanpa perlu mendefinisikan variabel Public ataupun Private, dan kapan kita sebaiknya menggunakan macro. Mari kita amati beberapa penggunaan macro sebagai berikut:

  1. Menggunakan variabel sebagai parameter untuk perintah (command argument), seperti:

    // Penggunaan macro seperti ini
    use &cNamaDBF
    rename &cNamaLama to &cNamaBaru
    
    // Dapat dirubah menjadi
    use ( cNamaDBF )
    rename ( cNamaLama ) to ( cNamaBaru )
    

  2. Sedapat mungkin, kita hanya menggunakan macro untuk membuat Code-Block; topik ini akan dibahas lebih detail di Bab 4 mengenai Code Block, namun berikut ini adalah contoh sederhana mengenai implementasi macro tersebut:

    cFor := "brgKode = cBrgKode"
    bFor := &( "{|| " + cFor + " }"
    go top
    do while ! eof()
       if eval( bFor )
          ? brgNama, brgSatuan, brgHrgBeli, brgHrgJual
       endif
       skip
    enddo
    

Go Top


Notes: Bab ini masih belum selesai, cuman saya kali ini menggunakan cara iteratif, sehingga setiap bab akan saya kunjungi lagi dalam sirkular untuk penambahan materi dan penyempurnaan.. rada niru RUP - Rational Unified Process nih yee :-)