Algoritma Kriptografi Klasik


 Algoritma Kriptografi Klasik
 Pendahuluan
 Algoritma kriptografi klasik berbasis karakter
 Menggunakan pena dan kertas saja, belum ada komputer
 Termasuk ke dalam kriptografi kunci-simetri
 Algoritma kriptografi klasik:
– Cipher Substitusi (Substitution Ciphers)
– Cipher Transposisi (Transposition Ciphers)
 1. Cipher Substitusi
 Monoalfabet : setiap karakter chipertext menggantikan satu macam karakter plaintext
 Polyalfabet : setiap karakter chipertext menggantikan lebih dari satu macam karakter plaintext
 Monograf /unilateral: satu enkripsi dilakukan terhadap satu karakter plaintext
 Polygraf /multilateral: satu enkripsi dilakukan terhadap lebih dari satu karakter plaintext
 1. Cipher Substitusi – Caesar Cipher
 Tiap huruf alfabet digeser 3 huruf ke kanan
pi : A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
ci : D E F G H I J K L M N O P Q R S T U V W X Y Z A B C
 Contoh:
Plainteks: AWASI ASTERIX DAN TEMANNYA OBELIX
Cipherteks: DZDVL DVWHULA GDQ WHPDQQBA REHOLA
 1. Cipher Substitusi – Caesar Cipher
 Dalam praktek, cipherteks dikelompokkan ke dalam kelompok n-huruf, misalnya kelompok 4-huruf:
DZDV LDVW HULA GDQW HPDQ QBAR EHOL A
 Atau membuang semua spasi:
DZDVLDVWHULAGDQWHPDQQBAREHOLA
 Tujuannya agar kriptanalisis menjadi lebih sulit
 1. Cipher Substitusi – Vigènere Cipher
 Termasuk ke dalam cipher abjad-majemuk (polyalpabetic substitution cipher ).
 Algoritma tersebut baru dikenal luas 200 tahun kemudian yang oleh penemunya cipher tersebut kemudian dinamakan Vigènere Cipher.
 Vigènere Cipher menggunakan Bujursangkar Vigènere untuk melakukan enkripsi.
 Setiap baris di dalam bujursangkar menyatakan huruf-huruf cipherteks yang diperoleh dengan Caesar Cipher.
 1. Cipher Substitusi – Vigènere Cipher
 1. Cipher Substitusi – Vigènere Cipher
 Contoh penerapan Vigènere Cipher :
Plainteks : THIS PLAINTEXT
Kunci : sony sonysonys
Cipherteks : LVVQ HZNGFHRVL
 Jika panjang kunci lebih pendek daripada panjang plainteks, maka kunci diulang secara periodik. Dalam hal ini Kunci “sony” diulang sebanyak panjang plaintext-nya
 Pada dasarnya, setiap enkripsi huruf adalah Caesar cipher dengan kunci yang berbeda-beda.
c(‘T’) = (‘T’ + ‘s’) mod 26 = L
T = 20 dan s= 19 à (20+19)%26=13 à L
c(‘H’) = (‘H’ + ‘o’) mod 26 = V, dst
 2. Cipher Transposisi
 Cipherteks diperoleh dengan mengubah posisi huruf di dalam plainteks.
 Dengan kata lain, algoritma ini melakukan transpose terhadap rangkaian huruf di dalam plainteks.
 Nama lain untuk metode ini adalah permutasi, karena transpose setiap karakter di dalam teks sama dengan mempermutasikan karakter-karakter tersebut.
 2. Cipher Transposisi (Contoh)
Contoh: Misalkan plainteks adalah
POLITEKNIK ELEKTRONIKA NEGERI SURABAYA

Enkripsi:
POLITEK
NIKELEK
TRONIKA
NEGERIS
URABAYA

Cipherteks: (baca secara vertikal)
PNTNUOIRERLKOGAIENEBTLIRAEEKIYKKASA
PNTN UOIR ERLK OGAI ENEB TLIR AEEK IYKK ASA
 Algoritma Kriptografi Modern
 Pendahuluan
 Beroperasi dalam mode bit (algoritma kriptografi klasik beroperasi dalam mode karakter)
 kunci, plainteks, cipherteks, diproses dalam rangkaian bit
 operasi bit xor paling banyak digunakan
 Pendahuluan
 Tetap menggunakan gagasan pada algoritma klasik: substitusi dan transposisi, tetapi lebih rumit (sangat sulit dipecahkan)
 Perkembangan algoritma kriptografi modern didorong oleh penggunaan komputer digital untuk keamanan pesan.
 Komputer digital merepresentasikan data dalam biner.
 Algoritma Enkripsi dengan rangkaian bit
 Pesan (dalam bentuk rangkaian bit) dipecah menajdi beberapa blok
 Contoh: Plainteks 100111010110
Bila dibagi menjadi blok 4-bit
1001 1101 0110
maka setiap blok menyatakan 0 sampai 15:
9 13 6
 Algoritma Enkripsi dengan rangkaian bit
Bila plainteks dibagi menjadi blok 3-bit:
100 111 010 110

maka setiap blok menyatakan 0 sampai 7:
4 7 2 6
 Jenis Algoritma Kriptografi
 Algoritma Simetri
a. Blok Chiper : DES, IDEA, AES
b. Stream Chiper : OTP, A5 dan RC4
 Algoritma Asimetri : RSA, DH, ECC, DSA
 Fungsi Hash : MD5, SHA1
 Dalam presentasi kami menggunakan Algoritma AES, RSA dan MD5

AES (Advanced Encryption Standard)
 ALGORITMA SIMETRI : BLOK CHIPER
 AES (Advanced Encryption Standard)
 DES dianggap sudah tidak aman.
 Perlu diusulkan standard algoritma baru sebagai pengganti DES.
 National Institute of Standards and Technology (NIST) mengusulkan kepada Pemerintah Federal AS untuk sebuah standard kriptografi kriptografi yang baru.
 NIST mengadakan lomba membuat standard algoritma kriptografi yang baru. Standard tersebut kelak diberi nama Advanced Encryption Standard (AES).
 AES (Advanced Encryption Standard)
 Pada bulan Oktober 2000, NIST mengumumkan untuk memilih Rijndael (dibaca: Rhine-doll)
 Pada bulan November 2001, Rijndael ditetapkan sebagai AES
 Diharapkan Rijndael menjadi standard kriptografi yang dominan paling sedikit selama 10 tahun.
 AES (Advanced Encryption Standard)
 Tidak seperti DES yang berorientasi bit, Rijndael beroperasi dalam orientasi byte.
 Setiap putaran mengunakan kunci internal yang berbeda (disebut round key).
 Enciphering melibatkan operasi substitusi dan permutasi.
 Karena AES menetapkan panjang kunci adalah 128, 192, dan 256, maka dikenal AES-128, AES-192, dan AES-256
 AES (Advanced Encryption Standard)
 Garis besar Algoritma Rijndael yang beroperasi pada blok 128-bit dengan kunci 128-bit adalah sebagai berikut (di luar proses pembangkitan round key):
– AddRoundKey: melakukan XOR antara state awal (plainteks) dengan cipher key. Tahap ini disebut juga initial round.
– Putaran sebanyak Nr – 1 kali. Proses yang dilakukan pada setiap putaran adalah:
 SubBytes: substitusi byte dengan menggunakan tabel substitusi (S-box).
 ShiftRows: pergeseran baris-baris array state secara wrapping.
 MixColumns: mengacak data di masing-masing kolom array state.
 AddRoundKey: melakukan XOR antara state sekarang round key.
– Final round: proses untuk putaran terakhir:
 SubBytes
 ShiftRows
 AddRoundKey
 AES (Advanced Encryption Standard)
 AES (Advanced Encryption Standard)
 Selama kalkulasi plainteks menjadi cipherteks, status sekarang dari data disimpan di dalam array of bytes dua dimensi, state, yang berukuran NROWS ´ NCOLS.
 Untuk blok data 128-bit, ukuran state adalah 4 ´ 4.
 Elemen array state diacu sebagai S[r,c], 0 £ r < 4 dan 0 £ c
Dengan mencoba nilai-nilai k = 1, 2, 3, …, diperoleh nilai d yang bulat adalah 1019. Ini adalah kunci privat (untuk dekripsi).
 RSA
 Misalkan plainteks M = HARI INI
atau dalam ASCII: 7265827332737873

Pecah M menjadi blok yang lebih kecil (misal 3 digit):
m1 = 726 m4 = 273
m2 = 582 m5 = 787
m3 = 733 m6 = 003
(Perhatikan, mi masih terletak di dalam antara 0 sampai n – 1)
 RSA
 Enkripsi setiap blok:
c1 = 72679 mod 3337 = 215
c2 = 58279 mod 3337 = 776, dst
Chiperteks C = 215 776 1743 933 1731 158.

 Dekripsi (menggunakan kunci privat d = 1019)
m1 = 2151019 mod 3337 = 726
m2 = 7761019 mod 3337 = 582 dst untuk sisi blok lainnya
Plainteks M = 7265827332737873 yang dalam ASCII karakternya adalah HARI INI.
 RSA
 Kekuatan dan Keamanan RSA
– Kekuatan algoritma RSA terletak pada tingkat kesulitan dalam memfaktorkan bilangan non prima menjadi faktor primanya, yang dalam hal ini n = a ´ b.
– Sekali n berhasil difaktorkan menjadi a dan b, maka f(n) = (a – 1)´(b – 1) dapat dihitung. Selanjutnya, karena kunci enkripsi e diumumkan (tidak rahasia), maka kunci dekripsi d dapat dihitung dari persamaan ed º 1 (mod n).
– Penemu algoritma RSA menyarankan nilai a dan b panjangnya lebih dari 100 digit. Dengan demikian hasil kali n = a ´ b akan berukuran lebih dari 200 digit.
– Menurut Rivest dan kawan-kawan, usaha untuk mencari faktor bilangan 200 digit membutuhkan waktu komputasi selama 4 milyar tahun! (dengan asumsi bahwa algoritma pemfaktoran yang digunakan adalah algoritma yang tercepat saat ini dan komputer yang dipakai mempunyai kecepatan 1 milidetik).
 Algoritma MD5
 FUNGSI HASH
 MD5
 MD5 adalah fungsi hash satu-arah yang dibuat oleh Ron Rivest.
 MD5 merupakan perbaikan dari MD4 setelah MD4 berhasil diserang oleh kriptanalis.
 Algoritma MD5 menerima masukan berupa pesan dengan ukuran sembarang dan menghasilkan message digest yang panjangnya 128 bit.
 Dengan panjang message digest 128 bit, maka secara brute force dibutuhkan percobaan sebanyak 2128 kali untuk menemukan dua buah pesan atau lebih yang mempunyai message digest yang sama.
 MD5 (Algoritma)
 Penambahan Bit-bit Pengganjal
– Pesan ditambah dengan sejumlah bit pengganjal sedemikian sehingga panjang pesan (dalam satuan bit) kongruen dengan 448 modulo 512.
– Jika panjang pesan 448 bit, maka pesan tersebut ditambah dengan 512 bit menjadi 960 bit. Jadi, panjang bit-bit pengganjal adalah antara 1 sampai 512.
– Bit-bit pengganjal terdiri dari sebuah bit 1 diikuti dengan sisanya bit 0
 MD5 (Algoritma)
 Penambahan Nilai Panjang Pesan
– Pesan yang telah diberi bit-bit pengganjal selanjutnya ditambah lagi dengan 64 bit yang menyatakan panjang pesan semula.
– Jika panjang pesan > 264 maka yang diambil adalah panjangnya dalam modulo 264. Dengan kata lain, jika panjang pesan semula adalah K bit, maka 64 bit yang ditambahkan menyatakan K modulo 264.
– Setelah ditambah dengan 64 bit, panjang pesan sekarang menjadi kelipatan 512 bit
 MD5 (Algoritma)
 Inisialisai Penyangga MD
– MD5 membutuhkan 4 buah penyangga (buffer) yang masing-masing panjangnya 32 bit. Total panjang penyangga adalah 4 ´ 32 = 128 bit. Keempat penyangga ini menampung hasil antara dan hasil akhir.
– Keempat penyangga ini diberi nama A, B, C, dan D. Setiap penyangga diinisialisasi dengan nilai-nilai (dalam notasi HEX) sebagai berikut:
A = 01234567
B = 89ABCDEF
C = FEDCBA98
D = 76543210
 MD5 (Algoritma)
 Pengolahan Pesan dalam Blok Berukuran 512 bit
– Pesan dibagi menjadi L buah blok yang masing-masing panjangnya 512 bit (Y0 sampai YL – 1).
– Setiap blok 512-bit diproses bersama dengan penyangga MD menjadi keluaran 128-bit, dan ini disebut proses HMD5
 MD5 (Algoritma)
 MD5 (Algoritma)
 MD5 (Algoritma)
 MD5 (Algoritma)
 Putaran 1 : 16 kali operasi dasar dengan g(b,c,d) = F(b,c,d)
 MD5 (Algoritma)
 Putaran 2 : 16 kali operasi dasar dengan g(b,c,d) = G(b,c,d)
 MD5 (Algoritma)
 Putaran 3 : 16 kali operasi dasar dengan g(b,c,d) = H(b,c,d)
 MD5 (Algoritma)
 Putaran 4 : 16 kali operasi dasar dengan g(b,c,d) = I(b,c,d)
 MD5 (Algoritma)
 Setelah putaran keempat, a, b, c, dan d ditambahkan ke A, B, C, dan D, dan selanjutnya algoritma memproses untuk blok data berikutnya (Yq+1).
 Keluaran akhir dari algoritma MD5 adalah hasil penyambungan bit-bit di A, B, C, dan D.

Pengenalan Kriptografi


Pengenalan Kriptografi
oleh : Tedi Heriyanto
$ Edisi : 0.0.5 – 27 Juni 1999 $
________________________________________

Catatan
Tulisan ini dimaksudkan sebagai pengantar bagi Anda yang berminat mendalami bidang kriptografi, dan tulisan ini bukanlah sebuah referensi lengkap tentang kriptografi. Untuk mempelajari kriptografi lebih lanjut silakan Anda lihat pada bagian Sumber Informasi Lebih Lanjut tentang Kriptografi. Bila ada saran ataupun kritik tentang tulisan ini, silakan layangkan ke email penulis.
________________________________________
Pendahuluan
Kemajuan di bidang telekomunikasi dan komputer telah memungkinkan seseorang untuk melakukan transaksi bisnis secara cashless, selain itu ia juga dapat mengirimkan informasi kepada temannya secara on-line.
Kegiatan-kegiatan tersebut tentu saja akan menimbulkan resiko bilamana informasi yang sensitif dan berharga tersebut diakses oleh orang-orang yang tidak berhak (unauthorized persons). Misalnya, informasi mengenai nomor kartu kredit anda, bila informasi ini jatuh kepada orang-orang yang jahat maka anda harus bersiap-siap terhadap melonjaknya tagihan kartu kredit anda.
Sebelum tahun 1970-an, teknologi kriptografi digunakan terbatas hanya untuk tujuan militer dan diplomatik. Akan tetapi kemudian bidang bisnis dan perorangan mulai menyadari pentingnya melindungi informasi berharga.
Pengertian Dasar
Suatu pesan yang tidak disandikan disebut sebagai plaintext ataupun dapat disebut juga sebagai cleartext. Proses yang dilakukan untuk mengubah plaintext ke dalam ciphertext disebut encryption atau encipherment. Sedangkan proses untuk mengubah ciphertext kembali ke plaintext disebut decryption atau decipherment. Secara sederhana istilah-istilah di atas dapat digambarkan sebagai berikut :

Gb. 1. Proses Enkripsi/Dekripsi Sederhana
Cryptography adalah suatu ilmu ataupun seni mengamankan pesan, dan dilakukan oleh cryptographer. Sedang, cryptanalysis adalah suatu ilmu dan seni membuka (breaking) ciphertext dan orang yang melakukannya disebut cryptanalyst.
Cryptographic system atau cryptosystem adalah suatu fasilitas untuk mengkonversikan plaintext ke ciphertext dan sebaliknya. Dalam sistem ini, seperangkat parameter yang menentukan transformasi pencipheran tertentu disebut suatu set kunci. Proses enkripsi dan dekripsi diatur oleh satu atau beberapa kunci kriptografi. Secara umum, kunci-kunci yang digunakan untuk proses pengenkripsian dan pendekripsian tidak perlu identik, tergantung pada sistem yang digunakan.
Secara umum operasi enkripsi dan dekripsi dapat diterangkan secara matematis sebagai berikut :
EK (M) = C (Proses Enkripsi)
DK (C) = M (Proses Dekripsi)
Pada saat proses enkripsi kita menyandikan pesan M dengan suatu kunci K lalu dihasilkan pesan C. Sedangkan pada proses dekripsi, pesan C tersebut diuraikan dengan menggunakan kunci K sehingga dihasilkan pesan M yang sama seperti pesan sebelumnya.
Dengan demikian keamanan suatu pesan tergantung pada kunci ataupun kunci-kunci yang digunakan, dan tidak tergantung pada algoritma yang digunakan. Sehingga algoritma-algoritma yang digunakan tersebut dapat dipublikasikan dan dianalisis, serta produk-produk yang menggunakan algoritma tersebut dapat diproduksi massal. Tidaklah menjadi masalah apabila seseorang mengetahui algoritma yang kita gunakan. Selama ia tidak mengetahui kunci yang dipakai, ia tetap tidak dapat membaca pesan.
Cryptographic system (cryptosystem)
Suatu cryptosystem terdiri dari sebuah algoritma, seluruh kemungkinan plaintext, ciphertext dan kunci-kunci. Secara umum cryptosystem dapat digolongkan menjadi dua buah, yaitu :
1. Symmetric Cryptosystem
Dalam symmetric cryptosystem ini, kunci yang digunakan untuk proses enkripsi dan dekripsi pada prinsipnya identik, tetapi satu buah kunci dapat pula diturunkan dari kunci yang lainnya. Kunci-kunci ini harus dirahasiakan. Oleh karena itulah sistem ini sering disebut sebagai secret-key ciphersystem. Jumlah kunci yang dibutuhkan umumnya adalah :
nC2 = n . (n-1)
——–
2
dengan n menyatakan banyaknya pengguna.
Contoh dari sistem ini adalah Data Encryption Standard (DES), Blowfish, IDEA.
2. Assymmetric Cryptosystem
Dalam assymmetric cryptosystem ini digunakan dua buah kunci. Satu kunci yang disebut kunci publik (public key) dapat dipublikasikan, sedang kunci yang lain yang disebut kunci privat (private key) harus dirahasiakan. Proses menggunakan sistem ini dapat diterangkan secara sederhana sebagai berikut : bila A ingin mengirimkan pesan kepada B, A dapat menyandikan pesannya dengan menggunakan kunci publik B, dan bila B ingin membaca surat tersebut, ia perlu mendekripsikan surat itu dengan kunci privatnya. Dengan demikian kedua belah pihak dapat menjamin asal surat serta keaslian surat tersebut, karena adanya mekanisme ini. Contoh sistem ini antara lain RSA Scheme dan Merkle-Hellman Scheme.
Setiap cryptosytem yang baik harus memiliki karakteristik sebagai berikut :
• Keamanan sistem terletak pada kerahasiaan kunci dan bukan pada kerahasiaan algoritma yang digunakan.
• Cryptosystem yang baik memiliki ruang kunci (keyspace) yang besar.
• Cryptosystem yang baik akan menghasilkan ciphertext yang terlihat acak dalam seluruh tes statistik yang dilakukan terhadapnya.
• Cryptosystem yang baik mampu menahan seluruh serangan yang telah dikenal sebelumnya
Namun demikian perlu diperhatikan bahwa bila suatu cryptosystem berhasil memenuhi seluruh karateristik di atas belum tentu ia merupakan sistem yang baik. Banyak cryptosystem lemah yang terlihat baik pada awalnya. Kadang kala untuk menunjukkan bahwa suatu cryptosystem kuat atau baik dapat dilakukan dengan menggunakan pembuktian matematika.
Hingga saat ini masih banyak orang yang menggunakan cryptosystem yang relatif mudah dibuka, alasannya adalah mereka tidak mengetahui sistem lain yang lebih baik serta kadang kala terdapat motivasi yang kurang untuk menginvestasikan seluruh usaha yang diperlukan untuk membuka suatu sistem.
Cryptographic Protokol
Pengertian
Suatu protokol adalah serangkaian langkah yang melibatkan dua pihak atau lebih dan dirancang untuk menyelesaikan suatu tugas. Dari definisi ini dapat diambil beberapa arti sebagai berikut :
• protokol memiliki urutan dari awal hingga akhir;
• setiap langkah harus dilaksanakan secara bergiliran;
• suatu langkah tidak dapat dikerjakan bila langkah sebelumnya belum selesai;
• diperlukan dua pihak atau lebih untuk melaksanakan protokol;
• protokol harus mencapai suatu hasil;
Selain itu, suatu protokol pun memiliki karakteristik yang lain, yaitu :
• setiap orang yang terlibat dalam protokol harus mengetahui terlebih dahulu mengenai protokol dan seluruh langkah yang akan dilaksanakan;
• setiap orang yang terlibat dalam protokol harus menyetujui untuk mengikutinya;
• protokol tidak boleh menimbulkan kerancuan;
• protokol harus lengkap;
Cryptographic protocol adalah suatu protokol yang menggunakan kriptografi. Protokol ini melibatkan sejumlah algoritma kriptografi, namun secara umum tujuan protokol lebih dari sekedar kerahasiaan. Pihak-pihak yang berpartisipasi mungkin saja ingin membagi sebagian rahasianya untuk menghitung sebuah nilai, menghasilkan urutan random, atau pun menandatangani kontrak secara bersamaan. Penggunaan kriptografi dalam sebuah protokol terutama ditujukan untuk mencegah atau pun mendeteksi adanya eavesdropping dan cheating.
Fungsi Protokol
Dalam kehidupan kita sehari-hari terdapat banyak sekali protokol tidak resmi, misalnya saja dalam permainan kartu, pemungutan suara dalam pemilihan umum. Akan tetapi tidak ada seorang pun yang memikirkan mengenai protokol-protokol ini, protokol-protokol ini terus berkembang, semua orang mengetahui bagaimana menggunakannya.
Saat ini, semakin banyak interaksi antar manusia dilakukan melalui jaringan komputer. Komputer ini tentu saja memerlukan suatu protokol formal agar dapat melakukan hal yang biasa dilakukan manusia tanpa berpikir. Bila kita berpindah dari satu daerah ke daerah lain dan mengetahui bahwa kartu pemilihan suaranya berbeda dengan yang biasa kita gunakan, kita dapat beradaptasi dengan mudah. Akan tetapi kemampuan ini belum dimiliki oleh komputer, sehingga diperlukan suatu protokol.
Protokol digunakan untuk mengabtraksikan proses penyelesaian suatu tugas dari mekanisme yang digunakan. Protokol komunikasi adalah sama meskipun diimplementasikan pada PC atau VAX. Bila kita yakin bahwa kita memiliki protokol yang baik, kita dapat mengimplementasikannya dalam segala benda mulai dari telepon hingga pemanggang roti cerdas.
Penyerangan terhadap protokol
Penyerangan cryptographic dapat ditujukan pada beberapa hal berikut :
• algoritma cryptographic yang digunakan dalam protokol;
• teknik cryptographic yang digunakan untuk mengimplementasikan algoritma dan protokol;
• protokol itu sendiri;
Seseorang dapat mencoba berbagai cara untuk menyerang suatu protokol. Mereka yang tidak terlibat dalam protokol dapat menyadap sebagian atau seluruh protokol. Tindakan ini disebut penyerangan pasif, karena si penyerang tidak mempengaruhi atau mengubah protokol, ia hanya mengamati protokol dan berusaha untuk memperoleh informasi.
Selain itu, seorang penyerang dapat berusaha untuk mengubah protokol demi keuntungannya sendiri. Ia dapat mengirimkan pesan dalam protokol, menghapus pesan, atau bahkan mengubah informasi yang ada di dalam suatu komputer. Tindakan-tindakan ini disebut sebagai penyerangan aktif, karena ia membutuhkan suatu campur tangan aktif.
Seorang penyerang tidaklah hanya berasal dari lingkungan luar protokol, namun ia mungkin juga berasal dari dalam protokol itu sendiri, ia dapat merupakan salah satu pihak yang terlibat dalam protokol. Tipe penyerang semacam ini disebut sebagai cheater. Passive cheater mengikuti protokol, tetapi berusaha memperoleh informasi lebih banyak daripada yang diperbolehkan protokol bagi dirinya. Active cheater mengubah protokol dalam usahanya untuk berbuat curang.
Usaha untuk menjaga keamanan protokol akan semakin sulit apabila pihak-pihak yang terlibat umumnya merupakan active cheater, oleh karena itu suatu protokol yang baik harus mampu atau pun harus aman terhadap kemungkinan passive cheating.
Berbagai macam basic cryptanalytic attacks
Tujuan cryptanalytic attack adalah untuk mengetahui beberapa plaintext yang sesuai dengan ciphertext yang ada dan berusaha menentukan kunci yang memetakan satu dengan yang lainnya. Plaintext ini dapat diketahui karena ia merupakan standar atau karena pendugaan. Jika suatu teks diduga berada di dalam suatu pesan, posisinya mungkin tidak diketahui, tetapi suatu pesan lazimnya cukup pendek sehingga memungkinkan cryptanalyst menduga plaintext yang diketahui dalam setiap posisi yang mungkin dan melakukan penyerangan pada setiap kasus secara paralel.
Suatu algoritma enkripsi yang kuat tidak hanya mampu bertahan terhadap serangan plaintext yang dikenal tetapi juga mampu bertahan terhadap adaptive chosen plaintext. Dalam penyerangan ini, cryptanalyst berkesempatan memilih plaintext yang digunakan dan dapat melakukannya secara berulang kali, memilih plaintext untuk tahap N+1 setelah menganalisis hasil tahap N.
Yang dimaksud cryptanalytic attacks adalah usaha-usaha yang dilakukan seseorang untuk memperoleh informasi ataupun data yang telah dienkripsi. Secara ringkas terdapat tujuh macam basic cryptanalytic attacks berdasarkan tingkat kesulitannya bagi penyerang, dimulai dari yang paling sulit adalah :
• Ciphertext-only attack. Dalam penyerangan ini, seorang cryptanalyst memiliki ciphertext dari sejumlah pesan yang seluruhnya telah dienkripsi menggunakan algoritma yang sama.
• Known-plaintext attack. Dalam tipe penyerangan ini, cryptanalyst memiliki akses tidak hanya ke ciphertext sejumlah pesan, namun ia juga memiliki plaintext pesan-pesan tersebut.
• Chosen-plaintext attack. Pada penyerangan ini, cryptanalyst tidak hanya memiliki akses atas ciphertext dan plaintext untuk beberapa pesan, tetapi ia juga dapat memilih plaintext yang dienkripsi.
• Adaptive-chosen-plaintext attack. Penyerangan tipe ini merupakan suatu kasus khusus chosen-plaintext attack. Cryptanalyst tidak hanya dapat memilih plaintext yang dienkripsi, ia pun memiliki kemampuan untuk memodifikasi pilihan berdasarkan hasil enkripsi sebelumnya. Dalam chosen-plaintext attack, cryptanalyst mungkin hanya dapat memiliki plaintext dalam suatu blok besar untuk dienkripsi; dalam adaptive-chosen-plaintext attack ini ia dapat memilih blok plaintext yang lebih kecil dan kemudian memilih yang lain berdasarkan hasil yang pertama, proses ini dapat dilakukannya terus menerus hingga ia dapat memperoleh seluruh informasi.
• Chosen-ciphertext attack. Pada tipe ini, cryptanalyst dapat memilih ciphertext yang berbeda untuk didekripsi dan memiliki akses atas plaintext yang didekripsi.
• Chosen-key attack. Cryptanalyst pada tipe penyerangan ini memiliki pengetahuan tentang hubungan antara kunci-kunci yang berbeda.
• Rubber-hose cryptanalysis. Pada tipe penyerangan ini, cryptanalyst mengancam, memeras, atau bahkan memaksa seseorang hingga mereka memberikan kuncinya.

Analisis berbagai tipe penyerangan secara matematis
Suatu penyerangan pasif atas cryptosystem adalah semua metode untuk mengungkapkan informasi tentang plaintext dan ciphertextnya dengan tanpa mengetahui kunci. Secara matematis :
Diberikan fungsi F, G, dan H yang terdiri dari n variabel.
Diberikan sistem enkripsi E.
Diberikan suatu distribusi plaintext dan kunci.
Suatu penyerangan atas E dengan menggunakan G dengan mengasumsikan F membagi H dengan probabilitas p adalah suatu algoritma A dengan sepasang input f,g dan satu buah output h sedemikian hingga terdapat probabilitas p atas h = H(P1, …, Pn), jika kita memiliki f = F(P1, …, Pn) dan g = G(EK(P1), …, EK(Pn)). Perlu diperhatikan bahwa probabilitas ini tergantung pada distribusi vektor-vektor (K,P1,…,Pn).
Penyerangan akan merupakan suatu trivial bila terdapat probabilitas paling sedikir p untuk h = H(P1, …, Pn) jika f = F (P1,…,Pn) dan g = G (C1,…,Cn). Di sini C1,…,Cn terletak pada ciphertext yang mungkin, dan tidak memiliki hubungan tertentu dengan P1,…,Pn. Dengan kata lain, suatu serangan akan merupakan trivial bila ia tidak benar-benar menggunakan enkripsi EK(P1),…,EK(Pn).
Dengan merumuskan penyerangan secara matematis, kita dapat secara tepat memformulasikan dan bahkan membuktikan pernyataan bahwa suatu cryptosystem itu kuat. Kita katakan, sebagai contoh, bahwa suatu cryptosystem adalah aman terhadap seluruh penyerangan pasif jika sembarang penyerangan nontrivial terhadapnya tidak praktis. Jika kita dapat membuktikan pernyataan ini maka kita akan memiliki keyakinan bahwa cryptosystem kita akan bertahan terhadap seluruh teknik cryptanalytic pasif. Jika kita dapat mereduksi pernyataan ini hingga pada beberapa masalah yang tidak terpecahkan maka kita masih tetap memiliki keyakinan bahwa cryptosystem kita tidak mudah dibuka.
Ciphertext-only attack
Dengan menggunakan notasi di atas, suatu ciphertext-only attack adalah suatu penyerangan dengan F adalah konstanta. Diberikan hanya beberapa informasi G(EK(P1),..EK(Pn)) tentang n ciphertext, penyerangan harus memiliki kesempatan menghasilkan beberapa informasi H(P1,…,Pn) tentang plaintext. Penyerangan akan merupakan suatu trivial bila ia hanya menghasilkan H(P1,…,Pn) ketika diberikan G(C1,…,Cn) untuk C1,…,Cn acak.
Sebagai contoh, misalkan G ( C ) = C dan misalkan H(P) adalah bit pertama P. Kita dapat secara mudah menulis suatu penyerangan, pendugaan, yang menduga bahwa H(P) adalah 1. Penyerangan ini adalah trivial karena tidak menggunakan ciphertext, probabilitas keberhasilannya adalah 50 %. Di lain pihak, terdapat penyerangan atas RSA yang memproduksi satu bit informasi tentang P, dengan probabilitas keberhasilan 100 %, menggunakan C. Jika diberikan suatu C acak maka tingkat kesuksesan turun menjadi 50%. Inilah yang disebut penyerangan nontrivial.
Known-plaintext attack
Penyerangan known-plaintext klasik memiliki F(P1,P2) = P1, G(C1,C2) = (C1,C2), dan H(P1,P2) tergantung hanya pada P2. Dengan kata lain, bila diberikan dua ciphertext C1 dan C2 dan satu dekripsi P1, penyerangan known-plaintext seharusnya menghasilkan informasi tentang dekripsi P2.
Brute-force attack
Umpamakan penyerangan known-plaintext berikut. Kita diberikan sejumlah plaintext P1,…,Pn-1 dan ciphertext C1,…,Cn-1. Kita juga diberikan sebuah ciphertext Cn. Kita jalankan seluruh kunci K. Bila kita temukan K sedemikian sehingga EK(P1) = Ci untuk setiap I<n, kita cetak DK(Cn).
Jika n cukup besar sehingga hanya satu kunci yang bekerja, penyerangan ini akan sukses untuk seluruh input yang valid pada setiap waktu, sementara ia akan menghasilkan hasil yang tepat hanya sekali untuk input acak. Penyerangan ini adalah nontrivial, masalahnya ia sangat lambat bila terdapat banyak kemungkinan kunci.
________________________________________

Konversi ke HTML oleh Tedi Heriyanto. $ 12 September 1999. 10.30 $

Sumber Informasi Lebih Lanjut (belum selesai)
Website dan FTP
http://www.rsa.com (RSA Inc.)
http://www.counterpane.com (Counterpane Inc.)
http://theory.lcs.mit.edu/~rivest/ (Ronald L. Rivest-the R in RSA)

http://www.cryptography.com

Buku-buku
Scheneier, Bruce, Applied Cryptography, edisi 2, New Jersey:John Wiley & Sons, Inc., 1996.

Key-encripting Key
Kunci kriptografi yang digunakan untuk mengenkripsi kunci lain, tetapi biasanya tidak digunakan untu…
Cipher
Algoritma kriptografi (cryptographic algorithm) berupa persamaan matematik yang digunakan dalam pros…
RSA
Merupakan algoritma kriptografi untuk kunci public (public key cryptography) yang umum digunakan saa…
Cryptographers
Para pelaku atau praktisi kriptografi.
Digital Signature Algorithm
DSA adalah merupakan teknik kriptografi yang berbasis kepada masalah matematika yang disebut discret…
KRIPTOGRAFI
Sebelum melangkah lebih jauh untuk melakukan analisis terhadap beberapa SPI yang ada, diperlukan perangkat-perangkat untuk membantu proses analisis tersebut. Salah satu dasar yang penting adalah penggunaan kriptografi sebagai landasan-landasan teoritis bagaimana sistem-sistem perdagangan di Internet tersebut melakukan pengamanan.
Kriptografi adalah ilmu yang mempelajari bagaimana membuat suatu pesan yang dikirim pengirim dapat disampaikan kepada penerima dengan aman [Schn 96]. Kriptografi dapat memenuhi kebutuhan umum suatu transaksi:
1. Kerahasiaan (confidentiality) dijamin dengan melakukan enkripsi (penyandian).
2. Keutuhan (integrity) atas data-data pembayaran dilakukan dengan fungsi hash satu arah.
3. Jaminan atas identitas dan keabsahan (authenticity) pihak-pihak yang melakukan transaksi dilakukan dengan menggunakan password atau sertifikat digital. Sedangkan keotentikan data transaksi dapat dilakukan dengan tanda tangan digital.
4. Transaksi dapat dijadikan barang bukti yang tidak bisa disangkal (non-repudiation) dengan memanfaatkan tanda tangan digital dan sertifikat digital.
Pembakuan penulisan pada kriptografi dapat ditulis dalam bahasa matematika. Fungsi-fungsi yang mendasar dalam kriptografi adalah enkripsi dan dekripsi. Enkripsi adalah proses mengubah suatu pesan asli (plaintext) menjadi suatu pesan dalam bahasa sandi (ciphertext).
C = E (M)
dimana
M = pesan asli
E = proses enkripsi
C = pesan dalam bahasa sandi (untuk ringkasnya disebut sandi)
Sedangkan dekripsi adalah proses mengubah pesan dalam suatu bahasa sandi menjadi pesan asli kembali.
M = D (C)
D = proses dekripsi
Umumnya, selain menggunakan fungsi tertentu dalam melakukan enkripsi dan dekripsi, seringkali fungsi itu diberi parameter tambahan yang disebut dengan istilah kunci.
Untuk memudahkan penggambaran suatu skenario komunikasi dalam pembahasan selanjutnya, maka dipergunakan nama-nama orang yang relevan dengan peran yang dilakukannya dalam komunikasi itu.
Kode & nama Penjelasan
A: Anto Pihak pertama
B: Badu Pihak kedua
C: Chandra Pihak ketiga
E: Edi Pihak penyadap informasi yang tidak diperuntukkan kepadanya (eavesdropper)
M: Maman Pihak yang tidak hanya menyadap informasi, namun juga mengubah informasi yang disadap (malacious person)
T: Tari, Tata,
Tania Pihak yang dipercaya oleh pihak pertama, kedua dan ketiga (trusted person)
Tabel 3.1. Nama-nama ganti untuk mempermudah penjelasan
Bab ini akan menguraikan mengenai beberapa jenis serangan, jenis-jenis kunci kriptografi, berbagai jenis perangkat dan protokol kriptografi, serta masalah panjang kunci kriptografi.
Jenis Serangan
Selain ada pihak yang ingin menjaga agar pesan tetap aman, ada juga ternyata pihak-pihak yang ingin mengetahui pesan rahasia tersebut secara tidak sah. Bahkan ada pihak-pihak yang ingin agar dapat mengubah isi pesan tersebut. Ilmu untuk mendapatkan pesan yang asli dari pesan yang telah disandikan tanpa memiliki kunci untuk membuka pesan rahasia tersebut disebut kriptoanalisis. Sedangkan usaha untuk membongkar suatu pesan sandi tanpa mendapatkan kunci dengan cara yang sah dikenal dengan istilah serangan (attack).
Di bawah ini dijelaskan beberapa macam penyerangan terhadap pesan yang sudah dienkripsi:
1. Ciphertext only attack, penyerang hanya mendapatkan pesan yang sudah tersandikan saja.
2. Known plaintext attack, dimana penyerang selain mendapatkan sandi, juga mendapatkan pesan asli. Terkadang disebut pula clear-text attack.
3. Choosen plaintext attack, sama dengan known plaintext attack, namun penyerang bahkan dapat memilih penggalan mana dari pesan asli yang akan disandikan.
Berdasarkan bagaimana cara dan posisi seseorang mendapatkan pesan-pesan dalam saluran komunikasi, penyerangan dapat dikategorikan menjadi:
1. Sniffing: secara harafiah berarti mengendus, tentunya dalam hal ini yang diendus adalah pesan (baik yang belum ataupun sudah dienkripsi) dalam suatu saluran komunikasi. Hal ini umum terjadi pada saluran publik yang tidak aman. Sang pengendus dapat merekam pembicaraan yang terjadi.
2. Replay attack [DHMM 96]: Jika seseorang bisa merekam pesan-pesan handshake (persiapan komunikasi), ia mungkin dapat mengulang pesan-pesan yang telah direkamnya untuk menipu salah satu pihak.
3. Spoofing [DHMM 96]: Penyerang – misalnya Maman – bisa menyamar menjadi Anto. Semua orang dibuat percaya bahwa Maman adalah Anto. Penyerang berusaha meyakinkan pihak-pihak lain bahwa tak ada salah dengan komunikasi yang dilakukan, padahal komunikasi itu dilakukan dengan sang penipu/penyerang. Contohnya jika orang memasukkan PIN ke dalam mesin ATM palsu – yang benar-benar dibuat seperti ATM asli – tentu sang penipu bisa mendapatkan PIN-nya dan copy pita magentik kartu ATM milik sang nasabah. Pihak bank tidak tahu bahwa telah terjadi kejahatan.
4. Man-in-the-middle [Schn 96]: Jika spoofing terkadang hanya menipu satu pihak, maka dalam skenario ini, saat Anto hendak berkomunikasi dengan Badu, Maman di mata Anto seolah-olah adalah Badu, dan Maman dapat pula menipu Badu sehingga Maman seolah-olah adalah Anto. Maman dapat berkuasa penuh atas jalur komunikas ini, dan bisa membuat berita fitnah.
Kabel koaksial yang sering dipergunakan pada jaringan sangat rentan terhadap serangan vampire tap [Tane 89], yakni perangkat keras sederhana yang bisa menembus bagian dalam kabel koaksial sehingga dapat mengambil data yang mengalir tanpa perlu memutuskan komunikasi data yang sedang berjalan. Seseorang dengan vampire tap dan komputer jinjing dapat melakukan serangan pada bagian apa saja dari kabel koaksial.
Penyerang juga bisa mendapatkan kunci dengan cara yang lebih tradisional, yakni dengan melakukan penyiksaan, pemerasan, ancaman, atau bisa juga dengan menyogok seseorang yang memiliki kunci itu. Ini adalah cara yang paling ampuh untuk mendapat kunci.
Kunci Simetris
Ini adalah jenis kriptografi yang paling umum dipergunakan. Kunci untuk membuat pesan yang disandikan sama dengan kunci untuk membuka pesan yang disandikan itu. Jadi pembuat pesan dan penerimanya harus memiliki kunci yang sama persis. Siapapun yang memiliki kunci tersebut – termasuk pihak-pihak yang tidak diinginkan – dapat membuat dan membongkar rahasia ciphertext. Problem yang paling jelas disini terkadang bukanlah masalah pengiriman ciphertext-nya, melainkan masalah bagaimana menyampaikan kunci simetris tersebut kepada pihak yang diinginkan. Contoh algoritma kunci simetris yang terkenal adalah DES (Data Encryption Standard) dan RC-4.

Gambar 3.1. Kunci simetris
Kunci Asimetris
Pada pertengahan tahun 70-an Whitfield Diffie dan Martin Hellman menemukan teknik enkripsi asimetris yang merevolusi dunia kriptografi. Kunci asimetris adalah pasangan kunci-kunci kriptografi yang salah satunya dipergunakan untuk proses enkripsi dan yang satu lagi untuk dekripsi. Semua orang yang mendapatkan kunci publik dapat menggunakannya untuk mengenkripsikan suatu pesan, sedangkan hanya satu orang saja yang memiliki rahasia tertentu – dalam hal ini kunci privat – untuk melakukan pembongkaran terhadap sandi yang dikirim untuknya.
Dengan cara seperti ini, jika Anto mengirim pesan untuk Badu, Anto dapat merasa yakin bahwa pesan tersebut hanya dapat dibaca oleh Badu, karena hanya Badu yang bisa melakukan dekripsi dengan kunci privatnya. Tentunya Anto harus memiliki kunci publik Badu untuk melakukan enkripsi. Anto bisa mendapatkannya dari Badu, ataupun dari pihak ketiga seperti Tari.

Gambar 3.2. Penggunaan kunci asimetris
Teknik enkripsi asimetris ini jauh lebih lambat ketimbang enkripsi dengan kunci simetris. Oleh karena itu, biasanya bukanlah pesan itu sendiri yang disandikan dengan kunci asimetris, namun hanya kunci simetrislah yang disandikan dengan kunci asimetris. Sedangkan pesannya dikirim setelah disandikan dengan kunci simetris tadi. Contoh algoritma terkenal yang menggunakan kunci asimetris adalah RSA (merupakan singkatan penemunya yakni Rivest, Shamir dan Adleman).
Fungsi Hash Satu Arah
Kini akan dibahas mengenai keutuhan pesan saat dikirimkan. Bagaimana jika Anto mengirimkan surat pembayaran kepada Badu sebesar 1 juta rupiah, namun di tengah jalan Maman (yang ternyata berhasil membobol sandi entah dengan cara apa) membubuhkan angka 0 lagi dibelakangnya sehingga menjadi 10 juta rupiah? Di mata Tari, pesan tersebut harus utuh, tidak diubah-ubah oleh siapapun, bahkan bukan hanya oleh Maman, namun juga termasuk oleh Anto, Badu dan gangguan pada transmisi pesan (noise). Hal ini dapat dilakukan dengan fungsi hash satu arah (one-way hash function), yang terkadang disebut sidik jari (fingerprint), hash, message integrity check, atau manipulation detection code.
Saat Anto hendak mengirimkan pesannya, dia harus membuat sidik jari dari pesan yang akan dikirim untuk Badu. Pesan (yang besarnya dapat bervariasi) yang akan di-hash disebut pre-image, sedangkan outputnya yang memiliki ukurannya tetap, disebut hash-value (nilai hash). Kemudian, melalui saluran komunikasi yang aman, dia mengirimkan sidik jarinya kepada Badu. Setelah Badu menerima pesan si Anto – tidak peduli lewat saluran komunikasi yang mana – Badu kemudian juga membuat sidik jari dari pesan yang telah diterimanya dari Anto. Kemudian Badu membandingkan sidik jari yang dibuatnya dengan sidik jari yang diterimanya dari Anto. Jika kedua sidik jari itu identik, maka Badu dapat yakin bahwa pesan itu utuh tidak diubah-ubah sejak dibuatkan sidik jari yang diterima Badu. Jika pesan pembayaran 1 juta rupiah itu diubah menjadi 10 juta rupiah, tentunya akan menghasilkan nilai hash yang berbeda.

Gambar 3.3. Membuat sidik jari pesan
Fungsi hash untuk membuat sidik jari tersebut dapat diketahui oleh siapapun, tak terkecuali, sehingga siapapun dapat memeriksa keutuhan dokumen atau pesan tertentu. Tak ada algoritma rahasia dan umumnya tak ada pula kunci rahasia.
Jaminan dari keamanan sidik jari berangkat dari kenyataan bahwa hampir tidak ada dua pre-image yang memiliki hash-value yang sama. Inilah yang disebut dengan sifat collision free dari suatu fungsi hash yang baik. Selain itu, sangat sulit untuk membuat suatu pre-image jika hanya diketahui hash-valuenya saja.
Contoh algoritma fungsi hash satu arah adalah MD-5 dan SHA. Message authentication code (MAC) adalah salah satu variasi dari fungsi hash satu arah, hanya saja selain pre-image, sebuah kunci rahasia juga menjadi input bagi fungsi MAC.
Tanda Tangan Digital
Badu memang dapat merasa yakin bahwa sidik jari yang datang bersama pesan yang diterimanya memang berkorelasi. Namun bagaimana Badu dapat merasa yakin bahwa pesan itu berasal dari Anto? Bisa saja saat dikirimkan oleh Anto melalui saluran komunikasi yang tidak aman, pesan tersebut diambil oleh Maman. Maman kemudian mengganti isi pesan tadi, dan membuat lagi sidik jari dari pesan yang baru diubahnya itu. Lalu, Maman mengirimkan lagi pesan beserta sidik jarinya itu kepada Badu, seolah-oleh dari Anto.
Untuk mencegah pemalsuan, Anto membubuhkan tanda tangannya pada pesan tersebut. Dalam dunia elektronik, Anto membubuhkan tanda tangan digitalnya pada pesan yang akan dikirimkan untuk Badu sehingga Badu dapat merasa yakin bahwa pesan itu memang dikirim oleh Anto.
Sifat yang diinginkan dari tanda tangan digital diantaranya adalah:
1. Tanda tangan itu asli (otentik), tidak mudah ditulis/ditiru oleh orang lain. Pesan dan tanda tangan pesan tersebut juga dapat menjadi barang bukti, sehingga penandatangan tak bisa menyangkal bahwa dulu ia tidak pernah menandatanganinya.
2. Tanda tangan itu hanya sah untuk dokumen (pesan) itu saja. Tanda tangan itu tidak bisa dipindahkan dari suatu dokumen ke dokumen lainnya. Ini juga berarti bahwa jika dokumen itu diubah, maka tanda tangan digital dari pesan tersebut tidak lagi sah.
3. Tanda tangan itu dapat diperiksa dengan mudah.
4. Tanda tangan itu dapat diperiksa oleh pihak-pihak yang belum pernah bertemu dengan penandatangan.
5. Tanda tangan itu juga sah untuk kopi dari dokumen yang sama persis.
Meskipun ada banyak skenario, ada baiknya kita perhatikan salah satu skenario yang cukup umum dalam penggunaan tanda tangan digital. Tanda tangan digital memanfaatkan fungsi hash satu arah untuk menjamin bahwa tanda tangan itu hanya berlaku untuk dokumen yang bersangkutan saja. Bukan dokumen tersebut secara keseluruhan yang ditandatangani, namun biasanya yang ditandatangani adalah sidik jari dari dokumen itu beserta timestamp-nya dengan menggunakan kunci privat. Timestamp berguna untuk menentukan waktu pengesahan dokumen.

Gambar 3.4. Pembuatan tanda tangan digital
Keabsahan tanda tangan digital itu dapat diperiksa oleh Badu. Pertama-tama Badu membuat lagi sidik jari dari pesan yang diterimanya. Lalu Badu mendekripsi tanda tangan digital Anto untuk mendapatkan sidik jari yang asli. Badu lantas membandingkan kedua sidik jari tersebut. Jka kedua sidik jari tersebut sama, maka dapat diyakini bahwa pesan tersebut ditandatangani oleh Anto.

Gambar 3.5. Pemeriksaan keabsahan tanda tangan digital
Masalah Pertukaran Kunci Publik
Anto hendak mengirimkan Badu suatu dokumen rahasia. Jika mereka belum pernah bertemu sebelumnya, tentu Badu harus mengirimkan kunci publiknya kepada Anto agar Anto dapat melakukan enkripsi yang pesannya hanya dapat dibuka oleh Badu. Demikian juga pula sebaliknya, Anto harus mengirimkan kepada Badu kunci publiknya agar Badu dapat memeriksa keaslian tanda tangan Anto pada pesan yang dikirim. Dengan cara ini Anto dapat memastikan pesan itu sampai ke tujuannya, sedangkan Badu dapat merasa yakin bahwa pengirim pesan itu adalah Anto.
Masalah yang muncul adalah bagaimana mereka dapat saling bertukar kunci dengan aman? Bisa saja di tengah pertukaran kunci-kunci publik milik Anto dan Budi itu diganti dengan kunci publik milik Maman. Dengan begitu Maman dengan bebas dapat menyadap dan mengubah seluruh informasi. Inilah suatu contoh dari man-in-the-middle attack.
Anto dan Badu harus sama-sama yakin bahwa kunci-kunci publik yang mereka dapatkan benar-benar otentik. Mereka bisa mendapatkannya dari sesorang yang dipercaya, Tari misalnya. Setiap anggota jaringan diasumsikan telah memiliki saluran komunikasi pribadi yang aman dengan Tari. Saluran inilah yang dimanfaatkan untuk mengirim kunci publik Badu ke Anto (dan sebaliknya). Tari menjadi penjamin keabsahan kunci jika Anto dan Badu sebelumnya tidak pernah bertukar kunci publik. Skenario ini tetap membutuhkan kunci-kunci kriptografi lagi (baik itu kunci simetris ataupun kunci asimetris) untuk pengamanan saluran komunikasi antara Tari dengan Anto atau Badu.
Sertifikat Digital
Masalah di atas dapat dipecahkan dengan penggunaan sertifikat digital. Tari tidak lagi setiap saat menjadi penukar kunci, namun Tari cukup menandatangani kunci publik milik setiap orang di jaringan tersebut. Sebenarnya dalam sertifikat tersebut tak hanya berisi kunci publik, namun dapat berisi pula informasi penting lainnya mengenai jati diri pemilik kunci publik, seperti misalnya nama, alamat, pekerjaan, jabatan, perusahaan dan bahkan hash dari suatu informasi rahasia. Semua orang mempercayai otoritas Tari dalam memberikan tanda tangan, sehingga orang-orang dalam jaringan itu merasa aman menggunakan kunci publik yang telah ditandatangani Tari.

Gambar 3.6. Contoh sertifikat digital
Jika Maman berhasil mencuri sertifikat digital yang dipertukarkan antara Anto dan Badu, serta menggantinya dengan sertifikat digital milik dirinya sendiri, maka Anto dan Badu dapat segera melihat bahwa sertifikat digital yang diterimanya bukan ‘lawan bicara’ yang semestinya.
Bagaimana jika Chandra – yang berada di luar jaringan Tari – hendak berkomunikasi dengan Anto? Chandra memiliki juga sertifikat, tetapi tidak ditandatangani oleh Tari, melainkan oleh Tata, seseorang yang dipercaya dalam jaringan tempat Chandra berada. Tari dan Tata adalah otoritas sertifikat (certificate authority), yaitu pihak-pihak yang berwenang memberikan sertifikat. Namun Anto tidak mengenal dan tidak mempercayai Tata. Masalah ini dapat diselesaikan jika ada otoritas sertifikat (OS) yang kedudukannya lebih tinggi dari Tata dan Tari – katakanlah Tania. Tania memberikan pengesahan kepada Tata dan Tari. Jadi ada hirarki dari sertifikat digital. Jika Tania berada pada kedudukan hirarki yang paling tinggi, maka Tania disebut otoritas sertifikat utama (root certificate authority).
Anto mempercayai tanda tangan Tari. Namun karena Tari sendiri keberadaannya disahkan oleh Tania, tentunya Anto harus mengakui otoritas Tania. Jika Tania memberikan pengesahan kepada OS lain dibawahnya, seperti Tata, maka dengan merunut struktur hirarki percabangan OS, Anto dapat memeriksa kebenaran sertifikat digital milik Chandra yang disahkan oleh Tata.

Gambar 3.7. Contoh hirarki otoritas sertifikat digital
Serangan terhadap sistem yang memiliki pengamanan dengan sertifikat digital sulit dilakukan. Jelas Edi tidak mendapatkan apa-apa kalaupun ia memainkan ulang percakapan antara Anto dan Chandra. Edi membutuhkan kunci privat untuk bisa membuka pesan-pesan yang dipertukarkan, padahal kunci privat itu tidak ada di dalam sertifikat digital.
Penukaran sertifikat digital Chandra dengan sertifikat digital Maman akan segera diketahui, karena sertifikat digital itu pasti berbeda. Sedangkan jika sertifikat yang dipertukarkan antara Chandra dan Anto tidak diganti, tetapi yang diganti oleh Maman adalah pesan yang dipertukarkan, maka tentu ada ketidakcocokan dalam pemeriksaan tanda tangan digital.
Secara teoritis keunggulan dari tanda tangan digital adalah kemampuan untuk melakukan proses otentikasi secara off-line. Pemeriksa cukup memiliki kunci publik dari OS utama untuk mengetahui sah-tidaknya kunci publik dari lawan bicaranya. Selain itu untuk meningkatkan keamanan, kunci publik OS utama bisa saja diintegrasikan dalam program aplikasi. Namun kenyataannya, karena ada kemungkinan sertifikat digital tersebut hilang, tercuri atau identitas pemilik sertifikat berubah (perubahan alamat surat elektronik atau nomor KTP misalnya), maka sertifikat digital perlu diperiksa keabsahannya dengan melihat daftar sertifikat terbatalkan (certificate revocation list) yang disimpan oleh OS.
Tanda Tangan Pesan Ganda
Andaikan Anto membuat perjanjian jual-beli dengan Badu. Untuk masalah pembayaran, Anto menginstruksikan bank untuk memberikan kepada Badu sejumlah uang sesuai dengan perjanjian jual-beli, namun Anto tidak ingin agar bank mengetahui isi perjanjian jual-beli itu.
1. Anto membuat sidik jari dari SPP (yaitu Hash(SPP)) dan sidik jari SPJB (yakni Hash(SPJB)).
2. Kemudian, Anto membuat sebuah sidik jari baru dari gabungan kedua sidik jari sebelumnya ( Hash ( (Hash(SPP) + Hash(SPJB) ) ). Hasil hash tersebut dinamakan sidik jari pesan ganda SPP & SPJB.
3. Anto menyerahkan surat perjanjian jual belinya kepada Badu. Selain itu Anto juga menyerahkan surat perintah pembayaran beserta sidik jari pesan ganda SPP & SPJB kepada bank.
4. Saat Badu ingin mengambil uang di bank, Badu membuat sidik jari dari surat perjanjian jual beli (SPJB). Badu menyerahkan sidik jari SPJB kepada bank.
5. Bank membuat sidik jari dari surat perintah pembayaran (SPP).
6. Bank menggabungkan sidik jari SPP dengan sidik jari SPJB yang diterimanya dari Badu, kemudian meng-hash-nya sehingga dihasilkan sidik jari pesan ganda SPP & SPJB.
7. Jika sidik jari pesan ganda SPP & SPJB yang baru dibuat itu sama dengan yang telah diberikan oleh Anto, maka bank menjalankan kewajibannya kepada Badu.

Gambar 3.8. Pembuatan sidik jari pesan ganda
Jika sidik jari pesan ganda SPP & SPJB dienkripsi dengan kunci privat Anto, maka akan menjadi tanda tangan pesan ganda (dual-signature) Anto untuk kedua perjanjian tersebut [ViMa 97].
Protokol Pembagian Rahasia
Jika Anto memiliki rahasia, ia dapat memberikan ‘separuh’ rahasia itu kepada Badu dan ‘separuh’ rahasia itu kepada Chandra. Badu, yang menerima paruh pertama rahasia Anto, tidak bisa mengetahui apa isi rahasia itu. Demikian pula dengan Chandra. Namun, jika Badu dan Chandra menggabungkan potongan-potongan rahasia itu, maka akan tergambar rahasia Anto. Pembagian rahasia (secret splitting) dapat dilakukan dengan cara:
1. Anto membuat seuntai string acak R yang panjangnya sama dengan pesan rahasia M.
2. Anto melakukan operasi XOR antara M dengan R, sehingga menghasilkan S.
3. Anto memberikan R kepada Badu dan S kepada Chandra
4. Jika Badu dengan Chandra bertemu, maka mereka sanggup mendapatkan pesan rahasia M dengan cara melakukan operasi XOR antara S dengan R.
Protokol Komitmen-Bit
Protokol ini bermanfaat kalau misalnya Anto hendak membuat suatu pernyataan atau komitmen (katakanlah suatu string binari 1000), namun Anto tak ingin agar Badu mengetahui isi pernyatan tersebut sebelum saatnya. Badu harus merasa yakin bahwa Anto pada saatnya nanti, benar-benar mengeluarkan isi pernyataan yang sebenarnya saat melakukan komitmen, dan tidak mengeluarkan pernyataan yang sudah diubah (misalnya mengubah string tadi menjadi 1001). Ada beberapa jenis protokol komitmen-bit, namun di bawah ini hanya dijelaskan salah satu diantaranya, yakni dengan fungsi hash satu arah:
1. Anto membuat dua buah string secara acak, yakni R1 dan R2
2. Anto menggabungkan kedua string acak itu ke dalam pernyataannya (b) yang akan dikomitmenkan menjadi (R1, R2, b)
3. Anto menghitung hash dari gabungan string itu, Hash(R1, R2, b).
4. Anto kemudian mengirimkan hash tersebut beserta R1 kepada Badu. Badu akan menyimpannya untuk pemeriksaan nanti.
5. Jika sudah tiba saatnya untuk menunjukkan pernyataannya, Anto memberikan seluruh string (R1, R2, b) kepada Badu.
6. Badu memeriksa fungsi hash dari (R1, R2, b). Jika cocok dengan hash yang diperiksanya dulu, maka pernyataan Anto tidak diubah.
Tanda Tangan Buta
Badu disodori 100 amplop tertutup oleh Anto. Amplop itu berisi secarik pesan dan kertas karbon. Badu membuka 99 amplop secara acak. Jika seluruh amplop yang dibuka ternyata berisi pesan yang mirip, maka Badu dapat merasa bahwa amplop ke-100 juga berisi pesan yang mirip pula. Namun, jika satu saja dari 99 amplop tadi ada yang isi berbeda dari yang lain, maka Badu dapat mencurigai bahwa isi amplop ke-100 bisa saja juga tidak mirip dengan isi ke-98 amplop lainnya.
Dalam kasus dimana ternyata ke-99 amplop yang dibuka secara acak tadi berisi pesan yang mirip, maka dengan keyakinan yang cukup tinggi Badu berani menandatangani amplop terakhir yang belum dibuka. Tanda tangan Badu akan menembus amplop dan kertas karbon, sehingga pesan dalam amplop akan tertandatangani oleh Badu. Badu kurang lebih tahu apa isi pesan di amplop ke-100 itu. Protokol tanda tangan buta (blind signature) bekerja sebagai berikut:
1. Anto ‘mengalikan’ dokumen (yang akan ditandatangani) dengan sebuah faktor pembuta.
2. Anto mengirimkan dokumen itu kepada Badu
3. Badu menandatangani dokumen itu
4. Badu mengembalikan dokumen yang sudah ditandatangani tadi kepada Anto
5. Anto membaginya dengan faktor pembuta, sehingga mendapatkan dokumen yang asli sudah tertandatangani oleh Badu.
Protokol Uang Digital
1. Deskripsi Protokol
Berdasarkan beberapa teori penunjang di atas, maka dapatlah dibangun suatu protokol untuk uang digital. David Chaum, memiliki beberapa paten atas protokol uang digital yang diciptakannya. Berikut ini dijelaskan salah satu protokol uang digital:
1. Anto menyiapkan n lembar uang dengan nilai tertentu. Setiap uang diberi nomor seri acak X yang cukup panjang, sehingga kemungkinan 2 bilangan acak sama kecil sekali. Dalam setiap uang juga ada n (I1, I2, …, In) string identifikasi yang berguna untuk memberikan informasi mengenai pemilik uang, yakni Anto. Anto kemudian memecah tiap-tiap string identitas diri itu tadi menjadi dua bagian dengan menggunakan protokol pemecahan rahasia. Lantas Anto melakukan bit-komitmen pada setiap pecahan. Contoh uang yang disiapkan adalah:
Nilai: Rp.1.000,-
Nomor seri acak: X
String identitas: I1 = (I1L, I1R)
I2 = (I2L, I2R)
. . . .
In = (InL, InR)
2. Anto memasukkan uang itu kedalam yang juga disisipi kertas karbon amplop (mengalikan uang dengan faktor pembuta), lalu memberikannya kepada bank.
3. Bank akan meminta Anto untuk membuka n – 1 amplop itu secara acak. Bank memeriksa apakah semua uang tersebut memiliki nilai yang sama. Bank juga meminta kepada Anto untuk membuktikan kejujuran dirinya saat menuliskan string identifikasi pada uang itu, dengan cara menggabungkan pasangan-pasangan string identifikasi.
4. Jika bank merasa bahwa Anto tidak melakukan kecurangan, maka bank akan menandatangani uang terakhir yang masih di dalam amplop itu dan menyerahkannya kepada Anto. Tanda tangan bank akan menembus amplop dan kertas karbon sehingga uang di dalamnya tertandatangani.
5. Anto membuka amplop. Uang siap dipakai.
6. Anto menyerahkan uang kepada Badu. Badu sebagai penerima uang, akan memeriksa apakah tanda tangan bank pada uang itu absah.
7. Badu akan menyuruh Anto untuk membuka salah satu sisi dari setiap string identifikasi di setiap uang dengan cara memberikan string pemilih sepanjang n-bit. Artinya, jika string pemilih itu b1, b2, …, bn maka Anto harus membuka sisi kiri atau kanan dari Ii, tergantung apakah bi itu 0 atau 1.
8. Setelah itu Badu membawa uang tersebut ke bank. Bank akan memeriksa apakah nomor seri uang tersebut sudah pernah diterima oleh bank. Kalau belum ada, maka uang tersebut dinyatakan sah.
9. Jika nomor seri uang itu sudah pernah diterima oleh bank, maka bank akan memeriksa string identitas yang sudah terbuka pada uang itu dan membandingkannya dengan string identitas pada uang dengan nomor seri sama yang pernah diterima bank sebelumnya. Jika ternyata string identitas itu sama, maka berarti Badu yang menggandakan uang tersebut. Namun jika berbeda, maka berarti Anto yang menggandakan uang digital tersebut.
2. Pembelanjaan Ganda
Jika Anto menggandakan uang digitalnya lalu menggunakan uang digital yang sama itu dua kali, bank dapat mendeteksinya meskipun Badu tidak bisa. Badu memang ‘membuka’ identitas uang, namun hanya separuh-separuh. Kalau uang digital itu pernah diberikan Anto kepada Chandra, maka tentu Chandra juga pernah ‘membuka’ separuh identitas uang digital tadi secara acak. Nah, kemungkinan bahwa proses pembukaan identitas oleh Badu dan Chandra itu sama (maksudnya sama urutan pembukaannya, misalnya kiri-kiri-kanan-kiri-kanan, dan seterusnya) adalah 1 per 2n. Andaikan n cukup besar, katakanlah 16 saja, maka kemungkinan Badu dan Chandra secara acak membuka paruhan identitas dengan urutan sama adalah 1 : 65536. Artinya, jika Anto memberikan uangnya kepada dua orang yang berbeda, kemungkinan besar paruhan identitas yang dibuka juga berbeda. Jika saat otentikasi uang digital oleh bank ditemukan bahwa ada uang digital dengan nomor seri sama yang telah diuangkan, dan paruhan identitasnya berbeda, maka kemungkinan besar Anto menyerahkan uang digital yang sama kepada dua orang yang berbeda.
Sedangkan apabila Badu menguangkan uang digital yang sama dua kali, karena paruhan identitas dari uang digital yang diotentikasi itu sama persis dengan yang sudah tercatat, maka kemungkinan besar uang itu diberikan Anto kepada orang yang sama. Badulah yang ketahuan menguangkan uang digital yang sama dua kali. Penggunaan uang digital yang sama dua kali dikenal dengan istilah pembelanjaan ganda (double spending).
Panjang Kunci
Panjang Kunci Simetris
Meskipun ada beberapa cara bagi seorang kriptoanalis untuk memecahkan pesan rahasia, namun cara yang cukup umum dilakukan adalah dengan melakukan brute-force attack. Dengan cara ini, seorang penyerang mencoba seluruh kemungkinan kunci yang ada, sampai menemukan sebuah kunci yang jika dipergunakan untuk mendekripsi pesan yang disandikan akan memunculkan suatu pesan yang bermakna. Tentunya cara ini bermanfaat hanya jika sudah diketahui algoritmanya, namun tidak diketahui kuncinya apa.
PIN 5 digit berarti biasanya ada 100.000 kombinasi. Kelihatannya cukup, namun sebenarnya kurang. Dengan sebuah komputer pribadi saja bisa dengan mudah diselesaikan. Salah satu pencegahannya adalah dengan pembatasan seberapa banyak pemakai dapat mencoba memasukkan PIN. Biasanya dibatasi tiga kali.
Berikut ini diberikan contoh dari brute-force attack pada suatu algoritma ‘geser pada papan ketik QWERTY’:
Sandi zsdyrtvstf dicoba dengan kunci 3 menjadi bjkwpqmjql
Sandi zsdyrtvstf dicoba dengan kunci 2 menjadi nkleqwzkwa
Sandi zsdyrtvstf dicoba dengan kunci 1 menjadi mastercard
Ternyata kunci 1 cocok, karena dalam pesan yang disandikan itu mungkin ada transaksi yang menggunakan kartu kredit ‘mastercard’. Dengan menggunakan kunci yang sama, kemudian penyerang berusaha mendekripsikan bagian-bagian lain dari pesan, mungkin berusaha mengambil nomor kartu kreditnya. Kunci itu juga dapat dipakai untuk keperluan lain, misalnya untuk melakukan penipuan (spoofing).
DES, sebuah algoritma simetris, memiliki panjang kunci 56-bit, artinya ada 256 kemungkinan kunci. Sedangkan peraturan di Amerika Serikat yang akan diberlakukan pada tahun 1998 nanti akan melarang ekspor teknologi enkripsi lebih dari 40-bit. Sedangkan untuk keperluan dalam negeri Amerika Serikat, kunci 128-bit masih diizinkan penggunaannya [Star 97].
Tahun 1995, Michael Wierner merancang sebuah chip yang mengkhususkan diri untuk melakukan brute-force attack pada metoda enkripsi DES [Schn 96]. Chip tersebut dapat menemukan kunci rahasia dalam waktu rata-rata 3,5 jam dan kunci itu dijamin dapat ditemukan dalam waktu 7 jam. Harga pembuatannya adalah 1 juta dollar AS. Sesuai hukum Moore, setiap 18 bulan kemampuan komputer meningkat 2 kali lipat untuk harga yang sama. Maka, pada tahun 2000, harga chip itu hanya berkisar 100.000 dolar AS. Harga ini masih dalam jangkauan daya beli beberapa mafia kejahatan terorganisir. Karena itu, kini disarankan untuk menggunakan DES dengan kunci 112-bit.
Panjang kunci DES Jaminan waktu untuk menemukan kunci
40-bit 0,4 detik
56-bit 7 jam
64-bit 74 jam 40 menit
128-bit 157.129.203.952.300.000 tahun
Tabel 3.2. Serangan brute-force pada DES
Protokol keamanan SSL (Secure Socket Layer) pada Netscape Navigator menggunakan algoritma RC4 40-bit untuk enkripsi simetrisnya. Tahun 1995, Damien Doligez menjebolnya menggunakan 120 komputer Unix yang terhubung pada jaringan dalam waktu 8 hari [Star 97]. Dengan cara seperti ini, dijamin bahwa dalam 15 hari kunci itu pasti ditemukan.
Panjang kunci RC4 Jaminan waktu untuk menemukan kunci
40-bit 15 hari
56-bit 2.691,49 tahun
64-bit 689.021,57 tahun
128-bit 12.710.204.652.610.000.000.000.000 tahun
Tabel 3.3. Serangan brute-force pada RC4
Panjang Kunci Asimetris
Sedangkan pada sistem enkripsi kunci publik-privat, yang memegang peranan dalam menjebol kunci privat adalah kesulitan mencari faktor prima bilangan yang sangat besar. Beberapa kunci yang dipergunakan 10 tahun lalu saja kini sama sekali tidak laik pakai seiring dengan perkembangan ilmu pengetahuan dan teknologi.
Kunci publik yang dimanfaatkan SSL adalah teknologi kunci publik 40-bit dari RSA, yang ternyata dapat dijebol dalam waktu 1,3 hari dengan 100 komputer menggunakan brute-force attack [DHMM 96].
Ronald Rivest, salah seorang penemu RSA, juga pernah menghitung bahwa untuk menemukan kunci RSA 512-bit dengan cara brute-force attack membutuhkan biaya 8,2 juta dollar AS [DaLe 96]. Untuk kasus tertentu, ini pun tidak aman. Kini perusahaan-perusahaan disarankan menggunakan kunci 2048 bit agar data aman sampai tahun 2015.
Prospek
Pada saat tulisan ini dibuat, ekspor teknologi enkripsi DES 56-bit keluar dari Amerika Serikat masih diizinkan. Untuk yang lainnya hanya diizinkan 40-bit. Setelah tanggal 31 Desember 1998, ekspor teknologi enkripsi DES dari Amerika Serikat hanya dibatasi sampai 40-bit saja, atau boleh saja tetap 56-bit, namun pengembang perangkat lunak itu harus menyediakan perangkat untuk membuka kunci itu juga [Star 97].
Panjang-pendeknya kunci dalam teknik-teknik enkripsi pada sistem perdagangan di Internet, akan menjadi salah satu titik lemah sistem perdagangan di Internet itu sendiri. Ada argumen yang menyatakan bahwa kalau pada suatu saat ukuran kunci publik-privat terasa terlalu pendek, maka panjangkan saja lagi kunci itu, tentu proses penyerangannya akan makin sulit. Hal ini memang benar, namun ada pertimbangan lain bahwa pengguna kunci tersebut harus bisa melakukan proses enkripsi-dekripsi dengan teknologi yang secara komersil memungkinkan. Terlihat di sini bahwa dibutuhkan ukuran kunci yang cukup panjang supaya aman, tapi tidak terlalu panjang agar memudahkan dalam penggunannya secara umum.
Beberapa teknik brute-force attack lain yang tidak akan dibahas panjang disini, seperti dengan penyebaran virus, komputasi paralel pada jaringan raksasa, undian Cina, atau penggunaan komputer biologis. Semua itu menunjukkan bahwa ada kemungkinan bahwa kunci bisa didapatkan dengan brute-force attack.
Satu hal yang patut dicatat adalah bukan berarti dengan mungkinnya suatu metoda enkripsi dijebol lantas metoda enkripsi itu tidak bermanfaat, namun yang penting apakah biaya untuk melakukan serangan itu lebih besar dari pada harga informasi yang dienkripsi itu. Jika ya, maka untuk apa sang pencuri melakukannya? Untuk apa melakukan penyerangan dengan biaya 2 milyar rupiah kalau informasi yang dienkripsi hanya berharga Rp.10.000,- saja?
Kembali ke daftar isi

Bab 22. Keamanan Sistem

________________________________________
Kriptografi
Dasar enkripsi cukup sederhana. Pengirim menjalankan fungsi enkripsi pada pesan plaintext, ciphertext yang dihasilkan kemudian dikirimkan lewat jaringan, dan penerima menjalankan fungsi dekripsi (decryption) untuk mendapatkan plaintext semula. Proses enkripsi/dekripsi tergantung pada kunci (key) rahasia yang hanya diketahui oleh pengirim dan penerima. Ketika kunci dan enkripsi ini digunakan, sulit bagi penyadap untuk mematahkan ciphertext, sehingga komunikasi data antara pengirim dan penerima aman.
Kriptografi macam ini dirancang untuk menjamin privasi: mencegah informasi menyebar luas tanpa izin. Akan tetapi, privaci bukan satu-satunya layanan yang disediakan kriptografi. Kriptografi dapat juga digunakan untuk mendukung authentication (memverifikasi identitas pengguna) dan integritas (memastikan bahwa pesan belum diubah).
Kriptografi digunakan untuk mencegah orang yang tidak berhak untuk memasuki komunikasi, sehingga kerahasiaan data dapat dilindungi. Secara garis besar, kriptografi digunakan untuk mengirim dan menerima pesan. Kriptografi pada dasarnya berpatokan pada kunci yang secara selektif telah disebar pada komputer-komputer yang berada dalam satu jaringan dan digunakan untuk memroses suatu pesan.
Operasional
Keamanan operasional (operations security) adalah tindakan apa pun yang menjadikan sistem beroperasi secara aman, terkendali, dan terlindung. Yang dimaksud dengan sistem adalah jaringan, komputer, lingkungan. Suatu sistem dinyatakan operasional apabila sistem telah dinyatakan berfungsi dan dapat dijalankan dengan durasi yang berkesinambungan, yaitu dari hari ke hari, 24 jam sehari, 7 hari seminggu.
Manajemen Administratif (Administrative Management) adalah penugasan individu untuk mengelola fungsi-fungsi keamanan sistem. Beberapa hal yang terkait:
1. Pemisahan Tugas (Separation of Duties). Menugaskan hal-hal yang menyangkut keamanan kepada beberapa orang saja. Misalnya, yang berhak menginstall program ke dalam system komputer hanya admin, user tidak diberi hak tersebut.
2. Hak Akses Minimum (Least Privilege). Setiap orang hanya diberikan hak akses minimum yang dibutuhkan dalam pelaksanaan tugas mereka
3. Keingin-tahuan (Need to Know). Yang dimaksud dengan need to know adalah pengetahuan akan informasi yang dibutuhkan dalam melakukan suatu pekerjaan.
Kategori utama dari kontrol keamanan operasional antara lain:
1. Kendali Pencegahan (Preventative Control). Untuk mencegah error dan intruder temasuki sistem. Misal, kontrol pencegahan untuk mencegah virus memasuki sistem adalah dengan menginstall antivirus.
2. Kontrol Pendeteksian (Detective Control). Untuk mendeteksi error yang memasuki sistem. Misal, mencari virus yang berhasil memasuki sistem.
3. Kontrol Perbaikan (Corrective/Recovery Control). Membantu mengembalikan data yang hilang melalui prosedur recovery data. Misal, memperbaiki data yang terkena virus.
Kategori lainnya mencakup:
1. Kendali Pencegahan (Deterrent Control). . Untuk menganjurkan pemenuhan (compliance) dengan kontrol eksternal.
2. Kendali Aplikasi (Application Control) . Untuk memperkecil dan mendeteksi operasi-operasi perangkat lunak yang tidak biasa.
3. Kendali Transaksi (Transaction Control) . Untuk menyediakan kendali di berbagai tahap transaksi (dari inisiasi sampai keluaran, melalui kontrol testing dan kontrol perubahan).
Terminologi Kriptografi

a. Pesan, Plainteks dan Cipherteks
Pesan adalah data atau informasi yang dapat dibaca dan dimengerti maknanya. Nama lain untuk pesan adalah plainteks. Agar pesan tidak bisa dimengerti maknanya oleh pihak lain, maka pesan perlu disandikan ke bentuk lain yang tidak dapat dipahami. Bentuk pesan yang tersandi disebut cipherteks
b. Pengirim dan Penerima
Pengirim adalah entitas yang mengirim pesan kepada entitas lainnya. Penerima adalah entitas yang menerima pesan. Entitas di sini dapat berupa orang, mesin (komputer), kartu kredit dan sebagainya.
c. Enkripsi dan dekripsi
Proses menyandikan plainteks menjadi cipherteks disebut enkripsi. Sedangkan proses mengembalikan cipherteks menjadi plainteks semula dinamakan dekripsi
d. Cipher dan kunci
Algoritma kriptografi disebut juga cipher yaitu aturan untuk enciphering dan deciphering, atau fungsi matematika yang digunakan untuk enkripsi dan dekripsi. Konsep matematis yang mendasari algoritma kriptografi adalah relasi antara dua buah himpunan yaitu himpunan yang berisi elemen-elemen plainteks dan himpunan yang berisi cipherteks. Enkripsi dan dekripsi adalah fungsi yang memetakan elemen-elemen antara kedua himpunan tersebut.
e. Sistem kriptografi
Sistem kriptografi merupakan kumpulan yang terdiri dari algoritma kriptografi, semua plainteks dan cipherteks yang mungkin dan kunci.
f. Penyadap
Penyadap adalah orang yang berusaha mencoba menangkap pesan selama ditransmisikan dengan tujuan mendapatkan informasi sebanyak-banyaknya mengenai sistem kriptografi yang digunakan untuk berkomunikasi dengan maksud untuk memecahkan cipherteks.
g. Kriptanalisis dan kriptologi
Kriptanalisis (cryptanalysis) adalah ilmu dan seni untuk memecahkan cipherteks menjadi plainteks tanpa mengetahui kunci yang digunakan. Pelakunya disebut kriptanalis. Kriptologi adalah studi mengenai kriptografi dan kriptanalisis.
Sejarah Kriptografi
Sejarah kriptografi sebagian besar merupakan sejarah kriptografi klasik yaitu metode enkripsi yang menggunakan kertas dan pensil atau mungkin dengan bantuan alat mekanik sederhana. Secara umum algoritma kriptografi klasik dikelompokkan menjadi dua kategori, yaitu algoritma transposisi (transposition cipher) dan algoritma substitusi (substitution cipher). Cipher transposisi mengubah susunan huruf-huruf di dalam pesan, sedangkan cipher substitusi mengganti setiap huruf atau kelompok huruf dengan sebuah huruf atau kelompok huruf lain.
Kriptografi modern dipicu oleh perkembangan peralatan komputer digital. Tidak seperti kriptografi
klasik yang mengenkripsi karakter per karakter (dengan menggunakan alfabet tradisionil), kriptografi modern beroperasi pada string biner. Kriptografi modern tidak hanya memberikan aspek keamanan confidentially, tetapi juga aspek keamanan lain seperti otentikasi, integritas data dan nirpenyangkalan.

Kriptografi Kunci Simetri dan Asimetri
Berdasarkan kunci yang digunakan untuk enkripsi dan dekripsi, kriptografi dapat dibedakan lagi menjadi kriptografi kunci simetri dan kriptografi kunci asimetri. Pada sistem kriptografi kunci simetri, kunci untuk enkripsi sama dengan kunci untuk dekripsi. Jika kunci untuk enkripsi tidak sama dengan kunci untuk dekripsi, maka dinamakan sistem kriptografi asimetri.

KRIPTOGRAFI
1. 1 Latar belakang
Berkat perkembangan teknologi yang begitu pesat memungkinkan manusia dapat berkomunikasi dan saling bertukar informasi/data secara jarak jauh. Antar kota antar wilayah antar negara bahkan antar benua bukan merupakan suatu kendala lagi dalam melakukan komunikasi dan pertukaran data. Seiring dengan itu tuntutan akan sekuritas (keamanan) terhadap kerahasiaan informasi yang saling dipertukarkan tersebut semakin meningkat. Begitu banyak pengguna seperti departemen pertahanan, suatu perusahaan atau bahkan individu-individu tidak ingin informasi yang disampaikannya diketahui oleh orang lain atau kompetitornya atau negara lain. Oleh karena itu dikembangkanlah cabang ilmu yang mempelajari tentang cara-cara pengamanan data atau dikenal dengan istilah Kriptografi.

Dalam kriptografi terdapat dua konsep utama yakni enkripsi dan dekripsi. Enkripsi adalah proses dimana informasi/data yang hendak dikirim diubah menjadi bentuk yang hampir tidak dikenali sebagai informasi awalnya dengan menggunakan algoritma tertentu. Dekripsi adalah kebalikan dari enkripsi yaitu mengubah kembali bentuk tersamar tersebut menjadi informasi awal.

Algoritma kriptografi berdasarkan jenis kunci yang digunakan dapat dibedakan menjadi dua jenis yaitu :
• Algoritma simetris
Dimana kunci yang digunakan untuk proses enkripsi dan dekripsi adalah kunci yang sama
• Algoritma asimetris
Dimana kunci yang digunakan untuk proses enkripsi dan dekripsi menggunakan kunci yang berbeda.

Sedangkan berdasarkan besar data yang diolah dalam satu kali proses, maka algoritma kriptografi dapat dibedakan menjadi dua jenis yaitu :
• Algoritma block cipher
Informasi/data yang hendak dikirim dalam bentuk blok-blok besar (misal 64-bit) dimana blok-blok ini dioperasikan dengan fungsi enkripsi yang sama dan akan menghasilkan informasi rahasia dalam blok-blok yang berukuran sama.

• Algoritma stream cipher
Informasi/data yang hendak dikirim dioperasikan dalam bentuk blok-blok yang lebih kecil (byte atau bit), biasanya satu karakter persatuan persatuan waktu proses, menggunakan tranformasi enkripsi yang berubah setiap waktu.

Camellia merupakan algoritma kriptografi simetris blok cipher. Dalam Camellia proses enkripsi dan dekripsi dilakukan pada blok data berukuran 128-bit dengan kunci yang dapat berukuran 128-bit, 192-bit, 256-bit. Algoritma Camellia dikembangkan oleh :
• Kazumaro Aoki (NTT – Nippon Telegraph and Telephone Corp.)
• Tetsuya Ichikawa (Mitsubishi electric Corp.)
• Masayuki Kanda (NTT – Nippon Telegraph and Telephone Corp.)
• Mitsuru Matsui (Mitsubishi electric Corp.)
• Shiho Moriai (NTT – Nippon Telegraph and Telephone Corp.)
• Junko Nakajima (Mitsubishi electric Corp.)
• Toshio Tokita (Mitsubishi electric Corp.)
Dimana versi 1.0 pada bulan Juli 2000, versi 2.0 pada September 2001 dan versi 2.1 pada Febuari 2002.

II Kriptografi

2. 1 Dasar Kriptografi
2. 1. 1 Teori Kriptografi
Kriptografi adalah suatu ilmu yang mempelajari bagaimana cara menjaga agar data atau pesan tetap aman saat dikirimkan, dari pengirim ke penerima tanpa mengalami gangguan dari pihak ketiga. Menurut Bruce Scheiner dalam bukunya “Applied Cryptography”, kriptografi adalah ilmu pengetahuan dan seni menjaga message-message agar tetap aman (secure).
Konsep kriptografi sendiri telah lama digunakan oleh manusia misalnya pada peradaban Mesir dan Romawi walau masih sangat sederhana. Prinsip-prinsip yang mendasari kriptografi yakni:
• Confidelity (kerahasiaan) yaitu layanan agar isi pesan yang dikirimkan tetap rahasia dan tidak diketahui oleh pihak lain (kecuali pihak pengirim, pihak penerima / pihak-pihak memiliki ijin). Umumnya hal ini dilakukan dengan cara membuat suatu algoritma matematis yang mampu mengubah data hingga menjadi sulit untuk dibaca dan dipahami.
• Data integrity (keutuhan data) yaitu layanan yang mampu mengenali/mendeteksi adanya manipulasi (penghapusan, pengubahan atau penambahan) data yang tidak sah (oleh pihak lain).
• Authentication (keotentikan) yaitu layanan yang berhubungan dengan identifikasi. Baik otentikasi pihak-pihak yang terlibat dalam pengiriman data maupun otentikasi keaslian data/informasi.
• Non-repudiation (anti-penyangkalan) yaitu layanan yang dapat mencegah suatu pihak untuk menyangkal aksi yang dilakukan sebelumnya (menyangkal bahwa pesan tersebut berasal dirinya).

Berbeda dengan kriptografi klasik yang menitikberatkan kekuatan pada kerahasiaan algoritma yang digunakan (yang artinya apabila algoritma yang digunakan telah diketahui maka pesan sudah jelas “bocor” dan dapat diketahui isinya oleh siapa saja yang mengetahui algoritma tersebut), kriptografi modern lebih menitikberatkan pada kerahasiaan kunci yang digunakan pada algoritma tersebut (oleh pemakainya) sehingga algoritma tersebut dapat saja disebarkan ke kalangan masyarakat tanpa takut kehilangan kerahasiaan bagi para pemakainya.
Berikut adalah istilah-istilah yang digunakan dalam bidang kriptografi :
• Plaintext (M) adalah pesan yang hendak dikirimkan (berisi data asli).
• Ciphertext (C) adalah pesan ter-enkrip (tersandi) yang merupakan hasil enkripsi.
• Enkripsi (fungsi E) adalah proses pengubahan plaintext menjadi ciphertext.
• Dekripsi (fungsi D) adalah kebalikan dari enkripsi yakni mengubah ciphertext menjadi plaintext, sehingga berupa data awal/asli.
• Kunci adalah suatu bilangan yang dirahasiakan yang digunakan dalam proses enkripsi dan dekripsi.

Kriptografi itu sendiri terdiri dari dua proses utama yakni proses enkripsi dan proses dekripsi. Seperti yang telah dijelaskan di atas, proses enkripsi mengubah plaintext menjadi ciphertext (dengan menggunakan kunci tertentu) sehingga isi informasi pada pesan tersebut sukar dimengerti.

plaintext ciphertext plaintext

kunci enkripsi kunci dekripsi

Gambar 2.1 Diagram proses enkripsi dan dekripsi
Peranan kunci sangatlah penting dalam proses enkripsi dan dekripsi (disamping pula algoritma yang digunakan) sehingga kerahasiaannya sangatlah penting, apabila kerahasiaannya terbongkar, maka isi dari pesan dapat diketahui.
Secara matematis, proses enkripsi merupakan pengoperasian fungsi E (enkripsi) menggunakan e (kunci enkripsi) pada M (plaintext) sehingga dihasilkan C (ciphertext), notasinya :

Ee(M) – C
Sedangkan untuk proses dekripsi, merupakan pengoperasian fungsi D (dekripsi) menggunakan d (kunci dekripsi) pada C (ciphertext) sehingga dihasilkan M (plaintext), notasinya :

Dd(C) = M
Sehingga dari dua hubungan diatas berlaku :
Dd(Ee(M)) = M
2. 1. 2 Algoritma Simetris dan Asimetris
2. 1. 2. 1 Algoritma Simetris
Algoritma simetris (symmetric algorithm) adalah suatu algoritma dimana kunci enkripsi yang digunakan sama dengan kunci dekripsi sehingga algoritma ini disebut juga sebagai single-key algorithm.
Plaintext ciphertext plaintext

kunci enkripsi (K) kunci dekripsi (K)
Gambar 2.2 Diagram proses enkripsi dan dekripsi algoritma simetris

Sebelum melakukan pengiriman pesan, pengirim dan penerima harus memilih suatu suatu kunci tertentu yang sama untuk dipakai bersama, dan kunci ini haruslah rahasia bagi pihak yang tidak berkepentingan sehingga algoritma ini disebut juga algoritma kunci rahasia (secret-key algorithm).
Kelebihan :
• Kecepatan operasi lebih tinggi bila dibandingkan dengan algoritma asimetrik.
• Karena kecepatannya yang cukup tinggi, maka dapat digunakan pada sistem real-time

Kelemahan :
• Untuk tiap pengiriman pesan dengan pengguna yang berbeda dibutuhkan kunci yang berbeda juga, sehingga akan terjadi kesulitan dalam manajemen kunci tersebut.
• Permasalahan dalam pengiriman kunci itu sendiri yang disebut “key distribution problem”
Contoh algoritma : TwoFish, Rijndael, Camellia
2. 1. 2. 2 Algoritma Asimetris
Algoritma asimetris (asymmetric algorithm) adalah suatu algoritma dimana kunci enkripsi yang digunakan tidak sama dengan kunci dekripsi. Pada algoritma ini menggunakan dua kunci yakni kunci publik (public key) dan kunci privat (private key). Kunci publik disebarkan secara umum sedangkan kunci privat disimpan secara rahasia oleh si pengguna. Walau kunci publik telah diketahui namun akan sangat sukar mengetahui kunci privat yang digunakan.

Plaintext ciphertext plaintext

kunci enkripsi (K1) kunci dekripsi (K2)
Gambar 2.3 Diagram proses enkripsi dan dekripsi algoritma asimetris
Pada umumnya kunci publik (public key) digunakan sebagai kunci enkripsi sementara kunci privat (private key) digunakan sebagai kunci dekripsi.
Kelebihan :
• Masalah keamanan pada distribusi kunci dapat lebih baik
• Masalah manajemen kunci yang lebih baik karena jumlah kunci yang lebih sedikit

Kelemahan :
• Kecepatan yang lebih rendah bila dibandingkan dengan algoritma simetris
• Untuk tingkat keamanan sama, kunci yang digunakan lebih panjang dibandingkan dengan algoritma simetris.
Contoh algoritma : RSA, DSA, ElGamal
2. 1. 3 Block Cipher dan Stream Cipher
Jika kita melihat berdasarkan ukuran serta format data yang akan diproses, maka algoritma kriptografi dapat dibagi menjadi dua bagian yang utama yaitu:
• Block Cipher, algoritma kriptografi ini bekerja pada suatu data yang berbentuk blok/kelompok data dengan panjang data tertentu (dalam beberapa byte), jadi dalam sekali proses enkripsi atau dekripsi data yang masuk mempunyai ukuran yang sama.
• Stream cipher, algoritma yang dalam operasinya bekerja dalam suatu pesan berupa bit tunggal atau terkadang dalam suatu byte, jadi format data berupa aliran dari bit untuk kemudian mengalami proses enkripsi dan dekripsi.

Pada algoritma penyandian blok (block cipher), plainteks yang masuk akan diproses dengan panjang blok yang tetap yaitu n, namun terkadang jika ukuran data ini terlalu panjang maka dilakukan pemecahan dalam bentuk blok yang lebih kecil. Jika dalam pemecahan dihasilkan blok data yang kurang dari jumlah data dalam blok maka akan dilakukan proses pading (penambahan beberapa bit).

2. 2 Mode Operasi dalam Block Cipher
\2. 2. 1 Electronic Codebook (ECB)
Pada mode operasi ECB sebuah blok input plaintext dipetakan secara statis ke sebuah blok output ciphertext. Sehingga tiap plaintext yang sama akan menghasilkan ciphertext yang selalu sama pula. Sifat- sifat dari mode operasi ECB :
• Sederhana dan efisien
• Memungkinkan implementasi parallel
• Tidak menyembunyikan pola plaintext
• Dimungkinkan terjadi adanya active attack.

Skema dari mode operasi ECB dapat digambarkan sebagai berikut :

Sender Receiver

Gambar 2.4 Skema Mode Operasi ECB

Cipher Block Chaining (CBC)
Pada mode oparasi ini hasil enkripsi dari blok sebelumnya mempengaruhi hasil enkripsi selanjutnya, atau enkripsi sebeluimnya menjadi feedback pada enkripsi blok saat itu., jadi tiap blok ciphertext bergantung bukan hanya pada blok plaintext-nya tapi bergantung pula pada blok-blok plaintext sebelumnya. Sehingga untuk plaintext yang sama, belum tentu menghasilkan ciphertext yang sama pula.

Skema dari mode operasi CBC dapat digambarkan sebagai berikut :

Sender Receiver

Gambar 2.5 Skema Mode Operasi CBC.

Mula-mula sebelum si pengirim hendak mengirimkan pesannya kepada si penerima, dia terlebih dahulu harus meng-XOR plaintext dengan IV (initialization vector) baru kemudian dienkripsi, setelah itu baru dikirimkan ciphertext pertamanya kepada si penerima. Plaintext ke-2 pun demikian, harus di-XOR terlebih dahulu dengan ciphertext sebelumnya sebelum mengalami proses enkripsi baru kemudian dikirimkan ke si penerima sebagai ciphertext 2 dan seterusnya.
Sifat-sifat dari mode operasi CBC :
• Lebih aman dari active attacks dibandingkan mode operasi ECB
• Error pada satu ciphertext dapat berakibat parah
• Menutupi pola plaintext
• Implementasi parallel belum diketahui

Dalam kriptografi, Public Key Infrastructure (PKI) adalah sebuah cara untuk otentikasi, pengamanan data dan perangkat anti sangkal. Secara teknis, PKI adalah implementasi dari berbagai teknik kriptografi yang bertujuan untuk mengamankan data, memastikan keaslian data maupun pengirimnya dan mencegah penyangkalan.
Teknik-teknik kriptografi yang digunakan antara lain: – fungsi hash, – algoritma enkripsi simetrik, dan – algoritma enkripsi asimetrik. Fungsi hash akan digunakan bersama dengan algoritma enkripsi asimetrik dalam bentuk tanda tangan digital untuk memastikan integritas dan keaslian berita/data berikut pengirimnya. Algoritma enkripsi simetrik digunakan untuk mengamankan data dengan cara enkripsi. Dalam PKI penggunaan algoritma enkripsi simetrik tidak langsung didefinisikan tetapi telah diimplementasikan oleh berbagai perangat lunak. Secara garis besar PKI diwujudkan dalam bentuk kolaborasi antar komponen-komponennya.
Komponen-komponen PKI antara lain: – Subscriber, – Certification Authority (CA), – Registration Authority (RA), – Sertifikat Digital. Secara praktis wujud PKI adalah penggunaan sertifikat digital. Sertifikat digital adalah sebuah file komputer yang berisi data-data tentang sebuah public key, pemiliknya (subscriber atau CA), CA yang menerbitkannya dan masa berlakunya.
PKI telah diimplementasikan dengan berbagai aplikasi seperti S/MIME, HTTPS, VPN, dll. Anda dapat melihat fitur S/MIME pada software email yang terkenal seperti Outlook Express, Mozilla Mail/Thunderbird, dan Evolution.
IPSec (singkatan dari IP Security) adalah sebuah protokol yang digunakan untuk mengamankan transmisi datagram dalam sebuah internetwork berbasis TCP/IP. IPSec mendefiniskan beberapa standar untuk melakukan enkripsi data dan juga integritas data pada lapisan kedua dalam DARPA Reference Model (internetwork layer). IPSec melakukan enkripsi terhadap data pada lapisan yang sama dengan protokol IP dan menggunakan teknik tunneling untuk mengirimkan informasi melalui jaringan Internet atau dalam jaringan Intranet secara aman. IPSec didefinisikan oleh badan Internet Engineering Task Force (IETF) dan diimplementasikan di dalam banyak sistem operasi. Windows 2000 adalah sistem operasi pertama dari Microsoft yang mendukung IPSec.
IPSec diimplementasikan pada lapisan transport dalam OSI Reference Model untuk melindungi protokol IP dan protokol-protokol yang lebih tinggi dengan menggunakan beberapa kebijakan keamanan yang dapat dikonfigurasikan untuk memenuhi kebutuhan keamanan pengguna, atau jaringan. IPSec umumnya diletakkan sebagai sebuah lapsian tambahan di dalam stack protokol TCP/IP dan diatur oleh setiap kebijakan keamanan yang diinstalasikan dalam setiap mesin komputer dan dengan sebuah skema enkripsi yang dapat dinegosiasikan antara pengirim dan penerima. Kebijakan-kebijakan keamanan tersebut berisi kumpulan filter yang diasosiasikan dengan kelakuan tertentu. Ketika sebuah alamat IP, nomor port TCP dan UDP atau protokol dari sebuah paket datagram IP cocok dengan filter tertentu, maka kelakukan yang dikaitkan dengannya akan diaplikasikan terhadap paket IP tersebut.
Dalam sistem operasi Windows 2000, Windows XP, dan Windows Server 2003, kebijakan keamanan tersebut dibuat dan ditetapkan pada level domain Active Directory atau pada host individual dengan menggunakan snap-in IPSec Management dalam Microsoft Management Console (MMC). Kebijakan IPSec tersebut, berisi beberapa peraturan yang menentukan kebutuhan keamanan untuk beberapa bentuk komunikasi. Peraturan-peraturan tersebut digunakan ntuk memulai dan mengontrol komunikasi yang aman berdasarkan sifat lalu lintas IP, sumber lalu lintas tersebut dan tujuannya. Peraturan-peraturan tersebut dapat menentukan metode-metode autentikasi dan negosiasi, atribut proses tunneling, dan jenis koneksi.
Untuk membuat sebuah sesi komunikasi yang aman antara dua komputer dengan menggunakan IPSec, maka dibutuhkan sebuah framework protokol yang disebut dengan ISAKMP/Oakley. Framework tersebut mencakup beberapa algoritma kriptografi yang telah ditentukan sebelumnya, dan juga dapat diperluas dengan menambahkan beberapa sistem kriptografi tambahan yang dibuat oleh pihak ketiga. Selama proses negosiasi dilakukan, persetujuan akan tercapai dengan metode autentikasi dan kemanan yang akan digunakan, dan protokol pun akan membuat sebuah kunci yang dapat digunakan bersama (shared key) yang nantinya digunakan sebagi kunci enkripsi data. IPSec mendukung dua buah sesi komunikasi keamanan, yakni sebagai berikut:
• protokol Authentication Header (AH): menawarkan autentikasi pengguna dan perlindungan dari beberapa serangan (umumnya serangan man in the middle), dan juga menyediakan fungsi autentikasi terhadap data serta integritas terhadap data. Protokol ini mengizinkan penerima untuk merasa yakin bahwa identitas si pengirim adalah benar adanya, dan data pun tidak dimodifikasi selama transmisi. Namun demikian, protokol AH tidak menawarkan fungsi enkripsi terhadap data yang ditransmisikannya. Informasi AH dimasukkan ke dalam header paket IP yang dikirimkan dan dapat digunakan secara sendirian atau bersamaan dengan protokol Encapsulating Security Payload.
• protokol Encapsulating Security Payload (ESP): Protokol ini melakukan enkapsulasi serta enkripsi terhadap data pengguna untuk meningkatkan kerahasiaan data. ESP juga dapat memiliki skema autentikasi dan perlindungan dari beberapa serangan dan dapat digunakan secara sendirian atau bersamaan dengan Authentication Header. Sama seperti halnya AH, informasi mengenai ESP juga dimasukkan ke dalam header paket IP yang dikirimkan.
Beberapa perangkat keras serta perangkat lunak dapat dikonfigurasikan untuk mendukung IPSec, yang dapat dilakukan dengan menggunakan enkripsi kunci publik yang disediakan oleh Certificate Authority (dalam sebuah public key infrastructure) atau kunci yang digunakan bersama yang telah ditentukan sebelumnya (skema Pre-Shared Key/PSK) untuk melakukan enkripsi secara privat.
1. Sejarah dan perkembangan
Kerberos pertama kali dikembangkan pada dekade 1980-an sebagai sebuah metode untuk melakukan autentikasi terhadap pengguna dalam sebuah jaringan yang besar dan terdistribusi. Kerberos menggunakan enkripsi kunci rahasia/kunci simetris dengan algoritma kunci yang kuat sehingga klien dapat membuktikan identitas mereka kepada server dan juga menjamin privasi dan integritas komunikasi mereka dengan server. Protokol ini dinamai Kerberos, karena memang Kerberos (atau Cerberus) merupakan seekor anjing berkepala tiga (protokol Kerberos memiliki tiga subprotokol) dalam mitologi Yunani yang menjadi penjaga Tartarus, gerbang menuju Hades (atau Pluto dalam mitologi Romawi).
2. Operasi
Protokol Kerberos memiliki tiga subprotokol agar dapat melakukan aksinya:
• Authentication Service (AS) Exchange: yang digunakan oleh Key Distribution Center (KDC) untuk menyediakan Ticket-Granting Ticket (TGT) kepada klien dan membuat kunci sesi logon.
• Ticket-Granting Service (TGS) Exchange: yang digunakan oleh KDC untuk mendistribusikan kunci sesi layanan dan tiket yang diasosiasikan dengannya.
• Client/Server (CS) Exchange: yang digunakan oleh klien untuk mengirimkan sebuah tiket sebagai pendaftaran kepada sebuah layanan.
Sesi autentikasi Kerberos yang dilakukan antara klien dan server adalah sebagai berikut:

Cara kerja protokol Kerberos
1. Informasi pribadi pengguna dimasukkan ke dalam komputer klien Kerberos, yang kemudian akan mengirimkan sebuah request terhadap KDC untuk mengakses TGS dengan menggunakan protokol AS Exchange. Dalam request tersebut terdapat bukti identitas pengguna dalam bentuk terenkripsi.
2. KDC kemudian menerima request dari klien Kerberos, lalu mencari kunci utama (disebut sebagai Master Key) yang dimiliki oleh pengguna dalam layanan direktori Active Directory (dalam Windows 2000/Windows Server 2003) untuk selanjutnya melakukan dekripsi terhadap informasi identitas yang terdapat dalam request yang dikirimkan. Jika identitas pengguna berhasil diverifikasi, KDC akan meresponsnya dengan memberikan TGT dan sebuah kunci sesi dengan menggunakan protokol AS Exchange.
3. Klien selanjutnya mengirimkan request TGS kepada KDC yang mengandung TGT yang sebelumnya diterima dari KDC dan meminta akses tehradap beberapa layanan dalam server dengan menggunakan protokol TGS Exchange.
4. KDC selanjutnya menerima request, malakukan autentikasi terhadap pengguna, dan meresponsnya dengan memberikan sebuah tiket dan kunci sesi kepada pengguna untuk mengakses server target dengan menggunakan protokol TGS Exchange.
5. Klien selanjutnya mengirimkan request terhadap server target yang mengandung tiket yang didapatkan sebelumnya dengan menggunakan protokol CS Exchange. Server target kemudian melakukan autentikasi terhadap tiket yang bersangkutan, membalasnya dengan sebuah kunci sesi, dan klien pun akhirnya dapat mengakses layanan yang tersedia dalam server.
Meski terlihat rumit, pekerjaan ini dilakukan di balik layar, sehingga tidak terlihat oleh pengguna.
Kriptoanalisis (dari bahasa Yunani kryptós, “tersembunyi”, dan analýein, “melepaskan”) adalah disiplin ilmu mengenai metode membaca pesan terenkripsi (tersandi), tanpa mengetahui informasi rahasia atau kunci yang seharusnya digunakan untuk membaca pesan tersebut. Dalam bahasa sehari-hari, kriptoanalisis bisa dikatakan ilmu memecahkan sandi. Disiplin ilmu yang digunakan pada kriptografi antara lain matematika, linguistik, logika, dan ilmu komputer.
Kriptoanalisis pertama kali dicetuskan oleh ilmuwan Arab zaman kekhalifahan Abbasiyah al-Kindi. Dalam bukunya Sebuah Naskah dalam Memecahkan Pesan-Pesan Kriptografis, ia menjelaskan secara detail metode analisis frekuensi, yang merupakan dasar bagi metode-metode kriptoanalisis. Kriptoanalisis terus berkembang sesuai perkembangan teknologi. Salah satu contoh terkenal adalah kriptoanalisis mesin Enigma pada Perang Dunia II. Pada pertengahan 1970-an muncul kelompok baru kriptografi yang disebut kriptografi asimetrik. Penemuan ini menyebabkan terjadinya perubahan radikal pada metode-metode kriptoanalisis, yang melibatkan matematika murni.
Serangan brute-force adalah sebuah teknik serangan terhadap sebuah sistem keamanan komputer yang menggunakan percobaan terhadap semua kunci yang mungkin. Pendekatan ini pada awalnya merujuk pada sebuah program komputer yang mengandalkan kekuatan pemrosesan komputer dibandingkan kecerdasan manusia. Sebagai contoh, untuk menyelesaikan sebuah persamaan kuadrat seperti x²+7x-44=0, di mana x adalah sebuah integer, dengan menggunakan teknik serangan brute-force, penggunanya hanya dituntut untuk membuat program yang mencoba semua nilai integer yang mungkin untuk persamaan tersebut hingga nilai x sebagai jawabannya muncul. Istilah brute force sendiri dipopulerkan oleh Kenneth Thompson, dengan mottonya: “When in doubt, use brute-force” (jika ragu, gunakan brute-force).
Teknik yang paling banyak digunakan untuk memecahkan password, kunci, kode atau kombinasi. Cara kerja metode ini sangat sederhana yaitu mencoba semua kombinasi yang mungkin.
Sebuah password dapat dibongkar dengan menggunakan program yang disebut sebagai password cracker. Program password cracker adalah program yang mencoba membuka sebuah password yang telah terenkripsi dengan menggunakan sebuah algoritma tertentu dengan cara mencoba semua kemungkinan. Teknik ini sangatlah sederhana, tapi efektivitasnya luar biasa, dan tidak ada satu pun sistem yang aman dari serangan ini, meski teknik ini memakan waktu yang sangat lama, khususnya untuk password yang rumit.
Namun ini tidak berarti bahwa password cracker membutuhkan decrypt. Pada prakteknya, mereka kebayakan tidak melakukan itu. Umumnya, kita tidak dapat melakukan decrypt password-password yang sudah terenkripsi dengan algoritma yang kuat. Proses-proses enkripsi modern kebanyakan hanya memberikan satu jalan, di mana tidak ada proses pengembalian enkripsi. Namun, anda menggunakan tool-tool simulasi yang mempekerjakan algoritma yang sama yang digunakan untuk mengenkripsi password orisinal. Tool-tool tersebut membentuk analisa komparatif. Program password cracker tidak lain adalah mesin-mesin ulet. Ia akan mencoba kata demi kata dalam kecepatan tinggi. Mereka menganut “Azaz Keberuntungan”, dengan harapan bahwa pada kesempatan tertentu mereka akan menemukan kata atau kalimat yang cocok. Teori ini mungkin tepat mengena pada anda yang terbiasa membuat password asal-asalan. Dan memang pada kenyataannya, password-password yang baik sulit untuk ditembus oleh program password cracker.
Key generation merupakan kegiatam manajemen kunci dalam menghasilkan kunci yang acak dimana keacakan kunci merupakan bagian terpenting dalam menjamin kekuatan suatu kiptografi syarat sayrat kunci dikatakan acak adalah :
• Telah lulus uji statistik
untuk menguji keacakan pada suatu rangkaian kunci yang dihasilkan, kita dapat mengujinya dengan menggunakan uji statistik, diantaranya :
• five basic test, tes ini terdiri dari :
frequency test untuk menentukan apakah jumlaj bit ‘0’ dan ‘1’ dalam barisan bit mempunyai jumlah bit yang relatif sama, seperti yang diharapkan untuk barisan acak.
• serial test. untuk mementukan apakah jumlah dari pasangan bit 00,01,10 dan 11 dalam barisan bit mempunyai jumlah yang relatif sama, seperti yang diharapkan untuk barisan acak.
• poker test. untuk menentukan apakah jumlah dari barisan bit dengan lebar tertentu muncul dalam barisan bit seperti yang diharapkan untuk barisan acak.
• runs test. untuk menetukan apakah jumlah runtun dalam barisan bit, baik runtun bit ‘0’ ataupun bit ‘1’dalamb arisan bit mempunyai jumlah yang relatif sama, seperti yang diharapkan untuk barisan acak.
• autocorrelation test. untuk menentukan apakah perbedaan jumlah bit ‘0’ dan ‘1’ dalam barian bit (cycle) mempunyai jumlah yang relatif sama, seperti yang diharapkan untuk barisan acak.
1. b. FIPS 140.1
2. c. FIPS 140.2
3. d. NIST SP 800.22.v.1.8
4. e. die hard test
5. f. maurer’s universal statistic test.
tidak dapat diramalkan
maksudnya,selain telah lulus uji statistik juga unpredictable (tidak dapat diramalkan).secara perhitungan akan sulit untuk menentukan atau menduga bit bit selanjutnya yang akan muncul dari rangkaian tersebut. selain itu rangkaian itu haruslah tidak memberikan pengetahuan yang lengkap tentang algoritma atu infrastruktur hardware yang digunakan dalam pembangkitan rangkaian seluruh bit bit sebelumnya dalam rangkaian itu seniri
apabila menggunakan alat yang menghasilkan suatu kunci, ia tidak pernah menghasilkan kunci yang hampir sama atu sama persis dengan kunci yang dihasilkan sebelumnya. hal ini berarti jika pembangkit tersebut digunakan dua kali dengan input yang sama maka akan didapatkan dua rangkaian acak yang sama sekali berbeda dan tidak saling berhubungan.
namun untuk menghasilkan kunci yang acak tidaklah mudah. . ada dua macam untuk menghasilkan rangkaian kunci, yaitu : secara manual Metode ini masih sederhana.Biasanya digunakan koin dalam membangkitkan kuncinya. Ataupun dapat menggunakan Boudout Code jika yang dibangkitkan adalah karakter. Misal : Rumah = 0 , Burung = 1
Untuk menghasilkan 2 karakter maka pelemparan koin harus dilakukan sebanyak 10 kali, hasilnya dapat dilihat pada tabel boudout.
Kelebihan metode manual ini yaitu tidak membutuhkan biaya besar dan tidak memerlukan keahlian khusus. Sedangkan kekurangannya adalah membutuhkan tenaga yang besar dan membutuhkan waktu yang lama.
Artikel ini membutuhkan judul dalam bahasa Indonesia yang sepadan dengan judul aslinya.
Artikel bertopik teknologi informasi ini perlu dirapikan agar memenuhi standar Wikipedia
Merapikan artikel bisa berupa membagi artikel ke dalam paragraf atau wikifikasi artikel. Setelah dirapikan, tolong hapus pesan ini.
1. Secara elektronis
Pembuatan kunci secara elektronis merupakan teknik pembuatan rangkaian kunci yang menggunakan suatu alat pembangkit rangakain kunci (key generator). cara ini memiliki banyak. Metode ini sudah menggunakan alat elektronik dalam pembangkitan kuncinya. Biasanya menggunakan RK Generator seperti RNG (Random Number Generator yang akan kami bahas pada paper kali ini).cara ini memiliki banyak keuntungan contonya tenaga yang dibutuhkan kecil dan watu yang dibutuhkan sedikit. namun ia memiki kelemahan yaitu biaya yang dibutuhkan besar dan harus memiliki SDM yang mempunyai keahlian khusus.
1. Random Bit Generator
Random Bit Generator (pembangkit kunci acak) adalah sebuah alat ataupun algoritma yang mampu menghasilkan suatu rangkaian bit acak atau kunci. Idealnya, suatu algoritma sandi menggunakan kunci yang dihasilkan oleh Random Bit Generator ini. Hal ini dikarenakan bit-bit yang dihasilkan oleh Random Bit Generator benar-benar acak, sehingga sangat sulit untuk dianalisa. Ada beberapa metode yang dapat kita lakukan untuk membangkitkan rangkaian kunci dengan Random Bit Generator ini, yaitu :
1. 1.Pembangkit kunci berbasis hardware
yaitu pembangkitan kunci yang dilakukan dengan memanfaatkan keacakan yang ditimbulkan oleh kejadian yang bersifat fisik, beberapa contoh kejadian fisik tersebut dapat adalah sebagai berikut:
1. Suara dari mikropon atau input dari kamera.
2. Ketidakstabilan dari ascilator yang bekerja.
3. Thermal noise yang dihasilkan oleh semi-konduktor dioda ataupun resistor.
4. Turbulensi udara pada diskdrive yang tertutup rapat menyebabkan fluktuasi yang acak pada diskdrive sector read latency time.
5. 2. Pembangkit kunci berbasis software.
Pada umumnya pembangkitan kunci dengan cara ini lebih sulit dibuat dibandingkan pembangkitan kunci berbasis hardware. Pembangkitan kunci berbasis software ini dalam prosesnya biasanya memanfaatkan :
1. Jam yang terdapat pada sistem
2. Lama waktu penekanan tombol
3. Mouse movement
4. Input yang diberikan user.
Data yang digunakan pada pembangkit software sangat bervariasi dan bergantung pada banyak faktor, seperti platform komputer. Namun sulit untuk mencegah pihak-pihak yang tidak berkepentingan untuk meneliti dan memanipulasi data yang dihasilkan. Suatu software pembangkit bit acak seharusnya menggunakan beberapa sumber yang sifatnya acak yang dihasilkan pada sistem komputer.
Pseudo random bit generator.
Pseudo random bit generator (PRNG) adalah pembangkit rangkainbilangan pseurandom, diman proses pembangkitan tiap elemen tergantung dari formulasi matematis yang digunakan, dan ia membutuhkan seed.
Seed yaitu input yang digunakan pada pseudo random bit generator sedangkan outputnya disebutpseudo random bit sequences (rangkaian bit semi acak). seed berfungsi sebagai inputan pseudo random bit generator, karena seed meupakan inputan pembangkit kunci semi acak, maka panjangnya disesuiaikan dengan algoritma pseudorandom generator yang digunakan. Untuk pseudorandom bit, seed inilah yang berperan penting, pada pseudorandom yang baik tidak ditentukan oleh seed melainkan oleh formulasi matematis yang digunakan pada algoritma tersebut.
Bilangan pseudorandom dapat dibangkitkan dari bit pseudorandom oleh karena itu sekarang berkembang Pseudorandom Bit Generator. Pseudorandom Bit Generator ini adalah suatu algoritma yang mempunya sifat deterministik, dimana apabila diberikan berisan biner dengan panjang x, maka akan mengahsilkan barisan biner dengan panjang x yang kelihatan acak, deterministik berarti apabila generator diberikan initial seed yang sama maka akan menghasilkan barisan output yang sama atau berulang. aswin–

Wiki: MD5

Dalam kriptografi, MD5 (Message-Digest algortihm 5) ialah fungsi hash kriptografik yang digunakan secara luas dengan hash value 128-bit. Pada standart Internet (RFC 1321), MD5 telah dimanfaatkan secara bermacam-macam pada aplikasi keamanan, dan MD5 juga umum digunakan untuk melakukan pengujian integritas sebuah file.
MD5 di desain oleh Ronald Rivest pada tahun 1991 untuk menggantikan hash function sebelumnya, MD4. Pada tahun 1996, sebuah kecacatan ditemukan dalam desainnya, walau bukan kelemahan fatal, pengguna kriptografi mulai menganjurkan menggunakan algoritma lain, seperti SHA-1 (klaim terbaru menyatakan bahwa SHA-1 juga cacat). Pada tahun 2004, kecacatan-kecacatan yang lebih serius ditemukan menyebabkan penggunaan algoritma tersebut dalam tujuan untuk keamanan jadi makin dipertanyakan.
Daftar isi:
1. Sejarah dan kriptoanalisis
2. Efek nyata dari kriptoanalisis
3. Pengujian Integritas
4. Algortima
5. Pseudocode
6. Hash-hash MD5
7. Lihat pula
8. Pranala luar
1. Sejarah dan kriptoanalisis
MD5 adalah salah satu dari serangkaian algortima message digest yang didesain oleh Profesor Ronald Rivest dari MIT (Rivest, 1994). Saat kerja analitik menunjukkan bahwa pendahulu MD5 — MD4 — mulai tidak aman, MD5 kemudian didesain pada tahun 1991 sebagai pengganti dari MD4 (kelemahan MD4 ditemukan oleh Hans Dobbertin).
Pada tahun 1993, den Boer dan Bosselaers memberikan awal, bahkan terbatas, hasil dari penemuan pseudo-collision dari fungsi kompresi MD5. Dua vektor inisialisasi berbeda dan dengan beda 4-bit diantara keduanya.

Pada tahun 1996 Dobbertin mengumumkan sebuah kerusakan pada fungsi kompresi MD5. Dikarenakan hal ini bukanlah serangan terhadap fungsi hash MD5 sepenuhnya, hal ini menyebabkan para pengguna kriptografi menganjurkan pengganti seperti WHIRLPOOL, SHA-1 atau RIPEMD-160.
Ukuran dari hash — 128-bit — cukup kecil untuk terjadinya serangan brute force birthday attack. MD5CRK adalah proyek distribusi mulai Maret 2004 dengan tujuan untuk menunjukka kelemahan dari MD5 dengan menemukan kerusakan kompresi menggunakan brute force attack.
Bagaimanapun juga, MD5CRK berhenti pada tanggal 17 Agustus 2004, saat [[kerusakan hash]] pada MD5 diumumkan oleh Xiaoyun Wang, Dengguo Feng, Xuejia Lai dan Hongbo Yu [1][2]. Serangan analitik mereka dikabarkan hanya memerlukan satu jam dengan menggunakan IBM P690 cluster.
Pada tanggal 1 Maret 2005, Arjen Lenstra, Xiaoyun Wang, and Benne de Weger mendemontrasikan[3] kunstruksi dari dua buah sertifikat X.509 dengan public key yang berbeda dan hash MD5 yang sama, hasil dari demontrasi menunjukkan adanya kerusakan. Konstruksi tersebut melibatkan private key untuk kedua public key tersebut. Dan beberapa hari setelahnya, Vlastimil Klima menjabarkan[4] dan mengembangkan algortima, mampu membuat kerusakan Md5 dalam beberapa jam dengan menggunakan sebuah komputer notebook. Hal ini menyebabkan MD5 tidak bebas dari kerusakan.
Dikarenakan MD5 hanya menggunakan satu langkah pada data, jika dua buah awalan dengan hash yang sama dapat dibangun, sebuah akhiran yang umum dapat ditambahkan pada keduanya untuk membuat kerusakan lebih masuk akal. Dan dikarenakan teknik penemuan kerusakan mengijinkan pendahuluan kondisi hash menjadi arbitari tertentu, sebuah kerusakan dapat ditemukan dengan awalan apapun. Proses tersebut memerlukan pembangkitan dua buah file perusak sebagai file templat, dengan menggunakan blok 128-byte dari tatanan data pada 64-byte batasan, file-file tersebut dapat mengubah dengan bebas dengan menggunakan algoritma penemuan kerusakan.
2. Efek nyata dari kriptoanalisis
Saat ini dapat diketahui, dengan beberapa jam kerja, bagaimana proses pembangkitan kerusakan MD5. Yaitu dengan membangkitkan dua byte string dengan hash yang sama. Dikarenakan terdapat bilangan yang terbatas pada keluaran MD5 (2128), tetapi terdapat bilangan yang tak terbatas sebagai masukannya, hal ini harus dipahami sebelum kerusakan dapat ditimbulkan, tapi hal ini telah diyakini benar bahwa menemukannya adalah hal yang sulit.
Sebagai hasilnya bahwa hash MD5 dari informasi tertentu tidak dapat lagi mengenalinya secara berbeda. Jika ditunjukkan informasi dari sebuah public key, hash MD5 tidak mengenalinya secata berbeda jika terdapat public key selanjutnya yang mempunyai hash MD5 yang sama.
Bagaimanapun juga, penyerangan tersebut memerlukan kemampuan untuk memilih kedua pesan kerusakan. Kedua pesan tersebut tidak dengan mudah untuk memberikan serangan preimage, menemukan pesan dengan hash MD5 yang sudah ditentukan, ataupun serangan preimage kedua, menemukan pesan dengan hash MD5 yang sama sebagai pesan yang diinginkan.
Hash MD5 lama, yang dibuat sebelum serangan-serangan tersebut diungkap, masih dinilai aman untuk saat ini. Khususnya pada digital signature lama masih dianggap layak pakai. Seorang user boleh saja tidak ingin membangkitkan atau mempercayai signature baru menggunakan MD5 jika masih ada kemungkinan kecil pada teks (kerusakan dilakukan dengan melibatkan pelompatan beberapa bit pada bagian 128-byte pada masukan hash) akan memberikan perubahan yang berarti.
Penjaminan ini berdasar pada posisi saat ini dari kriptoanalisis. Situasi bisa saja berubah secara tiba-tiba, tetapi menemukan kerusakan dengan beberapa data yang belum-ada adalah permasalahan yang lebih susah lagi, dan akan selalu butuh waktu untuk terjadinya sebuah transisi.
3. Pengujian Integritas
Ringkasan MD5 digunakan secara luas dalam dunia perangkat lunak untuk menyediakan semacam jaminan bahwa file yang diambil (download) belum terdapat perubahan. Seorang user dapat membandingkan MD5 sum yang dipublikasikan dengan checksum dari file yang diambil. Dengan asumsi bahwa checksum yang dipublikasikan dapat dipercaya akan keasliannya, seorang user dapat secara yakin bahwa dile tersebut adalah file yang sama dengan file yang dirilis oleh para developer, jaminan perlindungan dari Trojan Horse dan virus komputer yang ditambahkan pada perangkat lunak. Bagaimanapun juga, seringkali kasus yangterjadi bahwa checksum yang dipublikasikan tidak dapat dipercaya (sebagai contoh, checksum didapat dari channel atau lokasi yang sama dengan tempat mengambil file), dalam hal ini MD5 hanya mampu melakukan error-checking. MD5 akan mengenali file yang didownload tidak sempurna, cacat atau tidak lengkap.
4. Algortima

Gambar 1. Satu operasi MD5 — MD5 terdiri atas 64 operasi, dikelompokkan dalam empat putaran dari 16 operasi. F adalah fungsi nonlinear; satu fungsi digunakan pada tiap-tiap putaran. Mi menujukkan blok 32-bit dari masukan pesan, dan Ki menunjukkan konstanta 32-bit, berbeda untuk tiap-tiap operasi.
s menunjukkan perputaran bit kiri oleh s; s bervariasi untuk tiap-tiap operasi. menunjukan tambahan modulo 232. MD5 memproses variasi panjang pesan kedalam keluaran 128-bit dengan panjang yang tetap. Pesan masukan dipecah menjadi dua gumpalan blok 512-bit; Pesan ditata sehingga panjang pesan dapat dibagi 512. Penataan bekerja sebagai berikut: bit tunggal pertama, 1, diletakkan pada akhir pedan. Proses ini diikuti dengan serangkaian nol (0) yang diperlukan agar panjang pesan lebih dari 64-bit dan kurang dari kelipatan 512. Bit-bit sisa diisi dengan 64-bit integer untuk menunjukkan panjang pesan yang asli. Sebuah pesan selalu ditata setidaknya dengan 1-bit tunggal, seperti jika panjang pesan adalah kelipatan 512 dikurangi 64-bit untuk informasi panjang (panjang mod(512) = 448), sebuah blok baru dari 512-bit ditambahkan dengan 1-bit diikuti dengan 447 bit-bit nol (0) diikuti dengan panjang 64-bit.
Algortima MD5 yang utama beroperasi pada kondisi 128-bit, dibagi menjadi empat word 32-bit, menunjukkan A, B, C dan D. Operasi tersebut di inisialisasi dijaga untuk tetap konstan. Algoritma utama kemudian beroperasi pada masing-masing blok pesan 512-bit, masing-masing blok melakukan pengubahan terhadap kondisi.Pemrosesan blok pesan terdiri atas empat tahap, batasan putaran; tiap putasan membuat 16 operasi serupa berdasar pada fungsi non-linear F, tambahan modular, dan rotasi ke kiri. Gambar satu mengilustrasikan satu operasi dalam putaran. Ada empat macam kemungkinan fungsi F, berbeda dari yang digunakan pada tiap-tiap putaran:

menunjukkan operasi logikan XOR, AND, OR dan NOT.
5. Pseudocode
Pseudocode pada algoritma MD5 adalah sebagai berikut.
// Catatan: Seluruh variable tidak pada 32-bit dan dan wrap modulo 2^32 saat melakukan perhitungan // Mendefinisikan r sebagai berikut var int [64] r, k r[ 0..15] := {7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22} r[16..31] := {5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20} r[32..47] := {4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23} r[48..63] := {6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21} // Menggunakan bagian fraksional biner dari integral sinus sebagai konstanta: for i from 0 to 63 k[i] := floor(abs(sin(i + 1)) × 2^32) // Inisialisasi variabel: var int h0 := 0x67452301 var int h1 := 0xEFCDAB89 var int h2 := 0x98BADCFE var int h3 := 0x10325476 // Pemrosesan awal: append “1” bit to message append “0” bits until message length in bits ≡ 448 (mod 512) append bit length of message as 64-bit little-endian integer to message // Pengolahan pesan paada kondisi gumpalan 512-bit: for each 512-bit chunk of message break chunk into sixteen 32-bit little-endian words w(i), 0 ≤ i ≤ 15 // Inisialisasi nilai hash pada gumpalan ini: var int a := h0 var int b := h1 var int c := h2 var int d := h3 // Kalang utama: for i from 0 to 63 if 0 ≤ i ≤ 15 then f := (b and c) or (( not b) and d) g := i else if 16 ≤ i ≤ 31 f := (d and b) or (( not d) and c) g := (5×i + 1) mod 16 else if 32 ≤ i ≤ 47 f := b xor c xor d g := (3×i + 5) mod 16 else if 48 ≤ i ≤ 63 f := c xor (b or ( not d)) g := (7×i) mod 16 temp := d d := c c := b b := ((a + f + k(i) + w(g)) leftrotate r(i)) + b a := temp // Tambahkan hash dari gumpalan sebagai hasil: h0 := h0 + a h1 := h1 + b h2 := h2 + c h3 := h3 + d var int digest := h0 append h1 append h2 append h3 // (diwujudkan dalam little-endian)
Catatan: Meskipun rumusan dari yang tertera pada RFC 1321, berikut ini sering digunakan untuk meningkatkan efisiensi:
(0 ≤ i ≤ 15): f := d xor (b and (c xor d)) (16 ≤ i ≤ 31): f := c xor (d and (b xor c))
6. Hash-hash MD5
Hash-hash MD5 sepanjang 128-bit (16-byte), yang dikenal juga sebagai ringkasan pesan, secara tipikal ditampilkan dalam bilangan heksadesimal 32-digit. Berikut ini merupakan contoh pesan ASCII sepanjang 43-byte sebagai masukan dan hash MD5 terkait:
MD5(“The quick brown fox jumps over the lazy dog”) = 9e107d9d372bb6826bd81d3542a419d6
Bahkan perubahan yang kecil pada pesan akan (dengan probabilitas lebih) menghasilkan hash yang benar-benar berbeda, misalnya pada kata “dog”, huruf d diganti menjadi c:
MD5(“The quick brown fox jumps over the lazy cog”) = 1055d3e698d289f2af8663725127bd4b
Hash dari panjang-nol ialah:
MD5(“”) = d41d8cd98f00b204e9800998ecf8427e
7. Lihat pula
• MD2
• SFV
• Cyclic redundancy check
8. Pranala luar
8. 1. Informasi MD5
• (en)RFC 1321 — Algoritma Ringkasan-Pesan MD5
• (en)Menggunakan MD5 untuk memastikan integritas isi dari file
• (en)Catatan Kriptoanalisis MD5
• (en)Tanya-Jawab tentang Kerusakan Hash
• (en)Online MD5 crack – Rainbow Tables + big hash database (md5, md5(md5), sha1, mysql)
• (fr)Online MD5 Reverser | Hash cracker
• (en)Pembobolan hash password MD5 Online
• (en)Pembobolan MD5 Online
8. 2. Implementasi
• (en)situs tentang MD5 — berisi tentang berbagai macam implementasi pada berbagai bahasa pemrogaman
• (en)Paj’s Home: Cryptography (Javascript MD4 dan MD5, plus SHA-1)
• (en)MD5 kalkulator dengan Javascript memberikan nilai secara langsung dari kalkulasi
• (en)Jacksum (Sebuah program dengan berbagai macam fungsi verifikasi pesan)
8. 3. Kerusakan
• (en)Kerusakan cepat yang ditemukan oleh V. Klima
Kategori: Kriptografi
Bahasa lain: English, Bahasa Melayu, Español, Deutsch, Français, Italiano, 日本語, Русский, Português, العربية, Polski, Lainnya…
Dari Wikipedia Indonesia. Seluruh teks tersedia sesuai dengan Lisensi Dokumentasi Bebas GNU.
• “MD5″ on the Wikipedia website
• Versi terdahulu
• Pembicaraan
• Sunting
Halaman ini terakhir diubah pada 2009-04-10 23:36:36
Halaman Utama
Wapedia: For Wikipedia on mobile phones

Algoritma Kriptografi
Jan.10, 2009 in Kriptografi
Algoritma kriptografi adalah algoritma yang berfungsi untuk melakukan tujuan dari ilmu kriptografi itu sendiri. Algoritma kriptografi terdiri dari 2 bagian fungsi, yaitu :
1. ENKRIPSI (encryption), dan
2. DEKRIPSI (decryption).
Shannon mengatakan bahwan Algoritma kriptografi harus memiliki kekuatan untuk melakukan konfusi dan difusi.
• KONFUSI (confusion). Mengaburkan hubungan antara plaintext dan ciphertext. Cara palingmudah untuk melakukan konfusi adalah menggunakan substitusi. Konfusi menimbulkan kesulitan dalam usaha musuh untuk mencari keteraturan dan pola statistik antara plaintext dan ciphertext.
• DIFUSI (difusion), Menyebarkan redudansi plaintext dengan menyebarkan masukan ke seluruh ciphertext. Caa yang paling mudah untuk dapat melakukan difusi adalah dengan menggunakan metode transposisi. Jika menggunakan difusi, akan dibutuka waktu ang lebih lama untk emecakan sandi rahasia ini.
Sehingga dapat digunakan untuk mengamankan informasi. Pada implementasinya sebuah algoritma sandi harus memperhatikan kualitas layanan dari keseluruhan sistem dimana dia diimplementasikan. Algoritma sandi yang handal adalah algoritma sandi yang kekuatannya terletak pada kunci, bukan pada kerahasiaan algoritma itu sendiri. Teknik dan metode untuk menguji kehandalan algoritma sandi adalah kriptanalisa.
Secara umum berdasarkan kesamaan kuncinya, algoritma sandi dibedakan menjadi :
• ALGORITMA KUNCI SIMETRIS.
• ALGORITMA KUNCI ASIMETRIS.
Berdasarkan arah implementasi dan pembabakan zamannya dibedakan menjadi :
• ALGORITMA SANDI KLASIK.
• ALGORITMA SANDI MODERN
Berdasarkan kerahasiaan kuncinya dibedakan menjadi :
• ALGORITMA SANDI KUNCI RAHASIA
• ALGORITMA SANDI KUNCI PUBLIK
Mengapa algoritma kriptografi banyak dipublikasikan ke masyarakat luas? Jika keseluruhan keamanan algoritma tersebut tergantung kunci dan tidak satupun didasarkan oleh detail algoritma, maka algoritma tersebut dapat dipublikasikan oleh semua orang agar dapat dianalisis dan di modifikasi oleh semua orang.
Protokol Kriptografi

• Protokol: aturan yang berisi rangkaian langkah-langkah, yang melibatkan dua atau lebih orang, yang dibuat untuk menyelesaikan suatu kegiatan.

• Protokol kriptografi: protokol yang menggunakan kriptografi.
Orang yang berpartisipasi dalam protokol kriptografi memerlukan protokol tersebut misalnya untuk:
– berbagi komponen rahasia untuk menghitung sebuah nilai,
– membangkitkan rangkaian bilangan acak,
– meyakinkan identitas orang lainnya (otentikasi),
– dll

• Protokol kriptografi dibangun dengan melibatkan beberapa algoritma kriptografi.

• Sebagian besar protokol kriptografi dirancang untuk dipakai oleh kelompok yang terdiri dari 2 orang pemakai, tetapi ada juga beberapa protokol yang dirancang untuk dipakai oleh kelompok yang terdiri dari lebih dari dua orang pemanaki (misalnya pada aplikasi teleconferencing)

• Untuk mendemonstrasikan protokol kriptografi, kita menggunakan nama-nama pemain sebagai berikut:

Alice : orang pertama (dalam semua protokol)
Bob : orang kedua (dalam semua protokol)
Carol : orang ketiga dalam protokol tiga- atau empat- orang
Dave : orang keempat dalam protokol empat-orang
Eve : penyadap (eavesdropper)
Trent : juru penengah (arbitrator) yang dipercaya
1. Protokol Komunikasi dengan Sistem Kriptografi Simetri.

Protokol 1:
(1) Alice dan Bob menyepakati algoritma kriptografi simetri yang akan digunakan.
(2) Alice dan Bob menyepakati kunci yang akan digunakan.
(3) Alice menulis pesan plainteks dan mengenkripsinya dengan kunci menjadi cipherteks.
(4) Alice mengirim pesan cipherteks kepada Bob.
(5) Bob mendekripsi pesan cipherteks dengan kunci yang sama dan membaca plainteksnya.

• Eve mendengar semua percakapan antara Alice dan Bob pada protokol ini.
– jika Eve menyadap transmisi pesan pada langkah (4), ia harus mencoba mengkriptanalisis cipherteks untuk memperoleh plainteks tanpa mengetahui kunci.
– jika ia mendengar pembicaraan pada langkah (1)dan (2), maka ia mengetahui algoritma dan kunci yang digunakan, sehingga ia dapat mendekripsi cipherteks dengan kunci tsb.

• Protokol kriptografi di atas tidak bagus karena kunci harus tetap rahasia sebelum, sepanjang, dan setelah protokol. Langkah (1) dapat dilakukan dalam mode publik, namun langkah (2) harus dilakukan dalam mode rahasia. Sistem kriptografi kunci-publik dapat memecahkan masalah distribusi kunci ini.

2. Protokol Komunikasi dengan Sistem Kriptografi Kunci-Publik.

Protokol 2:
(1) Alice dan Bob menyepakati algoritma kriptografi kunci-publik yang akan digunakan.
(2) Bob mengirimi Alice kunci publiknya (kunci publik Bob).
(3) Alice mengenkripsi pesannya dengan kunci publik Bob kemudian mengirimkannya ke Bob
(4) Bob mendekripsi pesan dari Alice dengan kunci rahasia miliknya (kunci rahasia Bob).

• Pada umumnya, pengguna di jaringan menyepakati algoritma kriptografi kunci-publik yang digunakan. Setiap pengguna jaringan mempunyai kunci publik dan kunci rahasia, yang dalam hal ini kunci publik dipublikasikan melalui basisdata yang dapat diakses bersama. Dengan demikian, protokol kriptografi kunci-publik menjadi lebih sederhana sebagai berikut:

Protokol 3:
(1) Alice mengambil kunci publik Bob dari basisdata kunci-publik.
(2) Alice mengenkripsi pesannya dengan kunci publik Bob kemudian mengirimkannya kepada Bob.
(3) Bob mendekripsi pesan dari Alice dengan kunci rahasia miliknya (kunci rahasia Bob).

• Eve yang mendengar pembicaraan selama protokol ini akan mendapatkan kunci publik Bob, tetapi Eve tidak dapat mendekripsi cipherteks karena ia tidak mengetahui kunci rahasia Bob.

• Dalam dunia nyata, sistem kriptografi kunci-publik bukanlah pengganti sistem kriptografi sismetri. Sistem kriptografi kunci-publik tidak digunakan untuk mengenkripsi pesan, melainkan untuk mengenkripsi kunci pada sistem kriptografi simetri.

• Dengan sistem kriptogfai kunci-publik, maka pertukaran kunci pada sistem kriptografi simetri dapat dilakukan dengan protokol kriptografi kunci-publik sebagai berikut:

Protokol 4:
(1) Bob mengirimi Alice kunci publiknya.
(2) Alice membangkitkan kunci simetri K, mengenkripsikannya dengan kunci publik (PK) Bob, dan mengirimkannya ke Bob,

EPK(K)

(3) Bob mendekripsi pesan dari Alice dengan menggunakan kunci rahasianya (SK) untuk mendapatkan kembali kunci simetri K,

DSK(EPK(K)) = K

(4) Baik Alice dan Bob dapat saling berkirim pesan dengan sistem kriptografi simetri dengan menggunakan kunci K.

• Dua gabungan sistem kriptografi yang digunakan pada protokol 4 di atas disebut hybrid cryptosystem dan kunci sismetri yang dipertukarkan disebut session key.

• Dengan protokol 4 di atas, kita katakan bahwa sistem kriptografi kunci-publik berhasil memecahkan masalah manajemen kunci yang sangat penting, yaitu pertukaran kunci.

3. Protokol untuk Sidik Dijital (Digital Signature)

a. Menandatangani Dokumen dengan Sistem Kriptografi Simetri dan Seorang Juru Penengah.

Alice ingin menandatangani dokumen digital (pesan atau arsip) dan mengirimkannya ke Bob. Ia meminta Trent sebagai juru penengah (misalnya pengacara) antara Alice dan Bob (diperlukan jika sewaktu-waktu ada pertengkaran antara Alice dan Bob). Trent akan memberikan sidik berupa sertifikasi terhadap dokumen yang dikirim oleh Alice. Sistem kriptografi yang digunakan adalah simetri. Trent memberikan kunci rahasia KA kepada Alice dan kunci rahasia KB kepada Bob (KA dan KB berbeda).

Protokol 5:
(1) Alice mengenkripsi dokumen dengan KA dan mengirimkannya kepada Trent.
(2) Trent mendekripsi dokumen dari Alice dengan KA.
(3) Trent menambahkan pada dokumen yang sudah didekripsi sebuah pernyataan sertifikasi bahwa dia telah menerima dokumen itu dari Alice, kemudian mengenkripsi keseluruhannya dengan KB.
(4) Trent mengirim cipherteks yang dihasilkan kepada Bob.
(5) Bob mendekripsi cipherteks dengan KB. Ia membaca dokumen dan sertifikasi dari Trent bahwa Alice yang mengirimkan dokumen tersebut.

• Karakteristik pemberian tanda tangan dengan prtotokol 5 adalah sbb:
1. Sidik (signature) pasti otentik, karena Trent adalah juru penegah yang dipercaya, Trent mengetahui bahwa dokumen dari Alice. Sertifikasi dari Trent berlaku sebagai bukti bagi Bob.
2. Sidik tidak dapat digunakan lagi untuk dokumen yang lain. Jika Bob menggunakan sertifikasi dari Trent untuk dokumen yang lain, maka kecurangan Bon ini dapat diketahui oleh Trent sbb:
– Trent meminta dokumen tersebut dari Bob.
– Trent mengenkripsi dokumen tersebut dengan KA dan membandingkannya dengan cipherteks dari Alice.
– Jika hasil enkripsi dokumen dari Bob tidak sama dengan cipherteks dari Alice, maka Bob telah mekakukan kecurangan.

3. Dokumen yang sudah ditandatangani tidak dapat diubah. Trent dapat membuktikan bahwa dokumen sudah berubah dengan cara yang sama seperti 2 di atas.
4. Sidik tidak dapat disangkal. Jika Alice menyangkal bahwa dia yang mengirim dokumen, sertifikasi dari Trent dapat menyanggah sangkalan Alice.

• Protokol 5 di atas tidak praktis karena membutuhkan pihak ketiga (Trent) untuk memberikan sertifikasi keabsahan dokumen dan prosesnya memakan waktu.

b. Menandatangani Dokumen dengan Sistem Kriptografi Kunci-Publik.

Protokol 6:
(1) Alice mengenkripsi dokumen dengan kunci rahasianya. Ini sekaligus juga berarti Alice telah memberikan sidik (signature) pada dokumennya.
(2) Alice mengirim dokumen yang terenkripsi kepada Bob.
(3) Bob mendekripsi dokumen dengan kunci publik Alice. Ini sekaligus juga berarti Bob telah memverifikasi sidik pada dokumen.

• Protokol 6 tidak membutuhkan pihak ketiga (Trent) untuk memberikan tandatangan (Trent hanya diperlukan untuk mensertifikasi bahwa kunci publik Alice memang benar milik Alice).

• Protokol 6 memiliki karakteristik yang sama seperti pada protokol 5.

c. Menandatangani Dokumen dengan Sistem Kriptografi Kunci-Publik dan Fungsi Hash Satu-Arah

Protokol 7:
(1) Alice meringkas dokumennya menjadi message digest dengan fungsi hash satu-arah.
(2) Alice mengenkripsi message digest dengan kunci rahasianya. Hasil enkripsinya disertakan (embedded) pada dokumen. Ini berarti Alice telah memberi sidik dijital pada dokumennya.
(3) Alice mengirim dokumen yang sudah diberi sidik dijital kepada Bob.
(4) Bob meringkas dokumen dari Alice menjadi mesaage digest dengan fungsi hash yang sama. Bob mendekripsi sidik dijital yang disertakan pada dokumen Alice. Jika hasil dekripsinya sama dengan message digest yang dihasilkan, maka sidik dijital tersebut sah.

• Jika dokumen yang sama ingin ditandatangani oleh dua orang (Alice dan Bob), maka orang ketiga, Carol, dibutuhkan pada proses verifikasi. Protokolnya adalah sebagai berikut:

Protokol 8:
(1) Alice memberi sidik dijital pada message digest dari dokumen.
(2) Bob memberi sidik dijital pada message digest dari dokumen.
(3) Bob mengirimkan sidik dijitalnya kepada Alice.
(4) Alice mengirim dokumen yang sudah diberi sidik dijitalnya dan sidik dijital dari Bob kepada Carol.
(5) Carol memverifikasi sidik dijital Alice dan sidik dijital Bob (Carol mengetahui kunci publik Alice dan kunci publik Bob).

4. Protokol untuk Sidik Dijital dengan Enkripsi

• Protokol ini dapat dianalogikan seperti pengiriman surat yang menggunakan amplop tertutup. Tanda tangan pada surat memberikan bukti kempemilikan, hal ini sama dengan fungsi sidik dijital pada pada dokumen elektrinis. Sedangkan amplop memberikan perlindungan keamanan (privacy), hal ini sama dengan fungsi enkripsi pada dokumen.

• Sidik dijital diberikan dengan menggunakan kunci rahasia pengirim (lihat protokol 6) dan dokumen dienkripsi dengan kunci publik penerima.

• Protokolnya adalah sbb:

Protokol 9:
(1) Alice menandatangi dokumen atau pesan (M) dengan menggunakan kunci rahasianya (SK-A).
SSK-A(M)
(2) Alice mengenkripsi dokumen yang sudah ditandatangi dengan kunci publik Bob (PK-B) dan mengirimkannya kepada Bob
EPK-B(SSK-A(M))
(3) Bob mendekripsi cipherteks yang diterima dengan kunci rahasianya (SK-B).
DSK-B(EPK-B(SSK-A(M))) = SSK-A(M))
(4) Bob melakukan verifikasi dengan mendekripsi hasil pada langkah 3 dengan menggunakan kunci publik Alice dan sekaligus mendapatkan kembali dokumen yang belum dienkripsi.
VPK-A( SSK-A(M)) = M

• Menandatangani dokumen sebelum mengenkripsikannya adalah cara yang alamiah. Dalam kehidupan sehari-hari, kita menulis surat, menandatanganinya, dan memasukkannya ke dalam amplop. Bila Alice memasukkan surat ke dalam amplop, kemudian menandatangani amplop, maka keabsahannya diragukan. Jika Bob memperlihatkan surat Alice tersebut kepada Carol, maka Carol mungkin menuduh Bob berbohong tentang isi surat tersebut.
• Alice tidak harus menggunakan menggunakan kunci publik/kunci rahasia yang sama untuk enkripsi dan tanda tangan. Alice dapat menggunakan dua pasang kunci: sepasang untuk enkripsi dan sepasang untuk pemberian tanda tangan.
• Misalkan Bob ingin mengkonfirmasi bahwa dia telah menerima dokumen dari Alice. Maka, Bob mengirimkan konfirmasi “tanda terima” kepada Alice. Protokol pengiriman pesan tanda terima adalah sebagai berikut:
Protokol 10:
(1) Alice menandatangi dokumen atau pesan (M) dengan menggunakan kunci rahasianya (SK-A), mengenkripsikannya dengan kunci publik Bob (PK-B) dan mengirimkannya kepada Bob
EPK-B(SSK-A(M))
(2) Bob mendekripsi cipherteks yang diterima dengan kunci rahasianya (SK-B), memverifikasi sidik dijital dengan kunci publik Alice dan sekaligus mendapatkan kembali dokumen yang belum dienkripsi.
VPK-A(DSK-B(EPK-B(SSK-A(M)))) = M
(3) Bob menandatangani dokumen (M) dengan kunci rahasianya (SK-B), mengenkripsikannya dengan kunci publik Alice (PK-A), dan mengirimkannya ke Alice.
EPK-A(SSK-B(M))
(4) Alice mendekripsi dokumen dengan kunci rahasianya (SK-A) dan memverifikasi sidik dijital dengan kunci publik Bob (PK-B).
VPK-B(DSK-A(EPK-A(SSK-B(M)))) = M ’
Jika M ’ yang dihasilkan sama dengan dokumen yang dikirim oleh Alice (M), maka Alice tahu bahwa Bob menerima dokumennya dengan benar.

Algoritma Asimetris [Public Key]
Jan.10, 2009 in Kriptografi
Algoritma Asimetris atau sering disebut algoritma public key, penggunaan kunci dalam algoritma ini adalah, kunci yang dipakai dalam proses enkripsi berbeda dengan kunci yang dipakai pada proses dekripsi, jadi jumlah kunci enkripsi ≠ kunci dekripsi.
Ada 2 jenis kunci di algoritma ini, yaitu
1. KUNCI PUBLIK adalah kunci yang digunakan untuk melakukan proses enkripsi data. Kunci ini disebut publik karena siapapun dapat mengetahuinya.
2. KUNCI PRIVAT adalah kunci yang digunakan untuk melakukan proses dekripsi data. Kunci ini disebut privat karena 1 kunci privat hanya dimiliki oleh 1 orang saja. Kunci privat sering juga disebut kunci rahasia.
Istilah kunci rahasia dalam algoritma simetris digunakan untk menyatakan kunci enkripsi dan dekripsi, sementara pada algoritma asimetris digunakan untuk menyatakan kunci privat, karena kunci publik tidak dirahasiakan.

desain IMK


Pengenalan Konsep User Interface dan IMK
Dedy Arisandi, ST, M.Kom
Teknik Perangkat Lunak FMIPA USU
2010
Pada tahun 1970 mulai dikenal istilah antarmuka pengguna (user interface), yang juga dikenal dengan istilah Man-Machine Interface (MMI), dan mulai menjadi topik perhatian bagi peneliti dan perancang sistem.
Perusahaan komputer mulai memikirkan aspek fisik dari antarmuka pengguna sebagai faktor penentu keberhasilan dalam pemasaran produknya.
HCI didefinisikan sebagai disiplin ilmu yang berhubungan dengan perancangan, evaluasi, dan implementasi sistem komputer interaktif untuk digunakan oleh manusia dan studi tentang fenomena di sekitarnya.
HCI pada prinsipnya membuat agar sistem dapat berdialog dengan penggunanya seramah mungkin.
Secara sederhana IMK adalah studi tentang manusia, teknologi komputer dan cara bagaimana mereka saling berinteraksi.
Kita mempelajari IMK untuk dapat menentukan bagaimana membuat agar teknologi komputer dapat lebih berguna bagi manusia
Hal tersebut membutuhkan pemahaman tentang tiga hal, yaitu:
Teknologi komputer
Manusia yang akan berinteraksi dengannya
Dan apa yang dimaksud dengan “lebih berguna” (more usable)
Saat ini perkembangan teknologi (komputer) sangat pesat
Hampir setiap saat kita berhubungan dengan teknologi komputer
Pada awal perkembangan komputer tahun 1950, masih sangat sulit dioperasikan, tidak praktis, dan waktu eksekusinya sulit diprediksi.
Ukurannya sangat besar dan harganya sangat mahal, sehingga jika dibandingkan tenaga buruh saat itu masih jauh lebih murah.
Hanya dapat dioperasikan oleh tenaga teknisi spesialis yang sudah terbiasa melakukan pemrograman secara on-line dengan menggunakan kartu plong (punch card).
Hanya sedikit yang diketahui tentang bagaimana membuatnya mudah untuk digunakan.
ENIAC 1
Memprogram ENIAC
ILLIAC II
Saat ini komputer sudah jauh lebih murah,
digunakan untuk hampir setiap sisi kehidupan,
kita mempunyai pengetahuan yang cukup bagaimana agar komputer dapat menyesuaikan dengan kebutuhan kerja manusia.
Penurunan harga komputer yang sangat dramatis dihasilkan oleh adanya perkembangan teknologi terutama teknologi microelectronic dalam bentuk keping silicon (IC).
Kemampuan teknologi untuk memperkecil ukuran rangkaian serta mengkemas sejumlah rangkaian dalam satu keping tipis IC merupakan langkah menuju perkembangan komputer yang powerful dengan kapasitas penyimpan yang besar, namun dengan harga yang semakin murah.
Perubahan teknologi di atas telah membuka kemungkinan penggunaan komputer yang lebih luas.
Saat ini kehadiran komputer sudah tidak dapat dilepaskan dari dunia bisnis dan industri modern.
Komputer juga ditemukan dalam penggunaan aplikasi rumah tangga
Agar komputer dapat diterima secara luas dan digunakan secara efektif, maka perlu dirancang secara baik.
Hal ini tidak berarti bahwa semua sistem harus dirancang agar dapat mengakomodasi semua orang, namun komputer perlu dirancang agar memenuhi dan mempunyai kemampuan sesuai dengan kebutuhan pengguna secara spesifik.
Pengguna seharusnya tidak perlu memikirkan bagaimana cara berinteraksi dengan komputer, tetapi yang penting justru bagaimana mengoptimalkan komputer untuk memenuhi kebutuhannya
Analoginya adalah seperti kita menggunakan mobil atau motor, kita tidak perlu memikirkan bagaimana cara mesin bekerja.
Tidak hanya perancangan layout layar monitor
Dari sudut pandang pengguna merupakan keseluruhan sistem
Useful, Usable, dan Used.
Useful
fungsional, dapat mengerjakan sesuatu
Usable
Dapat mengerjakan sesuatu dengan mudah, mengerjakan sesuatu yang benar (does the right things)
Used
Terlihat baik, tersedia dan diterima/digunakan oleh organisasi
Manusia
Komputer
Interaksi
Aktivitas
Lingkungan kerja
Tujuan utama IMK adalah untuk membuat sistem yang lebih:
Berguna (usable)
Aman
Produktif
Efektif
Efisien
Fungsional
Membutuhkan pengetahuan tentang
Tujuan manusia
Kemampuan dan keterbatasan manusia
Kemampuan dan keterbatasan komputer
Pekerjaan
Aspek sosial
Aspek Organisasi
Lingkungan kerja
Interaksi diantara elemen-elemen tersebut
Prinsip kerja sebuah sistem komputer adalah adanya masukan – proses – keluaran (input – process – output).
Ketika seseorang bekerja dengan sebuah komputer, ia akan melakukan interaksi atau berdialog dengan komputer menggunakan cara-cara tertentu.
Agar terjadi proses dialog yang baik, maka kita harus memahami watak atau karakter lawan dialog kita.
Dalam konteks IMK maka perancang terutama harus memahami psikologi manusia, yang merupakan faktor penentu keberhasilan interaksi.
Teknik Elektronika dan Komputer.
Psikologi.
Perancangan grafis.
Ergonomis.
Antropologi.
Linguistik.
Sosiologi.
Antarmuka pada HP
Antarmuka Kamera Digital

 ASPEK MANUSIA
 Dedy Arisandi, ST, M.Kom
 Teknik Perangkat Lunak FMIPA USU
 2010
 Faktor utama yang dominan dalam interaksi manusia dan komputer adalah faktor kognisi.
 Pada awal tahun 1960 dan 1970-an paradigma utama dalam psikologi kognisi adalah mencari karakter manusia sebagai pengolah informasi.
 Segala sesuatu yang diindera (penglihatan, pendengaran, sentuhan, bau dan rasa) dianggap sebagai informasi yang akan diolah oleh otak.
 Ide dasarnya adalah bahwa informasi masuk dan keluar dari pikiran manusia melalui sederet langkah proses yang urut.
1. Informasi dari lingkungan disandikan ke bentuk representasi internal.
2. Representasi internal dari rangsangan dibandingkan dengan informasi yang sudah tersimpan di otak.
3. Membuat keputusan respon apa yang akan dipilih.
4. Mengeksekusi respon yang telah dipilih dan melakukan tindakan yang diperlukan
 Dua hal penting yang dapat ditambahkan pada model dasar pengolahan pada manusia adalah pengolahan atas perhatian dan ingatan (memory).
 Pada model ini kognisi dapat dipandang berdasarkan:
1. Bagaimana informasi dirasakan oleh pengolah persepsi
2. Bagaimana perhatian terhadap informasi
3. Bagaimana informasi diproses dan disimpan dalam memori
 Register sensori, yang menerima informasi dari luar dan akan memegang informasi untuk waktu singkat (dalam seper sepuluhan detik)
 Memori jangka pendek, yang menyimpan informasi terbatas untuk periode pendek (beberapa detik)
 Memori jangka panjang, yang akan menyimpan informasi dalam jangka yang tidak dapat ditentukan
 Mata masih merupakan indera utama dalam berinteraksi dengan komputer.
 Mata manusia terutama digunakan untuk menghasilkan persepsi yang terorganisir akan :
 gerakan
 ukuran
 Bentuk/pola
 jarak
 posisi relatif
 tekstur, dan
 warna
 Sistem visual pada manusia mampu merasakan obyek dalam kondisi terang sinar matahari dan dalam kegelapan malam.
 Juga dapat merasakan dan mengikuti obyek yang bergerak dengan cepat (gerakan serangga) dan kejadian yang sekejap kemudian menghilang (seperti petir)
 Namun juga banyak hal yang tidak dapat dilihat, seperti gerakan peluru, pertumbuhan tanaman, dan sinar infra-merah.
 Terdapat dua teori pendekatan yang menjelaskan tentang bagaimana cara manusia melihat suatu obyek:
 Teori Konstruktif
 Teori Ekologi
 Asumsi utama pendekatan ini adalah bahwa persepsi melibatkan intervensi dari representasi dan ingatan.
 Apa yang kita lihat bukanlah merupakan replika atau copy dari dunia seperti citra yang dihasilkan kamera.
 Tetapi sistem visual manusia akan menyusun suatu model dari dunia dengan mentransformasi, memperbaiki, mendistorsi, dan membuang informasi.
 Efek dari konstruksi adalah untuk menyediakan kepada kita gambaran yang lebih konstan dari dunia dibanding jika kita hanya mengandalkan citra yang dilihat dari retina mata kita.
 Oleh karena itu kita melihat bangunan selalu tidak berubah dan orang terlihat mempunyai ukuran dan bentuk yang sama, meskipun kita melihat dari berbagai posisi dan jarak.
 Prinsip pengorganisasian memungkinkan kita untuk menerima pola rangsangan sebagai sesuatu yang mempunyai arti yang dapat didefinisikan sebagai:
 Kedekatan (closure)
 Kesamaan (similarity)
 Simetri (symmetry)
 Kontinuitas (continuity)
 Pendekatan (proximity)
 Pendekatan; titik-titik terlihat sebagai suatu kelompok dan bukan suatu elemen acak.
a) Kesamaan; ada kecenderungan untuk melihat elemen-elemen yang mempunyai bentuk atau warna sama sebagai satu kelompok
b) Kedekatan; bagian yang hilang pada gambar akan diisi untuk melengkapinya, sehingga terlihat sebagai lingkaran yang utuh
d. Kontinuitas; rangsangan terlihat seperti disusun dari dua baris titik yang saling bersimpangan satu dengan yang lain, dan bukan sekumpulan titik yang acak
e. Simetri; daerah yang dibatasi oleh garis batas simetris cenderung dirasakan sebagai gambar yang koheren.
 Pendekatan ini berargumen bahwa persepsi adalah proses langsung, yaitu informasi hanya merupakan hasil deteksi retina dan bukan merupakan hasil rekonstruksi.
 Perhatian utama adalah memahami apa yang kita kerjakan saat kita merasakan (melihat), dan bukan mencoba untuk memahami bagaimana kita merasakan suatu gambar atau bagaimana kita mengenali suatu obyek.
 Luminans adalah besar intensitas cahaya yang dipantulkan atau dihasilkan oleh permukaan obyek, Luminans merupakan besaran terukur dengan satuan lilin/meter persegi.
 Semakin besar luminans suatu obyek, rincian (detail) obyek yang dapat dilihat oleh mata juga akan semakin bertambah, namun jika terlalu besar justru akan berlaku sebaliknya.
 Semakin besar luminans, maka diameter anak-mata (pupil) akan semakin mengecil, sehingga intensitas cahaya yang diterima retina tidak terlalu besar, dan akan meningkatkan kedalaman fokusnya (deep of field).
 Hal yang sama terjadi pada kamera saat kita mengatur diafragma pada lensa, semakin kecil diafragma, maka besar intensitas cahaya yang masuk akan semakin kecil juga, namun kedalamannya (deep of field) semakin besar.
 Kontras adalah hubungan antara intensitas cahaya yang dikeluarkan atau dipantulkan oleh suatu obyek dengan intensitas cahaya dari latarbelakang (background) obyek tersebut.

 K = Nilai kontras
 L0 = Luminans obyek
 LB = Luminans latarbelakang
 Kecerahan (brightness) adalah tanggapan subyektif mata terhadap cahaya yang dipancarkan atau dipantulkan obyek
 Tidak ada arti khusus dari tingkat kecerahan seperti pada luminans, sehingga nilai kecerahan suatu obyek tidak dapat diukur (tidak mempunyai satuan), atau bersifat kualitatif subyektif.
 Secara umum luminans yang tinggi berimplikasi pada kecerahan yang tinggi pula.
 Sudut penglihatan (visual angle) didefinisikan sebagai sudut yang terjadi saat mata melihat obyek dihadapannya secara vertikal.
 Ketajaman penglihatan (visual acuity) adalah sudut penglihatan minimum ketika mata masih dapat melihat obyek dengan jelas.
 Besar sudut penglihatan yang dibentuk dari gambar di atas adalah:
 Nilainya biasanya sangat kecil, sehingga dinyatakan dalam satuan menit atau detik busur.
 Sudut penglihatan yang nyaman bagi mata adalah 15 menit, dan dalam kondisi yang buruk dapat dinaikkan sampai 21 menit.
 Medan penglihatan adalah sudut yang dibentuk ketika mata bergerak kekiri terjauh dan kekanan terjauh, yang dapat dibagi menjadi empat wilayah:
 Wilayah tempat kedua bola mata mampu melihat sebuah orbyek dalam keadaan sama, disebut juga penglihatan binokuler
 Wilayah terjauh yang dapat dilihat oleh mata kiri ketika mata kiri digerakkan ke sudut paling kiri, disebut juga penglihatan monokuler kiri.
 Wilayah terjauh yang dapat dilihat oleh mata kanan ketika mata kanan digerakkan ke sudut paling kanan, disebut juga penglihatan monokuler kanan.
 Wilayah buta, yakni wilayah yang sama sekali tidak dapat dilihat oleh kedua mata kita.
 Dalam dunia nyata mata selalu digunakan untuk melihat semua bentuk obyek 3-dimensi
 Dalam sistem komputer yang menggunakan layar 2-dimensi, mata “dipaksa” untuk dapat “mengerti” bahwa obyek pada layar tampilan yang susungguhnya berupa obyek 2-dimensi, harus dipahami sebagai obyek 3-dimensi dengan menggunakan teknik-teknik tertentu.

 DESAIN ANTARMUKA PEMAKAI
 Dedy Arisandi, ST, M.Kom
 Teknik Perangkat Lunak FMIPA USU
 2010
 Materi Kuliah
 Pendahuluan
– Pengenalan Konsep User Interface dan IMK
 Aspek Manusia
– Persepsi/pengamatan dan Representasi/penyajian
– Atensi dan Keterbatasan Memori
– Pengetahuan dan Model Mental
– Antarmuka Metafora dan Konsep Model
 Aspek Teknologi
– Manusia dan Teknologi
– Style Interaksi
 Materi Kuliah(Lanjutan)
 Desain Antarmuka Pemakai
– User Centered Design
– Desain User Interface
– Desain Kognitif
 Pendukung Dalam Perancangan
– Usability
– Prototipe
– Dialog
 Evaluation
– Evaluasi
 Sumber Acuan
 Human-Computer Interaction, Jenny Preece, Addison-Weesley, 1994
 Designing The User Interface, Shneiderman, B, 3rd Edition, Addison Wesley, 1998
 Interaksi Manusia dan Komputer, Insap Santosa, Andi Offset, 2004
 Interaksi Manusia dan Komputer, Sudarmawan, Andi Offset, 2007
 Sumber lain dari Internet
 Metode Evaluasi
 Ujian Tengah Semester : 30 %
 Ujuan Akhir Semester : 40 %
 Quis & Tugas : 20 %
 Kehadiran : 10 %
 Nilai akhir = Total nilai . % Kehadiran

Regular Expressions(kompiler)


• Regular Expressions
• finite state machine is a good “visual” aid
– but it is not very suitable as a specification
(its textual description is too clumsy)
• regular expressions are a suitable specification
– a more compact way to define a language that can be accepted by an FSM
• used to give the lexical description of a programming language
– define each “token” (keywords, identifiers, literals, operators, punctuation, etc)
– define white-space, comments, etc
• these are not tokens, but must be recognized and ignored
• Example: Pascal identifier
• Lexical specification (in English):
– a letter, followed by zero or more letters or digits
• Lexical specification (as a regular expression):
– letter . (letter | digit)*
• Operands of a regular expression
• Operands are same as labels on the edges of an FSM
– single characters, or
– the special character e (the empty string)
– “letter” is a shorthand for
– a | b | c | … | z | A | B | C | … | Z
• “digit“ is a shorthand for
– 0 | 1 | 2 | … | 9
• sometimes we put the characters in quotes
– necessary when denoting | . * ( )
• Precedence of | . * operators.
• Consider regular expressions:
– letter.letter | digit*
– letter.(letter | digit)*
• TEST YOURSELF
Question 1: Describe (in English) the language defined by each of the following regular expressions:
– letter (letter* | digit*)
– (letter | _ ) (letter | digit | _ )*
– digit* “.” digit*
– digit digit* “.” digit digit*
• TEST YOURSELF
Question 2: Write a regular expression for each of these languages:
– The set of all C++ reserved words
• Examples: if, while, for, class, int, case, char, true, false
– C++ string literals that begin with ” and end with ” and don’t contain any other ” except possibly in the escape sequence \”
• Example: ”The escape sequence \” occurs in this string”
– C++ comments that begin with /* and end with */ and don’t contain any other */ within the string
• Example: /* This is a comment * still the same comment */
• Example: Integer Literals
• An integer literal with an optional sign can be defined in English as:
– “(nothing or + or -) followed by one or more digits”
• The corresponding regular expression is:
– (+|-|e) (digit.digit*)
• A new convenient operator ‘+’
– same precedence as ‘*’
– digit digit* is the same as
– digit + which means “one or more digits”
• Language Defined by a Regular Expression
• Recall: language = set of strings
• Language defined by an automaton
– the set of strings accepted by the automaton
• Language defined by a regular expression
– the set of strings that match the expression
• Concept of Reg Exp Generating a String
Rewrite regular expression until have only a sequence of letters (string) left
• Non–determinism in Generation
• Different rule applications may yield different final results
• Concept of Language Generated by Reg Exp
• Set of all strings generated by a regular expression is the language of the regular expression
• In general, language may be infinite
• String generated by regular expression language is often called a “token”
• Examples of Languages and Reg Exp
• å = { 0, 1, . }
– (0 | 1)+ “.” (0 | 1)* | (0 | 1)* “.” (0 | 1)+
Þ binary floating point numbers
– (0 0)* Þ even-length all-zero strings
– 1* (0 1* 0 1*)* Þ binary strings with even number of zeros
• å = { a,b,c, 0, 1, 2 }
– (a|b|c)(a|b|c|0|1|2)* Þ alphanumeric identifiers
– (0|1|2)+ Þ trinary numbers
• Reg Exp Notational Shorthand
• R + one or more strings of R: R(R*)
• R? optional R: (R|e)
• [abcd] one of listed characters: (a|b|c|d)
• [a-z] one character from this range: (a|b|c|d…|z)
• [^abc] anything but one of the listed chars
• [^a-z] any one character not from this range
• Equivalence of FSM and Regular Expressions
• Theorem:
– For each finite state machine M, we can construct a regular expression R such that M and R accept the same language.
– [proof omitted]
• Theorem:
– For each regular expression R, we can construct a finite state machine M such that R and M accept the same language.
– [proof outline follows]
• Regular Expressions to NFSM (1)
• Regular Expressions to NFSM (2)
• Regular Expressions to NFSM (3)
• For A*
• Example of RegExp -> NFSM conversion
• Consider the regular expression
(1|0)*1
• The NFSM is
• Converting NFSM to DFSM
• Simulate the NFSM
• Each state of DFSM
– is a non-empty subset of states of the NFSM
• Start state of DFSM
– is the set of NFSM states reachable from the NFSM start state using only e-moves
• Add a transition S a > S’ to DFSM iff
– S’ is the set of NFSM states reachable from any state in S after consuming only the input a, considering e-moves as well
• Remarks on converting NFSM to DFSM
• An NFSM may be in many states at any time
• How many different states ?
• If there are N states, the NFSM must be in some subset of those N states
• How many subsets are there?
• 2N = finitely many
• For example, if N = 5 then 2N = 32 subsets
• NFSM -> DFSM Example
• TEST YOURSELF
Question 3: First convert each of these regular expressions to a NFSM
– (a | b | e) (a | b)
– (ab | ba)* (aa | bb)
Question 4: Next convert each resulting NFSM to a DFSM

Grammars for Syntax Definition
A Context-free Grammar (CFG) Is Utilized to Describe the Syntactic Structure of a Language
A CFG Is Characterized By:
1. A Set of Tokens or Terminal Symbols
2. A Set of Non-terminals
3. A Set of Production Rules
Each Rule Has the Form

NT ® {T, NT}*
4. A Non-terminal Designated As the Start Symbol
Grammars for Syntax Definition
Example CFG
Grammars are Used to Derive Strings:
Grammars are Used to Derive Strings:
A More Complex Grammar
Defining a Parse Tree
More Formally, a Parse Tree for a CFG Has the Following Properties:
Root Is Labeled With the Start Symbol
Leaf Node Is a Token or Î
Interior Node (Now Leaf) Is a Non-Terminal
If A ® x1x2…xn, Then A Is an Interior; x1x2…xn Are Children of A and May Be Non-Terminals or Tokens
Other Important Concepts
Ambiguity
Other Important Concepts
Associativity of Operators
Other Important Concepts
Operator Precedence
Syntax-Directed Translation
Associate Attributes With Grammar Rules & Constructs and Translate As Parsing Occurs
Our Example Uses Infix to Postfix Notation Translation for Expressions
Translation May Be Defined Inductively As: Postfix(e), E is an Expression
Syntax-Directed Definition: (2 parts)
Each Production Has a Set of Semantic Rules
Each Grammar Symbol Has a Set of Attributes
For the Following Example, String Attribute “t” is Associated With Each Grammar Symbol, i.e.,
What is a Derivation for 9 + 5 – 2?
Syntax-Directed Definition: (2 parts)
Each Production Rule of the CFG Has a Semantic Rule
Note: Semantic Rules for expr Use Synthesized Attributes Which Obtain Their Values From Other Rules.
Semantic Rules are Embedded in Parse Tree
How Do Semantic Rules Work ?
What Type of Tree Traversal is Being Performed?
How Can We More Closely Associate Semantic Rules With Production Rules ?
Examples
Parsing – Top-Down & Predictive
Top-Down Parsing Þ Parse tree / derivation of a token string occurs in a top down fashion.
For Example, Consider:
Top-Down Parse (type = start symbol)
Top-Down Parse (type = start symbol)
Top-Down Process
Recursive Descent or Predictive Parsing
Parser Operates by Attempting to Match Tokens in the Input Stream
Utilize both Grammar and Input Below to Motivate Code for Algorithm
Top-Down Algorithm (Continued)
Problem with Top Down Parsing
Left Recursion in CFG May Cause Parser to Loop Forever
Solution: Algorithm to Remove Left Recursion
Comparing Grammars
with Left Recursion
Notice Location of Semantic Actions in Tree
What is Order of Processing?
Comparing Grammars
without Left Recursion
The Lexical Analysis Process
A Graphical Depiction
The Lexical Analysis Process
Functional Responsibilities
Input Token String Is Broken Down
White Space and Comments Are Filtered Out
Individual Tokens With Associated Values Are Identified
Symbol Table Is Initialized and Entries Are Constructed for Each “Appropriate” Token
Under What Conditions will a Character be Pushed Back?
Can You Cite Some Examples in Programming Language Statements?
Algorithm for Lexical Analyzer
Algorithm for Lexical Analyzer
Symbol Table Considerations

desain antarmuka pemakai


Modul Pemrograman Visual Basic 6.0
Dedy Arisandi, ST, M.Kom Halaman 1
1. PENDAHULUAN
A. Microsoft Visual Basic
Visual Basic (VB) merupakan salah satu bahasa pemrograman komputer. Bahasa
pemrograman adalah perintah-perintah yang dimengerti oleh komputer untuk melakukan
tugas-tugas tertentu. Bahasa pemrograman Visual Basic, yang dikembangkan oleh
Microsoft sejak tahun 1991, merupakan pengembangan dari pendahulunya yaitu bahasa
pemrograman BASIC (Beginner’s All-purpose Symbolic Instruction Code) yang
dikembangkan pada era 1950-an. Visual Basic merupakan salah satu Development Tool
yaitu alat bantu untuk membuat berbagai macam program komputer, khususnya yang
menggunakan sistem operasi Windows. Visual Basic merupakan salah satu bahasa
pemrograman komputer yang mendukung pemrograman berorientasikan object (Object
Oriented Programming = OOP). Contoh penerapan OOP dapat Anda lihat pada gambar
berikut ini:
B. Integrated Development Environment (IDE) Visual Basic 6.0
Integrated Development Environment Visual Basic merupakan lingkungan
pengembangan program yang terintegrasi yang bersifat visual (grafis) dan mudah
digunakan. Untuk melihat IDE VB 6.0 dapat ditempuh dengan langkah-langkah berikut :
􀂾 Klik tombol Start pada Taskbar
􀂾 Pilih dan klik menu Program > Microsoft Visual Studio> Microsoft Visual Basic 6.0
Modul Pemrograman Visual Basic 6.0
Dedy Arisandi, ST, M.Kom Halaman 2
􀂾 Berikutnya akan tampil kotak dialog New Project berikut ini:
􀂾 Pilih icon Standard Exe, kemudian klik tombol Open. Selanjutnya akan tampil IDE
VB 6.0 sebagai berikut :
Modul Pemrograman Visual Basic 6.0
Dedy Arisandi, ST, M.Kom Halaman 3
Keterangan IDE VB di atas:
􀀹 Menu pada VB berisi semua perintah Visual Basic yang dapat Anda pilih
dengan menggunakan Mouse ataupun Keyboard. Anda dapat mengakses menu
yang bergaris bawah seperti File dengan menekan tombol Alt+F. Anda juga
bisa menggunakan shorcut (tombol cepat) seperti Crt+O untuk membuka
jendela Open Project, Ctr+S untuk membuka jendela Save, dan sebagainya.
􀀹 Toolbar adalah tombol-tombol yang mewakili suatu perintah tertentu dari
Visual Basic. Pada jendela VB terdapat 4 (empat) Toolbar yang dapat dibuka
dengan cara mengklik tombol kanan Mouse pada daerah Toolbar, Ceklis
Toolbar yang ingin ditampilkan.
􀀹 Form Window adalah daerah kerja utama Visual Basic dimana Anda dapat
meletakkan kontrol-kontrol yang terdapat pada Toolbox dengan cara
menggambar atau mengklik dua kali pada Toolbox yang akan diletakkan pada
Form.
􀀹 Toolbox merupakan kotak piranti yang berisi semua kontrol (objek) yang
dapat digunakan untuk merancang interface aplikasi yang Anda inginkan.
Secara default Toolbox yang terdapat pada VB adalah sebagai berikut:
Toolbar Menu
Toolbox
Form Window
Project
Explorer
Propertie
Window
Form
Layout
Window
Modul Pemrograman Visual Basic 6.0
Dedy Arisandi, ST, M.Kom Halaman 4
Kontrol di atas dapat ditambah dengan cara mengklik tombol Mouse kanan
pada daerah Toolbox, pilih Components, tampil jendela berikut:
Cheklis componen yang ingin Anda tampilkan kemudian klik tombol Apply,
OK, maka dijendela Toolbox akan terdapat kontrol baru yang telah Anda pilih
tadi.
􀀹 Project Explorer adalah jendela yang berisi semua file dalam satu aplikasi
Visual Basic. Jendela ini berisi Project, Form, Modul, Class, dan beberapa file
lainnya. Untuk mengaktifkan file tersebut Anda harus mengklik Mouse dua
kali pada file yang ingin diaktifkan.
Pointer
Label
Frame
Check box
Combo box
Horizontal Scroolbar
Timer
Directory list box
Shape
Image
Picture box
Text box
Command button
Option button
List box
Vertical Scroolbar
Drive list box
File list box
Line
Data
OLE
Modul Pemrograman Visual Basic 6.0
Dedy Arisandi, ST, M.Kom Halaman 5
Jika jendela Project Explorer ini tidak tampil di IDE VB Anda dapat
menampilkannya dengan cara mengklik icon ini pada Toolbar. Di atas
jendela ini terdapat tiga buah icon berikut:
􀀹 Properties Window adalah jendela yang berisi semua informasi mengenai
kontrol (objek) yang terdapat pada Anda rancang pada Form Visual Basic.
􀀹 Form Layout Window adalah jendela yang menggambarkan posisi dari Form
yang akan ditampilkan pada layar monitor. Anda dapat menggesar gambar
Form yang tampak pada monitor dengan cara mendrag Form tersebut dan
letakkan pada posisi yang sesuai menurut Anda.
C. Keluar Dari IDE Visual Basic 6.0
Sebelum Anda keluar dari lingkungan kerja VB, Sebaiknya simpan terlebih dahulu
aplikasi yang baru anda kerjakan. Sebaiknya simpan file-file aplikasi anda pada satu
direktori atau folder. Untuk keluar dari IDE Visual Basic dapat dilakukan dengan 4
(empat) cara sebagai berikut:
􀂾 Klik menu File> Exit.
􀂾 Tekan tombol Alt + F4.
􀂾 Tekan tombol Alt + Q
􀂾 Klik tombol Close yang terdapat disudut kanan atas jendela Visual Basic.
Menampilkan
Jendela Program
Menampilkan
Jendela Form
Kontrol (objek) yang terdapat
pada form aktif
Nama Properti dan Nilainya yang dapat
disesuaikan dengan selera Anda
Keterangan dari properti yang
dipilih.
Modul Pemrograman Visual Basic 6.0
Dedy Arisandi, ST, M.Kom Halaman 6
2. MEMBUAT APLIKASI VISUAL BASIC 6.0
A. Proses Pembuatan Aplikasi
Untuk pembuatan aplikasi pada VB Anda harus mengikuti prosedur berikut ini:
􀂾 Buka Microsoft Visual Basic 6.0 (caranya lihat pada pembahasan sebelumnya)
􀂾 Buat aplikasi baru yang Anda inginkan atau Anda dapat membuka aplikasi yang sudah
pernah dibuat sebelumnya.
􀂾 Jika aplikasi telah selesai dibuat, kemudian jalankan aplikasi tersebut dengan menekan
tombo F5 pada keyboard atau klik menu Run> Start.
􀂾 Jika masih terjadi kesalahan perbaiki dan periksa kembali program aplikasi yang Anda
buat sampai benar. Proses ini dinamakan dengan debugger.
􀂾 Setelah aplikasi berhasil dijalankan kemudian simpan program aplikasi tersebut.
􀂾 Langkah berikutnya Anda dapat melakukan kompilasi terhadap aplikasi tersebut,
sehingga menjadi file executable yang dapat langsung dijalankan tanpa membuka IDE
Visual Basic.
􀂾 Keluar dari Visual Basic.
B. Membuat Aplikasi Baru Dengan VB
Untuk membuat aplikasi baru dengan Visual Basic, langkah awal yang harus dilakukan yaitu
Merancang Interface (antar muka) aplikasi pada jendela Form kemudian atur Properti dari
setiap kontrol/objek yang digunakan dan langkah terakhir tentukan metode yang diinginkan
dengan pengetikan kode program pada jendela kode.
Berikut ini langkah-langkah membuat Aplika pada Visual Basic:
􀂾 Buka Microsoft Visual Basic.
􀂾 Pada jendela New Project pilihlah Standard EXE.
􀂾 Pada objek Form rancanglah tampilan berikut ini:
􀂾 Untuk membuat tampilan di atas klik kontrol Label pada Toolbox, gambar kontrol
tersebut pada Form dengan cara klik dan drag mouse sampai terbentuk objek seperti
terlihat di atas.
Properti dari kontrol yang aktif
Modul Pemrograman Visual Basic 6.0
Dedy Arisandi, ST, M.Kom Halaman 7
􀂾 Aturlah properti dari Label, Textbox, dan Command di atas pada jendela properti dengan
pengaturan berikut ini:
Objek / Kontrol Properties Value
Form1 Name
Caption
StartUpPosition
frmAplikasi
Aplikasi Percobaan
2 – CenterScreen
Label1 Caption Ketik Sembarang Kalimat Kemudian Klik
Tombol OK
Label2 Name
Caption
lblKalimat
(kosongkan)
Text1 Name
Text
txtKalimat
(kosongkan)
Command1 Name
Caption
cmdOk
&OK
Command2 Name
Caption
cmdKeluar
&Keluar
Berikut ini tampilan Interface setelah dilakukan pengatuaran properti di atas :
􀂾 Langkah berikutnya yaitu menentukan metode dan even yang akan diterapkan pada
aplikasi tersebut. Jika tombol OK diklik (event click) maka metode yang dilakukan yaitu
teks yang diketik akan ditampilkan pada Label di bawahnya. Kemudian jika tombol
Keluar diklik maka aplikasi akan tertutup. Untuk membuat metode dan even tersebut
double click (klik 2 kali) pada kontrol, misalkan klik 2 kali pada tombol OK, maka
jendela code akan ditampilkan sebagai berikut:
Modul Pemrograman Visual Basic 6.0
Dedy Arisandi, ST, M.Kom Halaman 8
Ketiklah program lengkapnya sebagai berikut:
Private Sub cmdOk_Click()
lblKalimat.Caption = txtKalimat.Text
End Sub
Private Sub cmdKeluar_Click()
End
End Sub
􀂾 Setelah program selesai diketik, kemudian jalankanlah program dengan cara menekan
tombol keyboard F5 atau klik icon ini pada toolbar standard maka akan tampil hasil
aplikasi berikut:
􀂾 Klik tombol Keluar untuk menutup aplikasi percobaan di atas. Anda juga dapat menutup
hasil program dengan mengklik icon berikut ini yang terdapat pada Toolbar Standard.
􀂾 Simpan aplikasi percobaan di atas dengan cara menekan tombol Ctr + S maka jendela
Save File As akan tampil sebagai berikut:
Pilihan Kontrol yang
saat ini aktif
Pilihan Event yang
dapat digunakan
Ketiklah metode yang
akan dikerjakan oleh
kontrol tersebut
Anda dapat menekan space keyboard pada fasilitas
ini dan secara otomatis nilai properti akan tercatat.
Modul Pemrograman Visual Basic 6.0
Dedy Arisandi, ST, M.Kom Halaman 9
􀂾 Berikutnya akan tampil jendela Save Project As berikut ini:
C. Membuat File Executable
File Executable adalah file yang dapat dijalankan langsung tanpa harus membuka program
pembuatnya. Untuk membuat file executable pada Visual Basic dapat dilakukan dengan cara
sebagai berikut:
􀂾 Klik menu File> Make Aplikasi.Exe…
􀂾 Anda dapat langsung menjalankan file executable berikut ini dengan cara
mengklik 2 kali pada icon tersebut.
Klik Icon ini untuk
membuat folder baru
􀂙 Buatlah folder baru untuk
menyimpan aplikasi
percobaan ini.
􀂙 Ketik nama file untuk Form
yang ada.
􀂙 Kemudian akhiri dengan
mengklik tombol Simpan.
􀂙 Ketik nama file untuk
Project yang aktif.
􀂙 Kemudian akhiri dengan
mengklik tombol Simpan.
􀂙 Jika tampil konfirmasi
berikut ini pilih No:
􀂙 Tentukan terlebih dahulu
folder letak file executable
yang akan dibuat.
􀂙 Ketik nama file executable
pada jendela File Name.
􀂙 Klik tombol Option jika
anda ingin melakukan
pilihan pengaturan yang
tersedia.
􀂙 Akhiri dengan mengklik
tombol OK.
􀂙 File Executable saat ini telah
direkam pada disk Anda.
Modul Pemrograman Visual Basic 6.0
Dedy Arisandi, ST, M.Kom Halaman 10
3. DATA, VARIABEL, DAN OPERATOR
A. Data
Data adalah nilai mentah yang tidak memiliki arti jika berdiri sendiri. Data dalam Visual
Basic dianggap sebagai nilai-nilai yang bisa dimanipulasi dalam pembuatan program. Contoh
dari data seperti:
“Sekolah Tinggi Teknik Harapan”
9876.45
True
12/6/2005
Setiap data pasti memiliki tipe atau jenis data. Pada Visual Basic jenis data dapat
didefenisikan menggunakan kata kunci Dim. Berikut ini tipe data yang dikenal oleh Visual
Basic 6.0 :
􀂾 Integer
Tipe data numerik yang berupa bilangan bulat (tanpa pecahan), mulai dari -32.768 hingga
32.767.
􀂾 Byte
Tipe data yang berupa nilai bulat positif (tanpa pecahan), mulai dari 0 hingga 225.
􀂾 Decimal
Tipe data yang digunakan untuk menyimpan nilai desimal (pecahan) dengan ketepatan
hingga 28 angka desimal.
􀂾 Boolean
Tipe data yang hanya memiliki dua buah nilai yaitu True atau False.
􀂾 String
Tipe data yang memiliki nilai alfanumerik, yaitu nilai data yang bisa berupa huruf, angka,
atau karakter khusus lainnya.
􀂾 Single
Tipe data numerik yang memiliki kisaran nilai mulai dari -3.402823E+38 hingga
3.402823E+38
􀂾 Double
Tipe data numerik yang memiliki kisaran nilai yang sangat besar yaitu mulai dari -
1.79769313486232E+308 hingga 1.79769313486232E+308.
􀂾 Date
Tipe data yang digunakan untuk menyimpan nilai tanggal dan jam. Nilainya berkisar dari
1 Januari 100 hingga 31 Desember 9999.
􀂾 Currency
Tipe data yang digunakan untuk menyimpan nilai uang sesuai dengan setting komputer
anda.
􀂾 Long
Tipe data numerik yang mirip dengan integer, hanya saja nilainya jauh lebih besar yaitu
dari -2.147.483.648 hingga 2.147.483.647.
􀂾 Object
Tipe data yang menyimpan objek seperti form, kontrol dan sebagainya.
􀂾 Variant
Tipe data yang bisa berisi segala macam tipe data yang berbeda. Biasanya digunakan jika
anda tidak mengetahui pasti jenis data yang akan digunakan.
Modul Pemrograman Visual Basic 6.0
Dedy Arisandi, ST, M.Kom Halaman 11
B. Variabel
Variabel adalah tempat untuk menyimpan nilai-nilai atau data secara sementara pada aplikasi
Visual Basic. Nilai suatu variabel selalu berubah yaitu tergantung dari nilai yang diberikan
terakhir kali kepada variabel tersebut.
Contoh : Panjang = txtPanjang.Text
Panjang adalah contoh sebuah variabel yang menyimpan nilai yang terkandung didalam
txtPanjang.Text.
􀂾 Pendeklarasian Variabel
Pada Visual Basic, sebelum variabel digunakan sebaiknya Anda mendeklarasikan variabel
terlebih dahulu. Aturan penulisan pendeklarasian variabel adalah sebagai berikut:
Dim namavariabel As tipedatavariabel
Contoh :
Dim Counter as Integer
Dim Nama as String
Dim Tanggal as Date
􀂾 Pemberian Nilai Variabel
Variabel yang sudah Anda deklarasikan dapat diberi nilai sesuai dengan jenis datanya.
Variabel yang menampung data tanggal tidak dapat diberi nilai dengan string. Berikut ini
aturan pemberian nilai variabel:
Namavariabel = nilai
Contoh :
Counter = 10
Nama = “Delia Syakirah”
Tanggal = #07/05/2005#
Kondisi = True
C. Operator
Operator adalah perintah yang memanipulasi nilai atau variabel dan memberikan suatu hasil.
Contoh :
Luas = Panjang * Lebar
Keterangan :
Panjang dan Lebar adalah operan
* adalah operator
Luas adalah variabel penampung hasil
􀂾 Operator Aritmatika
Operator aritmatika adalah operator yang digunakan untuk melakukan perhitungan
matematis aritmatika, seperti penjumlahan, pengurangan, dan sebagainya.
OPERATOR ARTI CONTOH
+ Penjumlahan A = 5 + 4
(Nilai A = 9)
– Pengurangan B = 9 – 5
(Nilai B = 4)
* Perkalian C = 20 * 5
Modul Pemrograman Visual Basic 6.0
Dedy Arisandi, ST, M.Kom Halaman 12
(Nilai C = 100)
/ Pembagian (pecahan) D = 15 / 10
(Nilai D = 1,5
\ Pembagian (bulat) E = 15 / 10
(Nilai E = 1)
^ Pangkat F = 2 ^ 5
(Nilai F = 32)
Mod Sisa Pembagian G = 11 Mod 3
(Nilai G = 2)
& (atau +) Penggabungan String H = 4 & 8
(Nilai G = 48)
I = “Dedy” + “Arisandi”
(Nilai I = “Dedy Arisandi”
􀂾 Operator Perbandingan
Operator perbandingan adalah operator yang digunakan untuk membandingkan satu nilai
dengan nilai yang lain, untuk mendapatkan hasil True (benar) atau False (salah). Operator
perbandingan ini biasanya digunakan untuk mengambil keputusan pada suatu kondisi.
OPERATOR ARTI CONTOH
< Lebih kecil dari 7 Lebih besar dari 5 > 9 hasilnya False
<= Lebih kecil sama dengan 6 = Lebih besar sama dengan 6 >= 5 hasilnya True
= Sama dengan 7 = 7 hasilnya True
Tidak sama dengan 7 7 hasilnya False
􀂾 Operator Logikal
Operator logikal adalah operator yang berfungsi untuk membandingkan suatu
perbandingan.
OPERATOR ARTI CONTOH
AND Akan menghasilkan nilai True jika
kedua nilai yang akan dibandingkan
bernilai True.
X = 4<6 AND 78
(Nilai X = True)
OR Akan menghasilkan nilai False jika
kedua nilai yang akan dibandingkan
bernilai False.
X = 310)
(Nilai Z = False)
Modul Pemrograman Visual Basic 6.0
Dedy Arisandi, ST, M.Kom Halaman 13
Latihan :
Buatlah sebuah Form dengan kontrol-kontrol berikut ini:
Objek / Kontrol Properties Value
Form 1 Name
Caption
StartUpPosition
frmOperator
Form Operator
2 – CenterScreen
Frame1 Caption Input
Frame2 Caption Output
Frame3 Caption Operasi Aritmatika
Frame4 Caption Operasi Perbandingan
Label1 Caption Nilai 1
Label2 Caption Nilai 2
Text1 Name
Text
txtNilai1
(kosongkan)
Text2 Name
Text
txtNilai2
(kosongkan)
Text3 Name
Text
Alignment
Locked
txtOutput
(kosongkan)
2 – Center
True
Option1 Name
Caption
optPenambahan
Penambahan (+)
Option2 Name
Caption
optPengurangan
Pengurangan (-)
Option3 Name
Caption
optPengalian
Pengalian (*)
Option4 Name
Caption
optPembagian
Pembagian (/)
Option5 Name
Caption
optPembagianBulat
Pembagian Bulat (\)
Option6 Name
Caption
optSisaBagi
Sisa Bagi (Mod)
Option7 Name
Caption
optPemangkatan
Pemangkatan (^)
Option8 Name
Caption
optPenggabungan
Penggabungan (&&)
Option9 Name
Caption
optLebihKecil
Lebih Kecil ()
Option11 Name
Caption
optLebihKecilSamaDengan
=
Option13 Name
Caption
optSamaDengan
Sama Dengan (=)
Option14 Name
Caption
optTidakSamaDengan
Tidak Sama Dengan ()
Modul Pemrograman Visual Basic 6.0
Dedy Arisandi, ST, M.Kom Halaman 14
Private Sub optLebihBesar_Click()
txtOutput.Text = Val(txtNilai1.Text) > Val(txtNilai2.Text)
End Sub
Private Sub optLebihBesarSamaDengan_Click()
txtOutput.Text = Val(txtNilai1.Text) >= Val(txtNilai2.Text)
End Sub
Private Sub optLebihKecil_Click()
txtOutput.Text = Val(txtNilai1.Text) < Val(txtNilai2.Text)
End Sub
Private Sub optLebihKecilSamaDengan_Click()
txtOutput.Text = Val(txtNilai1.Text) <= Val(txtNilai2.Text)
End Sub
Private Sub optPemangkatan_Click()
txtOutput.Text = Val(txtNilai1.Text) ^ Val(txtNilai2.Text)
End Sub
Private Sub optPembagian_Click()
txtOutput.Text = Val(txtNilai1.Text) / Val(txtNilai2.Text)
End Sub
Private Sub optPembagianBulat_Click()
txtOutput.Text = Val(txtNilai1.Text) \ Val(txtNilai2.Text)
End Sub
Private Sub optpenambahan_Click()
txtOutput.Text = Val(txtNilai1.Text) + Val(txtNilai2.Text)
End Sub
Private Sub optPengalian_Click()
txtOutput.Text = Val(txtNilai1.Text) * Val(txtNilai2.Text)
End Sub
Private Sub optPenggabungan_Click()
txtOutput.Text = Val(txtNilai1.Text) & Val(txtNilai2.Text)
End Sub
Private Sub optPengurangan_Click()
txtOutput.Text = Val(txtNilai1.Text) – Val(txtNilai2.Text)
End Sub
Private Sub optSamaDengan_Click()
txtOutput.Text = Val(txtNilai1.Text) = Val(txtNilai2.Text)
End Sub
Private Sub optSisaBagi_Click()
txtOutput.Text = Val(txtNilai1.Text) Mod Val(txtNilai2.Text)
End Sub
Private Sub optTidakSamaDengan_Click()
txtOutput.Text = Val(txtNilai1.Text) Val(txtNilai2.Text)
End Sub
Modul Pemrograman Visual Basic 6.0
Dedy Arisandi, ST, M.Kom Halaman 15
4. ALUR PROGRAM DAN KODE PENAMAAN KONTROL
Program adalah proses yang sambung menyambung. Untuk mencapai tujuan, program harus
melalui tahap-tahap tertentu, sehingga diperlukan alur program yang jelas dan efisien. Dalam
Visual Basic 6.0 dikenal beberapa tipe alur seperti keputusan, perulangan ataupun lompatan.
A. Alur Keputusan
Alur keputusan adalah sebuah alur yang menganalisa suatu keadaan dan mengambil
keputusan berdasarkan pada hasil dari analisa tersebut. Jika kondisi benar maka akan
dijalankan perintah tertentu, sedang jika kondisi salah, maka dijalankan perintah yang
lainnya. Beberapa alur keputusan yaitu if, if else, dan case.
􀂾 Pernyataan IF
If digunakan untuk membandingkan suatu kondisi tertentu. Aturan penulisan pernyataan
if adalah sebagai berikut:
If (Kondisi) Then
… Ekspresi…
End If
Contoh :
Jika teks yang dinput pada kotak input = “Dedy” maka pesan akan ditampilkan kemudian
aplikasi akan tertutup. Dapat diimplementasikan dalam Visual Basic sebagai berikut :
Objek / Kontrol Properties Value
Form 1 Name
Caption
StartUpPosition
frmIf
Alur Program IF
2 – CenterScreen
Label1 Caption Ketik Kata Pada Teks lalu klik Proses
Text1 Name
Text
txtInput
(kosongkan)
Command1 Name
Caption
cmdProses
&Proses
Modul Pemrograman Visual Basic 6.0
Dedy Arisandi, ST, M.Kom Halaman 16
􀂾 Pernyataan If Else
Aturan penulisan pernyataan If Else adalah sebagai berikut:
If (Kondisi) Then
… Ekspresi 1…
Else
… Ekspresi 2…
End If
Contoh :
Jika nilai yang dinput pada kotak input >=60 maka akan ditampilkan pesan bahwa Anda
lulus jika lebih kecil dari 60 maka Anda dinyatakan gagal. Dapat diimplementasikan
dalam Visual Basic sebagai berikut :
Objek / Kontrol Properties Value
Form1 Name
Caption
StartUpPosition
frmIfElse
Alur Program If Else
2 – CenterScreen
Label1 Caption Masukkan Nilai
Label2 Caption Keterangan
Text1 Name
Text
txtNilai
(kosongkan)
Text2 Name
Text
txtKeterangan
(kosongkan)
Command1 Name
Caption
cmdProses
&Proses
Command2 Name
Caption
cmdUlangi
&Ulangi
Command3 Name
Caption
cmdClose
&Close
Modul Pemrograman Visual Basic 6.0
Dedy Arisandi, ST, M.Kom Halaman 17
􀂾 Pernyataan Case
Case digunakan untuk melakukan pemilihan kondisi yang jumlahnya banyak atau
bertingkat. Aturan penulisan dari pernyataan Case adalah sebagai berikut:
Select Case Ekspresi
Case nilai:
… Ekspresi 1…
Case nilai:
… Ekspresi 2…
Case nilai:
… Ekspresi 3…
Case Else nilai:
… Ekspresi 4…
End Select
Case dapat berupa :
Case is 􀃎 contoh: Case is >=70
Case [nilaiawal] To [nilaiakhir] 􀃎 contoh: Case 1 To 5
Case [nilai] 􀃎 contoh: Case 7
Contoh :
Jika nilai dimasukkan pada kotak input, maka hasil akan mengikuti persyaratan dibawah
ini:
Nilai 0 – 45 : Keterangan Nilai = E (Gagal)
Nilai 46 – 59 : Keterangan Nilai = D (Kurang Baik)
Nilai 60 – 69 : Keterangan Nilai = C (Cukup Baik)
Nilai 70 – 79 : Keterangan Nilai = B (Baik)
Nilai 80 – 100 : Ketarangan Nilai = A (Sangat Memuaskan)
Permasalahan di atas dapat diselesaikan dengan alur program Case pada Visual Basic
sebagai berikut:
Objek / Kontrol Properties Value
Form1 Name
Caption
StartUpPosition
frmAlurCase
Alur Program Case
2 – CenterScreen
Label1 Caption Masukkan Nilai
Label2 Caption Keterangan Nilai
Text1 Name
Text
txtNilai
(kosongkan)
Text2 Name
Text
txtKeterangan
(kosongkan)
Command1 Name
Caption
cmdProses
&Proses
Command2 Name
Caption
cmdUlangi
&Ulangi
Command3 Name
Caption
cmdClose
&Close
Modul Pemrograman Visual Basic 6.0
Dedy Arisandi, ST, M.Kom Halaman 18
Private Sub cmdKeluar_Click()
Unload Me
End Sub
Private Sub cmdProses_Click()
Select Case Val(txtNilai.Text)
Case 0 To 45
txtKeterangan.Text = “E (Gagal)”
Case 46 To 59
txtKeterangan.Text = “D (Kurang Baik)”
Case 60 To 69
txtKeterangan.Text = “C (Cukup Baik)”
Case 70 To 79
txtKeterangan.Text = “B (Baik)”
Case 80 To 100
txtKeterangan.Text = “A (Sangat Memuaskan)”
Case Else
txtKeterangan.Text = “Nilai tidak terjangkau”
End Select
End Sub
Private Sub cmdUlangi_Click()
txtNilai.Text = “”
txtKeterangan.Text = “”
txtNilai.SetFocus
End Sub
B. Alur Pengulangan
Pengulangan adalah instruksi program yang memerintahkan suatu tugas diulang-ulang
berdasarkan kondisi tertentu. Beberapa alur pengulangan yaitu do while, do until, dan for
next. Untuk keluar dari alur pengulangan Anda dapat menggunakan exit do atau exit for.
􀂾 Do While
Do While merupakan alur pengulangan yang akan melakukan pengulangan terus menerus
selama (while) suatu kondisi memenuhi syarat.
Aturan penulisan Do While:
Do While (Kondisi)
… Ekspresi …
Loop
Modul Pemrograman Visual Basic 6.0
Dedy Arisandi, ST, M.Kom Halaman 19
Contoh :
intNilai = 1
Do While (intNilai Asc(“Z”)
Print “Huruf ” & Chr(i)
i = i + 1
Loop
contoh program di atas akan menampilkan tulisan “Huruf A” sampai dengan “Huruf Z”.
􀂾 For Next
For Next merupakan alur pengulangan yang digunakan untuk mengulangi suatu perintah
dalam jumlah yang ditentukan.
Aturan penuliasan For Next :
For counter = nilaiawal To nilaiakhir [steep kenaikan]
… Ekspresi …
Next counter
Contoh :
Rancanglah kontrol-kontrol berikut ini pada form aplikasi Anda:
Objek / Kontrol Properties Value
Form1 Name
Caption
StartUpPosition
frmAlurPengulanganFor
Alur Program Pengulangan For
2 – CenterScreen
Label1 Caption Menampilkan Nilai Fungsi F(X)=A + BX
Label2 Caption Nilai A
Label3 Caption Nilai B
Label4 Caption Batas Bawah X
Label5 Caption Batas Atas X
Modul Pemrograman Visual Basic 6.0
Dedy Arisandi, ST, M.Kom Halaman 20
Text1 Name
Text
txtNilaiA
(kosongkan)
Text2 Name
Text
txtNilaiB
(kosongkan)
Text3 Name
Text
txtXBawah
(kosongkan)
Text4 Name
Text
txtXAtas
(kosongkan)
Picture1 Name
BackColor
AutoRedraw
picLayar
&H00FFFFFF& (Warna Putih)
True
Command1 Name
Caption
cmdProses
&Proses
Command2 Name
Caption
cmdUlangi
&Ulangi
Command3 Name
Caption
cmdClose
&Close
Kode Program :
Private Sub cmdKeluar_Click()
Unload Me
End Sub
Private Sub cmdProses_Click()
Dim A, B, AX, BX, X, Y As Double
Dim I As Integer
A = Val(txtNilaiA.Text)
B = Val(txtNilaiB.Text)
AX = Val(txtXBawah.Text)
BX = Val(txtXAtas.Text)
picLayar.FontSize = 8
picLayar.FontName = “Courier New”
Tampilan
program
setalah
program
dijalankan.
Modul Pemrograman Visual Basic 6.0
Dedy Arisandi, ST, M.Kom Halaman 21
picLayar.ForeColor = vbBlue
picLayar.Cls
picLayar.Print “TAMPILAN OUTPUT PROGRAM”
picLayar.Print “————————-“
picLayar.Print “X Y”
picLayar.Print “————————–“
For I = AX To BX
X = I
Y = A + B * X
picLayar.Print Format(X, “0.000”), Format(Y, “0.000”)
If I Mod 5 = 0 Then
MsgBox “Lanjutkan !!!”
picLayar.Cls
picLayar.Print “TAMPILAN OUTPUT PROGRAM”
picLayar.Print “————————-“
picLayar.Print “X Y”
picLayar.Print “————————-“
End If
picLayar.Print “————————-“
Next I
End Sub
Private Sub cmdUlangi_Click()
txtNilaiA.Text = “”
txtNilaiB.Text = “”
txtXBawah.Text = “”
txtXAtas.Text = “”
txtNilaiA.SetFocus
End Sub
C. Kode Penamaan Kontrol
Programmer seluruh dunia secara tidak resmi telah membiasakan diri untuk memberi
nama depan setiap menamai sebuah kontrol. Penamaan ini berfungsi untuk mengetahui
dengan cepat kontrol apa yang digunakan pada nama tersebut.
Nama Kontrol Kode Nama Kontrol Kode
Combo box cbo List box lst
Check box chk Menu mnu
Command button cmd Module mod
Directory list box dir OLE ole
Drive list box drv Option button opt
File list box fil Picture box pic
Frame fra Resource res
Form frm Shape shp
Grid grd Timer tmr
Horizontal scroll bar hsb Text box txt
Image img User defined data type typ
Label lbl Vertical scroll bar vsb
Line lin
Modul Pemrograman Visual Basic 6.0
Dedy Arisandi, ST, M.Kom Halaman 22
5. FORM, MDI FORM, DAN MENU
A. Form
Form adalah media untuk membuat window aplikasi. Form merupakan tempat dimana
kontrol-kontrol lain diletakkan di atasnya.
􀂾 Properti Form
Jika form Anda aktifkan maka dijendela properti akan tampil semua properti yang
dimiliki oleh form tersebut. Berikut ini properti yang dapat digunakan pada sebuah form
dan kegunaannya:
Properti Keterangan
AutoRedraw Jika True, Visual Basic secara otomatis menggambar ulang gambar pada
form karena window lain menghilangkan gambar. Jika False (default),
Visual Basic tidak akan me-redraw secara otomatis.
BackColor Warna background form. Anda dapat menentukan warna dengan angka
heksadesimal atau memilih warna yang sesuai dari palet warna.
BorderStyle 0 tanpa garis batas, 1 untuk garis tetap, 2 (default) untuk garis yang
ukurannya bisa diubah, 3 garis tetap dengan dua garis pada pinggirnya.
Caption Teks yang tampil pada judul form. Nilai caption secara default adalah nama
form.
ClipControls Jika True (default), Paint event akan bekerja.
ControlBox Jika True (default), form akan mengandung tombol control.
DrawMode Menyediakan 16 komposisi yang terkait dengan properti gambar dalam
menghasilkan efek gambar khusus.
DrawStyle Menyediakan 7 komposisi untuk menentukan tampilan garis dalam gambar.
DrawWidth Menentukan lebar garis pada form
Enabled Jika True (default), form dapat menanggapi events.
FillColor Warna untuk mengisi gambar pada form.
FillStyle Menyediakan 8 macam corak pengisi bidang gambar.
FontBold Untuk menentukan ukuran tebal font pada form maupun pada saat
pencetakan. Tidak berpengaruh pada properti caption.
FontItalic Untuk menentukan bentuk miring font pada form maupun pada saat
pencetakan. Tidak berpengaruh pada properti caption.
FontName Untuk menentukan jenis font pada form maupun pada saat pencetakan.
Tidak berpengaruh pada properti caption.
FontSize Untuk menentukan ukuran font pada form dan saat pencetakan. Tidak
berpengaruh pada properti caption.
FontStrikethru Untuk menentukan garis coret pada font di form maupun pada saat
pencetakan. Tidak berpengaruh pada properti caption.
FontTransparent Untuk mengahasilkan efek transparan font pada form maupun pada saat
pencetakan. Tidak berpengaruh pada properti caption.
FontUnderline Untuk menentukan garis bawah font di form maupun pada saat pencetakan.
Tidak berpengaruh pada properti caption.
ForeColor Untuk menentukan warna latar depan font di form maupun pada saat
pencetakan. Tidak berpengaruh pada properti caption.
Height Untuk menentukan ukuran tinggi form.
HelpContextID Menyediakan nomor pengenal dalam penyusunan context-sensitive help.
Icon Untuk menentukan icon aplikasi.
KeyPreview Jika False (default), control yang menerima fokus bisa menerima eventevent
berikut: KeyDown, KeyPress, dan KeyUp sebelum form. Jika bernilai
True, form akan menerima event sebelum kontrol terfokus.
Left Ukuran posisi kiri, terhitung dari pinggir kiri form.
LinkMode 0 (default) akan melumpuhkan DDE, 1 DDE otomatis DDE, 2 DDE
terkode, 3 permintaan terkode.
LinkTopic Menentukan aplikasi sumber dan topik DDE.
Modul Pemrograman Visual Basic 6.0
Dedy Arisandi, ST, M.Kom Halaman 23
MaxButton Jika True (default) tombol maximize muncul pada form pada saat runtime.
Jika False, pemakai tidak bisa me-maximize form.
MDIChild Jika True, form adalah jenis MDI. Jika False (default), form bukan form
MDI.
Name Nama form, default Form1
Picture File gambar yang menampilkan background form.
ScaleHeight Tinggi form, ScaleMode untuk menentukan unit pengukuran yang
digunakan.
ScaleLeft Jarak dari kiri layar ke batas kiri form.
ScaleMode Untuk menentukan pengukuran koordinat pada form. Anda dapat
menentukan diantara delapan pilihan.
ScaleTop Jarak dari sisi atas layar ke batas atas form
ScaleWidth Untuk menentukan lebar form.
Top Posisi batas atas form.
Visible Bernilai True atau False, sehingga form bisa tampak atau hilang.
Width Lebar form dalam satuan twip.
WindowState Menunjukkan kondisi startup form saat pemakai menjalankan program. Jika
bernilai 0 (default), form pertama muncul dalam ukuran sama seperti
ukuran desain. Jika bernilai 1, form minimized. Nilai 2, maximized.
Berikut ini contoh program menggunakan properti form :
Kontrol yang digunakan adalah sebagai berikut :
Objek / Kontrol Properties Value
Form1 Name
Caption
StartUpPosition
MaxButton
frmPropertiForm
Properti Pada Form
2 – CenterScreen
False
Label1 Caption Ketiklah Judul Form Disini
Text1 Name
Text
txtJudul
(Kosongkan)
Command1 Name
Caption
cmdPerbesar
Per&besar Ukuran Form
Command2 Name
Caption
cmdPerkecil
Per&kecil Ukuran Form
Command3 Name
Caption
cmdWarna
&Ganti Warna Form
Command4 Name
Caption
cmdTutup
&Tutup Form
Modul Pemrograman Visual Basic 6.0
Dedy Arisandi, ST, M.Kom Halaman 24
􀂾 Event Form
Event form adalah kejadian-kejadian yang dapat dialami oleh sebuah form, seperti Click
(klik), Load, dan sebagainya. Berikut ini event-event yang bisa dialami oleh sebuah form:
Event Keterangan
Activate Tejadi saat sebuah form menjadi window aktif
Click Terjadi saat pemakai mengklik form.
DblClick Terjadi saat pemakai melakukan klik ganda pada form.
Deactivate Terjadi saat form lain menjadi window aktif.
DragDrop Terjadi saat proses drag melewati form selesai.
DragOver Terjadi sewaktu proses drag melewati form.
GotFocus Terjadi pada saat form mendapat fokus.
KeyDown Terjadi saat pemakai menekan keyboard dan property KeyPreview kontrol pada
form bernilai True. Sebaliknya, kontrol akan memakai event KeyDown
KeyPress Terjadi saat pemakai menekan sebuah tombol pada keyboard melewati form.
KeyUp Terjadi saat pemakai melepas penekanan tombol.
LinkClose Terjadi pada saat proses DDE terhenti.
LinkError Terjadi pada saat proses DDE gagal.
LinkExecute Terjadi pada saat proses DDE mulai dijalankan.
LinkOpen Terjadi pada saat proses DDE mulai.
Load Terjadi pada saat form diaktifkan dan sebelum tempak dilayar.
LostFocus Terjadi pada saat form kehilangan fokus.
MouseDown Terjadi saat pemakai menekan mouse melalui form
MouseMove Terjadi pada saat pemakai memindahkan mouse melalui form.
MouseUp Terjadi saat pemakai melepas mouse melewati form.
Paint Terjadi saat Visual Basic harus menggambar form.
QueryUnload Terjadi beberapa saat sebelum aplikasi dihentikan.
Resize Terjadi pada saat pemakai mengubah ukuran form.
Unload Terjadi pada saat form dinonaktifkan.
Contoh program dengan menggunakan beberapa event pada form :
􀂾 Menggunakan Banyak Form Pada Satu Project
Aplikasi yang lengkap adalah aplikasi yang terdiri dari paduan beberapa form. Untuk
menggunakan banyak form pada satu project ada beberapa hal yang harus diperhatikan,
yaitu:
Pengaktifan Form
Perintah mengaktifkan form ke memori:
Load Namaform
Perintah untuk menutup form dari memori:
Unload Namaform
‘ KODE PROGRAM :
Private Sub Form_Click()
Me.Print “Double Click untuk membersihkan layar..”
End Sub
Private Sub Form_DblClick()
Me.Cls
Me.Print “Anda baru saja membersihkan layar dengan klik ganda..”
End Sub
Private Sub Form_KeyPress(KeyAscii As Integer)
Me.Print “Anda sedang menekan tombol keyboard..”
End Sub
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Me.Print “Anda sedang menggerakkan tombol mouse di atas form..”
End Sub
Modul Pemrograman Visual Basic 6.0
Dedy Arisandi, ST, M.Kom Halaman 25
Penampilan Form
Perintah menampilkan form ke layar:
Namaform.Show
Perintah untuk menyembunyikan form:
Namaform.Hide
Untuk menentukan form mana yang akan ditampilkan terlebih dahulu pada saat program
dijalankan, Anda dapat mengklik menu Project> Project1 Properties, maka akan tampil
jendela berikut:
B. MDI Form
MDI (Multi Document Interface) Form merupakan form yang berfungsi sebagai form induk
(form utama). Pada form ini Anda tidak bisa menggambar kontrol Textbox, Labe, Command,
dan sebagainya. Kontrol yang bisa diletakkan pada form ini adalah kontrol Picture box,
Menu, Toolbar, dan Status bar. Bila form utama ini ditutup, maka semua form anak juga akan
ikut tertutup. Untuk menyatakan form pada VB sebagai form anak, Anda dapat merubah nilai
dari properti MDIChild = True. MDI Form hanya dapat digunakan 1 kali pada satu project.
MDI Form dapat diaktifkan dengan cara sebagai berikut:
􀂾 Aktifkan Visual Basic
􀂾 Klik menu Project> Add MDI Form, selanjutnya akan tampil kotak dialog beriku:
􀂾 Klik tombol Open, maka form MDI akan ditampilkan.
Pilih form yang akan
ditampilkan pertama sekali pada
kotak Startup Object ini.
Modul Pemrograman Visual Basic 6.0
Dedy Arisandi, ST, M.Kom Halaman 26
C. Menu
Menu adalah serangkaian pilihan-pilihan yang dapat diklik atau dipilih untuk melakukan
tugas tertentu. Pada Microsoft Word misalnya, menunya terdiri dari File, Edit, View, Format,
Tools, Table, Window, dan Help. Jika menu tersebut diklik, maka didalamnya juga terdapat
sub menu. Visual Basic menyediakan fasilitas untuk membuat menu yaitu Menu Editor.
Langkah-langkah untuk membuat menu adalah sebagai berikut:
􀂾 Aktifkan MDI Form (ikuti langkah pembuatannya pada point sebelumnya)
􀂾 Klik menu Tools> Menu Editor (Ctr + E), akan tampil jendela menu editor:
􀂾 Ketiklah menu berikut ini pada menu editor di atas:
Menu Properti Nilai
File Caption
Name
&File
mnuFile
—New Caption
Name
New
mnuNew
—Open Caption
Name
Shortcut
Open
mnuOpen
Ctr + O
—Close Caption
Name
Close
mnuClose
Edit Caption
Name
&Edit
mnuEdit
—Cut Caption
Name
Shortcut
Cut
mnuCut
Ctr + X
—Copy Caption
Name
Shortcut
Copy
mnuCopy
Ctr + C
—Paste Caption
Name
Shortcut
Paste
mnuPaste
Ctr + V
—Clear Caption
Name
Clear
mnuClear
——Formats Caption Formats
Judul Menu
Nama Menu
Pilihan Shortcut
– Menaikkan level
urutan menu
– Menurunkan
level urutan menu
– Mengubah posisi menu 1
posisi ke atas
– Mengubah posisi menu 1
posisi ke bawah
– Menghapus
sebuah menu
– Menyisip 1
posisi kosong di
atas sebuah menu
– Berpindah ke
menu berikutnya
Menciptakan Menu
Modul Pemrograman Visual Basic 6.0
Dedy Arisandi, ST, M.Kom Halaman 27
Name mnuEditFormats
——Contents Caption
Name
Shortcut
Contents
mnuContents
Del
View Caption
Name
&View
mnuView
Insert Caption
Name
&Insert
mnuInsert
Format Caption
Name
F&ormat
mnuFormat
Tools Caption
Name
&Tools
mnuTools
Table Caption
Name
T&able
mnuTable
Window Caption
Name
&Window
mnuWindow
Help Caption
Name
&Help
mnuHelp
Latihan :
Gabungkanlah semua form yang pernah Anda buat sebelumnya ke satu buah form induk
(MDI Form). Kemudian buat menu untuk masing-masing bagian berdasarkan
pembahasan form seperti: alur program terdiri dari 4 menu yaitu (form If, form IfElse,
form Case, dan form For). Jika menu alur program diklik aplikasi akan menampilkan 4
buah sub menu dan bila sub menu form If diklik maka aplikasi akan menampilkan form
alur If ke layar sebagai form anak. Begitu juga instruksi untuk form-form lainnya.
Modul Pemrograman Visual Basic 6.0
Dedy Arisandi, ST, M.Kom Halaman 28
6. KOTAK INPUT DAN TOMBOL
A. Kotak Input
Kotak input digunakan untuk memasukkan data yang akan diproses oleh aplikasi. Pada
Visual Basic 6.0 terdapat tiga buah kotak input standar yang terdapat pada Toolbox (default)
yaitu Text Box, Combo Box, dan List Box.
􀂾 Text Box (Kotak Teks)
Text Box adalah kontrol yang paling sering digunakan yang berfungsi sebagai kotak input
teks yang diketikkan melalui keyboard. Text Box juga mempunya properti dan event
seperti halnya pada form.
PROPERTI KETERANGAN
Alignment Perataan teks di dalam kotak teks(rata kiri, rata tengah, atau rata kanan)
BackColor Warna latar belakang dari kotak teks
BorderStyle Menentukan pembatas disekeliling kotak teks.
Enabled Menentukan apakah kotak teks tersebut aktif
Font Mengubah jenis dan ukuran huruf kotak teks
ForeColor Warna teks di dalam kotak teks
Height Tinggi Kotak Teks
Left Jarak dari sisi kiri form ke sisi kiri kotak teks
Locked Menentukan apakah user bisa atau tidak menyunting teks di dalam kotak teks.
MaxLength Banyaknya karakter maksimal yang bisa diketikkan ke dalam kotak teks
MultiLine Teks yang diketikkan bisa lebih dari satu baris
PasswordChar Karakter yang muncul pada saat user mengetik, biasanya digunakan untuk
password
ScrollBars Menampilkan scrollbar (penggulung) jika Anda memilih properti MultiLine
TabIndex Menentukan nomor urut fokus kotak teks
TabStop Menentukan apakah kotak teks bisa menerima fokus
Text Teks yang ditampilkan atau diketikkan pada kotak teks
ToolTipText Text yang muncul pada ToolTip
Top Jarak dari sisi atas form ke sisi atas kotak
Visible Menampilkan / menyembunyikan kotak teks
Width Lebar kotak teks.
Contoh program :
Atur properti berikut ini pada aplikasi Anda:
Objek / Kontrol Properties Value
Form1 Name
Caption
frmKontroText
Form Uji Kontrol Text Box
Label1 Caption Input Teks dengan Karakter bintang
Label2 Caption Input Teks hanya dengan huruf kecil
Label3 Caption Input Teks hanya dengan huruf besar
Label4 Caption Input Teks hanya dengan angka
Text1 Name
Text
txtBintang
(Kosongkan)
Text2 Name
Text
txtHurufKecil
(Kosongkan)
Text3 Name
Text
txtHurufBesar
(Kosongkan)
Text4 Name
Text
txtAngka
(Kosongkan)
Text5 Name
MultiLine
ScrollBars
Text
txtScroll
True
3-Both
(Kosongkan)
Modul Pemrograman Visual Basic 6.0
Dedy Arisandi, ST, M.Kom Halaman 29
Kode Program :
Private Sub Form_Load()
txtbintang.PasswordChar = “*”
txtHurufBesar.Locked = True
End Sub
Private Sub txtAngka_KeyPress(KeyAscii As Integer)
If Not (KeyAscii >= Asc(“0″) And KeyAscii = -1 * _
(picDasar.ScaleHeight – imgTentang.Height) Then
imgTentang.Top = imgTentang.Top – 20
Else
imgTentang.Top = picDasar.ScaleHeight
End If
End Sub
Modul Pemrograman Visual Basic 6.0
Dedy Arisandi, ST, M.Kom Halaman 41
Contoh Program Timer2:
Objek / Kontrol Properties Value
Form1 Name
Caption
FrmTimer2
JAM ANALOG dan DIGITAL
Picture1 Name
BackColor
PicDasar
Putih
Timer1 Name
Interval
tmrJam
100
Timer2 Name
Interval
tmDigital
1000
Line1 Name
Index
linJarumJam
0
Label1 Name
Caption
BackColor
BorderStyle
lblTanggal
(Kosongkan)
(Warna Putih)
1-Fixed Single
Label1 Name
Caption
BackColor
BorderStyle
lblJam
(Kosongkan)
(Warna Putih)
1-Fixed Single
Kode Program :
Private Sub Form_Load()
lblTanggal.Caption = Now
lblJam.Caption = Format(Now, “hh:mm:ss”)
Width = 4000
Height = 4000
Left = Screen.Width \ 2 – 4100
Top = (Screen.Height – Height) \ 2
End Sub
Private Sub Form_Resize()
Dim i, sudut
Static flag As Boolean
If flag = False Then
flag = True
For i = 0 To 14
If i > 0 Then Load linJarumJam(i)
linJarumJam(i).Visible = True
Modul Pemrograman Visual Basic 6.0
Dedy Arisandi, ST, M.Kom Halaman 42
linJarumJam(i).BorderWidth = 5
linJarumJam(i).BorderColor = QBColor(2)
Next i
End If
For i = 0 To 14
Scale (-1, -1)-(1, 1)
sudut = i * 2 * Atn(1) / 3
linJarumJam(i).X1 = 0.9 * Cos(sudut)
linJarumJam(i).Y1 = 0.9 * Sin(sudut)
linJarumJam(i).X2 = Cos(sudut)
linJarumJam(i).Y2 = Sin(sudut)
Next i
End Sub
Private Sub tmrDigital_Timer()
Dim jam As Variant
jam = Now
lblJam.Caption = Format(jam, “hh:mm:ss”)
End Sub
Private Sub TMRJAM_Timer()
Const lenganjam = 0
Const lenganmenit = 13
Const lengandetik = 14
Dim sudut
Static detiklalu
If Second(Now) = detiklalu Then Exit Sub
detiklalu = Second(Now)
sudut = -0.5236 * (15 – (Hour(Now) + Minute(Now) / 60))
linJarumJam(lenganjam).X1 = 0
linJarumJam(lenganjam).Y1 = 0
linJarumJam(lenganjam).X2 = 0.5 * Cos(sudut)
linJarumJam(lenganjam).Y2 = 0.5 * Sin(sudut)
sudut = -0.1047 * (75 – (Minute(Now) + Second(Now) / 60))
linJarumJam(lenganmenit).X1 = 0
linJarumJam(lenganmenit).Y1 = 0
linJarumJam(lenganmenit).X2 = 0.7 * Cos(sudut)
linJarumJam(lenganmenit).Y2 = 0.7 * Sin(sudut)
sudut = -0.1047 * (75 – Second(Now))
linJarumJam(lengandetik).X1 = 0
linJarumJam(lengandetik).Y1 = 0
linJarumJam(lengandetik).X2 = 0.7 * Cos(sudut)
linJarumJam(lengandetik).Y2 = 0.7 * Sin(sudut)
End Sub
Modul Pemrograman Visual Basic 6.0
Dedy Arisandi, ST, M.Kom Halaman 43
9. PENGELOLAAN FILE
Untuk memudahkan pengelolaan file yang biasanya berjumlah banyak, file-file biasanya
dikelompokkan sesuai jenisnya dan disimpan pada satu folder atau direktori tersendiri. Visual
Basic menyediakan tiga buah kontrol standar untuk pengelolaan file yaitu DriveListBox,
DirListBox, FileListBox.
A. DriveListBox
DriveListBox adalah kontrol file pada VB yang berfungsi untuk menampilkan seluruh drive
yang ada pada komputer Anda. Berikut ini contoh gambar kontrol DriveListBox:
B. DirListBox
DirListBox adalah kontrol file pada VB yang berfungsi untuk menampilkan seluruh direktori/
folder dalam suatu drive tertentu. Berikut ini gambar kontrol DirListBox :
C. FileListBox
FileListBox merupakan kontrol file pada VB yang berfungsi untuk menampilkan file-file
yang sudah difilter dalam satu direktori. Untuk menentukan filter file yang akan ditampilkan
Anda dapat mengaturnya pada properti Pattern. Ketikkan *.* jika ingin menampilkan semua
file dan ketikkan *.ekstension, misalkan *.jpg untuk menampilkan file-file dengan ekstension
jpg. Berikut ini gambar kontrol FileListBox :
Contoh program dengan menggunakan ketiga kontrol file di atas :
Modul Pemrograman Visual Basic 6.0
Dedy Arisandi, ST, M.Kom Halaman 44
Objek / Kontrol Properties Value
Form1 Name
Caption
FrmFile
Jendela Browser
Drive1 Name Drive1
Dir1 Name Dir1
File1 Name
Pattern
File1
*.bmp;*.jpg;*.gif;*.wmf;*.ico
Image1 Name
Stretch
BorderStyle
imgGambar
True
1-FixedSingle
Label1 Name
Caption
BackColor
lblPath
Label Path
(Warna Hijau Muda)
Option1 Name
Caption
optStretch
Gambar Stretch
Option2 Name
Caption
optUnStretch
Gambar Sebenarnya
Private Sub File1_Click()
gambar = File1.Path & “\” & File1.FileName
imgGambar.Picture = LoadPicture(gambar)
lblPath.Caption = gambar
End Sub
Private Sub optStretch_Click()
imgGambar.Height = 4830 ‘Ukuran disesuaikan dengan
imgGambar.Width = 4440 ‘ukuran image yang anda buat
imgGambar.Stretch = True
End Sub
Kode Program:
Private Sub Form_Load()
optStretch.Value = True
End Sub
Private Sub Dir1_Change()
File1.Path = Dir1.Path
lblPath.Caption = Dir1.Path
End Sub
Private Sub Drive1_Change()
Dir1.Path = Drive1.Drive
End Sub
Private Sub optUnStretch_Click()
imgGambar.Stretch = False
End Sub
Modul Pemrograman Visual Basic 6.0
Dedy Arisandi, ST, M.Kom Halaman 45
10. KOTAK PESAN, KOTAK MASUKAN DAN KOTAK DIALOG
A. Kotak Pesan (MsgBox())
Pada Visual Basic terdapat kotak pesan (msgbox) yang berfungsi untuk menampilkan pesan
kepada pemakai. Pesan ini biasanya berupa pesan peringatan, pesan error, pesan untuk
memastikan suatu tindakan, dan sebagainya. Aturan penulisan adalah sebagai berikut:
intNamaVariabel = MsgBox(“Pesan” , intType, strJudul)
Keterangan:
􀂾 intNamaVariabel: Variabel untuk menyimpan hasil yang dikembalikan oleh fungsi
MsgBox().
􀂾 Pesan : Kalimat yang akan ditampilkan pada kotak pesan.
􀂾 intType: Nilai yang berfungsi untuk menampilkan pilihan tertentu pada kotak pesan.
􀂾 strJudul: Judul yang akan ditampilkan pada kotak pesan.
Contoh :
Dim Konfir As Integer
Konfir = MsgBox(“Apakan Anda yakin ingin keluar dari aplikasi ini”,
vbYesNo + vbQuestion, “Konfirmasi”)
Hasil dari perintah di atas :
B. Kotak Masukan (InputBox())
Kotak masukan pada Visual Basic dapat ditampilkan dengan fungsi InputBox(). Kotak
masukan ini berfungsi untuk menginputkan nilai-nilai data yang akan diproses pada aplikasi
Anda. Aturan penulisan kotak input ini adalah sebagai berikut :
strNamaVariabel = InputBox(“Pesan” , “strJudul”,
“strDefault”, intXPos, intYPs)
Keterangan:
􀂾 strNamaVariabel: Variabel untuk menyimpan hasil yang dikembalikan oleh fungsi
InputBox().
􀂾 Pesan: Kalimat yang ingin ditampilkan sebagai acuan pengisian data.
􀂾 srtJudul: Judul yang akan ditampilkan pada kotak input.
􀂾 strDefault: Teks yang ditampilkan sebagai jawaban default (jawaban yang sudah
disediakan) pada kotak input.
􀂾 intXPos: Lokasi pada sumbu X dimana kotak input akan muncul pada layar.
􀂾 intYPos: Lokasi pada sumbu Y dimana kotak input akan muncul pada layar.
Contoh :
Dim strInput As String
strInput = InputBox(“Masukkan Hobbi Anda : “, “Input Hobbi”, “Ketikkan
hobbi Anda disini”)
Modul Pemrograman Visual Basic 6.0
Dedy Arisandi, ST, M.Kom Halaman 46
Kotak input yang dihasilkan dari perintah tersebut:
C. Kotak Dialog (Dialog Box)
Kotak dialog adalah jendela-jendela kecil yang muncul untuk meminta input atau masukkan
dari pemakai. Masukan ini akan digunakan untuk melakukan suatu perintah atau tugas
tertentu. Pada Visual Basic terdapat beberapa kotak dialog yang dapat digunakan yaitu kotak
dialog Open, kotak dialog Save, kotak dialog Font, kotak dialog Color, dan kotak dialog
Print, dan kotak dialog Help.
Cara Membuat Kotak Dialog
􀂾 Aktifkan Visual Basic 6.0
􀂾 Pilih menu Project> Componens(atau tekan Ctr + T pada keyboard)
􀂾 Pada kotak Components pilihlah Microsoft Common Control 6.0 hingga kotak ceknya
tertandai lalu klik tombol OK.
􀂾 Rancanglah form dengan kontrol-kontrol berikut ini:
Objek / Kontrol Properties Value
Form1 Name
Caption
FrmDialog
Form Uji Kotak Dialog
CommonDialog1 Name Cdb1
Label1 Name lblKalimat
Command1 Name
Caption
cmdKalimat
Masukkan Kalimat
Combo1 Name cboKotakDialog
􀂾 Tampilan form :
􀂾 Selanjutnya ketiklah program berikut ini:
Private Sub cboKotakDialog_Click()
Select Case cboKotakDialog.ListIndex
Case 0
cdb1.DialogTitle = “Membuka Hanya File Dokumen (*.doc)”
cdb1.Filter = “*.doc”
cdb1.FileName = “*.doc”
cdb1.ShowOpen
Case 1
cdb1.DialogTitle = “Menyimpan File Teks (*.txt)”
Modul Pemrograman Visual Basic 6.0
Dedy Arisandi, ST, M.Kom Halaman 47
cdb1.Filter = “*.txt”
cdb1.FileName = “*.txt”
cdb1.ShowSave
Case 2
cdb1.DialogTitle = “Memilih Warna”
cdb1.ShowColor
lblKalimat.ForeColor = cdb1.Color
cboKotakDialog.ForeColor = cdb1.Color
Case 3
cdb1.DialogTitle = “Membuka Dialog Font”
cdb1.Flags = cdlCFBoth
cdb1.ShowFont
lblKalimat.FontSize = cdb1.FontSize
Case 4
cdb1.DialogTitle = “Membuka Dialog Printer”
cdb1.ShowPrinter
Case 5
cdb1.DialogTitle = “Anda Butuh Bantuan”
cdb1.ShowHelp
End Select
End Sub
Private Sub cmdKalimat_Click()
Dim Kalimat As String
Kalimat = InputBox(“Masukkan Sembarang Kalimat”, “Input Kalimat”,
“Ketikkan Kalimat disini”)
lblKalimat.Caption = Kalimat
End Sub
Private Sub Form_Load()
cboKotakDialog.AddItem “Kotak Dialog Open”
cboKotakDialog.AddItem “Kotak Dialog Save”
cboKotakDialog.AddItem “Kotak Dialog Color”
cboKotakDialog.AddItem “Kotak Dialog Font”
cboKotakDialog.AddItem “Kotak Dialog Print”
cboKotakDialog.AddItem “Kotak Dialog Help”
End Sub
Private Sub Form_Unload(Cancel As Integer)
Dim Konfir As Integer
Konfir = MsgBox(“Anda yakin ingin keluar dari aplikasi ini”, vbYesNo +
vbQuestion, “Konfirmasi”)
If Konfir = vbYes Then
Cancel = 0
End
Else
Cancel = 1
End If
End Sub
Modul Pemrograman Visual Basic 6.0
Dedy Arisandi, ST, M.Kom Halaman 48
11. TOOLBAR, POP UP MENU, DAN STATUSBAR
A. ToolBar
Toolbar adalah serangkaian tombol-tombol berupa gambar yang apabila diklik akan
melakukan perintah tertetu yang telah ditugaskan padanya. Toolbar berguna untuk
mempersingkat tugas pemakai dengan langsung mengklik gambar yang mewakili satu menu
pada menubar. Toolbar juga dibuat untuk mempercantik tampilan aplikasi Anda.
Untuk membuat Toolbar Anda harus memilih dua kontrol sekaligus yang sebelumnya harus
Anda instal dari component Microsoft Windows Common Controls 6.0 (SP6) yaitu:
􀂾 Image List yang berfungsi untuk menyimpan gambar-gambar yang akan ditampilkan pada
Toolbar.
􀂾 Toolbar yang berfungsi untuk membuat Toolbar itu sendiri.
Untuk membuat Toolbar ada langkah-langkah dan pengaturan yang harus Anda lakukan
yaitu:
􀂾 Buka project yang berisi MDI Form yang berisi menu latihan yang pernah anda buat
sebelumnya.
􀂾 Klik dua kali pada kontrol Image List, kemudian klik kontrol Toolbar dan gambarkan
pada bagian atas form Anda.
􀂾 Klik kanan pada kontrol Image List di atas, lalu pilih Properties, maka akan tampil
jendela berikut ini:
􀂾 Selanjutnya klik kanan pada Toolbar yang telah digambar di atas, lalu pilih properties,
maka akan tampil jendela berikut ini:
􀂾 Klik tombol Insert Picture, cari
gambar icon yang Anda kehendaki.
􀂾 Bila gambar yang terlanjur anda
ambil ingin dihapus kliklah tombol
Remove Picture.
􀂾 Ingat nomor index pada kotak Index
picture yang akan dipanggil
nantinya pada Toolbar.
􀂾 Jika gambar yang akan diletakkan
pada Toolbar sudah mencukupi,
akhiri dengan menekan tombol OK.
Modul Pemrograman Visual Basic 6.0
Dedy Arisandi, ST, M.Kom Halaman 49
􀂾 Setelah langkah-langakah diatas Anda ikuti maka Anda akan memperoleh hasil sebagai
berikut:
B. Pop Up Menu
Pop up menu adalah menu yang akan tampil apabila Anda mengklik tombol kanan mouse
pada daerah tertuntu. Pop up menu dibuat untuk mempersingkat dan mempermudah
perkerjaan pemakai untuk membuka suatu menu. Untuk membuat pop up menu anda dapat
melakukan langkah-langkah berikut ini:
􀂾 Buatlah terlebih dahulu menu yang akan Anda buat sebagai pop up menu pada Menu
Editor. Bila menu yang baru anda buat tersebut tidak ingin ditampilkan pada menu bar,
cek tombol checkbox Visible pada menu tersebut.
􀂾 Pilih kotak combo ImageList
dengan ImageList yang akan
Anda pilih gambarnya.
􀂾 Tentukan bentuk Toolbar yang
anda inginkan pada kotak combo
Style.
􀂾 Klik tob Button untuk memulai
membuat tombol icon pada
Toolbar Anda.
􀂾 Klik tombol Insert Button untuk
membuat tombol icon pada Toolbar
Anda.
􀂾 Ketikkan keterangan toolbar pada
kotak input Caption.
􀂾 Tentukan nomor indeks gambar
sesuai dengan susunan indeks pada
ImageList yang ingin anda
tampilkan pada Toolbar.
􀂾 Lakukan berulang-ulang sampai
semua icon toolbar yang anda
inginkan tampil, kemudian akhiri
dengan menekan tombol OK.
Modul Pemrograman Visual Basic 6.0
Dedy Arisandi, ST, M.Kom Halaman 50
􀂾 Ketik metode yang akan lakukan oleh pop up menu tersebut sebelumnya, misalkan:
Private Sub mnuTampiltoolbar_Click()
mnuTampilToolbar.Checked = Not mnuTampilToolbar.Checked
Toolbar1.Visible = mnuTampilToolbar.Checked
End Sub
􀂾 Klik dua kali kontrol yang akan Anda beri pop up menu, misalnya form lalu ketik
program berikut ini:
Private Sub MDIForm_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = 2 Then PopupMenu mnuToolbar
End Sub
􀂾 Hasil yang diperoleh dari langkah-langkah di atas dapat Anda lihat berikut ini:
C. Statusbar
Statusbar adalah baris status yang biasanya terdapat di bagian bawah layar suatu aplikasi
yang berfungsi memberikan keterangan mengenai aplikasi yang dijalankan saat ini. Sebagai
contoh pemakai dapat melihat tombol Caps Lock, atau Num Lock aktif atau tidak dapat
dilihat pada statusbar. Untuk membuat statusbar Anda dapat melakukan langkah-langkah
berikut ini:
􀂾 Klik kontrol Statusbar yang terdapat pada Toolbox, lalu klik dan gambar statusbar
tersebut tepat di bagian bawah form induk.
􀂾 Klik kanan pada statusbar, properties, maka akan tampil jendela berikut:
􀂾 Matikan cek pada pilihan
Visible ini agar menu tidak
tampil pada menu bar.
􀂾 Ketik menu-menu yang akan
ditampilkan pada pop up menu.
􀂾 Akhiri dengan mengklik tombol
OK.
􀂾 Menambah panel baru pada statusbar.
􀂾 Menghapus panel pada statusbar.
􀂾 Menampilkan teks pada statusbar.
􀂾 Menampilkan keterangan tips pada panel.
􀂾 Menentukan bentuk perataan teks.
􀂾 Menentukan bentuk isi panel.
􀂾 Mengambil gambar yang akan diletakkan
pada panel.
Modul Pemrograman Visual Basic 6.0
Dedy Arisandi, ST, M.Kom Halaman 51
Style yang dapat dipilih pada jendela Properties Pages tersebut adalah:
0 – sbrText: Menampilkan Teks
1 – sbrCaps: Menampilkan status penekanan tombol Caps Lock.
2 – sbrNum: Menampilkan status penekanan tombol Num Lock.
3 – sbrIns: Menampilkan status penekanan tombol Insert.
4 – sbrScrl: Menampilkan status penekanan tombol Scroll Lock.
5 – sbrTime: Menampilkan waktu saat ini.
6 – sbrDate: Manampilkan tanggal saat ini.
􀂾 Berikut ini tampilan status bar yang dapat dikerjakan dengan langkah-langkah di atas:
􀂾 Langkah yang selanjutnya Anda dapat memberikan metoda untuk setiap menu, pop up
menu, toolbar, dan status bar di atas yaitu sebagai berikut:
Private Sub MDIForm_Load()
StatusBar1.Panels(2).Text = Format(Date, “dddd”)
StatusBar1.Panels(3).Text = Format(Date, “dd mmmm yyyy”)
StatusBar1.Panels(4).Text = Format(Now, “hh:mm:ss”)
End Sub
Private Sub MDIForm_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = 2 Then PopupMenu mnuToolbar
End Sub
Private Sub MDIForm_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
StatusBar1.Panels(7).Text = “Klik Kanan untuk membuka Pop Up Menu”
End Sub
Private Sub MDIForm_Unload(Cancel As Integer)
Dim Konfir As Integer
Konfir = MsgBox(“Anda yakin ingin keluar dari aplikasi ini”, vbYesNo + vbQuestion, “Konfirmasi”)
If Konfir = vbYes Then
Cancel = 0
End
Else
Cancel = 1
End If
End Sub
Private Sub mnuCase_Click()
frmAlurCase.Show
End Sub
Modul Pemrograman Visual Basic 6.0
Dedy Arisandi, ST, M.Kom Halaman 52
Private Sub mnuIf_Click()
frmIf.Show
End Sub
Private Sub mnuIfElse_Click()
frmIfEls.Show
End Sub
Private Sub mnuOperasi_Click()
frmOperator.Show
End Sub
Private Sub mnuPengulangan_Click()
frmalurFor.Show
End Sub
Private Sub mnuPercobaan_Click()
frmAplikasi.Show
End Sub
Private Sub mnuPropertiForm_Click()
frmPropertiForm.Show
End Sub
Private Sub mnuTampiltoolbar_Click()
mnuTampilToolbar.Checked = Not mnuTampilToolbar.Checked
Toolbar1.Visible = mnuTampilToolbar.Checked
End Sub
Private Sub mnuTampilStatusbar_Click()
mnuTampilStatusbar.Checked = Not mnuTampilStatusbar.Checked
StatusBar1.Visible = mnuTampilStatusbar.Checked
End Sub
Private Sub StatusBar1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
StatusBar1.Panels(7).Text = “Status Aplikasi Anda”
End Sub
Private Sub Timer1_Timer()
StatusBar1.Panels(4).Text = Format(Now, “hh:mm:ss”)
End Sub
Private Sub Toolbar1_ButtonClick(ByVal Button As MSComctlLib.Button)
Select Case Button.Index
Case 1
mnuPercobaan_Click
Case 2
mnuOperasi_Click
Case 3
mnuIf_Click
Case 4
mnuIfElse_Click
Case 5
mnuCase_Click
Case 6
mnuPengulangan_Click
Case 7
mnuPropertiForm_Click
Case 9
Unload Me
End Select
End Sub
Private Sub Toolbar1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
StatusBar1.Panels(7).Text = “Klik Salah Satu Icon pada Toolbar”
End Sub
‘ Teruskan sampai sempurna……….
Modul Pemrograman Visual Basic 6.0
Dedy Arisandi, ST, M.Kom Halaman 53
12. PENGELOLAAN DATABASE
Database adalah kumpulan file-file yang mempunyai kaitan antara satu file dengan file yang
lain sehingga membentuk satu bangunanan data untuk menginformasikan satu aktivitas
tertentu. File-file tersebut disimpan ke dalam satu media penyimpanan fisik yang dapat
ditambah, diubah, dihapus, diseleksi, disortir, ditampilan, dan sebagainya. Dalam Visual basic
ada dua kontrol standar yang dapat Anda gunakan untuk pengelolaan database yaitu kontrol
data DAO dan kontrol data ADO.
A. Kontrol Data DAO
Dengan kontrol Data Acces Object (DAO) Anda dapat menampilkan field-field didalam
database. Field adalah atribut-atribut yang dimiliki oleh sebuah entiti. Entiti adalah objek
dunia nyata, seperti manusia, hewan, benda, dan sebagainya. Kontrol data dapat memilih
beberapa format database seperti Microsoft Access (mdb), dBase(dbf), FoxPro(dbf),
Excel(xls), Lotus(wk*), Paradox( db), bahkan database yang berbasis teks (*.txt).
Berikut ini properti yang dapat Anda gunakan pada kontrol data:
PROPERTI KETERANGAN
Caption Teks judul yang akan ditampilkan ditengah-tengah kontrol data.
Connect Memilih salah satu jenis database yang ada.
DatabaseName Menghubungkan kontrol data dengan file database.
RecordSource Memilih salah satu tabel dari database yang dipilih.
Langkah-langkah membuat program database dengan kontrol Data :
􀂾 Buatlah terlebih dahulu tabel yang akan dijadikan tempat penyimpanan data dengan cara
mengklik menu Add-Ins> Visual Data Manager..
􀂾 Klik menu File> New> Microsoft Access> Version 7.0 MDB… ketikkan nama file
database misal Latihan.mdb, klik tombol Save, selanjutnya tampil jendela berikut:
􀂾 Klik kanan pada properties, pilih New Table.
Modul Pemrograman Visual Basic 6.0
Dedy Arisandi, ST, M.Kom Halaman 54
􀂾 Katikkan pada jendela Add Field di atas data sebagai berikut:
Nama Field Type Size Keterangan
KodeMK Text 7 Index = Kode(KodeMK)
NamaMK Text 30
JlhSKS Single -
Semester Text 1
􀂾 Akhiri pembuatan tabel diatas dengan mengklik tombol Build The Table. Kemudian tutup
jendela Visual Data Manager.
􀂾 Rancanglah form berikut ini pada aplikasi Anda:
􀂾 Pengaturan properti:
Objek / Kontrol Properties Value
Form1 Name
Caption
FrmData
Form Uji Kontrol Data
Data1 Caption
Connect
DatabaseName
EofAction
RecordSource
Mata Kuliah
Access
(Browse file Latihan.mdb yang baru dibuat)
2 – Add New
MataKuliah
Component:
Micorosft Data Bound Grid Control 5.0 (SP3)
Modul Pemrograman Visual Basic 6.0
Dedy Arisandi, ST, M.Kom Halaman 55
Label1 Caption Kode Mata Kuliah
Label2 Caption Nama Mata Kuliah
Label3 Caption Jumlah SKS
Label4 Caption Semester
Text1 Name
Text
DataSource
DataField
MaxLength
txtKodeMK
(Kosongkan)
Data1
KodeMK
7
Text2 Name
Text
DataSource
DataField
MaxLength
txtNamaMK
(Kosongkan)
Data1
NamaMK
30
Text3 Name
Text
DataSource
DataField
MaxLength
txtJlhSKS
(Kosongkan)
Data1
JlhSks
3
Text4 Name
Text
DataSource
DataField
MaxLength
txtSemester
(Kosongkan)
Data1
Semester
1
Command1 Name
Caption
Style
Icon
cmdNew
&Data Baru
1-Graphical
C:\Program Files\Microsoft Visual Studio\Common\
Graphics\Icons\Computer\Key04.ico
Command2 Name
Caption
Style
Icon
cmdSimpan
&Simpan
1-Graphical
C:\Program Files\Microsoft Visual Studio\Common\
Graphics\Icons\Computer\Disk06.ico
Command3 Name
Caption
Style
Icon
cmdHapus
&Hapus
1-Graphical
C:\Program Files\Microsoft Visual Studio\Common\
Graphics\Icons\Computer\Trash02a.ico
Command4 Name
Caption
Style
Icon
cmdCetak
&Cetak
1-Graphical
C:\Program Files\Microsoft Visual Studio\Common\
Graphics\Bitmaps\TlBr_W95\Print.bmp
Command5 Name
Caption
Style
Icon
cmdExit
&Exit
1-Graphical
C:\Program Files\Microsoft Visual Studio\Common\
Graphics\Icons\Computer\W95mbx01.ico
DBGrid DataSource Data1
Modul Pemrograman Visual Basic 6.0
Dedy Arisandi, ST, M.Kom Halaman 56
Kode Program :
Option Explicit
Private Sub cmdExit_Click()
Unload Me
End Sub
Private Sub cmdHapus_Click()
Dim Konfir As Integer
Konfir = MsgBox(“Yakin Mata Kuliah ” & txtNamaMK.Text & ” Ingin
Dihapus”, vbQuestion + vbYesNo, “Penghapusan Data”)
If Konfir = vbYes Then
Data1.Recordset.Delete
cmdNew_Click
Data1.Recordset.MoveFirst
Else
txtKodeMK.SetFocus
End If
End Sub
Private Sub cmdNew_Click()
On Error GoTo SALAH
Data1.Recordset.AddNew
txtKodeMK.SetFocus
Exit Sub
SALAH:
MsgBox “Terjadi Kesalahan Input”, vbExclamation, “Penyimpanan”
Data1.Recordset.MoveFirst
cmdNew.SetFocus
End Sub
Private Sub cmdSimpan_Click()
cmdNew_Click
End Sub
Private Sub cmdCetak_Click()
DataReport1.Show
End Sub
Private Sub txtJlhSKS_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyReturn Then
txtSemester.SetFocus
End If
End Sub
Private Sub txtJlhSKS_KeyPress(KeyAscii As Integer)
If Not (KeyAscii >= Asc(“0″) And KeyAscii = Asc(“0″) And KeyAscii 3
.Text = Format(.Text, “###,##0″)
.SelStart = Len(.Text)
Case Is > 6
.Text = Format(.Text, “###,###,##0″)
.SelStart = Len(.Text)
Case Is > 9
.Text = Format(.Text, “###,###,###,##0″)
.SelStart = Len(.Text)
Case Is > 12
.Text = Format(.Text, “###,###,###,###,##0″)
.SelStart = Len(.Text)
End Select
End With
End Sub
􀂾 Tekan Ctr + S untuk menyimpan project anda.
􀂾 Klik 2 kali form jabatan, klik menu View, Code, lalu ketik program berikut ini:
Option Explicit
Dim Coba As Boolean
Private Sub Inisial()
Coba = False
txtNamaJab.Text = “”
txtTunjangan.Text = “”
txtNamaJab.Enabled = False
txtTunjangan.Enabled = False
cmdSimpan.Enabled = False
cmdEdit.Enabled = False
cmdHapus.Enabled = False
cmdBatal.Enabled = False
txtKodeJab.Text = “”
txtKodeJab.Enabled = True
txtKodeJab.SetFocus
TampilLV1
End Sub
Private Sub txtTunjangan_Change()
FormatAngka txtTunjangan
End Sub
Private Sub cmdBatal_Click()
Inisial
End Sub
Modul Pemrograman Visual Basic 6.0
Dedy Arisandi, ST, M.Kom Halaman 63
Private Sub TampilLV1()
Dim TJabatan As ADODB.Recordset
Dim Kata As String
Dim i As Byte
Dim vButir As ListItem
Me.MousePointer = 11
Kata = “SELECT * FROM Jabatan ORDER BY KD_Jabatan”
Set TJabatan = New ADODB.Recordset
TJabatan.Open Kata, DataAnsi, adOpenStatic
LV1.ListItems.Clear
If Not TJabatan.EOF Then
TJabatan.MoveFirst
i = 1
While Not TJabatan.EOF
Set vButir = LV1.ListItems.Add(, , i & “.”)
vButir.SubItems(1) = TJabatan![KD_Jabatan]
vButir.SubItems(2) = TJabatan![NM_Jabatan]
vButir.SubItems(3) = TJabatan![TJ_Jabatan]
TJabatan.MoveNext
i = i + 1
Wend
End If
TJabatan.Close
Set TJabatan = Nothing
Me.MousePointer = 1
End Sub
Private Sub CmdEdit_Click()
Coba = True
cmdEdit.Enabled = False
cmdHapus.Enabled = False
txtNamaJab.Enabled = True
txtTunjangan.Enabled = True
cmdSimpan.Enabled = True
txtKodeJab.Enabled = False
txtNamaJab.SetFocus
End Sub
Private Sub cmdHapus_Click()
Dim Kata As String
Dim Tanya As Integer
Tanya = MsgBox(“Yakin Data Jabatan ” & txtNamaJab.Text & ” Ingin Dihapus ?”, vbQuestion +
vbYesNo, “Penghapusan Data”)
If Tanya = vbYes Then
Me.MousePointer = 11
Kata = “DELETE FROM Jabatan WHERE KD_Jabatan='” & Trim(txtKodeJab.Text) & “‘”
DataAnsi.Execute Kata
Me.MousePointer = 1
Inisial
Else
cmdSelesai.SetFocus
End If
LV1.Refresh
End Sub
Private Sub cmdSelesai_Click()
Unload Me
End Sub
Private Sub cmdSimpan_Click()
If Not Coba Then
TambahData
Else
EditData
End If
LV1.Refresh
End Sub
Private Sub Form_Activate()
Inisial
End Sub
Private Sub TambahData()
Dim Kata As String
Modul Pemrograman Visual Basic 6.0
Dedy Arisandi, ST, M.Kom Halaman 64
Me.MousePointer = 11
Kata = “INSERT INTO Jabatan VALUES (‘” & Trim(txtKodeJab.Text) & “‘, ‘” &
Trim(txtNamaJab.Text) & “‘, ” & _
IIf(txtTunjangan.Text = “”, “0”, Format(txtTunjangan.Text, “##############0″)) & “)”
DataAnsi.Execute Kata
Me.MousePointer = 1
Inisial
LV1.Refresh
End Sub
Private Sub EditData()
Dim Kata As String
Me.MousePointer = 11
Kata = “UPDATE Jabatan SET NM_Jabatan='” & Trim(txtNamaJab.Text) & “‘, TJ_Jabatan = ” &
IIf(txtTunjangan.Text = “”, “0”, Format(txtTunjangan.Text, “##############0″)) & “)WHERE
KD_Jabatan='” & Trim(txtKodeJab.Text) & “‘”
DataAnsi.Execute Kata
Me.MousePointer = 1
Inisial
LV1.Refresh
End Sub
Private Sub Form_Load()
BukaData
End Sub
Private Sub Form_Unload(Cancel As Integer)
TutupData
End Sub
Private Sub LV1_ItemClick(ByVal Item As MSComctlLib.ListItem)
txtKodeJab.Text = LV1.SelectedItem.SubItems(1)
txtNamaJab.Text = LV1.SelectedItem.SubItems(2)
txtTunjangan.Text = LV1.SelectedItem.SubItems(3)
cmdEdit.Enabled = True
cmdHapus.Enabled = True
cmdBatal.Enabled = True
End Sub
Private Sub txtTunjangan_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyReturn Then cmdSimpan.SetFocus
End Sub
Private Sub txtKodeJab_KeyDown(KeyCode As Integer, Shift As Integer)
Dim TJabatan As ADODB.Recordset
Dim Kata As String
If KeyCode = vbKeyReturn Then
If txtKodeJab.Text = “” Then
MsgBox “Kode Data Jabatan Tidak Boleh Kosong”, vbExclamation, “Pengisian Data”
txtKodeJab.SetFocus
Exit Sub
End If
Me.MousePointer = 11
Kata = “SELECT * FROM Jabatan WHERE KD_Jabatan='” & Trim(txtKodeJab.Text) & “‘”
Set TJabatan = New ADODB.Recordset
TJabatan.Open Kata, DataAnsi, adOpenStatic, adLockReadOnly
If TJabatan.EOF Then
TJabatan.Close
Set TJabatan = Nothing
Me.MousePointer = 1
txtNamaJab.Text = “”
txtTunjangan.Text = “”
txtNamaJab.Enabled = True
txtTunjangan.Enabled = True
cmdSimpan.Enabled = True
cmdEdit.Enabled = False
cmdHapus.Enabled = False
cmdBatal.Enabled = True
txtNamaJab.SetFocus
Exit Sub
End If
TJabatan.MoveFirst
Modul Pemrograman Visual Basic 6.0
Dedy Arisandi, ST, M.Kom Halaman 65
With TJabatan
txtNamaJab.Text = ![NM_Jabatan]
txtTunjangan.Text = ![TJ_Jabatan]
End With
TJabatan.Close
Set TJabatan = Nothing
Me.MousePointer = 1
cmdSimpan.Enabled = False
cmdEdit.Enabled = True
cmdHapus.Enabled = True
cmdBatal.Enabled = True
cmdEdit.SetFocus
End If
End Sub
Private Sub txtNamaJab_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyReturn Then txtTunjangan.SetFocus
End Sub
􀂾 Simpan kembali Project anda, kemudian jalankan dengan menekan tombol keyboard F5,
maka akan muncul form input sebagai berikut:

semantic web


PENERAPAN DESIGN PATTERNS UNTUK IMPLEMENTASI
ALAT BANTU REQUIREMENTS MANAGEMENT
BERBASIS KOMPUTER GENGGAM
Disusun Sebagai Laporan Tugas Akhir
A Sasmito Adibowo
1299000029
FAKULTAS ILMU KOMPUTER
UNIVERSITAS INDONESIA
AGUSTUS 2003
ii
LEMBAR PERSETUJUAN
Judul : Penerapan Design Patterns untuk Implementasi Alat Bantu Requirements
Management berbasis Komputer Genggam
Nama : A Sasmito Adibowo
NPM : 1299000029
Tanggal : Juli 2003
Tugas akhir ini telah diperiksa dan disetujui oleh:
Pembimbing Tugas Akhir
Eko K. Budiardjo, Msc.
iii
ABSTRAK
Proyek tugas akhir ini membuat sebuah alat bantu untuk requirements management
yang dapat digunakan di komputer genggam. Perangkat lunak yang dinamakan
Rambutan – Requirements Management Tool for Busy System Analysts ini terdiri dari
dua aplikasi, satu untuk digunakan di komputer desktop sedangkan yang lain untuk
di komputer handheld. Program di desktop diimplementasikan dengan Java 2
Standard Edition sebagai aplikasi GUI Swing. Sedangkan program untuk komputer
genggam diterapkan menggunakan SuperWaba sehingga dapat dijalankan di
komputer-komputer handheld berbasis Palm OS, Windows CE, dan PocketPC.
Perangkat lunak ini diterapkan dengan design patterns untuk meningkatkan kualitas
arsitektur program sehingga dapat memfasilitasi pengembangan selanjutnya.
Landasan konsep requirements management yang dipergunakan bertolak dari
Requirements Markup Language (RQML), sebuah format XML untuk menyimpan dokumen
requirements, yang juga menjadi format penyimpanan data yang dikelola oleh
program. Bentuk requirements yang menjadi cakupan RQML adalah yang ditulis
secara tekstual dalam bahasa alami. Sedangkan rancangan RQML sendiri didasarkan
pada sekelompok best practices di dalam requirements management sehingga RQML
tidak tergantung pada metodologi pengembangan perangkat lunak tertentu.
Laporan tugas akhir ini terdiri dari dua bagian utama yaitu landasan teori yang diikuti
dengan bab-bab yang terkait pada pembuatan program. Landasan teori memberikan
perkenalan terhadap berbagai teori yang digunakan dalam pembuatan program;
meliputi requirements engineering, XML, Requirements Markup Language (RQML), dan
design patterns. Sedangkan pembahasan program meliputi analisis dan perancangan,
implementasi, serta pengujian. Tulisan ini diakhiri dengan satu bab penutup yang
memberikan rangkuman, kesimpulan, dan saran untuk penelitian-penelitian
selanjutnya.
xi + 143 hlm; 37 gbr; 10 tbl.
Daftar Pustaka: 69 (1977 – 2003).
iv
KATA PENGANTAR
Dulu, sewaktu belum terlalu lama tertarik pada komputer dan programming, saya itu
orangnya sangat technical sekali. Bacaan sehari-hari tidak jauh dari programming manuals
dan dokumentasi API. Selain itu saya juga senang mencoba-coba berbagai
development tools serta belajar macam-macam bahasa pemrograman. Bahkan saya
dulu suka melihat-lihat koran bagian lowongan pekerjaan untuk memutuskan programming
language atau tool apa yang akan saya coba berikutnya – dengan cara melihat
lowongan-lowongan IT (Information Technology) serta kemampuan apa saja yang
diminta untuk posisi itu.
Di bangku kuliah saya sempat kerja programming sambilan dan cukup beruntung untuk
terlibat dalam beberapa proyek ‘swasta’. Selain itu dari berbagai kuliah yang saya
ambil ada beberapa tugas programming yang cukup menantang. Dalam berbagai
kesempatan, saya cenderung untuk memprogram dalam bahasa yang object-oriented
dan berbagai masalah teknis saya pecahkan secara ad-hoc.
Sewaktu semester lima saya diperkenalkan dengan design patterns, waktu itu saya
merasa senang sekali. Karena dari dulu saya suka dengan yang namanya programming
libraries – komponen-komponen siap pakai untuk digunakan dalam suatu program
– maka saya memandang design patterns sebagai sebuah higher-order library
(analogis dengan higher-order functions). Cuma waktu itu agak sedih juga: kenapa baru
diperkenalkan pada semester yang cukup ‘tua’ – andaikata dikenalkan lebih awal
maka banyak masalah programming yang saya alami dulu akan menjadi lebih mudah
dipecahkan.
Pada waktu akan mengerjakan tugas akhir ini, ketertarikan akan design patterns saya
bawa ke Bapak Eko K Budiardjo, yang dulu memperkenalkan saya kepada design
patterns dan kemudian menjadi pembimbing tugas akhir ini. Beliau pada waktu itu
memperluas wawasan saya lebih jauh ke requirements engineering serta menawarkan
topik ini untuk dibahas dalam tugas akhir selain design patterns.
Perkenalan saya dengan bidang requirements engineering benar-benar mengubah
perspektif saya tentang bidang IT. Saya yang dulunya suka bikin-bikin berbagai utility
canggih namun tidak ada yang memakainya; sewaktu kerja part-time hanya mengikuti
instruksi tambahan requirement dari employer yang datang setiap Sabtu; juga yang
v
cenderung mempromosikan teknologi-teknologi tertentu dengan menjelek-jelekkan
yang lain. Banyak pandangan saya yang keliru jadi terkoreksi.
Ternyata requirements engineering itulah yang menghubungkan segi bisnis dengan IT
– di mana bidang yang kedua ini umumnya didominasi oleh para techies. Ternyata
masalahnya bukanlah bahasa C versus Java, bukanlah JSP versus PHP atau bahkan
Windows versus Linux. Masalah sebenarnya ada di requirements. Bukankah IT ditujukan
untuk memecahkan masalah di dunia nyata, masalah-masalah yang mayoritas
dimiliki oleh orang-orang di luar dunia IT?
Menerawang lebih jauh, bukankah bisnis di bidang manapun yang paling penting adalah
customer satisfaction? Kepuasan pelanggan berarti pemenuhan akan kebutuhan
yang dimilikinya… Sebuah penyedia jasa IT tentulah perlu mengerti masalah yang
sedang dihadapi oleh pelanggannya sehingga bisa ditemukan solusi yang tepat guna,
bukanlah hanya setumpuk hardware dan bergiga-giga program code yang tidak
terpakai….
Pada kesempatan ini, ijinkan saya untuk mengucapkan beberapa patah kata berikut:
• Kepada Bapak Eko K Budiardjo: terima kasih telah meluangkan waktu, pikiran,
serta bandwidth untuk membimbing saya dalam pengerjaan tugas akhir ini.
• Kepada Bapak Dadan Hardianto: terima kasih telah memegang peran sebagai
pembimbing akademis selama masa kuliah saya di Fasilkom UI.
• Terima kasih kepada orang tua saya yang telah memberi dukungan moral dan
material selama masa hidup saya sampai kini.
• Kepada Guilherme C Hazan: terima kasih sudah membuat SuperWaba dan
membantu menunjukkan workaround pada awal-awal pembuatan program.
• Kepada Minnarto Djojo: terima kasih telah memperkenalkan saya kepada dunia
komputer genggam.
• Kepada Jeane Anne: terima kasih sudah mau diganggu malam-malam dengan
pertanyaan-pertanyaan yang trivial – walaupun sedang stress mengurusi gusigusi
orang ;-)
• Kepada Maya, Hansen, Lerry, dkk: terima kasih udah mau ‘berbagi’ Pak Eko dan
‘Hari Selasa’, sorry banget waktu itu kalo gua nyinggung dan rada ngeselin.
vi
• Kepada anak-anak BNCC: sorry banget gua ga muncul-muncul lagi ke sekret dan
dateng expo cuma pas workshop J2ME doang – harus ngejar deadline TA nih ;-)
• Kepada mbak-mbak sekretariat, ibu-ibu perpustakaan, bapak-bapak satpam,
dan bapak-bapak janitor: terima kasih atas berbagai macam dukungannya
selama kehidupan saya di Fasilkom UI.
• Kepada teman-teman lain dan tidak dapat disebutkan satu per satu: terima
kasih atas bantuan dan dorongannya selama ini.
Jakarta, Agustus 2003
A Sasmito Adibowo
vii
DAFTAR ISI
PENDAHULUAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
Latar Belakang . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
Tujuan Penelitian . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
Ruang Lingkup Penelitian . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
Metodologi Penelitian . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
Sistematika Penulisan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
REQUIREMENTS ENGINEERING . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Definisi Requirements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Proses RE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
Traceability . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Requirements Patterns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
Alat Bantu RE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
Markup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
Terminologi XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
Konsep XML Secara Luas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
Document Type Definition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
eXtensible Stylesheet Language (XSL) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
Pengurai XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
Standar Pendukung Lainnya . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
REQUIREMENTS MARKUP LANGUAGE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
Fakta-fakta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
Best Practices RE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
Quality Attributes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
Requirements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
Data Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
Markup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
viii
DESIGN PATTERNS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
Gang of Four Patterns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
Model-View-Controller (MVC) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
Separable Model Architecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
ANALISIS DAN PERANCANGAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
User Story . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
Spesifikasi Kebutuhan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
Batasan Rancangan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
Perancangan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
IMPLEMENTASI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
Teknologi yang Digunakan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
Arsitektur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
Pemetaan dari RQML ke class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
Antarmuka pemakai . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
Penerapan Design Patterns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
Data Statistik . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
PENGUJIAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
Terhadap Spesifikasi Kebutuhan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
Terhadap Batasan Rancangan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
Terhadap Standar RQML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
Terhadap Fitur dari Alat Bantu Sejenis . . . . . . . . . . . . . . . . . . . . . . . . . . 131
PENUTUP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
Rangkuman . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
Kesimpulan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
Saran . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
DAFTAR PUSTAKA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
ix
DAFTAR GAMBAR
Gambar 1.1 Metodologi Penelitian . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
Gambar 1.2 Sistematika Penulisan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
Gambar 2.1 Proses RE. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
Gambar 2.2 Empat jenis informasi traceability tradisional . . . . . . . . . . . . . . . . . 15
Gambar 2.3 Sebuah requirement management system tradisional . . . . . . . . . . . . 19
Gambar 3.1 Arsitektur pengurai XML secara umum . . . . . . . . . . . . . . . . . . . . . 27
Gambar 3.2 Hirarki tipe dalam DOM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
Gambar 4.1 Tahap-tahap perancangan RQML . . . . . . . . . . . . . . . . . . . . . . . . . . 33
Gambar 4.2 Hirarki data model RQML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
Gambar 5.1 Arsitektur MVC dan hubungannya dengan Java . . . . . . . . . . . . . . . 60
Gambar 5.2 Separable Model Architecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
Gambar 6.1 Rancangan layar aplikasi handheld . . . . . . . . . . . . . . . . . . . . . . . . 78
Gambar 6.2 State diagram rancangan antarmuka pemakai aplikasi handheld . . . 79
Gambar 7.1 Evolusi bahasa pemrograman Java untuk komputer genggam . . . . 82
Gambar 7.2 Selayang pandang arsitektur kedua aplikasi . . . . . . . . . . . . . . . . . . 86
Gambar 7.3 Selayang pandang arsitektur aplikasi handheld . . . . . . . . . . . . . . . 88
Gambar 7.4 Selayang pandang arsitektur aplikasi desktop . . . . . . . . . . . . . . . . . 89
Gambar 7.5 Selayang pandang arsitektur komponen bridge . . . . . . . . . . . . . . . . 91
Gambar 7.6 Diagram status dari antarmuka aplikasi handheld . . . . . . . . . . . . . 96
Gambar 7.7 Layar Document List . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
Gambar 7.8 Salah satu layar Element List . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
Gambar 7.9 Salah satu layar Element Edit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
Gambar 7.10 Selayang pandang tampilan aplikasi desktop . . . . . . . . . . . . . . . . 99
Gambar 7.11 Contoh tampilan yang menampilkan jendela penyunting elemen firstclass
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
Gambar 7.12 Antarmuka serta implementasi data model RQML . . . . . . . . . . . . 101
Gambar 7.13 Adapter pattern pada kelas representasi data untuk aplikasi desktop
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
Gambar 7.14 File ElementAdapter.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
Gambar 7.15 Jalannya penciptaan obyek adapter oleh AdapterCacheFlyweight
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
x
Gambar 7.16 Memento pattern pada kelas representasi data untuk aplikasi handheld
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
Gambar 7.17 Subsistem Element Copiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
Gambar 7.18 Sebagian hirarki MVC pada aplikasi handheld . . . . . . . . . . . . . . 109
Gambar 7.19 File AbstractDocumentWindow.java . . . . . . . . . . . . . . . . . . . . . . 110
Gambar 7.20 Penerapan separable model architecture pada aplikasi desktop . . 112
Gambar 7.21 Penerapan decorator pattern oleh kelas ExceptionSafeActionWrapper
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
Gambar 7.22 File ExceptionSafeActionWrapper.java . . . . . . . . . . . . . . . . . . . . 114
Gambar 7.23 Observer pattern pada dialog penyunting RQML . . . . . . . . . . . . . 115
Gambar 7.25 Cuplikan RequirementImport.java . . . . . . . . . . . . . . . . . . . . . . . 120
xi
DAFTAR TABEL
Tabel 2.1 Beberapa alat bantu requirements management komersial . . . . . . . . . . 20
Tabel 5.1 Creational Patterns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
Tabel 5.2 Structural Patterns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
Tabel 5.3 Behavioral Patterns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
Tabel 5.4 Korelasi komponen-komponen Swing dengan data model yang digunakannya
[Fowl02] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
Tabel 7.1 Ikhtisar hitungan NCSS untuk seluruh program . . . . . . . . . . . . . . . 121
Tabel 7.2 Ikhtisar hitungan NCSS per class . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
Tabel 7.3 Ikhtisar hitungan NCSS per method . . . . . . . . . . . . . . . . . . . . . . . . . 122
Tabel 7.4 Hitungan NCSS per package . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
Tabel 8.1 Pemenuhan sistem terhadap requirement RQML . . . . . . . . . . . . . . . . 128
1
Bab 1
PENDAHULUAN
1.1 Latar Belakang
Proses requirements engineering bukanlah merupakan hal yang mudah. Seorang
system analyst, project manager, atau siapapun yang memegang peran project champion
harus mengumpulkan berbagai requirement dari para stakeholder, menganalisa
requirement tersebut, mengkomunikasikasikannya dengan para programmer, serta menyelesaikan
konflik yang terjadi antar berbagai requirement yang ada.
Seringkali project champion ini harus bekerja di luar kantor untuk bertemu dengan para
stakeholder. Hal ini terutama terjadi pada kasus proyek software development di
mana organisasi pengembang berbeda dengan organisasi yang pada akhirnya akan
menggunakan perangkat lunak tersebut.
Sebagai seorang pekerja IT yang mobile dengan jadwal yang padat, besar kemungkinannya
ia akan menggunakan sebuah PDA (Personal Digital Assistant) dalam mengatur
jadwal pekerjaannya sehari-hari. Aplikasi-aplikasi PIM (Personal Information Management)
yang menjadi ciri khas suatu PDA belum tentu dapat secara optimal membantu
tugasnya dalam pengumpulan serta perumusan requirement. Alangkah baiknya apabila
ada suatu perangkat lunak di dalam PDA-nya yang ditujukan khusus pengaturan
berbagai requirement – yang merupakan salah satu tugas utama project champion ini.
1.2 Tujuan Penelitian
Dari beberapa pencarian singkat di Google (terakhir pada
tanggal 2 Juli 2003), ternyata belum ada alat bantu requirements management yang
ditujukan untuk komputer genggam. Dua jenis software yang paling mendekati
kegunaan ini adalah untuk Project Management dan Mind-Mapping. Fakta ini
BAB 1 – PENDAHULUAN 2
1 Ada orang bijak yang pernah mengatakan, “Problem dan opportunity itu adalah dua
sisi pada koin yang sama.” – Sebuah permasalahan membuka peluang bagi yang dapat
memecahkan masalah tersebut.
menandakan adanya suatu market opportunity untuk sebuah requirements management
tool berbasis komputer genggam1.
Problem statement (atau lebih tepatnya, opportunity statement) tersebut menjadi titik
tolak penelitian ini yang bertujuan untuk membuat sebuah prototipe alat bantu
requirements management berbasis komputer genggam. Sebuah nilai tambah
diberikan melalui penggunaan design patterns dalam implementasinya.
Alat bantu yang dibuat dinamakan Rambutan – Requirements Management Tool for
Busy System Analysts. Rambutan terdiri dari dua software terpisah di mana keduaduanya
berfungsi saling melengkapi. Salah satunya untuk digunakan di komputer
desktop, sedang yang lain untuk digunakan di komputer genggam. Kedua aplikasi ini
ditujukan hanya untuk digunakan oleh satu orang (single-user system).
1.3 Ruang Lingkup Penelitian
Ruang lingkup penelitian meliputi penerapan sebuah alat bantu requirements management
yang berbasis RQML serta dapat digunakan di sebuah komputer genggam.
Fungsi utama yang diharapkan adalah data entry pada saat sang requirements engineer
berinteraksi dengan klien. Beberapa fungsi esensial namun kompleks terpaksa dikesampingkan
karena keterbatasan waktu. Fungsi-fungsi ini termasuk traceability, focus
group, dan reporting. Demikian pula dengan fungsi kolaborasi yang tidak termasuk
dalam ruang lingkup sebuah single-user system.
Alat bantu requirements management ini dikembangkan atas dasar konsep-konsep
RQML, sebuah format XML untuk menyimpan dokumen requirements [Gudg00]. Sebagian
besar theoretical work yang diperlukan pada problem domain – yaitu requirements
engineering – telah dilakukan oleh Gudgeirsson dalam penelitiannya pada saat membuat
RQML. Penelitian ini melanjutkan pekerjaannya dengan mengimplementasikan
sebuah software yang dibuat atas dasar RQML dan juga menyimpan datanya dalam
bentuk XML.
BAB 1 – PENDAHULUAN 3
Design patterns yang digunakan adalah pola-pola yang dimuat di [Gamm95]. Walaupun
masih banyak pattern lainnya, berbagai pattern dalam buku ini telah terbukti
cukup general purpose dalam penerapannya di berbagai object-oriented systems.
Komputer genggam yang menjadi sasaran adalah yang dijual sebagai Personal Digital
Assistant (PDA) dan berbasis PalmOS maupun PocketPC. Namun karena keterbatasan
sumber daya maka pengujian aplikasi komputer genggam hanya dilakukan di PalmOS.
1.4 Metodologi Penelitian
Penelitian melalui tahap-tahap studi literatur, studi perbandingan, analisis, perancangan,
implementasi dan terakhir pengujian. Dalam studi literatur, tiga referensi
utama yang digunakan adalah [Gudg00], [Gamm95], dan [Leff00] di samping berbagai
referensi pendamping. Studi perbandingan menggunakan program Rational Requisite-
Pro 2002 sebagai contoh alat bantu requirements management yang telah matang.
Analisis yang dilakukan terutama terhadap spesifikasi RQML serta bagaimana sebuah
komputer genggam dapat digunakan untuk pengumpulan requirement. Pada tahap
perancangan dibuat berbagai tampilan mock-up serta sebuah himpunan requirement
untuk program yang akan dibuat. Pada tahap implementasi, program dibuat dengan
semaksimal mungkin digunakan design patterns serta memperlakukan [Gamm95]
sebagai ‘buku solusi’ untuk masalah-masalah pemrograman. Setelah implementasi
selesai, program hasilnya diujikan dari berbagai perspektif dengan himpunan
requirement-nya masing-masing. Tahapan studi literatur dilakukan secara parallel dengan
studi perbandingan. Sedangkan tahapan-tahapan perancangan dan implementasi
dilakukan secara iteratif.
BAB 1 – PENDAHULUAN 4
Studi Studi Literatur
Perbandingan
Analisis
Perancangan
Implementasi
Pengujian
Gambar 1.1 Metodologi Penelitian
Analisis dilakukan atas dasar sebuah user story yang menggambarkan situasi
penggunaan Rambutan nantinya. Cara ini merupakan salah satu varian dari metode
skenario seperti CREWS [Maid96]. Bersamaan dengan spesifikasi RQML, user story
ini menjadi dasar untuk merumuskan requirement yang dibebankan kepada
Rambutan.
Berangkat dari data model RQML, perancangan Rambutan diawali dengan gambaran
garis besar sistem secara deskriptif (dituliskan berbentuk prosa) serta pembuatan
beberapa rancangan tampilan layar (screenshots) dari aplikasi handheld. Rancangan
kasar ini kemudian diperinci seiring dengan proses implementasi secara iteratif,
dengan design patterns [Gamm95] sebagai panduan untuk mengambil keputusankeputusan
rancangan program.
1.5 Sistematika Penulisan
Laporan tugas akhir ini terdiri dari dua bagian utama yaitu landasan teori yang diikuti
dengan bab-bab yang terkait pada pembuatan program. Landasan teori memberikan
perkenalan terhadap berbagai teori yang digunakan dalam pembuatan program;
meliputi requirements engineering, XML, Requirements Markup Language (RQML), dan
design patterns. Sedangkan pembahasan program meliputi analisis dan perancangan,
BAB 1 – PENDAHULUAN 5
Landasan Teori
2: Requirements Engineering
6: Analisis dan Perancangan
4: Requirements Markup Language
8: Pengujian
7: Implementasi
3: XML 5: Design Patterns
Gambar 1.2 Sistematika Penulisan
implementasi, serta pengujian. Tulisan ini diakhiri dengan satu bab penutup yang
memberikan rangkuman, kesimpulan, dan saran untuk penelitian-penelitian selanjutnya.
Gambar 1.2 menunjukkan hubungan ketergantungan antar bab yang ada dalam
laporan ini.
6
Bab 2
REQUIREMENTS ENGINEERING
The King’s Companion
The King called his wizard, Harry, into his chambers. “Harry, I require a
companion. I want you to find one for me. She must be strong and capable, yet
warm and affectionate. She must be intelligent, yet loyal and accepting of my
supreme authority. She must be attractive, yet find me loveable. She must be
able to entertain herself, yet be ready to cheerfully accompany me anywhere
at a moments notice. She must be quick to joy, slow to anger, and must never
criticize me. Oh – and Harry – I need her by tonight.”
Harry stared at the King. After a long pause, he started to speak. The King
abruptly stood up and waved him away. “I have given you my requirements.
You are a powerful wizard, I know you can find the perfect companion for me
– now go.”
Harry slowly nodded and retired to his tower.
Several hours later, while eating his supper, the King allowed himself to dream
about the wonderful woman the wizard would bring to him. She would be
sweet and warm, yet strong and intelligent. Surely, she would be the queen to
match his magnificent kingliness. He chortled as he thought about the other
kings with their chatty, stupid queens. They will most certainly envy him at
next month’s Monarch Golf Tournament and Banquet.
Imagine the King’s surprise when Harry arrived at the door with a beautiful
golden retriever. Imagine Harry’s frustration as he was led to the dungeon.
Harry’s yells can still be heard echoing in the vast corridors of the castle….
“But….. you said you wanted….”
Diangkat dari [Saut03], kisah “The King’s Companion” ini menceritakan salah satu
masalah yang melatarbelakangi munculnya requirements engineering sebagai bidang
ilmu. Klien (“The King”) memberikan berbagai requirement dengan deadline yang ketat
kepada vendor (“Harry”) tanpa memberikan kesempatan untuk memperjelas apa yang
BAB 2 – REQUIREMENTS ENGINEERING 7
diinginkannya . Untung saja vendor dapat memberikan suatu produk (“golden retriever”)
yang sesuai dengan semua requirement yang diberikan – namun sayangnya ‘solusi’
ini sama sekali bukan yang diinginkan oleh klien. Cerita ini berakhir dengan
tragis di mana kesalahan ditimpakan kepada vendor.
2.1 Definisi Requirements
Sebuah requirement dalam konteks rekayasa perangkat lunak adalah sebuah kemampuan
yang harus dimiliki dari suatu software [Dorf90]. Kemampuan ini dapat
ditujukan untuk memecahkan suatu permasalahan ataupun diperlukan untuk memenuhi
ketentuan-ketentuan tertentu (seperti standar tertentu, keputusan manajemen,
ataupun alasan-alasan politis).
Kumpulan dari berbagai requirement digunakan dalam berbagai aspek dalam pengembangan
sebuah sistem. Dalam tahap perancangan, requirement digunakan untuk
menentukan berbagai fitur yang akan ada di dalam sistem. Pada penghujung sebuah
development effort, himpunan requirement ini digunakan untuk melakukan validation
& verification untuk memastikan perangkat lunak yang telah dibuat memang sesuai
dengan yang diinginkan. Bahkan selagi pengembangan berjalan, himpunan
requirement ini terus dimodifikasi untuk menyesuaikannya dengan berbagai
kebutuhan para stakeholder serta tenggat waktu dan dana yang tersedia.
Secara luas, software systems requirements engineering (RE) adalah proses untuk menemukan
suatu himpunan requirement yang tepat sehingga suatu perangkat lunak
dapat memenuhi kegunaannya. Proses ini dilakukan dengan cara mengenali para
stakeholder serta kebutuhan mereka serta mendokumentasikannya di dalam bentuk
yang dapat digunakan untuk analisa, komunikasi, dan implementasi yang mengikutinya
[Nuse00].
Zave [Zave97] memberikan salah satu definisi yang paling jelas dari RE:
Requirements engineering is the branch of software engineering concerned
with the real-world goals for, functions of, and constraints on software
systems. It is also concerned with the relationship of these factors to precise
specifications of software behavior, and to their evolution over time and across
software families.
BAB 2 – REQUIREMENTS ENGINEERING 8
[re-enter process]
[agreed requirements]
[go-ahead given]
[project not feasible]
Feasibility Study
Requirements Management
Requirements Elicitation
Requirements Analysis and Negotiation
Requirements Documentation
Requirements Validation
Gambar 2.1 Proses RE.
2.2 Proses RE
Terdapat lima aktivitas utama di dalam proses requirements engineering [Koto98]:
• Requirements elicitation
• Requirements analysis and negotiation
• Requirements documentation
• Requirements validation
BAB 2 – REQUIREMENTS ENGINEERING 9
2 Seperti misalnya masalah “untuk merebut pasar pria usia 14-30 tahun.” Bahkan
menurut [Leff00], masalah yang hendak dipecahkan untuk permainan seperti SimCity atau
Myst adalah “terlalu banyak waktu luang yang dimiliki seseorang.”
• Requirements management and evolution
Sebuah activity diagram UML yang menunjukkan hubungan yang umum terjadi antara
aktivitas-aktivitas tersebut tertera pada Gambar 2.1. Keterangan singkat mengenai
masing-masing aktivitas akan diberikan selanjutnya. Rincian dari masing-masing
tahap ini dapat ditemukan di [Koto98], [Wieg99] dan berbagai buku teks lainnya
mengenai requirements engineering.
2.2.1 Requirements Elicitation
Pada tahap ini dikumpulkan berbagai requirement dari para stakeholder [Pres01].
Seorang pelanggan mempunyai masalah yang dapat ditangani oleh solusi berbasis
komputer. Tantangan ini ditanggapi oleh seorang pengembang. Di sinilah komunikasi
dimulai antara pelanggan, pengembang, dan calon pengguna dari sistem yang akan
dibuat.
Namun istilah elicitation agak diperdebatkan. Ada yang menganalogikannya dengan
seperti yang dilakukan oleh para arkeolog ketika mengumpulkan runtuhan-runtuhan
di situs purbakala [Leff00]. Ada yang memberikan istilah requirements capture karena
dilakukan terutama dengan mengumpulkan fakta-fakta [Benn00]. Bahkan [Gudg00]
menyatakan bahwa requirement sebenarnya dibuat ketimbang didapatkan (elicitated).
Walau yang terakhir ini nampaknya “lain sendiri”, argumen ini dapat diterima untuk
pengembangan software yang sama sekali baru maupun untuk software-software permainan
(games) yang terkadang permasalahan yang akan dipecahkan oleh game
tersebut cenderung tidak berhubungan dengan solusinya ataupun sebenarnya
masalah yang ada berasal dari bagian marketing2.
Sejalan dengan proses RE secara keseluruhan, tujuan dari requirements elicitation
adalah [Gudg00]:
• Untuk mengetahui masalah apa saja yang perlu dipecahkan dan mengenali
perbatasan-perbatasan sistem (system boundaries).
• Untuk mengenali siapa saja para stakeholder.
BAB 2 – REQUIREMENTS ENGINEERING 10
• Untuk mengenali tujuan dari sistem; yaitu sasaran-sararan yang harus
dicapainya.
Dalam [Nuse00] disebutkan beberapa jenis teknik pengumpulan requirement:
• Traditional techniques merupakan berbagai cara pengumpulan data. Cara-cara
ini termasuk kuesioner, survey, wawancara, serta analisis dari berbagai dokumentasi
yang ada seperti struktur organisasi, petunjuk pelaksanaan (juklak)
serta manual-manual dari sistem yang sudah ada.
• Group elicitation techniques bertujuan untuk mengembangkan dan mendapatkan
persetujuan stakeholder, sementara memanfaatkan dinamika kelompok
untuk memperoleh pengertian yang lebih mendalam. Cara-cara ini termasuk
brainstorming dan focus group, juga berbagai workshop RAD/JAD (workshop
untuk membangun sebuah konsensus dengan menggunakan seorang fasilitator
yang netral).
• Prototyping techniques membuat suatu implementasi parsial dari software yang
akan dibangun untuk membantu para pengembang, pengguna, serta pelanggan
untuk lebih mengerti berbagai requirement sistem [Leff00]. Digunakan untuk
mendapatkan umpan-balik yang cepat dari para stakeholder [Davi92], teknik ini
juga dapat digabungkan dengan berbagai teknik yang lain, seperti misalnya
digunakan di dalam sebuah acara group elicitation ataupun sebagai basis dari
sebuah kuesioner.
• Model-driven techniques menempatkan suatu model khusus dari jenis informasi
yang akan dikumpulkan untuk digunakan sebagai pedoman proses elicitation.
Termasuk di antaranya adalah goal based methods seperti KAOS [Lams98] dan
I* [Chun00] dan juga cara-cara berbasis skenario seperti CREWS [Maid96].
• Cognitive techniques termasuk serangkaian cara yang semulanya dikembangkan
untuk knowledge acquisistion untuk digunakan di knowledge-based systems
[Shaw96]. Teknik-teknik ini termasuk protocol analysis (di mana seorang ahli
melakukan sebuah tugas sembari mengutarakan pikiran-pikirannya), laddering
(menggunakan berbagai pemeriksaan untuk mendapatkan struktur dan isi dari
pengetahuan stakeholder), card sorting (meminta para stakeholder untuk
menysun kartu-kartu secara berkelompok, di mana setiap kartu tertera nama
BAB 2 – REQUIREMENTS ENGINEERING 11
sebuah domain entity), dan repertory grids (membuat sebuah attribute matrix for
entities di mana para stakeholder diminta untuk mengisi matriks tersebut).
• Contextual techniques muncul pada tahun 1990-an sebagai sebuah pilihan di
luar traditional maupun cognitive techniques [Gogu94]. Termasuk di antaranya
penggunaan teknik etnografis seperti pengamatan terhadap para peserta. Juga
termasuk ethnomethodogy dan analisis percakapan, yang keduanya menggunakan
analisis terinci untuk mengenali pola-pola dalam percakapan dan interaksi
[Vill99].
Dalam aktivitas requirements elicitation, ada baiknya untuk mengkategorikan berbagai
requirement yang ditemukan. Suatu requirement dapat diklasifikasi sebagai functional
requirement, non-functional requirement, maupun constraints [Grad92]. Sedangkan[
Koto98] mengatakan bahwa suatu requirement dapat diklasifikasikan menjadi very
general requirements, functional requirements, implementation requirements, performance
requirements, dan usability requirements.
Namun nyatanya klasifikasi (atau cara-cara pengkategorian lainnya) requirement ini
tidak mutlak diperlukan; klasifikasi requirement ditujukan terutama untuk menuntun
proses elicitation. Hal ini perlu diwaspadai karena gara-gara para anggota tim tidak
dapat setuju akan klasifikasi dari sekumpulan requirement, maka development effort
dari sebuah perusahaan Fortune 500 mengalami stagnasi [Leff00]. Terjebaknya
mereka di dalam masalah semantik ini merupakan salah satu contoh dari analysis
paralysis [Whit99].
2.2.2 Requirements modeling and analysis
Sebuah model adalah perwakilan dari benda lain yang mempunyai rincian yang cukup
untuk membantu penyelesaian tugas-tugas tertentu [Benn00]. Data modeling
bertujuan untuk mendapatkan pengertian dari pemrosesan serta pengaturan
informasi. Behavioral modeling memodelkan berbagai perilaku dari para stakeholder
serta berbagai sistem lain yang berhubungan dengannya. Domain modeling menyediakan
suatu bentuk abstrak dari dunia tempat beroperasinya sistem yang akan
dibuat.
Model-model yang dihasilkan dalam tahap ini ditujukan untuk analisa terhadap
berbagai requirement yang ada. Para stakeholder berunding untuk mendapatkan
BAB 2 – REQUIREMENTS ENGINEERING 12
suatu himpunan requirement akhir yang akan digunakan untuk tahap pengembangan
selanjutnya. Menurut [Koto98] setelah selesainya tahap idealnya ini akan berlaku:
• Berbagai requirement dari masing-masing stakeholder tidak bertentangan.
• Informasi di dalam semua requirement harus lengkap.
• Berbagai requirement yang ada harus selaras dengan anggaran yang dimiliki.
Walaupun dengan adanya batasan-batasan tersebut, seluruh requirement sebaiknya
mudah diubah ataupun disesuaikan.
2.2.3 Requirements documentation
Tahap ini adalah penulisan dari requirements document, yang terkadang disebut
dokumen Software Requirements Specification (SRS). Menurut [Hen80], dokumen ini
sebaiknya:
• Hanya menetapkan perilaku sistem sebagaimana terlihat dari luar
• Menetapkan batasan-batasan (constraints) yang diberikan kepada implementasinya.
• Mudah diubah.
• Berguna sebagai alat referensi untuk pemeliharaan sistem.
• Memuat gambaran akan siklus kehidupan sistem di masa yang akan datang.
Untuk meningkatkan readability, beberapa standar dokumentasi SRS telah dikembangkan.
Namun menurut [Kov99], serangkaian standar dan template apabila berdiri
sendiri tidak dapat digunakan sebagai cara yang mandraguna untuk memberi struktur
bagi sekumpulan requirement; tetapi struktur yang digunakan haruslah dikembangkan
sendiri-sendiri tergantung dari masalah yang sedang ditangani. Masalah standarisasi
notasi dan pendokumentasian requirement membuat pendekatan sistematis terhadap
RE menjadi sulit. [McDe94] memberikan sebuah daftar praktis ciri-ciri yang dinginkan
pada sebuah requirements document:
• Unambigous. Idealnya, hanya ada satu interpretasi terhadap sebuah requirements
document.
• Complete. Semua aspek yang bersangkutan haruslah dijelaskan secara lengkap
di dalam requirements document.
BAB 2 – REQUIREMENTS ENGINEERING 13
• Consistent. Tidak ada pernyataan yang bertentangan dalam requirements
document.
• Verifiable. Setelah sebuah sistem diimplementasikan, sebaiknya dapat dipastikan
bahwa sistem tersebut memenuhi requirement awal.
• Validatable. Suatu requirement sebaiknya dapat diperiksa oleh pelanggan untuk
memastikan bahwa requirement tersebut memang memenuhi kebutuhannya.
• Modifiable. Perubahan sebaiknya mudah dilakukan dan efek dari perubahan ini
terhadap bagian-bagian lain sebaiknya minimal.
• Understandable. Semua stakeholder sebaiknya dapat mengerti requirement seperti
ditetapkan di dalam dokumen.
• Testable. Semua requirement sebaiknya cukup kuantitatif untuk digunakan sebagai
titik tolak pengujian sistem.
• Traceable. Harus dimungkinkan adanya pengacuan (reference) antar berbagai
bagian di dokumen requirement ataupun ke bagian-bagian lain dari proses pembuatan
perangkat lunak.
2.2.4 Requirements validation
Dalam tahap ini, dokumen dari tahap sebelumnya diperiksa agar memenuhi kriteriakriteria
sebagai berikut [Koto98]:
• Lengkap.
• Konsisten.
• Tunduk pada keputusan-keputusan yang diambil pada tahap requirements
analysis.
Apabila ada requirement yang tidak memenuhi kriteria-kriteria tersebut, mungkin ada
baiknya bagi proses RE untuk kembali ke tahap-tahap sebelumnya. Beberapa contoh
masalah requirement yang terungkap pada tahap validasi antara lain [Koto98]:
• Kurang/tidak cocok dengan bakuan-bakuan kualitas.
• Kata-kata yang digunakan kurang baik sehingga requirement menjadi ambigu.
• Berbagai kesalahan yang terdapat pada model-model baik – model sistem
ataupun model permasalahan yang hendak dipecahkan.
• Pertentangan antar requirement yang tidak ditemukan pada tahap analisis.
BAB 2 – REQUIREMENTS ENGINEERING 14
2.2.5 Requirements management and evolution
Sebuah software yang sukses pasti akan berevolusi mengikuti perubahan lingkungannya.
Sebaliknya, software yang sudah tidak diperbaharui berarti telah ditinggalkan
oleh para penggunanya. Dalam perjalanan evolusi sebuah software, requirement akan
software tersebut akan bertambah, berubah, atau terkadang berkurang. Agar
perubahan ini terkendali, perlu adanya aktivitas requirements management (RM).
Walaupun berbagai aktivitas RE dalam Gambar 2.1 digambarkan secara terpisah,
namun sebenarnya pemisahan antara aktivitas-aktivitas ini tidaklah terlalu kentara.
Proses elicitation, analysis, documentation, dan validation dalam RE berjalan secara
berkesinambungan tanpa adanya batasan-batasan yang definitif. Fungsi lain dari
requirements management adalah untuk memastikan agar berbagai aktivitas dalam
proses RE ini berjalan dengan baik – agar iterasi demi iterasi dalam RE dilakukan
secara terkendali dan (diharapkan) menuju suatu kemajuan. Maka dari itu
requirements management digambarkan secara paralel dengan pengulangan dari
aktivitas-aktivitas RE lainnya.
Dalam aktivitasnya mengendalikan perubahan requirement maupun mengendalikan
proses RE itu sendiri, pada requirements management juga dilakukan penyusunan berbagai
informasi traceability – yaitu keterhubungan antara berbagai artifak di dalam
proses RE (termasuk perubahan requirement). Traceability itu sendiri merupakan
konsep yang penting di dalam RE yang akan selanjutnya dibahas berikutnya.
2.3 Traceability
Traceability adalah cara untuk membentuk hubungan-hubungan antara manusia dan
sistem dengan model-model di mana mereka dikelola [Jark98]. Kutipan berikut
memberikah sebuah garis besar mengenai pentingnya traceability di dalam rancangan
sistem secara keseluruhan:
“Requirement tracing is emerging as an effective bridge that aligns system
evolution with changing stakeholder needs. It also helps uncover unexpected
problems and innovative opportunities, and lays the groundwork for corporate
knowledge management.” [Jark98]
BAB 2 – REQUIREMENTS ENGINEERING 15
forward-to
forward-from
backward-from
problem domain
solution domain
backward-to
requirements
pretraceability
posttraceability
Gambar 2.2 Empat jenis informasi traceability tradisional
Secara tradisional ada empat jenis informasi traceability ([Koto98], [Jark98]):
• Forward-from traceability menghubungkan requirement ke rancangan
komponen-komponen dan penerapannya serta memberikan tanggungjawab
kepada komponen-komponen sistem tersebut untuk pencapaian requirementrequirement
tertentu.
• Backward-to traceability menghubungkan rancangan serta komponenkomponen
penerapannya kembali kepada requirement untuk memungkinkan
pengujian sistem terhadap pemenuhan requirement tersebut.
• Forward-to traceability menghubungkan informasi domain beserta informasi
lain yang bersangkutan yang mendahului rancangan sistem ke berbagai requirement.
Traceability ini memungkinkan penaksiran pengaruh perubahan kebutuhan
stakeholder maupun perubahan berbagai asumsi.
• Backward-from traceability menghubungkan requirement ke sumber-sumbernya
pada dokumen-dokumen ataupun orang-orang lain. Traceability ini memungkinkan
diketahuinya struktur kontribusi yang mendasari berbagai requirement
yang ada – yang sangat penting di dalam validasi requirement.
BAB 2 – REQUIREMENTS ENGINEERING 16
3 IT: Information Technology
Dua jenis trace yang pertama sering disebut post-traceability sedangkan dua yang
terakhir disebut pre-traceability. Seperti ditunjukkan di [Jark98], saat ini post-traceability
cenderung lebih dimengerti ketimbang pre-traceability, walaupun pre-traceability
mempunyai kemungkinan untuk menyediakan hubungan antara bisnis dengan IT3
yang saat ini sangat diperlukan.
Walaupun empat jenis trace tersebut sangat populer di dalam berbagai literatur,
mereka bukanlah satu-satunya jenis traceability yang ada. Bahkan pada [DP98], nampak
bahwa untuk setiap proyek mungkin diperlukan jenis-jenis trace-nya sendiri
sesuai dengan kebutuhan proyek tersebut; kemampuan ini disediakan di banyak alat
bantu RE (hal ini akan ditelusuri lebih lanjut pada bab ini juga).
2.4 Requirements Patterns
Dalam [Gamm95] telah ditunjukkan bahwa pattern dapat membawa pengaruh positif
dalam bidang software engineering. Walau buku ini membahas design pattern – yang
notabene adalah artifak dari solution space, semangat yang sama juga dapat
diterapkan pada problem space. Dengan mengumpulkan serta mengkategorisasikan
berbagai pengalaman kolektif dalam bidang RE, tentulah akan meningkatkan kualitas
RE sebagai ilmu praktis.
Sebuah pattern adalah pemecahan yang telah ditemukan untuk suatu masalah yang
umum. Praktis diresmikan oleh Gamma dkk. dalam [Gamm95], suatu pattern digambarkan
sebagai kesatuan dari niatan, alias, motivasi, penggunaan, akibat, serta contoh
penerapannya (lihat subbab 5.1 di halaman 55).
Berbagai keuntungan yang bisa didapatkan dengan mempelajari pattern menjadi pendorong
riset ke arah RE patterns. Sedikit berbeda dengan design patterns, tujuan dari
setiap RE pattern adalah untuk mengurangi ambiguitas yang dapat terjadi serta pada
saat yang bersamaan memberikan kebebasan terhadap pemenuhan requirement
tersebut [Cree99].
Memang studi RE patterns masih ketinggalan ketimbang yang telah dilakukan di dalam
solution space. Walaupun demikian, [Cree99] telah memberikan tiga pattern sebagai
satu permulaan bagi sebuah katalog yang dapat menandingi [Gamm95]. Ketiga
BAB 2 – REQUIREMENTS ENGINEERING 17
pattern ini telah digunakan dengan sukses di dalam empat SRS yang berbeda di mana
masing-masing menangani problem domain yang berbeda pula:
• Specify (Locate) – menggambarkan bagaimana seorang (sebuah) aktor dapat
menemukan suatu obyek di dalam aplikasi.
• Present (Display) – menggambarkan data yang harus ditampilkan oleh aplikasi.
• Prioritize (Sort) – untuk mengkomunikasikan bagaimana suatu aspek aplikasi
didahulukan dari yang lain.
Ketiga pattern di atas terutama difokuskan untuk pembuatan berbagai requirement
statement. Tetapi karena RE juga meliputi requirements management, maka [Ambl00]
memberikan dua pattern berikut untuk mengatasi berbagai tantangan politis di dalam
RE:
• Requirement As [a] Shield – ketika seseorang mengkritik pekerjaan yang
dilakukan, untuk menunjukkan bahwa kritik yang dilontarkan tidak berhubungan
dengan masalah yang sedang ditangani.
• Requirement As [a] Stick – untuk meniadakan berbagai pendekatan atau strategi
yang diusulkan namun tidak menguntungkan bagi organisasi; dengan mengevaluasi
pendekatan-pendekatan dan strategi ini terhadap requirement yang telah
diterima, kelemahan-kelemahannya akan cepat nampak.
2.5 Alat Bantu RE
Tipe alat bantu RE yang menjadi fokus proyek ini adalah alat bantu untuk requirements
management. Alat bantu ini berguna untuk mengumpulkan system requirements
di dalam sebuah tempat penyimpanan serta menyediakan berbagai fasilitas
untuk mendapatkan informasi mengenai berbagai requirement tersebut. Menurut
[Koto98], sebuah alat bantu requirements management umumnya memiliki fasilitasfasilitas
berikut:
• Sebuah requirements browser sehingga para pembaca dapat mengambil suatu
requirement yang spesifik dari database ataupun repository.
• Sebuah query system sehingga para pengguna dapat mengambil berbagai
requirement yang berhubungan.
• Sebuah requirements converter dan processor linker yang dapat mengubah
berbagai requirement di dalam sebuah dokumen pengolah kata ke dalam bentuk
BAB 2 – REQUIREMENTS ENGINEERING 18
basis data requirement dan dapat memelihara hubungan antara database dengan
perwakilan bahasa alami dari requirement tersebut.
• Sebuah change control system yang dapat memelihara informasi mengenai
perubahan-perubahan requirement dan hubungan-hubungan dengan berbagai
requirement yang terpengaruhi oleh perubahan tersebut.
2.5.1 Arsitektur Alat Bantu
Secara tradisional, alat bantu RE menyimpan berbagai requirement di dalam bentuk
database atau dokumen. Menurut [Wieg99], pendekatan berbasis dokumen untuk
menyimpan requirement mempunyai beberapa keterbatasan:
• Sulit untuk menjaga agar semua dokumen tetap tersinkronisasi dan terkini.
• Mengkomunikasikan perubahan-perubahan kepada semua anggota tim yang
terpengaruh merupakan sebuah proses manual.
• Sulit untuk membuat hubungan-hubungan antara functional requirement dengan
berbagai use case, rancangan, kode program, pengujian, dan berbagai tugas
untuk menghasilkan artifak-artifak tersebut.
• Tidak praktis untuk melacak status dari setiap requirement.
Selain masalah-masalah di atas, masalah umum yang terjadi dengan bahasa alami
sudah umum diketahui. Sebuah pemecahan kepada masalah-masalah ini adalah
dengan menyimpan berbagai requirement di dalam sebuah basis data multi-user serta
mengendalikan akses kepadanya dengan alat bantu requirement management. Namun
juga ada beberapa batasan dengan pendekatan ini [Gudg00]:
• Format file database seringkali proprietary dan tidak dapat dibaca oleh manusia.
• Format file database tidak komplementer; apabila sebuah dokumen requirement
disimpan di dalam suatu database menggunakan satu alat bantu maka tidaklah
mungkin untuk menambah informasi dengan suatu alat bantu lain yang
berbeda. Hal ini hanya mungkin dengan dokumen, di mana lebih banyak
informasi dapat diberikan dengan menambahkan lebih banyak teks.
• Karena sebenarnya tidak ada dokumen requirement, maka proses requirement
yang ada sangat tergantung dengan alat bantu yang digunakan.
Banyak alat bantu RE yang menggabungkan kedua pendekatan, baik yang berbasis
dokumen maupun dengan database. Dengan pendekatan itu, sebuah dokumen
BAB 2 – REQUIREMENTS ENGINEERING 19
Natural language
Requirements
Document
Requirements
convertor
Requirements
database
Traceability
support
Word
processor
linker
Requirements
browser
Requirements
query system
Report
generator
Change
control
system
Requirements
report
Traceability
Report
Gambar 2.3 Sebuah requirement management system tradisional, di mana dokumen-dokumen dalam
bahasa alami, laporan-laporan, dan basis data requirement adalah kesatuan-kesatuan yang terpisah
[Koto98]
requirement dimanipulasi dengan sebuah alat bantu, tetapi sebuah basis data
dipelihara di sampingnya untuk menyimpan berbagai attribut, tabel traceability, dan
sebagainya. Sebuah gambaran luas mengenai alat seperti itu ada pada Gambar 2.3.
Sedangkan INCOSE [Jone95] memberikan empat jenis arsitektur alat bantu
requirements management:
• Arsitektur A – document based. Arsitektur ini menggunakan komponen utama
sebuah program spreadsheet (seperti QuattroProTM, Lotus 1-2-3TM, ExcelTM) atau
word processor (seperti WordPerfectTM, AmiProTM, atau MS WordTM) dengan diberi
fungsi-fungsi tambahan untuk melakukan RM dengan menggunakan fasilitas
pemrograman yang diberikan oleh program paket tersebut (umumnya bahasa
macro). Teks di dalam dokumen diberi tanda-tanda khusus yang menandakan
teks tersebut sebagai sebuah requirement.
• Arsitektur B – hybrid. Seperti pada Arsitektur A namun dengan tambahan
validasi automatis dari berbagai requirement yang terdapat di dalam dokumendokumen.
Alat-alat ini dapat menghasilkan sebuah daftar yang memuat
berbagai requirement yang terlalaikan ataupun tidak perlu.
BAB 2 – REQUIREMENTS ENGINEERING 20
• Arsitektur C – special-purpose-database-based. Alat-alat RM yang termasuk
di dalam kategori ini menyimpan seluruh teks requirement di dalam sebuah basis
data, namun program database yang digunakan adalah bagian dari program RM
itu sendiri.
• Arsitektur D – general-purpose-database-based. Alat bantu yang termasuk
kategori ini menyimpan teks requirement menggunakan database yang terpisah.
Program DBMS yang digunakan adalah suatu program – umumnya komersial –
tersendiri.
2.5.2 Alat bantu komersial
Tabel berikut ini memuat beberapa alat bantu RM yang banyak digunakan, sebagaimana
dituliskan oleh Wiegers [Wieg00]. Dalam tabel berikut juga diberikan kelas
arsitektur alat bantu RM menurut klasifikasi INCOSE [Jone95].
Tabel 2.1 Beberapa alat bantu requirements management komersial
Alat Bantu Penyedia Arsitektur
Caliber-RM Technology Builders, Inc.
http://www.tbi.com
D (version 3.0)
DOORS Quality Systems and Software, Inc.
http://www.qssinc.com
C (version 2.1)
RequisitePro Rational Software Corporation
http://www.rational.com
B, D (version 2002)
RTM Workshop
Integrated Chipware, Inc.
http://www.chipware.com
D (version 2.3)
Vital Link Compliance Automation, Inc.;
http://www.complianceautomation.com
C (version 2.0)
Ulasan mengenai perbandingan alat-alat bantu requirements management bisa
didapatkan di [Inco02] dan [Achr03].
21
Bab 3
XML
Sebelum memperkenalkan XML, ada baiknya untuk membahas dasar-dasarnya di
dalam ilmu komputer. XML adalah sebuah versi penyederhanaan dari Standard
Generalized Markup Language (SGML), sebuah sistem untuk mengatur dan menandai
elemen-elemen dari sebuah dokumen. SGML dikembangkan dan distandarisasi oleh
International Organization for Standards (ISO) pada tahun 1986. SGML masih digunakan
secara luas di dalam industri penerbitan, namun karena besar dan kerumitannya,
SGML menjadi kurang ideal untuk penggunaan secara luas di era Internet. Untuk memecahkan
masalah-masalah ini, World-Wide Web Consortium (W3C) [Cons] membuat
XML sebagai sebuah subset dari SGML – walaupun kini XML mempunyai fitur-fitur
yang tidak didukung SGML sehingga XML tidak lagi merupakan sebuah subset.
Seperti dijelaskan di [Marc99], XML awalnya dirancang sebagai HTML yang lebih baik.
Sejalan dengan perkembangan popularitasnya, kegunaan XML sekarang menjadi lebih
luas ketimbang tujuan awalnya. Nampak bahwa XML telah menjadi sebuah standar
untuk pertukaran data, di mana penggunaannya tidak hanya untuk halaman web saja,
namun juga untuk data yang lain. Melalui berbagai inisiatif seperti BizTalk,
RosettaNET dan ebXML – yang bertujuan untuk memajukan penggunaan XML untuk
memungkinkan perniagaan elektronis dan penggabungan aplikasi – serta standar seperti
Simple Object Access Protocol (SOAP) [Cons00a] – yang merupakan protokol untuk
pertukaran informasi di sebuah lingkungan terdesentralisir dan terdisitributif – perkembangan
XML telah melampaui kegunaan awalnya. Pada saat standar integrasi dan
pertukaran data seperti IDEF0 [Fede] dan OpenDoc [IBM] telah gagal, atau setidaknya
tidak dapat mencapai potensinya secara penuh, XML akan sangat mungkin menjadi
sukses.
Ciri kunci dari XML adalah sifat keterbukaannya. Pada [Oxfo90], open system didefinisikan
sebagai berikut:
Any system in which the components conform to non-proprietary standars
rather then to the standards of specific supplier of hardware or software.
BAB 3 – XML 22
Karena standar XML serta berbagai standar pendukungnya didefinisikan oleh sebuah
konsorsium (W3C) ketimbang satu vendor tertentu, maka XML memenuhi kriteria open
system.
3.1 Markup
Markup adalah nama yang diberikan pada keterangan yang menjelaskan teks:
Igor 􀂖 Name
Asisten Laboratorium 􀂖 Job
XML adalah sebuah markup language yang menetapkan suatu cara untuk menulis
markup. Pada XML markup di atas mungkin berbentuk seperti ini:
Igor
Asisten Laboratorium
XML juga extensible karena memungkinkan Anda untuk menambah jenis-jenis
markup Anda sendiri. Ini tercermin dari nama XML, eXtensible Markup Language.
Ringkasnya, XML adalah sebuah meta-language yang memungkinkan Anda untuk
membuat dan membentuk sebuah markup untuk dokumen-dokumen Anda sendiri.
XML dikembangkan oleh W3C [Grah99], awalnya untuk menanggulangi keterbatasanketerbatasan
HTML. Akan tetapi kegunaannya telah berkembang melewati maksud
awalnya. Sebuah hasil sampingan pada rancangan XML – seperti disebutkan di
[Ecks99] – adalah bahwa XML memungkinkan pemisahan isi dari penampilan.
Ulasan XML ini dipusatkan untuk memberi perkenalan sangat singkat pada dasardasar
XML dan terus untuk menjelaskan lebih dalam hasil-hasil XML yang secara
istimewa mempunyai sangkut paut dengan proyek ini.
3.2 Terminologi XML
Sebuah dokumen XML terdiri dari satu atau lebih elemen (unsur). Sebuah elemen
ditandai dengan bentuk sebagai berikut:

Ini adalah data menurut susunan unsur contoh.

Elemen ini terdiri dari dua tag (etiket), sebuah tag pembuka yang melingkupi unsur
di antara sebuah tanda kurang-dari () dan sebuah tag
BAB 3 – XML 23
penutup yang serupa kecuali untuk garis-miring-depan (/) yang nampak sebelum
nama elemen. Teks di antara tag pembuka dan penutup dianggap sebagai bagian dari
elemen tersebut. Tidak seperti HTML, semua tag pembuka harus mempunyai tag
penutup yang bersesuaian, kecuali untuk elemen kosong. Suatu elemen dapat
disarangkan (nested) di dalam unsur lain, seperti berikut:
Diperbolehkan
namun penyarangan tidak dapat saling meliputi, seperti berikut:
Tidak diperbolehkan
Selanjutnya, setiap dokumen XML harus mempunyai hanya satu unsur akar (root
element). Hal ini berarti dokumen XML dapat diwakili oleh struktur data pohon.
Unsur dapat mempunyai atribut (perlengkapan), seperti:
Igor
“usia” adalah atribut dari unsur “nama” dan nilainya adalah 45, yang diberikan di
dalam tanda kutip.
Selain elemen biasa, XML juga mendukung elemen kosong di mana tidak ada teks di
antara tag pembuka dan penutup. Maka dari itu kedua etiket dapat digabungkan.
Kedua elemen berikut ini adalah serupa:

3.3 Konsep XML Secara Luas
Walaupun sebuah keberadaan dokumen XML hanya dapat menampung teks yang
diberi markup dengan berbagai tag seperti telah dibahas sebelumnya, sebuah dokumen
XML juga dapat mengandung hal-hal lain. Nyatanya ada tiga kesatuan yang dapat
diuraikan oleh sebuah aplikasi XML (seperti digambarkan di [Ecks99]):
• XML Document Mengandung data dokumen, dietiketkan dengan unsur-unsur
XML yang mempunyai arti, beberapa di antaranya dapat mengandung perlengkapan.
BAB 3 – XML 24
• Document Type Definition (DTD) Menentukan aturan-aturan bagaimana
unsur-unsur dan perlengkapan-perlengkapan, dan penentapan data lainnya dari
sebuah dokumen yang tunduk pada standar XML.
• Stylesheet Memerintahkan bagaimana sebuah dokumen sebaiknya dibentuk
ketika mereka ditampilkan. Berbagai stylesheet yang berbeda dapat diterapkan
pada dokumen yang sama, sehingga mengubah penampilannya tanpa
memempengaruhi data yang mendasarinya.
Maka dari itu, DTD menentukan informasi apa saja yang dapat disimpan di dalam
sebuah berkas XML dan stylesheet mengubah bentuk satu dokumen XML menjadi
bentuk yang lain. DTD dan stylesheet ditetapkan di dalam standarnya masingmasing,
yang akan ditinjau pada dua bagian berikut ini.
3.4 Document Type Definition
Keberadaan-keberadaan dari dokumen XML adalah well-formed (bentuk-baik) atau
valid (sah). Sebuah keberadaan dokumen XML dikatakan well-formed apabila dokumen
tersebut mengikuti sintaksis XML, yaitu bagian-bagian paling penting yang ditetapkan
sebelumnya di Terminologi XML (subbab 3.2). Kebentukbaikan didefinisikan
secara lengkap di [Grah99], namun pada umumnya sebuah dokumen adalah wellformed
jika dokumen tersebut memiliki dari campuran tag awal dan akhir yang benar,
semua attribut diberi tanda kutip secara benar, character set digunakan secara benar,
dan seterusnya. Kebentukbaikan adalah satu hal yang harus dimiliki oleh semua
dokumen XML; tanpa menjadi well-formed, sebuah dokumen XML bukanlah dokumen
XML.
Hal lain yaitu sebuah keberadaan dokumen XML dapat valid (sah). Keabsahan secara
tidak langsung menyatakan bahwa dokumen tersebut juga well-formed. Perbedaan
di antara dokumen yang valid dan dokumen yang well-formed adalah sebuah dokumen
valid harus memenuhi sebuah Document Type Definition (DTD), tetapi sebuah dokumen
well-formed tidak memerlukannya. Maka dari itu dokumen valid dikatakan lebih
ketat. Peran dari DTD adalah untuk menentukan elemen-elemen apa saja yang dapat
berada di dalam suatu dokumen berikut susunannya. Berikut ini adalah contoh dari
sebuah dokumen well-formed:

BAB 3 – XML 25
Igor
Asisten Laboratorium

Seseorang dapat saja menambahkan berbagai tag dan/atau attribut lainnya ke
dokumen ini dan akan masih well-formed:

Igor
Asisten Laboratorium
Tidak ada!

Walaupun demikian, ekstensibilitas ini tidak selalu diinginkan. Katakanlah contohcontoh
di atas diciptakan oleh seorang ilmuwan gila yang ingin menggunakan XML
untuk melacak kakitangannya (yaitu Henchmen Tracking Markup Language – atau
HTML). Jika ia juga ingin untuk menulis program-program komputer untuk mengolah
bahasa tersebut, sangat mungkin ia akan ingin membatasi cara-cara markup yang
dapat digunakan (sehingga program-programnya dapat bekerja dengan instance mana
pun dari dokumennya). Hal ini dapat dicapai menggunakan DTD sebagai berikut:

Dokumen XML pertama di atas adalah sah menurut DTD ini, namun dokumen yang
kedua tidak. Sebuah ciri penting dari DTD adalah kemampuannya untuk menetapkan
jenis-jenis attribut yang berbeda. Sebuah daftar lengkap jenis-jenis attribut yang
mungkin ada diberikan di [Marc99], namun jenis-jenis berikut ini adalah yang relatif
sering digunakan:
• CDATA untuk attribut string.
• ID untuk pengenal, yaitu sebuah nama yang khas di dalam dokumen.
• IDREF adalah pengacuan kepada sebuah attribut ID yang ditentukan di tempat
lain pada dokumen yang sama.
• IDREFS adalah sebuah daftar IDREF yang dipisahkan oleh spasi-spasi.
• NMTOKEN pada dasarnya adalah sebuah kata tanpa spasi.
• NMTOKENS adalah sebuah daftar attribut NMTOKEN yang dipisahkan oleh spasispasi.
BAB 3 – XML 26
Sebuah nilai awal dapat ditentukan untuk sebuah attribut. Jika dokumen tidak
mempunyai attribut itu, maka nilanya dianggap nilai awal yang dapat mengambil
salah satu dari nilai-nilai berikut:
• #REQUIRED berarti sebuah nilai harus disediakan di dokumen.
• #IMPLIED berarti jika tidak ada nilai yang diberikan, aplikasi yang mengolah
dokumen XML harus menggunakan nilai awalnya sendiri.
• #FIXED diikuti oleh sebuah nilai berarti perlengkapan yang bersangkutan adalah
tetap pada nilai tersebut.
Sebuah nilai literal perarti attribut tersebut akan diberikan nilai itu bila tidak ada yang
ditentukan di dokumen.
3.4.1 Masa depan DTD
DTD merupakan warisan dari SGML. Karena alasan sejarah, kemampuan DTD menjadi
agak terbatas. Keterbatasan terbesar adalah sintaks yaitu DTD bukanlah XML
well-formed, yang berarti dokumen-dokumen DTD tidak dapat diolah oleh peralatan
XML. Untuk memecahkan masalah ini, W3C sedang mengerjakan beberapa usulan
untuk mengendalikan isi dokumen kemudahan dan daya yang lebih ketimbang yang
dimungkinkan sekarang.
3.5 eXtensible Stylesheet Language (XSL)
eXtensible Stylesheet Language (XSL) terdiri dari serangkaian markup yang dapat
digunakan untuk menerapkan aturan-aturan pembentukan untuk setiap elemen di
dalam sebuah dokumen XML. XSL bekerja dengan menerapkan berbagai aturan style
pada isi dari sebuah dokumen XML, berdasarkan unsur-unsur yang ditemukannya
[Ecks99]. XSL diatur menjadi dua bagian:
• XSLT; untuk XSL Transformation
• XSLFO; untuk XSL Formatting Objects
Sebuah XSL Processor menerima sebuah dokumen XSL dan menggunakannya untuk
mentransformasikan suatu bentuk dokumen XML menjadi bentuk dokumen XML
lainnya.
BAB 3 – XML 27
Gambar 3.1 Arsitektur pengurai XML secara
umum
3.6 Pengurai XML
Walaupun struktur dokumen XML termasuk sederhana, pembuatan program untuk
menguraikan dokumen-dokumen XML tidak dapat dikatakan suatu tugas yang sepele.
Oleh karena itu muncul suatu jenis perangkat lunak yang disebut Pengurai XML (XML
Parsers).
Sebuah pengurai XML umumnya berbentuk pustaka (software library) tingkat menengah
yang memberikan layanan-layanan bagi aplikasi pada tingkat yang lebih tinggi
untuk membaca serta mengambil data yang terletak di dalam dokumen XML.
Pengurai-pengurai XML ini menetapkan API tertentu untuk berinteraksi dengan
program aplikasi yang menggunakannya. API ini mendefinisikan data model dari
sebuah dokumen XML kepada aplikasi yang menggunakan pengurai tersebut (Gambar
3.1).
Terdapat dua standar API untuk kegunaan ini: Simple API for XML (SAX) dan Document
Object Model (DOM). SAX tercipta awalnya melalui proses informal yang terjadi di
mailing list XML-DEV kemudian diterbitkan oleh David Megginson di
http://www.megginson.com/SAX [Marc99]. Sedangkan DOM ditetapkan oleh W3C –
sebuah badan formal yang mengawasi dan memberikan acuan-acuan untuk
perkembangan world-wide web. Karena menggunakan paradigma yang berbeda,
kedua API ini tidak menjadi saingan satu sama lain, melainkan saling melengkapi.
Tidak jarang pustaka-pustaka pengurai XML memberikan kedua pilihan API bagi
program-program aplikasi.
BAB 3 – XML 28
3.6.1 Simple API for XML (SAX)
Standar SAX menggunakan gaya Hollywood untuk memproses dokumen XML, “Don’t
call us, we’ll call you.” Pustaka pengurai XML menggunakan fungsi-fungsi ataupun
antarmuka callback untuk memanggil aplikasi pada saat dokumen XML diuraikan.
Pusat kendali terletak pada pustaka pengurai ketimbang program aplikasi.
Penggunaan SAX lebih cocok pada aplikasi-aplikasi yang menggunakan XML sebagai
representasi data eksternal dan menggunakan struktur datanya sendiri yang dapat
berbeda jauh dari struktur dokumen-dokumen XML yang digunakannya. Sejalan
dengan penguraian XML, fungsi-fungsi callback yang dipanggil pengurai XML mengisi
struktur data aplikasi berdasarkan parameter-parameter yang diberikan.
Karena pengurai XML tidak perlu menyimpan data pada saat dokumen diuraikan,
aplikasi-aplikasi yang menggunakan SAX cenderung memerlukan lebih sedikit memory
untuk memproses dokumen XML. Selain itu, sifat penguraian SAX yang on-the-fly
tidak memerlukan keberadaan seluruh dokumen sebelum penguraian dimulai. Hal ini
kontras dengan DOM yang memerlukan seluruh dokumen diterima sebelum dapat
memulai pemrosesan.
3.6.2 Document Object Model (DOM)
Standar DOM dikembangkan oleh W3C sebagai usaha untuk menyatukan model obyek
dari web browser Netscape 3 dan Internet Explorer 3. Rekomendasi DOM mendukung
dokumen XML maupun HTML.
Oleh Pengurai XML, data XML diwakilkan di dalam suatu struktur data DOM
Document Tree. Struktur pohon di memory ini serupa dengan dokumen XML yang
sedang diurai. Terdapat satu node untuk setiap elemen XML dengan tipenya masingmasing.
Perwakilan data Document Tree digunakan secara bersama oleh Pengurai
XML maupun aplikasi yang menggunakannya.
BAB 3 – XML 29
Node
Attr
CharacterData
Document
DocumentFragment
DocumentType
Element
Entity
EntityReference
Notation
ProcessingInstruction
Gambar 3.2 Hirarki tipe dalam DOM
[Marc99]
Dalam DOM, dokumen XML memiliki tipe Document. Elemen-elemen di dalam
dokumen tersebut umumnya bertipe Element. Berbagai attribut yang dimiliki oleh
elemen diwakili oleh obyek-obyek bertipe Attr. Data tekstual seperti komentar dan
elemen yang berisi teks diwakili oleh CharacterData. Sedangkan ada beberapa tipe
khusus lainnya seperti Entity, EntityReference, Notation, dan
ProcessingInstruction. Kesemua tipe ini merupakan turunan dari tipe Node (Gambar
3.2).
Elemen terluar atau root node dari suatu dokumen bukanlah juga merupakan
dokumen itu sendiri. Sebuah keberadaan dari Document memiliki paling banyak satu
keberadaan dari Node yang menjadi root node. Sedangkan Document yang tidak
mempunyai root node dikatakan dokumen kosong (blank document).
Traversal untuk masing-masing Node dilakukan secara random access dari Node yang
memilikinya (parent node). Masing-masing node memiliki sebuah daftar dari
anakannya dan daftar ini dapat diakses melalui operasi indexing.
Operasi-operasi berikut ini diberikan oleh Node untuk operasi traversal [Marc99]:
BAB 3 – XML 30
• nodeType adalah sebuah kode yang mewakili tipe sebenarnya dari Node yang
bersangkutan.
• parentNode adalah induk dari node ini, jika ada.
• childNode adalah daftar anakan dari node ini.
• firstChild adalah anak pertama dari node ini.
• lastChild adalah anak terakhir dari node ini.
• previousSibling bila diberikan sebuah child node, maka akan memberikan child
node sebelumnya.
• nextSibling bila diberikan sebuah child node, maka akan memberikan child node
setelahnya.
• attributes adalah daftar attribut yang dimiliki oleh node ini, jika ada.
W3C mendefinisikan API DOM dalam bentuk Interface Definition Language (IDL) –
sebuah standar yang digunakan oleh Object Management Group (OMG) untuk
mendefinisikan antarmuka berorientasi obyek untuk komponen-komponen perangkat
lunak namun tidak bergantung pada suatu bahasa pemrograman tertentu.
Didefinisikannya DOM dalam IDL memungkinkan penerapan XML Parser untuk
berbagai bahasa pemrograman – terdapat XML parser untuk C++, Java, SmallTalk,
Ada, bahkan COBOL.
Walaupun IDL ditujukan untuk pemrograman terdistribusi menggunakan CORBA,
namun tidak berarti bahwa semua pengurai XML harus diterapkan dalam bentuk
obyek-obyek CORBA. Bahkan tidak ada pengurai XML yang diterapkan sebagai obyekobyek
CORBA [Marc99]. W3C hanya menggunakan fasilitas multi-bahasa dari IDL
namun meninggalkan aspek-aspek distribusinya.
3.7 Standar Pendukung Lainnya
3.7.1 Namespaces
Namespace ditetapkan untuk memberikan kenunikan di antara elemen-elemen XML.
Penggunaan namespace tidak mutlak, namun sangat disarankan. Di dalam dokumen
XML, namespace ditetapkan dengan menggunakan sebuah string yang unik secara
global – penggunaan Universal Resource Identifier (URI) sangat disarankan untuk
menjamin keunikannya. URI ini dapat berupa Uniform Resource Locator (URL) yang
mengacu pada suatu dokumen ataupun tidak mengacu pada apapun. Agar dokumen
BAB 3 – XML 31
tetap ringkas, sebuah URI namespace dapat diberikan suatu prefix yang lebih pendek
dan keunikannya cukup dalam dokumen itu saja. Suatu deklarasi namespace tanpa
prefix menandakan sebuah default namespace bagi dokumen XML yang memuatnya.
Katakanlah ilmuwan gila kita tadi takut orang lain akan menggunakan tag yang
menggunakan nama yang sama dengan yang ada pada Henchmen Tracking Markup
Language. Lagipula, tag name memang sangat umum. Hal ini dapat dipecahkan
dengan menetapkan sebuah namespace untuk markup language tersebut. Misalkan
nama domain dari ilmuwan tersebut adalah http://www.example.com, maka ia dapat
membuat suatu namespace dengan URI http://www.example.com/dtd/html-0.1.dtd
dan menggunakannya sebagai berikut:

Igor
Asisten Laboratorium

Atau versi lainnya seperti ini

Igor
Asisten Laboratorium

Dalam versi di atas, URI http://www.example.com/dtd/html-0.1.dtd menyatakan
suatu default namespace dari dokumen XML secara keseluruhan. Ilmuwan ini dapat
memberikan DTD untuk diperoleh dari URL tersebut ataupun tidak sama sekali.
3.7.2 XLink dan XPointer
XLink [Con00b] dan XPointer [Con00c] merupakan bakuan-bakuan untuk membuat
hubungan antar sumber-sumber daya. Karena XLink menggunakan XPointer maka
XPointer akan diperkenalkan terlebih dahulu.
Pada 3.4 telah diperkenalkan suatu attribut ID yang memberikan suatu nama yang
unik di dalam suatu dokumen XML. Attribut ID ini dapat digunakan untuk mengacu
suatu elemen di dalam sebuah dokumen XML. Katakanlah di dalam file XML
contoh.xml terdapat suatu elemen dengan ID smurf. Maka elemen ini dapat diakses
dengan XPointer berikut:
BAB 3 – XML 32
contoh.xml#smurf
Sebuah contoh yang lebih rumit yaitu:
contoh.xml#root().child(6,magic)
XPointer di atas mengakses elemen keenam dari contoh.xml. Sebuah
penjelasan yang lebih lengkap mengenai XPointer bisa didapatkan di [Con00c].
Seperti telah dijelaskan di [Marc99], XLink memungkinkan penghubungan antara
dokumen-dokumen XML. Selain hubungan antar dokumen, XLink juga memungkinkan
penghubungan yang terjadi di antar elemen-lemen dalam satu dokumen (intradokumen).
Dalam XLink ada dua jenis hubungan:
• Simple links yang mirip seperti link yang terdapat di dalam HTML.
• Extended links yang memungkinkan penghubungan ke beberapa sumber daya
dari satu link yang sama.
Berikut ini adalah contoh dari simple link. Namespace xlink digunakan untuk menandakan
attribut-attribut yang menjadi bagian dari bakuan XLink. Contoh ini
menggunakan XPointer yang digunakan sebagai contoh pada bagian sebelumnya.

Walaupun XLink menggunakan sintaks XML, namun XLink tidak mempunyai DTD.
Tetapi DTD sebuah markup dapat dibuat untuk memaksakan sintaks XLink yang
benar pada dokumen-dokumennya.
33
Quality
Attributes
Facts
Best
Practices
Requirements
Design
Decisions
Data Model
Markup
Gambar 4.1 Tahap-tahap perancangan RQML
Bab 4
REQUIREMENTS MARKUP LANGUAGE
RQML adalah suatu usulan standar untuk penulisan dokumen system requirements
specification di dalam file XML. Dikembangkan oleh Gardar Gudgeirsson, University
of York [Gudg00], sebuah dokumen RQML bertujuan untuk menampung berbagai
requirement yang ditulis dalam bahasa alami.
Dalam mengembangkan RQML, Gudgeirsson memulai dengan penelaahan terhadap
berbagai literatur dalam bidang requirements engineering (RE) dan juga software
engineering secara umum. Dari studi literatur ini didapat serangkaian fakta yang
menggambarkan praktek-praktek software requirements engineering pada masa kini.
Selain itu dari salah satu literatur yang dipelajari, [Wieg99], didapatkan serangkaian
best practices dalam RE.
Sebagai domain information untuk RE, berbagai fakta dan best practices ini mendasari
dibuatnya sekumpulan requirements dan juga quality attributes yang menuntun
perancangan RQML. Setelah beberapa keputusan dasar (“design decisions”) diambil,
BAB 4 – REQUIREMENTS MARKUP LANGUAGE 34
rancangan RQML dibuat dalam bentuk data model yang menjadi dasar dibentuknya
sebuah document type definition (DTD) yang menentukan sintaks RQML.
Dalam bab ini diberikan pembahasan singkat mengenai fakta-fakta, best practices, dan
requirements yang membentuk RQML. Selain itu juga akan dibahas mengenai markup
RQML dengan mengutip bagian-bagian dari RQML DTD.
4.1 Fakta-fakta
Bagian ini memuat sebuah subset dari fakta-fakta yang dikemukakan oleh [Gudg00]
di dalam studi literaturnya. Berbagai fakta yang dikemukakan ulang di sini adalah
yang dapat dilacak balik (back-trace) dari rancangan RQML. Penomoran fakta sengaja
disamakan dengan yang ada pada [Gudg00] sehingga nomor ini nampak tidak terurut
– Gudgeirsson mengemukakan 16 fakta namun hanya enam di antaranya dapat
dilacak balik secara eksplisit dari data model RQML.
4.1.1 Fact 1
Dengan banyaknya jenis requirement maka tidaklah mungkin untuk memberikan
suatu ketetapan untuk mengkategorisasikannya ataupun untuk menggariskan caracara
yang ‘terbaik’ di dalam penggambarannya; kendati cara-cara tertentu memang
lebih baik dari yang lain.
4.1.2 Fact 2
Banyaknya teknik elicitation yang digunakan berakibat ganda. Pertama, karena
himpunan requirement masih limbung maka berbagai requirement yang ada bisa saling
meliputi dan/atau bertentangan. Kedua, seiring dengan jalannya pekerjaan
menyebabkan munculnya berbagai requirement baru ataupun hilangnya requirement
yang sudah ada.
4.1.3 Fact 3
Dengan cara-cara yang ada pada masa kini masih sulit untuk merekam berbagai
requirement di seluruh aktivitas-aktivitas analisis dan negosiasi, dan pada saat yang
bersamaan mengelola pertentangan antar stakeholder ataupun berhadapan dengan
requirement yang tidak lengkap.
BAB 4 – REQUIREMENTS MARKUP LANGUAGE 35
4.1.4 Fact 4
Seperti dituliskan di [Nuse00], semakin dirasa penting sekali kemampuan untuk tidak
hanya menulis berbagai requirement, namun juga untuk melakukannya sedemikian
rupa sehingga dapat dilacak oleh banyak orang untuk pengelolaan evolusinya sejalan
dengan waktu.
4.1.5 Fact 7
Karena secara teoritis banyak sekali data pelacakan yang dapat dikumpulkan di suatu
proyek, organisasi-organisasi harus dapat memilih dengan cermat data mana yang
akan dipelihara. Menurut [Koto98], pada prakteknya sangatlah mahal sekali untuk
mengumpulkan dan mengelola semua jenis informasi traceability.
4.1.6 Fact 8
Menurut [Ram98], pada saat ini tidak ada cara yang efisien di dalam menyimpan
informasi traceability yang rumit.
4.2 Best Practices RE
Bagian ini memuat sebuah subset dari serangkaian best practices dalam bidang
requirements engineering yang dikemukakan oleh [Wieg99]. Subset ini digunakan oleh
Gudgeirsson untuk membuat berbagai requirement terhadap rancangan RQML.
Berbagai best practices yang tidak dipergunakan umumnya karena tidak terkait
dengan penulisan dokumen SRS – karena itu di luar cakupan RQML.
Penomoran best practices pada bagian ini disamakan dengan yang ada di [Gudg00]
sehingga nampak tidak terurut.
• BP4 Membuat suatu daftar kata-kata.
• BP8 Melacak setiap perubahan pada semua hasil kerja yang terpengaruh.
• BP9 Membuat garis pangkalan serta mengendalikan versi-versi dari requirements
documents..
• BP11 Melacak status berbagai requirement.
• BP12 Mengukur kemantapan requirement.
• BP18 Melacak usaha-usaha yang dihabiskan untuk berbagai requirement.
BAB 4 – REQUIREMENTS MARKUP LANGUAGE 36
• BP19 Menulis visi serta cakupan.
• BP21 Mengenali kelas-kelas pengguna.
• BP22 Memilih product champion.
• BP23 Membentuk focus groups.
• BP24 Mengenali use-cases.
• BP27 Menetapkan quality attributes.
• BP29 Menggunakan kembali berbagai requirement.
• BP33 Memprioritaskan requirement.
• BP34 Memodelkan berbagai requirement.
• BP38 Mengenali sumber-sumber dari berbagai requirement.
• BP39 Memberi nama pada setiap requirement.
• BP40 Mencatat aturan-aturan bisnis.
• BP41 Membuat matriks traceability.
4.3 Quality Attributes
Bagian ini memuat tiga attribut kualitas yang membentuk rancangan RQML. Sebagai
analogi dari nilai-nilai moral, attribut-attribut kualitas ini menuntun berbagai
pengambilan keputusan terhadap hasil akhir dari sintaks RQML.
• Integratibility. Dapat digabungkan berarti kemampuan komponen-komponen
yang dibuat secara terpisah untuk dapat bekerja sama dengan benar. Hal ini
bergantung pada kompleksitas eksternal dari komponen-komponen tersebut,
mekanisme-mekanisme interaksi serta berbagai protokol yang dimilikinya, dan
juga tingkat pemisahan tanggung jawab dari masing-masing komponen.
• Extensibility. Dapat dikembangkan mengukur seberapa mudah untuk menambah
fungsionalitas kepada sistem. Ini juga merupakan suatu indikasi mengenai
seberapa mudah untuk menambahkan komponen-komponen yang ada di
pasaran terhadap sistem yang sudah dipergunakan.
• Portability. Dapat dipindahkan yaitu kemampuan sistem untuk dijalankan di
dalam berbagai lingkungan komputasi yang berbeda. Sebuah sistem disebut
portable bila sedemikan rupa sehingga semua anggapan memgenai lingkungan
BAB 4 – REQUIREMENTS MARKUP LANGUAGE 37
komputasi tertentu dibatasi pada satu komponen atau pada beberapa komponen
yang sangat berhubungan.
4.4 Requirements
Bagian ini memuat seluruh requirement yang diminta dari RQML. Beberapa requirement
ini dapat dilacak secara langsung kepada best practices maupun fakta-fakta yang
telah dikemukakan sebelumnya. Traceability ada pada nomor requirement yang
dicetak tebal dan diberikan sebagai nomor best practice (BPx) ataupun nomor fakta
(Fact x) pada akhir kalimat requirement. Persis setelah nomor requirement ditulis
kategori dari requirement tersebut dalam kurung siku, yaitu [fungsional] atau [nonfungsional].
• REQ1 [fungsional] RQML akan menjadi sebuah data format untuk menyimpan
software requirements specification.
• REQ2 [non-fungsional] RQML akan menggabungkan berbagai kekuatan metodemethode
masa kini yang menggunakan dokumen maupun database untuk
menyimpan berbagai requirement.
• REQ3 [fungsional] RQML akan dapat dikembangkan menuju metode-metode
pemodelan baru. Requirement ini adalah fungsional dan bukanlah attribut
kualitas extensible.
• REQ4 [non-fungsional] RQML akan diarahkan untuk digunakan sebagai standar
penyimpanan data untuk alat bantu requirement.
• REQ5 [fungsional] RQML akan mendukung best practices untuk requirements
engineering (RE); namun tidak mendukung suatu metode RE tertentu.
• REQ5-1 [fungsional] RQML akan mendukung pendokumentasian daftar istilah
(BP4).
• REQ5-2 [fungsional] RQML akan memungkinkan pelacakan setiap perubahan
pada hasil-hasil kerja (BP8).
• REQ5-3 [fungsional] RQML akan mendukung pembuatan garis pangkal serta
pengendalian versi dari berbagai requirements document (BP9).
• REQ5-4 [fungsional] RQML akan memungkinkan pelacakan status requirement
(BP11).
BAB 4 – REQUIREMENTS MARKUP LANGUAGE 38
• REQ5-5 [fungsional] RQML akan membuat mungkin pengukuran kemantapan
requirement (BP12).
• REQ5-6 [fungsional] RQML akan membuat mungkin untuk mendokumentasikan
usaha yang dilakukan dalam penerapan masing-masing requirement. (BP18)
• REQ5-7 [fungsional] RQML akan membuat mungkin pendokumentasian visi dan
cakupan untuk proyek-proyek tertentu (BP19).
• REQ5-8 [fungsional] RQML akan mendukung pengenalan kelas-kelas pengguna
(BP21).
• REQ5-9 [fungsional] RQML akan mendukung pemilihan berbagai product
champion (BP22).
• REQ5-10 [fungsional] RQML akan membuat mungkin untuk membentuk
berbagai focus group (BP23).
• REQ5-11 [fungsional] RQML akan memungkinkan untuk menetapkan berbagai
attribut kualitas (BP27).
• REQ5-12 [fungsional] RQML akan mendukung penggunaan kembali berbagai
requirement (BP29).
• REQ5-13 [fungsional] RQML akan memungkinkan pemrioritasan requirement
(BP33).
• REQ5-14 [fungsional] RQML akan medukung pendokumentasian requirement
dalam bahasa alami. (BP24, BP34)
• REQ5-15 [fungsional] RQML akan memungkinkan untuk mengenali sumbersumber
dari berbagai requirement (BP38).
• REQ5-16 [fungsional] RQML akan mendukung penamaan berbagai requirement
(BP39).
• REQ5-17 [fungsional] RQML akan mendukung perekaman aturan-aturan bisnis
(BP40).
• REQ5-18 [fungsional] RQML akan memberikan suatu cara untuk menyimpan
informasi traceability yang merupakan sebuah peningkatan dari cara-cara yang
digunakan sekarang (BP41, Fact 7, Fact 8).
• REQ6 [fungsional] RQML akan menyediakan suatu cara untuk mengklasifikasikan
jenis-jenis dari berbagai requirement (Fact 1).
BAB 4 – REQUIREMENTS MARKUP LANGUAGE 39
RQMLSecondClass
External RQMLFirstClass Term
Taxonomy Requirement Stakeholder Usecase
Project Assumption Context Issue Lexicon Group
Trace
Gambar 4.2 Hirarki data model RQML
• REQ7 [fungsional] RQML akan mendukung pendokumentasikan berbagai
requirement yang berubah ataupun tidak lengkap (Fact 2, Fact 3, Fact 4).
• REQ8 [fungsional] RQML akan mendukung traceability ke dalam dan ke luar dari
bagian-bagian teks dalam bahasa alami (Fact 7).
• REQ9 [fungsional] RQML akan memungkinkan penamaan, penggambaran, serta
pemberian alasan untuk berbagai kesatuan terkait yang sedang didokumentasikan.
• REQ10 [fungsional] RQML akan mendukung pendokumentasian informasi
stakeholder.
• REQ10-1 [fungsional] RQML akan membuat mungkin pendokumentasian
berbagai anggapan.
• REQ10-2 [fungsional] RQML akan membuat mungkin pendokumentasian
masalah-masalah yang belum terselesaikan.
4.5 Data Model
Bagian ini membahas data model yang digunakan sebagai dasar dibuatnya markup
RQML. Paradigma data model yang digunakan adalah data berorientasi obyek, tetapi
semua kelas hanya terdiri dari attribut (tanpa adanya method). Dari data model ini
nampak jenis-jenis dari berbagai data yang dapat dimuat di dalam suatu dokumen
RQML.
BAB 4 – REQUIREMENTS MARKUP LANGUAGE 40
4.5.1 Kelas RQMLSecondClass
Kelas RQMLSecondClass adalah base class bagi semua kelas di dalam RQML. Kelas ini
memuat attribut-attribut umum yang harus dimiliki oleh semua elemen. Berbagai
attribut tersebut adalah:
• ID merupakan identitas unik dari obyek ini di dalam suatu file RQML.
• URI mereferensikan obyek lain di luar file RQML lewat suatu URI (Universal
Resource Identifier).
4.5.2 Kelas External
Kelas External mewakili obyek-obyek yang ada di luar file XML (dokumen RQML).
Pada dasarnya, obyek apapun yang mempunyai URI dapat diwakili oleh suatu obyek
External.
4.5.3 Kelas RQMLFirstClass
Kelas RQMLSecondClass adalah base class bagi elemen-elemen yang disebut elemen
first-class. Berbagai elemen first-class ini adalah top-level elements – yaitu elemen
teratas sebelum elemen akar (root element) – di dalam file RQML. Attribut-attribut
yang harus dimiliki oleh sebuah elemen first-class adalah:
• Versi dari obyek first-class ini (REQ5-3).
• Status dari obyek first-class ini (REQ5-4, REQ 5-7).
• Kemantapan dari obyek first-class ini (REQ5-5).
• Kesulitan yang ada dalam mewujudkan informasi yang ada dalam obyek firstclass
ini (REQ5-6).
• Prioritas dari obyek first-class ini (REQ5-13).
• Nama dari obyek first-class ini (REQ9).
• Keterangan dari obyek first-class ini (REQ9)
• Alasan yang mendasari adanya masukan obyek first-class ini (REQ9).
4.5.4 Kelas Term
Obyek-obyek dari kelas Term digunakan sebagai elemen tujuan (target atau anchor)
dalam melakukan traceability ke dalam dan ke luar dari teks bahasa alami. Kelas ini
akan diturunkan langsung dari RQMLSecondClass (REQ8, REQ5-1).
BAB 4 – REQUIREMENTS MARKUP LANGUAGE 41
4 Ada kekeliruan di dalam [Gudg00], halaman 46, yang merunutkan obyek ini ke
REQ10-1.
4.5.5 Jenis-jenis obyek first-class
Dalam bagian ini diberikan jenis-jenis obyek first-class yang ada dalam RQML.
Berbagai obyek first-class ini adalah subclass dari RQMLFirstClass.
• Taxonomy Menyediakan suatu cara untuk membuat berbagai klasifikasi di mana
obyek-obyek first-class lainnya dapat diasosiasikan dengannya. Umumnya
obyek ini digunakan untuk mengklasifikasikan berbagai requirement menjadi
functional requirement, non-functional requirement, business rules, dan sebagainya,
namun juga dapat digunakan untuk mengklasifikasikan obyek-obyek first-class
lainnya (REQ6, REQ5-11, REQ5-10, REQ5-8, REQ5-17).
• Requirement Merupakan suatu requirement di dalam bahasa alami (REQ5-14).
• Stakeholder Menggambarkan seorang stakeholder (REQ5-9, REQ10).
• Usecase Adalah gambaran sebuah use-case (REQ5-14).
• Project Merupakan gambaran luas sebuah proyek ataupun sub-proyek
(REQ5-7).
• Assumption Menggambarkan sebuah anggapan (REQ10-1).
• Context Menyediakan sebuah konteks di mana obyek-obyek first-class lainnya
dapat diasosiasikan dengannya. Salah satu contoh konteks adalah domain
information (REQ5-15).
• Issue Mendokumentasikan sebuah permasalahan yang belum terpecahkan
(REQ10-2)4.
• Lexicon Menyimpan definisi dari sebuah konsep (REQ5-1).
• Group Mengelompokkan beberapa obyek first-class (REQ5-10).
• Trace Menetapkan pelacakan dari satu obyek first-class ke obyek first class yang
lain.
4.5.6 Jenis-jenis trace
Berikut ini adalah jenis-jenis traceability yang terdapat di dalam RQML. Dimuat
sebagai suatu obyek first-class Trace, berbagai traceability ini menghubungkan dua
BAB 4 – REQUIREMENTS MARKUP LANGUAGE 42
obyek first-class di dalam satu file XML. Untuk masing-masing jenis traceability
diberikan nomor requirement yang mendasarinya.
• parent-type Adalah pelacakan antara dua obyek taxonomy (REQ5-6).
• instantiation Memungkinkan pembuatan suatu keberadaan dari satu obyek
first-class (selain dari taxonomy) ke obyek first-class yang lain (REQ5-6).
• contextual-scope Memungkinkan sebuah obyek first-class untuk diasosiasikan
dengan konteks tertentu (REQ5-10, REQ5-15).
• baseline Menetapkan sebuah garis pangkal untuk obyek-obyek first-class dari
sebuah proyek (REQ5-3, REQ5-7).
• subproject Menetapkan sebuah proyek sebagai bagian dari proyek lain (REQ5-3,
REQ5-7).
• project-data Menghubungkan suatu proyek ke obyek second-class yang
berhubungan dengannya (REQ5-3, REQ5-7).
• refinement Perincian dari satu requirement ataupun use case ke yang lainnya
(REQ5-2, REQ5-3).
• supersede Memungkinkan satu obyek first-class untuk digantikan dengan yang
lain (REQ5-2, REQ5-3).
• parent Menetapkan suatu obyek first-class sebagai induk dari yang lain (REQ5-2,
REQ5-3).
• conflict Menunjukkan bahwa dua requirement atau use case bertentangan
(REQ5-2, REQ5-3).
• forward-from Adalah suatu pelacakan tradisional forward-from (REQ5-2,
REQ15).
• backward-to Adalah suatu pelacakan tradisional backward-to (REQ5-2, REQ15).
• forward-to Adalah suatu pelacakanpelacakan tradisional forward-to (REQ5-2,
REQ15).
• backward-from Adalah suatu pelacakanpelacakan tradisional backward-from
(REQ5-2, REQ15).
• stakeholder-view Memungkinkan seorang stakeholder untuk dihubungkan
dengan suatu obyek first-class yang menandakan kepemilikan, ketertarikan, atau
jenis-jenis hubungan lainnya (REQ10-1).
BAB 4 – REQUIREMENTS MARKUP LANGUAGE 43
5 Nampaknya domain rqml.org telah diambil alih oleh pihak lain.
• trace-to-trace Menghubungkan antara dua trace (REQ10-1).
• general-conflict Menandakan adanya konflik antara dua obyek first-class
(REQ5-2).
• lexref Menciptakan suatu hubungan antara sebuah term dengan masukan
lexicon untuk term tersebut (REQ5-1).
• see-also Menghubungkan antara dua masukan lexicon (REQ5-1).
• universal-trace Adalah pelacakan untuk penggunaan umum (REQ5-2).
4.6 Markup
Pada bagian ini akan dibahas document type definition (DTD) yang menjadi penentu
sintaks RQML. DTD ini dibuat dari data model RQML yang dibahas pada bagian
sebelumnya.
Karena XML tidak object-oriented maka pemetaan dari data model ke DTD dilakukan
dengan cara meratakan (“flatten”) pohon hirarki data model (Gambar 4.2) kemudian
membuat definisi tag XML dari berbagai leaf node yang dimiliki oleh pohon tersebut.
Tipe-tipe data sederhana (terutama string dan enumerasi) dipetakan menjadi attribut
dari suatu elemen. Sedangkan jenis-jenis data kompleks dijadikan sub-elemen dari
elemen yang memilikinya. Cara pemetaan ini analogis dengan cara meng-instantiate
semua class kemudian membuat elemen-elemen dari obyek-obyek yang merupakan
instance dari leaf class.
4.6.1 Root Element
Elemen rqml merupakan elemen akar di dalam suatu dokumen RQML. Dokumen ini
memuat hanya memuat berbagai elemen first-class sebagai child element langsung.
Perlu diketahui bahwa URL http://www.rqml.org yang digunakan sebagai basis
namespace bukanlah website RQML5; situs web RQML yang terakhir diketahui adalah

http://www.raqoon.is/rqml/rqml-resources.htm.

BAB 4 – REQUIREMENTS MARKUP LANGUAGE 44
4.6.2 Elemen term
Elemen term digunakan di banyak elemen lain untuk memungkinkan pemberian
attribut kepada sekelompok kata di dalam sebuah blok teks bahasa alami. Selain itu
elemen ini juga digunakan untuk melakukan traceability ke dalam bagian teks bahasa
alami.
Ada suatu ketidakkonsistenan di dalam [Gudg00] pada definisi elemen ini. Walau
seharusnya elemen ini adalah turunan dari RQMLSecondClass, namun attribut URI
tidak diwariskannya (lihat subbab 4.5.1 untuk keterangan kelas RQMLSecondClass).

4.6.3 Kelas RQMLFirstClass
Kelas RQMLFirstClass merupakan suatu abstract class yang menjadi dasar bagi
elemen-elemen lainnya. Walau sebenarnya tidak ada di dalam DTD, namun kelas ini
berguna untuk mendefinisikan berbagai attribut serta child elements yang umum ada
di semua elemen-elemen first-class. Elemen-elemen taxonomy, requirement,
stakeholder, use-case, project, assumption, issue, lexicon, group, dan trace semua
memiliki sekelompok attribut dan elemen anakan yang sama; kesamaan itu
didefinisikan di RQMLFirstClass.
Kelas ini mengalami ketidakkonsistenan yang sama dengan elemen term, yaitu tidak
adanya attribut URI yang seharusnya diwariskan dari RQMLSecondClass.

4.6.4 Elemen-elemen first-class
Pada bagian ini diberikan penjelasan singkat mengenai elemen-elemen first-class yang
semuanya merupakan turunan dari RQMLFirstClass. Pada beberapa definisi elemen
ditemukan ketidakkonsistenan yang ada di dalam [Gudg00]. Berbagai ketidakkonsistenan
tersebut akan ditunjukkan di dalam keterangan elemen yang bersangkutan.
4.6.4.1 Requirement
Elemen requirement digunakan untuk mendokumentasikan sebuah requirement dalam
bahasa alami. Elemen ini tidak menambahkan informasi apapun dari yang
didapatnya dari kelas RQMLFirstClass; namun hanya merupakan penamaan ulang dari
superclass-nya.




4.6.4.2 Stakeholder
Seperti requirement, elemen stakeholder tidak menambah informasi apapun kepada
RQMLFirstClass. Elemen ini menampung nama, keterangan, dan alasan untuk
seorang stakeholder. Walaupun informasi tambahan seperti alamat, e-mail, dan lainlain
akan menguntungkan, tambahan ini tidak disertakan agar rancangan RQML tetap
sederhana. Lagipula, informasi data pribadi seperti ini umumnya diletakkan di dalam
suatu relational database dan dapat dihubungkan dengan menggunakan traceability.
BAB 4 – REQUIREMENTS MARKUP LANGUAGE 46




4.6.4.3 Assumption
Elemen assumption adalah suatu penamaan ulang dari RQMLFirstClass yang ditujukan
untuk mendokumentasikan sebuah anggapan.
Ternyata ada ketidakkonsistenan di [Gudg00] untuk spesifikasi elemen ini, yaitu
spesifikasi elemen-elemen anakan yang dimiliki oleh elemen assumption berbeda
dengan yang digariskan oleh superclass-nya, RQMLFirstClass. Perbedaan ini dicetak
tebal dalam penggalan berikut.




4.6.4.4 Issue
Seperti requirement, stakeholder, dan assumption, elemen issue adalah penamaan
ulang dari RQMLFirstClass. Kegunaan elemen ini adalah untuk mendokumentasikan
permasalahan yang belum terpecahkan.


BAB 4 – REQUIREMENTS MARKUP LANGUAGE 47


4.6.4.5 Use-Case
Elemen use-case didasari oleh template use-case yang diambil dari [Dary00]. Elemen
ini mendokumentasikan seorang aktor, nol atau beberapa precondition dan
postcondition, nol atau beberapa alternative course, dan nol atau beberapa exception.



4.6.4.6 Project
Elemen project digunakan untuk mendokumentasikan suatu proyek atau subproyek.
Ada beberapa ketidakkonsistenan di dalam [Gudg00] mengenai definisi elemen ini.
Perbedaan pertama yaitu spesifikasi child elements yang diperbolehkan bukan merupakan
superset dari yang dimiliki oleh RQMLFirstClass, yang seharusnya menjadi
superclass dari elemen ini. Perbedaan kedua yaitu adanya ketidaksamaan di antara
bagian pembahasan dengan bagian lampiran untuk elemen ini.
Di [Gudg00], halaman 57 (Chapter 3. Design), elemen project didefinisikan sebagai:


BAB 4 – REQUIREMENTS MARKUP LANGUAGE 48

Sedangkan di halaman 90 (RQML DTD), spesifikasinya adalah:



4.6.4.7 Taxonomy
Elemen taxonomy hanya menambahkan satu buah informasi kepada kelas RQMLFirst-
Class. Tambahan ini adalah attribut type-element yang merupakan jenis-jenis elemen
first class lainnya kecuali term dan taxonomy.




4.6.4.8 Context
Elemen context memungkinkan pendokumentasian domain information ataupun
berbagai informasi lainnya yang menyusun konteks untuk bagian-bagian sistem yang
lain. Tambahan yang diberikan kepada kelas RQMLFirstClass adalah elemen-elemen
origin dan textual-data.
BAB 4 – REQUIREMENTS MARKUP LANGUAGE 49




4.6.4.9 Lexicon
Elemen lexicon memungkinkan berbagai definisi diberikan untuk elemen-elemen term
yang nampak di bagian-bagian lain. Traceability dapat digunakan untuk
menghubungkan elemen-elemen ini dengan elemen lexicon.



4.6.4.10 Group
Elemen group digunakan untuk mengelompokkan beberapa elemen lainnya. Mekanisme
pengelompokkan yang digunakan yaitu XLink. Pengelompokan ini ditujukan
untuk membantu bekerjanya sebuah focus group (REQ5-10).



BAB 4 – REQUIREMENTS MARKUP LANGUAGE 50

4.6.4.11 Trace
Elemen trace digunakan untuk melakukan traceability antara elemen-elemen firstclass
lainnya. Fungsionalitas traceability yang diberikan oleh elemen ini lebih dari
hanya empat jenis trace tradisional (forward-to, backward-to, forward-from, dan
backward-from) namun juga untuk hal-hal seperti hubungan parent-child, pengkategorisasian
elemen, pembuatan garis pangkal, konflik, dan berbagai hubungan lainnya.



<!– Source: Sink: –>

<!– Source: * except Sink: –>

<!– Source: Sink: * –>

<!– Source: Sink: * –>

<!– Source: Sink: –>

<!– Source: Sink: * except –>






BAB 4 – REQUIREMENTS MARKUP LANGUAGE 52

<!– Source: or Sink: second class object –>

<!– Source: second class object Sink: or –>

<!– Source: or Sink: second class object –>


<!– Source: , or Sink: * –>

<!– If the source is a , it must describe a type of stakeholder.
–>
<!– If the source is a , it must only contain objects of type –>
<!– or (again describing a stakeholder type). –>




<!– Source: Sink: –>


<!– Source: Sink: –>

<!– Source: Sink: –>


54
Bab 5
DESIGN PATTERNS
Design patterns adalah unsur-unsur rancangan yang seringkali muncul pada berbagai
sistem yang berbeda. Setiap kemunculan ini menguji pattern tersebut di berbagai situasi.
Semakin terujinya suatu unsur rancangan berarti semakin matangnya unsur
tersebut – sedemikian sehingga beberapa dapat dikatakan sebagai best practices dalam
perancangan sistem.
Istilah design patterns dimulai di bidang perancangan bangunan oleh Christopher
Alexander. Dalam bukunya A Pattern Language [Alex77], ia menerangkan pola-pola
yang terdapat di dalam berbagai rancangan arsitektur bangunan. Arti design pattern
diterangkannya dalam kalimat berikut:
Each pattern describes a problem which occurs over and over again in our
environment, and then describes the core of the solution to that problem, in
such a way that you can use this solution a million times over, without ever
doing it the same way twice [Alex77].
Dengan kata lain, design pattern adalah gambaran formal dari suatu masalah berikut
pemecahannya. Masing-masing pattern harus mempunyai nama yang sederhana dan
deskriptif yang dapat langsung digunakan untuk mengacu pada pola tersebut. Sebuah
pattern harus mendokumentasikan permasalahan, pemecahan, serta akibat-akibat
penggunaannya [Wall00].
Dalam bidang software engineering, debut design patterns diawali oleh Erich Gamma,
Richard Helm, Ralph Johnson dan John Vlissides dalam bukunya Design Patterns:
Elements of Reusable Object-Oriented Language [Gamm95]. Setelah buku ini, banyak
praktisi dan akademisi lainnya yang mulai mengkategorikan pola-pola rancangan
lainnya dalam berbagai software-intensive systems [Sun01a] [Wall00].
Pembahasan design patterns tentu tidak terlepas dari pembahasan arsitektur software
secara keseluruhan. Sebagai best practices dari perancangan software, design patterns
muncul sebagai komponen-komponen dari arsitektur software. Dalam bab ini juga
BAB 5 – DESIGN PATTERNS 55
dibahas dua arsitektur software dalam keterhubungannya dengan design patterns:
model-view-controller dan diikuti dengan salah satu variannya yaitu separable model
architecture.
5.1 Gang of Four Patterns
Pola-pola rancangan yang terdapat pada [Gamm95] secara kolektif disebut Gang of
Four Patterns [Coop98] – bukan karena mereka yang membuatnya, namun empat sekawan
ini membuat daftar pola-pola rancangan yang telah cukup stabil dan digunakan
di dalam berbagai sistem berorientasi obyek. [Gamm95] membagi katalog design
patterns mereka dalam tiga kategori: creational, structural, dan behavioral.
Creational patterns berhubungan dengan penciptaan obyek. Pola-pola ini berkisar seputar
obyek mana yang diciptakan, siapa yang menciptakannya, serta berapa banyak
obyek diciptakan.
Structural patterns berhubungan dengan struktur statis obyek dan kelas. Pola-pola
dalam structural patterns dapat dilihat pada saat program di-compile melalui struktur
inheritance, properties, serta agregasi obyek-obyek.
Behavioral patterns lebih berkenaan terhadap perilaku run-time program. Pola-pola ini
berkaitan dengan algoritma serta interaksi antar obyek saat program berjalan.
Penekanan behavioral patterns lebih pada komposisi obyek ketimbang inheritance.
Sedangkan masing-masing pattern dibahas oleh [Gamm95] sebagai kesatuan dari:
• Name – Merupakan nama yang diberikan pada pola ini.
• Intent – Merupakan pernyataan ringkas yang memberikan permasalahan yang
terjadi serta maksud yang hendak dicapai.
• Also Known As – Berbagai alias untuk pola ini, jika ada.
• Motivation – Sebuah skenario yang menerangkan sebuah permasalahan
rancangan dan bagaimana pola ini dapat memecahkannya.
• Applicability – Berbagai situasi di mana pola ini dapat diterapkan.
• Structure – Sebuah gambar yang menerangkan hubungan kelas dan obyek
dalam pattern ini.
BAB 5 – DESIGN PATTERNS 56
• Participants – Berbagai kelas dan/atau obyek yang turut serta dalam pola ini
beserta peranannya.
• Collaborations – Bagaimana kerja sama dari para peserta untuk melaksanakan
peranannya masing-masing.
• Consequences – Bagaimana pola ini mencapai tujuannya serta kompromi (tradeoff)
yang harus dilakukan dalam penerapannya.
• Implementation – Petunjuk, peringatan, serta berbagai teknik yang digunakan
dalam penerapan pola ini.
• Sample Code – Contoh program yang mengilustrasikan penerapan pola ini.
• Known Uses – Contoh-contoh dari penggunaan pola ini pada sebuah sistem
sungguhan.
• Related Patterns – Pola-pola lain yang berhubungan dengan pola ini.
Dalam bagian ini, pembahasan design pattern diringkas dalam bentuk tabular yang
diusulkan oleh [Gust99]. Teks yang menjadi keterangan niatan (intent) dari masingmasing
pattern diurai dalam bentuk kolom-kolom yang memberikan tambahan struktur
kepada gambaran pattern tersebut. Penguraian ini juga memungkinkan keseluruhan
pattern yang digunakan dapat dilihat dalam selayang pandang. Tidak
semua pattern dibahas di sini; namun hanyalah pola-pola yang digunakan di
Rambutan. Pembaca yang tertarik dapat mengacu pada [Gamm95], [Coop98], dan
[Sun01a] untuk pembahasan yang lebih lengkap.
5.1.1 Creational Patterns
Niatan dari masing-masing pola dalam creational patterns diuraikan menjadi lima
kolom:
• Penciptaan – apakah membuat atau membatasi pembuatan suatu obyek.
• Kesatuan – obyek apa yang diciptakan.
• Tindakan – cara yang diambil dalam menciptakan obyek.
• Tekanan – batasan-batasan yang ada dalam penciptaan obyek.
• Informasi Tambahan – keterangan yang memperjelas niatan dari pola yang
bersangkutan.
BAB 5 – DESIGN PATTERNS 57
Tabel 5.1 Creational Patterns
Nama
Pattern
Penciptaan Kesatuan Tindakan Tekanan Informasi Tambahan
Abstract
Factory
Menciptakan sekumpulan
obyek yang
berhubungan
atau saling
tergantung
dengan menyediakan
suatu antarmuka
untuk
melakukannya
tanpa
menentukan
suatu kelas
yang nyata.
Factory
Method
Menciptakan obyek-obyek dengan menyediakan
suatu antarmuka
yang
memungkinkan
subkelas-subkelas
untuk memutuskan
obyek mana yang
akan diciptakan.
Factory method
memungkinkan sebuah
kelas untuk
menunda pembuatan
keberadaan
obyek kepada
subkelas-subkelas.
Singleton Jangan
menciptakan
lebih dari satu
keberadaan
dari suatu kelas
dengan menyediakan
suatu titik akes
global kepadanya.
5.1.2 Structural Patterns
Niatan dari masing-masing pola dalam structural patterns diuraikan menjadi empat
kolom:
• Tindakan untuk diterapkan – apa yang dilakukan oleh pola yang bersangkutan.
• Kesatuan – perihal yang terkait dengan pola ini.
• Akibat – Dampak yang terjadi dari penerapan pola ini.
• Hasil – Apa saja yang didapatkan dari penerapan pola ini.
Tabel 5.2 Structural Patterns
Nama
Pattern
Tindakan untuk
diterapkan
Kesatuan Akibat Hasil
Adapter Mengubah antarmuka sebuah
kelas
kepada antarmuka
kelas lain
yang diharapkan
klien.
Adapter memungkinkan kelaskelas
untuk bekerja sama yang
sebaliknya tidak mungkin karena
antarmuka-antarmuka yang
tidak cocok.
BAB 5 – DESIGN PATTERNS 58
Tabel 5.2 Structural Patterns
Nama
Pattern
Tindakan untuk
diterapkan
Kesatuan Akibat Hasil
Bridge Memisahkan satu
dari yang lainnya
sebuah abstraksi
dan penerapannya
sehingga keduanya dapat
berbeda dan tidak saling tergantung.
Composite Menyusun obyek-obyek ke dalam struktur
pohon untuk
mewakili hirarki
seluruh-sebagian.
Composite memungkinkan klienklien
untuk memperlakukan
obyek tunggal maupun komposisi
dengan cara yang sama.
Decorator Secara dinamis
memberikan
tambahan
tanggungjawabtanggungjawab
kepada
sebuah obyek. Decorator memberikan mekanisme
perluasan yang mudah
disesuaikan.
Façade Memberikan sebuah
kesatuan
antarmuka kepada
suatu himpunan
antarmukaantarmuka
di dalam
sebuah subsistem.
Façade menetapkan antarmuka
dengan tingkat yang lebih tinggi
yang mempermudah penggunaan
sebuah subsistem.
Flyweight Penggunaan
secara bersamasama
dari
obyek-obyek. Flyweight memungkinkan sejumlah
besar dari obyek-obyek yang
berukuran kecil untuk ditangani
secara tepatguna.
5.1.3 Behavioral Patterns
Niatan dari masing-masing pola dalam behavioral patterns diuraikan menjadi tiga
kolom:
• Tujuan – Hal yang ingin dicapai dari penerapan pola.
• Rangkaian tindakan – cara pola ini diterapkan.
• Hasil – Apa saja yang didapatkan dari penerapan pola ini.
BAB 5 – DESIGN PATTERNS 59
Tabel 5.3 Behavioral Patterns
Nama
pattern
Tujuan Rangkaian tindakan
/ langkahlangkah
Hasil
Command Memparameterkan klien dengan
permintaan-permintaan
yang berbeda
dengan cara
membungkus sebuah
permintaan di
dalam sebuah obyek.
Command memungkinkan Anda untuk
mengantrikan atau mencatat permintaanpermintaan
dan mendukung operasi
yang dapat dibalikkan.
Iterator Mengakses unsur-unsur dari
sekumpulan obyek secara
berurutan.
Iterator memberikan suatu jalan untuk
mengakses unsur-unsur tanpa menyingkap
implementasi yang mendasarinya.
Observer Semua obyek yang bergantung
diberitahukan serta
diperbaharui ketika suatu
obyek berganti keadaan
dengan menetapkan
hubungan satuke-
banyak antara
obyek-obyek.
Memento Menangkap dan mengeluarkan
keadaan dalam suatu
obyek sehingga keadaan ini
dapat dikembalikan belakangan.
Memento melakukan hal ini tanpa
melanggar pembungkusan.
Strategy Membuat algoritma-algoritma
dari suatu keluarga algoritma
dapat dipertukarkan
dengan cara
membungkus
masing-masing
algoritma.
Strategy memungkinkan algoritma
berubah-ubah terlepas dari klien-klien
yang menggunakannya.
Template
Method
Menunda langkah-langkah
suatu algoritma ke subkelassubkelas
dengan cara
menetapkan rangka
dari suatu algoritma
di satu operasi.
Template Method memungkinkan
subkelas-subkelas untuk menetapkanulang
langkah-langkah tertentu dari
suatu algoritma tanpa mengubah susunan
algoritma tersebut.
5.2 Model-View-Controller (MVC)
Arsitektur MVC memisahkan suatu aplikasi interaktif ke dalam tiga kategori kelas:
model, view, dan controller. Kelas-kelas yang termasuk dalam model merepresentasikan
data yang diolah aplikasi tersebut. Sedangkan kelas-kelas di dalam view dan
controller adalah penerapan antarmuka pemakai; view merupakan tampilan aplikasi
sedangkan controller menerima masukan dari pemakai.
BAB 5 – DESIGN PATTERNS 60
Gambar 5.1 Arsitektur MVC dan hubungannya dengan Java [Stan97]
Dipopulerkan oleh SmallTalk-80 [Burb92], arsitektur MVC beserta varian-variannya
masih digunakan sampai saat ini. Arsitektur Doc/View yang ada pada framework
Borland ObjectWindows [Borl93] bisa dikatakan cukup mirip dengan MVC.
Penerapannya juga tidak terbatas pada aplikasi GUI yang menjadi tujuan awalnya;
framework seperti Jakarta Struts menerapkan arsitektur MVC pada lingkungan
berbasis web.
Umumnya suatu kelas controller dirancang untuk digunakan bersama dengan kelas
view tertentu, karena sulit untuk membuat controller umum yang tidak tergantung
pada view tertentu [Fowl02]. Karena itu hubungan antara view dan controller bisa
dikatakan tightly coupled.
Bertugas menerima masukan dari pemakai, kelas-kelas controller mengubah data di
dalam model berdasarkan masukan ini. Perubahan data dilakukan dengan memanggil
method-method tertentu pada kelas model – agar tidak melanggar enkapsulasi.
Perubahan data di dalam model menyebabkan view diberitahukan akan adanya perubahan
ini.
BAB 5 – DESIGN PATTERNS 61
Di antara view dengan model terdapat hubungan publish/subscribe. Sebuah model
memiliki daftar view yang subscribe kepadanya. Pada saat data di dalam model berubah,
semua view diberitahukan akan perubahan ini. Dengan diterimanya pemberitahuan,
view akan secara otomatis memperbaharui tampilannya untuk merefleksikan
perubahan ini. [Gamm95] menyebut hubungan antara view dengan model
ini sebagai penerapan dari Observer pattern.
Java 2 Standard Edition menyediakan dua kelas untuk mempermudah penerapan
hubungan publish/subscribe [Sun00a]. Di dalam package java.util terdapat pasangan
class Observable dan interface Observer. Suatu kelas model dapat di-extend
dari Observable sedangkan view dapat meng-implement Observer. Suatu view dapat
mendaftarkan dirinya untuk menerima pemberitahuan dari suatu model melalui
method Observable.addObserver(). Apabila data berubah, model yang bersangkutan
perlu memanggil method setChanged() untuk menandakan perubahan ini. Pengumuman
perubahan data dilakukan dengan memanggil method notifyObservers().
Kedua method tersebut ada di kelas Observable; dengan method setChanged() bersifat
protected sehingga hanya dapat dipanggil oleh subkelasnya.
5.3 Separable Model Architecture
Swing adalah nama panggilan (“code name”) untuk sekumpulan kelas antarmukapemakai
grafis (GUI) yang tersedia pada platform Java 2 Standard Edition. Pada release
sebelumnya platform ini menyediakan yang disebut Abstract Windowing Toolkit (AWT)
untuk membangun antarmuka pemakai. Walaupun AWT masih disediakan, aplikasiaplikasi
baru untuk Java 2 disarankan untuk menggunakan Swing ketimbang AWT
[Sun03a].
Perbedaan yang paling mendasar antara Swing dengan AWT yaitu Swing merupakan
pustaka yang pure Java [Sun00a]. Keseluruhan logika Swing dijalankan oleh JVM tanpa
memerlukan native code. Sedangkan pada AWT, fungsionalitas setiap komponen
antarmuka-pemakai sebenarnya didelegasikan kepada komponen-komponen native
dari host platform. Namun Swing menggunakan beberapa komponen AWT untuk
interaksi-interaksi primitifnya.
Suatu aplikasi dikatakan pure Java apabila sama sekali tidak menggunakan native
code – yaitu kode-kode program yang pribumi terhadap mesin yang menjalankannya
BAB 5 – DESIGN PATTERNS 62
Gambar 5.2 Separable Model Architecture [Fowl02]
(host machine/platform). Program-program Java mendapatkan kemampuan crossplatform
karena program-program tersebut tidak di-compile ke bahasa mesin yang
menjadi tujuan dijalankannya program. Namun program Java di-compile ke suatu
bahasa mesin maya yang disebut Java bytecode. Pada setiap mesin yang akan menjalankan
program Java dipasang suatu perangkat lunak yang dinamakan Java Virtual
Machine (JVM). JVM ini secara software bertindak sebagai mesin maya yang menerjemahkan
bytecode menjadi machine code pada saat program berjalan.
Tight coupling yang terjadi di antara view dan controller pada arsitektur MVC berakibat
tidak praktisnya pembuatan komponen-komponen umum antarmuka-pemakai berbasis
murni MVC. Hal ini ditemukan pada saat pengembangan arsitektur Swing
sehingga para pengembangnya memutuskan untuk tidak mengikuti arsitektur MVC
secara penuh [Fowl02].
Arsitektur yang digunakan Swing dinamakan Separable Model Architecture (SMA). Berakar
dari MVC, arsitektur ini menggabungkan view dan controller menjadi satu obyek.
Sedangkan model masih merupakan obyek tersendiri. Perbedaan yang lain yaitu
penampilan (painting) komponen-komponen Swing tidak dilakukan oleh komponen itu
sendiri, namun didelegasikan ke suatu UI Manager.
Karena tidak tergantung pada problem domain tertentu, model yang digunakan lebih
disesuaikan pada kebutuhan komponen yang bersangkutan. Misalkan komponen
JScrollBar dan JSlider (dua komponen scroll bar dan slider, secara berurutan, dari
Swing) menggunakan jenis model yang sama, yaitu Bounded Range Model [Sun00a]
BAB 5 – DESIGN PATTERNS 63
karena kedua komponen ini menampilkan data yang sejenis, yaitu suatu nilai yang
terletak di antara dua batas (bounds).
Obyek model di dalam Swing terdiri atas dua kategori, yaitu GUI-state model dan
Application-data model [Fowl02].
GUI-state model adalah sekumpulan interface yang merepresentasikan keadaan
penampilan suatu komponen antarmuka grafis. Misalkan apakah suatu tombol
sedang ditekan atau tidak, item mana saja di dalam sebuah list yang sedang dipilih,
ataupun posisi sebuah slider. Suatu aplikasi dapat saja menggunakan suatu GUI-state
model sendiri. Namun umumnya interaksi dengan model tidak diperlukan; aplikasi
dapat saja memanggil method dari komponen yang bersangkutan tanpa menyentuh
model yang digunakannya. Komponen akan mendelegasikan permintaan tersebut ke
model yang dimilikinya.
Application-data model adalah sekumpulan interface yang mewakili data yang
terutama berarti pada konteks aplikasi yang bersangkutan (berhubungan erat dengan
problem domain aplikasi). Penggunaan application-data model sangat disarankan untuk
aplikasi-aplikasi yang sangat berhubungan erat dengan data [Fowl02]. Interaksi yang
erat dengan data model lebih disarankan untuk beberapa komponen yang sangat datacentric
seperti JTable dan JTree.
Tabel berikut menunjukkan korelasi antara komponen-komponen Swing, interface dari
model yang digunakan serta tipe dari model yang diinginkan [Fowl02].
Tabel 5.4 Korelasi komponen-komponen Swing dengan data model yang digunakannya [Fowl02]
Component Model Interface Model Type
JButton ButtonModel GUI
JToggleButton ButtonModel GUI/data
JCheckBox ButtonModel GUI/data
JRadioButton ButtonModel GUI/data
JMenu ButtonModel GUI
JMenuItem ButtonModel GUI
JCheckBoxMenuItem ButtonModel GUI/data
JRadioButtonMenuItem ButtonModel GUI/data
JComboBox ComboBoxModel data
JProgressBar BoundedRangeModel GUI/data
JScrollBar BoundedRangeModel GUI/data
BAB 5 – DESIGN PATTERNS 64
Component Model Interface Model Type
JSlider BoundedRangeModel GUI/data
JTabbedPane SingleSelectionModel GUI
JList ListModel data
JList ListSelectionModel GUI
JTable TableModel data
JTable TableColumnModel GUI
JTree TreeModel data
JTree TreeSelectionModel GUI
JEditorPane Document data
JTextPane Document data
JTextArea Document data
JTextField Document data
JPasswordField Document data
Salah satu kelebihan Swing bila dibandingkan dengan pustaka antarmuka pemakai
lainnya, yaitu masing-masing komponen Swing mendelegasikan penampilannya
(painting) pada kelas-kelas lain. Pendelegasian ini memungkinkan Swing untuk
mempunyai penampilan yang berbeda-beda dan dapat diubah pada saat program
dijalankan [Fowl02]. Fungsionalitas ini disebut pluggable look-and-feel (PL&F) dan
diatur oleh sebuah UIManager. Untuk masing-masing komponen, painting didelegasikan
lebih lanjut ke kelas-kelas look-and-feel. Kelas-kelas inilah yang menggambar
setiap komponen ke layar. PL&F memungkinkan suatu program Swing mempunyai
tampilan yang berbeda-beda.
Pada Java Development Kit 1.3 untuk platform Windows, ada tiga look-and-feel yang
disediakan:
• Metal – Juga disebut cross-platform look-and-feel, ini merupakan look-and-feel
default yang diambil apabila tidak dipilih lainnya.
• Motif – Meniru penampilan aplikasi-aplikasi Motif yang umum terdapat pada
platform Unix.
• Windows – Meniru penampilan Microsoft Windows.
Selain ketiga look-and-feel di atas, beberapa vendor pihak ketiga juga menyediakan
look-and-feel alternatif untuk digunakan sebuah aplikasi Swing.
65
Bab 6
ANALISIS DAN PERANCANGAN
Bab ini membahas analisa yang dilakukan serta rancangan awal untuk sistem yang
akan dibuat. Analisa meliputi user story, serangkaian requirement serta berbagai
batasan (constraints) yang ditentukan. Perancangan yang dibuat termasuk ide umum
rancangan, rencana data model, serta gambaran kasar antarmuka pemakai.
Analisis dilakukan atas dasar user story yang menggambarkan sebuah contoh situasi
di mana Rambutan akan digunakan. Cerita ini menuturkan seorang system analyst
yang sedang mewawancarai dua orang stakeholder untuk membuat draft requirement
pada saat project initiation (pra-kontrak). Sang analyst berasal dari suatu perusahaan
perangkat lunak yang berbasis proyek. Sedangkan dua orang stakeholder yang
diwawancarainya bekerja pada sebuah perusahaan dotcom yang tidak mempunyai IT
department sendiri – mayoritas new development dikontrakkan ke luar.
Bagian berikutnya membahas berbagai spesifikasi kebutuhan (requirement) untuk dipenuhi
oleh software yang akan dibuat. Umumnya rangkaian requirement ini disarikan
dari user story pada bagian sebelumnya.
Spesifikasi kebutuhan diikuti oleh batasan-batasan (constraints) yang dibebankan
pada rancangan hasil akhir dari sistem. Batasan-batasan ini terutama didorong oleh
pertimbangan-pertimbangan politis maupun bisnis untuk kebaikan pengembangan
sistem selanjutnya yang bertolak dari proyek ini.
Setelah itu akan dibahas rancangan-rancangan awal yang dibuat sebagai modal dasar
untuk implementasi Rambutan. Sebagai sebuah one-person prototyping project,
berbagai spesifikasi ini sangat high-level; perincian dari rancangan-rancangan ini
dibuat on-the-fly secara iteratif sejalan dengan proses coding seperti cara kerja seorang
hacker pada umumnya.
6.1 User Story
BAB 6 – ANALISIS DAN PERANCANGAN 66
6 Apabila kata skimming yang digunakan – walaupun lebih tepat – nilai rasa yang
diberikan menjadi berkurang sehingga tidak mencerminkan keasyikan yang dialami.
Latar belakang cerita ini adalah pada dasawarsa pertama dari abad ke-21, di sebuah
kota metropolitan yang sibuk. Karena seluruh pelaku adalah para pekerja muda –
atau terkadang disebut sebagai Generation-X [Robb01] – maka bahasa percakapan
tetap dipertahankan dalam bentuk informal. Nama, merek dagang, maupun perusahaan
sebagian besar adalah fiktif – namun beberapa nama produk nyata digunakan
untuk menambah realisme cerita, tetapi tidak untuk mempromosikan produk
tersebut. Berikut ini adalah user story dalam bentuk narasi dialog.
Pada suatu pagi yang cerah, Rinoa, seorang system analyst, sedang bekerja di kantornya.
Seperti biasanya, ia memulai hari kerjanya di kantor pada jam delapan dengan
segelas cappucino beserta sederet e-mail dan IT newsletter. Selagi surfing6 di dalam
inbox-nya, tiba-tiba telepon berdering…
Operator: “Bu Rinoa, panggilan dari Binaraga di line satu.”
Rinoa: “Saya terima.” (Menjawab telepon di line satu…)
Telepon: “Halo, Rinoa? Masih inget gua?”
Rinoa: “Elu Vi, ada apa?”
Rupanya yang menelepon adalah kenalannya, Vivian, R & D Manager dari PT Binaraga
Maya Persada. Perusahaan ini merupakan klien lama dari PT Arcle Technologies,
tempat Rinoa bekerja.
Vivian: “Gini nih… gue – eh, kami – pengen bikin website baru…. Tempat lo bisa
handle ga?”
Rinoa: “Web apaan nih?”
Vivian: “Ga jauh lah, e-commerce juga… Kali ini kita mau jualan kamera, namanya
kamerafoto dot com…. Lo bisa ke tempat gua ga?”
Rinoa: “Hmm…” (Memeriksa jadwal pada aplikasi Palm Desktop di komputernya)
“Gimana kalo besok after lunch?”
Vivian: “Besok jam 13:30, OK?”
BAB 6 – ANALISIS DAN PERANCANGAN 67
Rinoa: (Membuat appointment di Palm Desktop untuk keesokan harinya) “OK.”
Rinoa kemudian menjalankan program Rambutan Desktop untuk membuat dokumen
System Requirements Specification (SRS). Ia membuat dokumen SRS baru, kemudian
menambahkan proyek “kamerafoto” ke dalamnya. Di dalam project description
ditulisnya ‘e-commerce kamera buat binaraga.’ Ia juga menambahkan seorang
stakeholder, ‘Vivian’. Kemudian ia mengambil PDA-nya, sebuah Clie􀀖 model tidak terlalu
baru, dan melakukan sinkronisasi data dengan komputer desktop di kantornya.
Dengan sinkronisasi ini, dokumen SRS yang baru ia buat disalin ke dalam PDA-nya.
Keesokan harinya, Rinoa datang ke kantor Binaraga….
Vivian: “Hai… udah lama ga ketemu nih, gimana kabar Cowo Lo… eh, Bos…”
Rinoa: “Hus, jangan diomongin di sini… bisa runyam.”
Vivian: “Iya deh, kita ke meeting room yuk.”
Mereka berdua berjalan ke suatu ruangan tertutup di dalam kantor. Walaupun
tertutup, sekat ruangan itu adalah kaca kedap suara – sehingga orang-orang kantor
masih dapat melihat ke dalam dan sebaliknya.
Rinoa: (Sambil mengeluarkan PDA-nya dan mengaktifkan program Rambutan) “So,
kita bisa mulai?”
Vivian: (Penasaran, sebagai pemilik PDA juga) “Program baru ya?”
Rinoa: “Iya nih, buat ngumpulin requirement… Bos nyuruh gua nyoba, jadi kelinci
percobaan nih, mentang-mentang gua…”
Vivian: (Menyindir, kemudian batuk palsu) “Orang kepercayaannya? (ehem)”
Rinoa: “Ya sudah lah, back to business. Lo mo bikin website e-commerce? Jual
kamera?”
Vivian: “Iya, ekspansi, biasa….”
Rinoa: “Siapa aja yang ikutan proyek ini?”
Vivian: “Gua, Bos gua, Sugi…”
Rinoa: “Sugianto?”
BAB 6 – ANALISIS DAN PERANCANGAN 68
Vivian: “Iya, sama Kristin, anak baru di marketing – nanti gua kenalin.”
Rinoa: (Menambah dua stakeholder baru selain Vivian yang telah dicatat kemarin:
Sugianto dan Kristin) “Udah? Ada lagi?”
Vivian: “Ya nanti paling anak-anak CS sama marketing, tapi itu Kristin yang urus.”
Rinoa: (Mencatat stakeholder: customer service dan marketing) “T’rus mo nampilin
apa aja?”
Vivian: “Produk, shopping cart – biasa lah, cuma kita mau ada sejarah pesanan
buat business intelligence.”
Rinoa: (Mencatat requirement: ‘shopping cart’, ‘daftar produk’, dan ‘sejarah pesanan’.
Untuk requirement ‘sejarah pesanan’, ia menambahkan rationale ‘business
intelligence’).
Vivian: “Lalu nanti mau bikin komunitas penggemar fotografi, jadi kudu ada
tampilan info-info atau artikel yang bisa di-update.”
Rinoa: (Mencatat requirement, ‘tampilan artikel’ beserta rationale-nya: ‘untuk
membuat komunitas’). “Pake content management?”
Vivian: “Iya lah, lo tau kan kita ga punya IT staff khusus.. Jadi artikel, produk,
[dan] pesanannya kudu bisa diurus dari web… dan bisa gampang diupdate.”
Sementara mereka berbicara, Vivian melihat seseorang berjalan melewati ruang
pertemuan. Ia kemudian bangkit, keluar, dan memanggil orang tersebut. Menjawab
panggilan Vivian, orang itu ikut masuk kembali ke ruang pertemuan bersamanya.
Vivian: “Ini Kristin, anak yang gua bilang tadi.”
Kemudian Kristin dan Rinoa saling berkenalan.
Rinoa: “Bisa minta nomor telepon?”
Kristin: (Melihat Clie􀀖 milik Rinoa) “Gua beam ya… Bentar deh….”
Kristin kemudian mengeluarkan telepon genggamnya, sebuah 7650, standard issue
bagi pegawai marketing Binaraga. Rinoa mengarahkan PDA-nya pada telepon genggam
BAB 6 – ANALISIS DAN PERANCANGAN 69
7 Anak-anak: para programmer.
Kristin dan sebaliknya. Mereka lalu bertukaran virtual business card (VCard) lewat
jalur inframerah.
Kristin: “Lagi pada ngapain nih?”
Vivian: “Ini nih, lagi bicarain kamerafoto… Rinoa itu system analyst dari Arcle
Technologies, yang bakal ngebuatin web baru kita itu. Lo bisa bantuin
kan?”
Kristin: “Oh gitu… bisa lah, jelas udah tugas gua.” (Kemudian duduk untuk
mengikuti rapat).
Vivian: “Sampai mana tadi… Oh ya, bisa integrasi dengan web yang lama ga? Terus
pake PHP dan MySQL biar bisa ditaruh di webhosting yang sama.”
Rinoa: (Mencatat masalah: ‘integrasi dgn legacy sys’. Kemudian mencatat batasan
‘PHP & MySQL’. Batasan ini diberi alasan, ‘webhosting yg sama dgn legacy
sys’).
Kristin: “Bisa dibuat untuk nyaring Pak Ogah dan Paman Gober ga?”
Rinoa: “Pak Ogah? Paman Gober? Siapa mereka?”
Kristin: “Istilah marketing sini – Pak Ogah itu orang-orang yang daftar sebagai
member tapi ga pernah login lagi atau lama sekali ga aktif. Kalo Paman
Gober itu member udah lama, sering login, tapi ga pernah beli apa-apa.”
Rinoa: (Mencatat istilah: Pak Ogah dan Paman Gober. Kemudian membuat dua
requirement ‘filter Pak Ogah’ dan ‘filter Paman Gober’. Lalu ia membuat
hubungan antara kedua requirement dengan definisi artinya masing-masing).
Kristin: (Setengah memaksa) “Jadi bisa ga?”
Rinoa: “Nanti gua tanyain anak-anak7 deh, yang penting sekarang keperluankeperluannya
dikumpulin dulu.”
Vivian: (berbicara perlahan kepada Kristin) “Tenang aja, kita udah sering kerja
sama dengan mereka, koq.”
BAB 6 – ANALISIS DAN PERANCANGAN 70
8 JAD: Joint Application Development.
Rinoa: “Visi proyeknya apa nih?”
Vivian: “Visinya…” (diam sejenak) “Eh, nanti gua tanya Bos dulu boleh bilang
sekarang apa engga – maklum, rada classified, takut bocor.”
Rinoa: “Tapi proyeknya jadi kan?”
Vivian: “Jadi lah, kita udah beli domain name-nya koq. So, berapa duwit bikinnya
nih?”
Rinoa: “Kayaknya ini rada sulit…” (menghitung requirement yang sudah dicatat
kemudian berpikir sejenak) “Mungkin sekitar satu setengah dari proyek lo
yang terakhir itu – tapi ini masih kira-kira lho.”
Tiba-tiba telepon genggam Rinoa berdering. Ternyata Yenny, sekretaris kantor, yang
memanggil.
Yenny: “Rin, besok kan kita ada JAD8, jadi si Bos mau kumpulin kita-kita sore ini
buat rapat – lembur dikit lah. Abis ini gua kirimin agenda rapatnya via
SMS.”
Rinoa: (kepada telepon) “OK. Btw, gua kayaknya dapet proyek nih, draft SRS-nya
ntar gua kirim. Tolong kasi tau bos sama anak-anak.”
Yenny: “Tentu, Bos….”
Rinoa: (menutup telepon) “Kawan-kawan, gua dipanggil nih, sorry. Ada yang mau
diomongin lagi tidak?”
Vivian: “Kayaknya segitu dulu deh.”
Kristin: (Mengangguk diam).
Rinoa: “Ya udah, gua balik dulu ya. Nanti gua kontak lo lagi sama ngasi draft
kontraknya.”
Vivian: “Oke deh. Good luck ya. Ati-ati di jalan.”
Rinoa: (bangkit untuk meninggalkan ruang rapat) “Makasih banyak ya.”
BAB 6 – ANALISIS DAN PERANCANGAN 71
Di dalam subway, Rinoa mengirimkan draft SRS yang sudah ditulisnya pada saat
pertemuan tadi ke kantor via telepon genggam. Ia kemudian menerima satu halaman
agenda rapat yang kemudian dibacanya dengan menggunakan PDA.
6.2 Spesifikasi Kebutuhan
6.2.1 Sistem membantu dalam pengumpulan informasi requirements
Sebagai sebuah requirements management tool, tentulah fungsi utamanya adalah
untuk membantu mengumpulkan berbagai requirement yang ada. Pengumpulan ini
dilakukan terutama pada saat system analyst berinteraksi dengan stakeholder.
Interaksi dapat dilakukan dalam sesi-sesi formal maupun informal – seperti
wawancara, brainstorming, workshop, rapat, maupun pada saat diskusi lewat telepon.
Dalam beberapa kesempatan ini, mungkin sang analyst sedang tidak dapat
menggunakan sebuah komputer desktop maupun notebook – untuk alasan kepraktisan
ataupun alasan-alasan yang lain.
6.2.2 Sistem membantu dalam pengelolaan informasi requirements
Data maupun informasi yang telah dikumpulkan haruslah dapat dikelola agar menjadi
suatu informasi yang berkualitas. Sistem harus dapat mengkategorikan berbagai data
requirement yang ada untuk mempermudah akses maupun analisis lebih lanjut.
Dari user story pada bagian 6.1, sebuah dokumen SRS yang menjadi penampung dari
berbagai informasi requirement terdiri atas sekumpulan entry yang dapat dikategorikan
sebagai berikut:
• proyek
• stakeholder
• requirement
• istilah
• masalah
• batasan
Selain itu juga ada informasi traceability yang menghubungkan berbagai entry di dalam
sebuah SRS.
BAB 6 – ANALISIS DAN PERANCANGAN 72
9 Tokoh Kristin pada user story di bagian 6.1 bukanlah merupakan contoh dari
pegawai marketing yang technophobic.
Berbagai entry yang telah dimasukkan ke dalam sistem haruslah dapat diubah (edit)
untuk memfasilitasi perubahan requirement pada analisa lebih lanjut.
6.2.3 Sistem mempunyai sebuah modul untuk digunakan di komputer genggam
Berhubungan dengan requirement 6.2.1, di saat absennya keberadaan komputer
desktop atau notebook, system analyst dapat juga menggunakan sebuah handheld
computer (yang beberapa di antaranya disebut Personal Digital Assistant – PDA).
Sebuah komputer berukuran kecil dan software pendukungnya akan memungkinkan
data entry dilakukan langsung di lokasi klien.
Sebagai staff Information Technology (IT), penggunaan sebuah PDA tentu tidak terlalu
menjadi masalah. Hal ini kontras dengan staff marketing yang terkadang mengalami
technophobia9.
6.2.4 Sistem mempunyai sebuah modul untuk digunakan di komputer desktop
Fungsi-fungsi yang diberikan oleh komputer genggam tentulah lebih terbatas bila
dibandingkan dengan komputer desktop atau notebook. Walaupun kekuatan prosesor
dan ukuran memory dari gadgets ini terus meningkat, namun ukuran fisik layar tidak
akan bertambah besar – apabila ukurannya bertambah tentulah tidak dapat lagi
disebut handheld computer, karena sudah melampaui ukuran genggaman manusia.
Belum lagi dengan minim atau absennya sebuah keyboard yang membatasi kecepatan
maupun kemudahan data entry.
Karena itu perlu adanya sebuah modul untuk dijalankan di komputer desktop yang
fungsi-fungsinya merupakan superset dari modul yang terdapat di komputer handheld.
Modul ini terutama berfungsi untuk editing yang lebih intensif pada saat requirement
dianalisa.
6.2.5 Informasi di aplikasi desktop dan handheld dapat dipertukarkan
Agar aplikasi desktop dan handheld dapat digunakan secara bergantian, data
dokumen SRS haruslah dapat dipertukarkan antar aplikasi – secara transitif, antar
device. Pergantian data ini haruslah terjadi semudah dan setransparan mungkin,
BAB 6 – ANALISIS DAN PERANCANGAN 73
seperti yang ada pada aplikasi PIM (Personal Information Management) yang disertakan
di semua komputer genggam yang dijual sebagai PDA.
6.3 Batasan Rancangan
6.3.1 Aplikasi harus dirancang untuk mempermudah pengembangan selanjutnya
(extensible)
Sebagai suatu proyek prototyping dengan jatah waktu yang sangat singkat, tentulah
tidak semua requirement maupun fitur yang diinginkan dapat diterapkan. Oleh karena
itu, program-program yang dibuat haruslah dirancang sedemikian rupa untuk
memfasilitasi pengembangan lebih lanjut.
Aspek-aspek rancangan ini termasuk dokumentasi yang lengkap serta sebuah open
architecture yang diharapkan akan relatif stabil. Pencapaian sebuah arsitektur yang
stabil dapat dilakukan dengan penerapan design patterns yang telah terbukti
manfaatnya serta teruji oleh waktu.
6.3.2 Menggunakan [Gamm95] design patterns
Batasan ini berhubungan dengan requirement 6.3.1. Karena pola-pola rancangan yang
dikategorikan di [Gamm95] telah teruji di banyak object-oriented systems, maka
penggunaannya diharapkan dapat menghasilkan sebuah arsitektur yang baik. Fakta
pendukung lainnya yaitu buku ini telah melakukan evangelisasi design patterns di
bidang pengembangan perangkat lunak.
6.3.3 Aplikasi handheld harus multi-platform
Setidaknya saat ini terdapat dua sistem operasi PDA: Palm OS dan Pocket PC.
Walaupun Palm OS masih memegang mayoritas, namun pangsa pasarnya telah
banyak dikurangi oleh Pocket PC dari Microsoft. Belum lagi sistem operasi
Symbian OS yang banyak digunakan di telepon genggam high-end Nokia – yang
memiliki berbagai fungsi tambahan menyerupai PDA.
Untuk mengurangi resiko terjebak di tengah platform wars ini, modul yang diperuntukkan
bagi komputer handheld jangan sampai tergantung pada sistem operasi tertentu.
Program harus dapat dijalankan di setidaknya dua sistem operasi handheld; atau
minimal dapat dibuat dua versi untuk masing-masing sistem operasi hanya dengan
BAB 6 – ANALISIS DAN PERANCANGAN 74
10 Terutama yang masih termasuk CMM Level 1(initial)
cara kompilasi ulang (analogis dengan portabilitas antar Unix dan Windows yang
ditawarkan oleh pustaka Qt untuk program C++).
6.3.4 Aplikasi desktop harus multi-platform.
Sebagaimana dengan batasan yang diberikan pada aplikasi untuk handheld, ketergantungan
pada sistem operasi desktop tertentu juga perlu dihindari. Walaupun dominasi
Microsoft Windows saat ini cukup signifikan, namun pengguna MacOS tidak bisa
dibilang sedikit – terutama di Amerika Serikat. Belum lagi dengan mulai bangkitnya
Linux untuk penggunaan di komputer desktop. Ketergantungan pada sistem operasi
tertentu dapat memperkecil pangsa pasar sebuah RE Tool – yang pada awalnya juga
tidak bisa dibilang besar.
6.3.5 Terdapat kode program pada handheld dan desktop yang digunakan
bersama
Sehubungan dengan requirement 6.2.5, data transfer antar-aplikasi haruslah difasilitasi
dengan adanya sejumlah common code pada kedua belah sisi pada antarmuka
aplikasi desktop dengan handheld. Keuntungan yang didapatkan dengan adanya
common code ini adalah:
• Meningkatkan konsistensi representasi data antar aplikasi.
• Mempermudah maintenance pada kedua aplikasi.
• Meminimalkan recoding maupun reimplementation pada kedua aplikasi.
6.3.6 Aplikasi yang dibuat tidak tergantung pada metodologi RE tertentu
Sebagai suatu bidang yang relatif baru, industri perangkat lunak masih belum setuju
pada satu metodologi requirements engineering tertentu. Walaupun ada beberapa
metodologi yang cukup populer, namun berbagai organisasi yang melakukan software
development masih cenderung untuk menggunakan metodologi kesukaannya sendiri
– malahan beberapa organisasi10 tidak menggunakan metodologi RE yang baku.
Selain itu, pertanyaan “Metodologi RE mana yang terbaik” juga masih diperdebatkan
[Gudg00].
BAB 6 – ANALISIS DAN PERANCANGAN 75
Mengingat keadaan-keadaan tersebut, ketergantungan pada metodologi RE tertentu
akan dapat menghambat perkembangan suatu RE Tool yang masih infant seperti
Rambutan. Sehingga suatu RE Tool yang masih baru ini sebaiknya dapat digunakan
untuk beberapa metodologi RE yang berbeda.
6.3.7 Tidak ada pembayaran kontinu kepada pihak ketiga
Pembayaran license fee ataupun biaya-biaya pihak ketiga lainnya secara berkelanjutan
tentu dapat mengurangi keuntungan dari penjualan sebuah perangkat lunak. Apalagi
bila license fee ini merupakan variable cost yang menambah biaya jual untuk setiap
salinan aplikasi yang dijual.
Sebagai sebuah prototype yang belum mempunyai sponsor yang jelas, komponenkomponen
komersial – terutama yang bisa mendatangkan biaya-biaya tambahan
seperti disebutkan sebelumnya – sebaiknya dihindari. Ini ditujukan agar Rambutan
tetap mempunyai banyak alternatif development branches yang mungkin.
6.4 Perancangan
6.4.1 Gambaran umum sistem
Sistem terdiri atas dua aplikasi yang berdiri sendiri: satu untuk komputer handheld
dan satu lagi untuk komputer desktop. Aplikasi handheld diterapkan dengan
SuperWaba sedangkan aplikasi desktop dibuat untuk platform Java 2 Standard
Edition (J2SE). Kedua aplikasi diprogram untuk API yang berbeda, namun keduanya
dibuat dengan bahasa pemrograman Java. Hal ini memungkinkan beberapa
komponen untuk digunakan secara bersama di aplikasi handheld ataupun desktop.
Berkat SuperWaba, aplikasi handheld dapat dijalankan di sistem operasi Palm OS dan
Pocket PC tanpa perlu dilakukan kompilasi ulang. Karena – seperti Java –
SuperWaba adalah sebuah sistem berbasis virtual machine, maka executable file yang
persis sama dapat digunakan untuk kedua platform. Selain itu berkat suatu
compatibility layer, program-program SuperWaba dapat dijalankan dengan menggunakan
sebuah Java Virtual Machine (JVM) yang memenuhi standar JDK 1.1. Pilihan
kompatibilitas ini dapat digunakan untuk mendukung handheld dengan sistem
BAB 6 – ANALISIS DAN PERANCANGAN 76
11 Misalnya Sharp ZaurusTM.
operasi lain yang mendukung Java 1.1, seperti misalnya komputer genggam berbasis
Linux11.
Sebagai program J2SE, aplikasi desktop dapat digunakan di semua sistem operasi
yang mendukung Java 2 – termasuk Windows, Linux, Macintosh, OS/390, bahkan
Novell Netware. Selain portabilitas, platform J2SE juga memberikan suatu pustaka
serta API yang kaya yang akan memudahkan pengembangan aplikasi selanjutnya.
Dukungan SuperWaba terhadap Palm OS dan Pocket PC memenuhi requirement 6.3.3.
Penggunaan J2SE memenuhi requirement 6.3.4. Bahasa pemrograman Java yang digunakan
oleh SuperWaba dan J2SE memungkinkan pemenuhan requirement 6.3.5 dan
6.2.5. Fakta bahwa program-program SuperWaba dapat dijalankan di J2SE juga mendukung
pencapaian requirement 6.2.5. Selain itu, bahasa Java yang object-oriented
serta platform J2SE yang kaya akan pustaka kelas mendukung pencapaian requirement
6.3.1 dan 6.3.2. SuperWaba yang open-source serta J2SE yang dapat didownload
secara gratis tidak bertentangan dengan batasan 6.3.7.
6.4.2 Rancangan umum
Rancangan problem domain sistem didasarkan terutama pada RQML. Pada dasarnya,
aplikasi desktop maupun handheld adalah editor untuk dokumen-dokumen RQML.
Aplikasi-aplikasi ini memberikan cara untuk membuat berbagai entry di mana masingmasing
entry merupakan salah satu dari first-class RQML element (subbab 4.3 di
halaman 36). RQML dipilih terutama karena jenis-jenis first-class element yang ada
adalah superset dari jenis-jenis entry dokumen SRS yang terdapat pada requirement
6.2.2. Selain itu karena RQML berdasarkan XML, maka format dokumen SRS yang
dihasilkan oleh Rambutan adalah non-proprietary.
Aplikasi desktop melakukan load/save terhadap data RQML secara langsung (dalam
bentuk file XML). Sedangkan aplikasi handheld menggunakan suatu format data
tersendiri (proprietary) yang dapat dibaca oleh aplikasi desktop dan kemudian
disimpan dalam bentuk XML. Aplikasi desktop juga dapat menyimpan data RQML ke
dalam format yang digunakan oleh aplikasi handheld. Bentukan proprietary dari data
di aplikasi handheld dipilih agar memudahkan implementasi aplikasi tersebut serta
BAB 6 – ANALISIS DAN PERANCANGAN 77
12 Konsep sinkronisasi ini umum terdapat pada komputer genggam yang dijual
sebagai PDA dan dilakukan secara periodik oleh penggunanya untuk melakukan backup
data ke desktop. Istilah Palm OS untuk hal ini adalah ‘HotSync’ sedangkan Pocket PC
menamakannya ‘ActiveSync’.
13 Para programmer untuk platform Palm OS mungkin akan lebih memahami kalimat,
“Belum ada conduit yang dibuat untuk HotSync.”
menghemat tempat yang diperlukan untuk menyimpan data di dalam komputer
genggam.
Sebagai sebuah RQML editor, kedua aplikasi terdiri dari beberapa dialog yang masingmasing
digunakan untuk menyunting sebuah first-class RQML element. Misalkan
untuk elemen stakeholder terdapat editor-nya sendiri yang berbeda dengan editor
untuk elemen project.
Kedua aplikasi ditujukan untuk satu pengguna saja (single-user) dan dapat menangani
lebih dari satu dokumen RQML. Masalah pengumpulan dan analisis requirement
secara kolaboratif belum ditangani pada prototipe ini.
Dokumen-dokumen di aplikasi handheld disimpan di dalam device dan ditransfer ke
komputer desktop pada saat sinkronisasi12. Untuk tahap pertama pengembangan,
aplikasi desktop cukup dapat membaca dan menyimpan data yang dimiliki oleh
aplikasi handheld – namun satu dokumen belum dapat di-edit secara bersamaan di
desktop dan handheld dengan perubahan-perubahannya akan digabungkan pada saat
sinkronisasi13.
Pada kedua aplikasi dilakukan pemisahan antara user-interface dan data model.
Aplikasi desktop menggunakan Swing untuk antarmuka pemakainya. Sedangkan
aplikasi handheld tidak mempunyai banyak piliha standar antarmuka pemakai selain
yang telah disediakan oleh SuperWaba. Diharapkan bahwa komponen-komponen data
yang diimplementasikan oleh aplikasi desktop dapat digunakan kembali (re-use) untuk
pengembangan lebih lanjut – seperti misalnya aplikasi untuk server.
6.4.3 Rancangan kelas representasi data
Kelas representasi data dirancang dengan memetakan data model RQML yang
diberikan oleh [Gudg00] hampir secara langsung ke dalam suatu interface inheritance.
BAB 6 – ANALISIS DAN PERANCANGAN 78
14 RDBMS seperti Oracle 9i memberikan fasilitas ini.
RMT
Koka-Koli BPR
Remote Pair Programming
Virtual JAD
HelloWorld System
New Details New
HelloWorld System Requirements
Message
GUI
req-3 Fonts
req-2
req-1
ID Name
Projects
Requirements
Stakeholders
Use-Cases
Assumptions
Issues
Taxonomies
Contexts
Lexicon
Groups
Traces
OK
uc1
General Actors Conditions Cour…
ID
Name
Priority
Difficulty
Status
Stability
Version
Cancel Delete
Description
Rationale
This describes the most
ordinary use of the “hello
world” system
………………………………………….
uc1…………………………………….
Traditional Hello World usage
High
Normal
Proposed
Normal
1.0
Gambar 6.1 Rancangan layar aplikasi handheld. Dari kiri ke kanan: Document List, Entry List, dan
Edit Entry.
Kemudian interface tree ini diimplementasikan oleh dua data model, masing-masing
untuk aplikasi desktop dan handheld.
Data model pada aplikasi desktop akan dibuat sebagai sekumpulan adapter yang
menggunakan komponen-komponen dari pustaka pengurai XML untuk menyimpan
datanya baik di memory maupun sebagai file dalam disk. Berbagai method call
implementasi dari interface RQML di-forward ke method call untuk XML parser.
Penggunaan pustaka pengurai XML secara eksklusif sebagai back-end memungkinkan
pengembangan lebih lanjut yang menyimpan data RQML bukan di file – misalnya
penyimpanan data XML di dalam sebuah basis data relasional14.
Sedangkan data model pada aplikasi handheld menyimpan datanya sendiri dalam
bentuk instance variables. Ini dilakukan karena berbagai keterbatasan yang ada pada
platform yang digunakan – sebuah XML parser yang fully-featured masih terlalu besar
untuk diterapkan secara efisien di dalam sebuah komputer genggam. Selain itu untuk
mengikuti salah satu filsafat komputer handheld yaitu sebagai satellite viewer untuk
komputer desktop [Palm].
6.4.4 Rancangan antarmuka pemakai
Rancangan antarmuka pemakai dibuat awalnya untuk aplikasi handheld. Sebagai
sebuah superset, rancangan antarmuka pemakai untuk aplikasi desktop akan
mengikuti semangat dari antarmuka aplikasi handheld.
Terdapat tiga jenis layar di aplikasi handheld: sebuah Document List, Entry List dan
akhirnya Edit Entry. Layar Document List memungkinkan pengguna untuk memilih
sebuah dokumen SRS yang akan di-edit. Layar Entry List berguna untuk memilih
BAB 6 – ANALISIS DAN PERANCANGAN 79
[Document List]
[Edit Entry]
Select Document [Entry List]
Select Entry
New Entry
Delete Entry
Confirm Edit
Cancel Edit
Close Document
[Confirm Delete]
(Remove Entry)
Gambar 6.2 State diagram rancangan antarmuka pemakai aplikasi handheld.
sebuah elemen RQML first-class untuk disunting. Sedangkan layar Edit Entry
digunakan untuk mengubah sebuah elemen RQML first-class. Pada layar Entry List,
pengguna dapat memilih jenis dari elemen-elemen RQML first-class yang ditampilkan.
Gambar 6.2 menampilkan state diagram untuk berbagai tampilan pada aplikasi
handheld. Status-status Document List, Entry List, dan Edit Entry bersesuaian dengan
layar-layar yang dilukiskan sebelumnya. Karena status Confirm Delete hanyalah
sebuah dialog box pertanyaan sederhana, maka ilustrasi tampilannya tidak diberikan.
Pada awalnya program menampilkan layar Document List. Di layar ini, pengguna
dapat memilih salah satu dokumen yang akan di-edit ataupun membuat dokumen
baru (status tidak ditampilkan). Kedua pilihan akan membawa pengguna pada layar
Entry List yang menampilkan daftar berbagai entry yang terdapat di dalam dokumen.
Di dalam layar ini, pengguna dapat membuat entry baru maupun menyunting entry
yang telah ada. Kedua pilihan akan menampilkan layar Edit Entry yang berguna
untuk mengubah entry yang telah dipilih. Pada layar ini, operasi editing dapat
kemudian disimpan ataupun untuk menghapus entry yang sedang aktif. Setelah
selesai melakukan editing, pengguna akan dikembalikan ke layar Entry List. Dari layar
Entry List, pengguna dapat menutup dokumen yang sedang aktif untuk melakukan
editing terhadap dokumen SRS lainnya.
80
Bab 7
IMPLEMENTASI
Bab ini akan membahas rincian-rincian implementasi dari program yang telah dihasilkan.
Sebelumnya didahului oleh uraian singkat mengenai berbagai teknologi yang
digunakan dalam pembuatan program, pembahasan dimulai pada tinjauan luas
arsitektur masing-masing aplikasi. Kemudian dilanjutkan pada cara yang telah ditempuh
untuk mengekspresikan data RQML – yang didefinisikan dengan sebuah XML
DTD – ke dalam bentuk object-oriented. Dari sini pembahasan diteruskan ke
antarmuka pemakai berikut beberapa contoh screenshot kedua aplikasi. Setelah itu
akan dibahas beberapa komponen yang dominan secara arsitektural berikut design
patterns yang digunakannya. Pembahasan pada bab ini ditutup dengan memberikan
hitungan source code metric pada Rambutan.
7.1 Teknologi yang Digunakan
Aplikasi handheld diterapkan untuk platform SuperWaba, sedangkan aplikasi desktop
diprogram untuk Java 2 Standard Edition (J2SE). Untuk implementasi GUI pada
aplikasi desktop digunakan Swing, suatu pustaka dan framework alternatif dari J2SE
di samping Abstract Windowing Toolkit (AWT). Pengurai (parser) XML yang digunakan
adalah Apache Xerces. Sedangkan build tool yang digunakan untuk meng-compile
program serta membuat paket-paket distribusi adalah Apache Ant. Dokumentasi
source code dibuat menggunakan Doxygen.
7.1.1 Java
Java adalah suatu bahasa pemrograman berorientasi obyek yang dibuat oleh Sun
Microsystems. Tidak seperti bahasa pemrograman pada umumnya, program-program
Java di-compile ke dalam bentuk bytecode, yaitu sebuah bahasa mesin untuk prosesor
abstrak. Sebuah perangkat lunak yang dinamakan Java Virtual Machine (JVM)
mengimplementasikan mesin abstrak ini secara software. Sebagai platform, Java juga
mendefinisikan sekelompok API untuk digunakan oleh program-programnya. Karena
BAB 7 – IMPLEMENTASI 81
di-compile menjadi bahasa mesin abstrak serta adanya standarisasi API membuat
Java menjadi bahasa pemrograman yang multi-platform.
Sun juga menyediakan beberapa implementasi JVM berikut API-nya untuk berbagai
sistem operasi yang dapat di-download secara gratis. Software ini secara resmi disebut
Java Software Development Kit, dan secara tradisional disebut sebagai JDK.
Beberapa vendor independen juga menyediakan berbagai implementasi JDK lainnya
sebagai alternatif dari yang disediakan oleh Sun.
Sampai saat ini, platform Java yang ditetapkan Sun dinamakan Java 2. Platform ini
dibagi dalam tiga edisi [Sun02a]:
• Java 2 Standard Edition (J2SE) – ditujukan untuk pengembangan aplikasi bagi
komputer-komputer client maupun personal computer.
• Java 2 Enterprise Edition (J2EE) – ditujukan bagi komputer-komputer server
untuk pengembangan enterprise applications.
• Java 2 Micro Edition (J2ME) – ditujukan untuk consumer electronic devices
seperti telepon genggam, smart card, pager, dan set-top box.
7.1.2 SuperWaba
SuperWaba (http://www.superwaba.org/) merupakan salah satu implementasi
alternatif Java yang ditujukan untuk komputer genggam (handheld) berbasis Palm OS
dan Pocket PC. Dikembangkan oleh Guilherme Campos Hazan, SuperWaba
merupakan pengembangan lanjutan dari Waba 1.0g [Fari03]. Penggunaan SuperWaba
diatur oleh lisensi open-source LGPL dan dapat di-download secara gratis.
Waba merupakan sebuah implementasi Java Virtual Machine (JVM) yang ditujukan
untuk komputer-komputer dengan arsitektur yang sangat terbatas. Dikembangkan
oleh Rick Wild pada tahun 1999, Waba ditargetkan sebagai subset yang hanya mendukung
sebagian dari language features yang dimiliki oleh Java. Tidak semua bytecode
yang didukung oleh JVM juga didukung oleh Waba VM. Walaupun merupakan
implementasi JVM, namun standar API yang digunakan berbeda jauh dengan yang
digariskan oleh pencipta Java, Sun Microsystems. Perbedaan-perbedaan ini memungkinkan
Waba menjadi jauh lebih ramping dibandingkan Java sehingga dapat
diterapkan di komputer handheld (yang pada masa itu lebih terbatas dibandingkan
sekarang).
BAB 7 – IMPLEMENTASI 82
Java
Waba
Jump
SuperWaba
WabaJump
1995 1997 2001
J2ME
1999 2003
Gambar 7.1 Evolusi bahasa pemrograman Java untuk komputer genggam
[Dick02] [Fari03] [Haza03] [Sun00b] [Wild99].
Salah satu keuntungan utama dari menggunakan Waba adalah penggunaan tools Java
untuk pengembangan program. Learning curve untuk para developer Java relatif
landai karena bahasa pemrograman yang digunakan benar-benar subset dari Java.
Walaupun API yang digunakan berbeda, Waba memberikan suatu compatibility layer
yang menjadi perantara antara Waba API dengan Java API sehingga program-program
Waba dapat dijalankan di komputer desktop dengan menggunakan Java 1.1.
Kesemua ini terjadi ketika standar Java 2 Micro Edition (J2ME) masih dalam proses
tinggal landas [Sun00b] – juga pada waktu itu masih sedikit development tools yang
cukup viable untuk cross-platform handheld programming. Salah satu yang ada untuk
kegunaan tersebut, MobileBuilder (http://www.penright.com/), sangat mahal dengan
harga lisensi $1595 per developer seat [Adib02]. Dengan Waba didistribusikan secara
gratis dalam lisensi LGPL membuatnya menjadi platform yang sangat menarik.
Implementasi Waba 1.0 mendukung banyak sekali platform seperti Palm OS,
Windows CE, Newton, TI (kalkulator scientific), dan DOS [Adib02]. Namun sayangnya
kemampuannya sangat terbatas – seperti sedikitnya user-interface controls, tidak mendukung
warna, dan tidak mendukung exception. Selain itu nampaknya Rick Wild berhenti
meneruskan pengembangan Waba pada tahun 2000 [Haza03].
BAB 7 – IMPLEMENTASI 83
15 Sebagai perbandingan, J2ME MIDP tidak mendukung floating-point.
Perkembangan selanjutnya dari Waba adalah SuperWaba dan WabaJump. WabaJump
dikembangkan di http://www.wabajump.org/ yang merupakan penggabungan dari
Waba dan Jump. WabaJump memungkinkan untuk menulis program-program Jump
dengan API dari Waba. Namun perkembangan proyek ini sejak tahun 2001
nampaknya tidak banyak yang tercermin dari rendahnya aktivitas di website-nya.
Dikembangkan secara estafet oleh Greg Hewgill, Ralf Kleberhoff, dan terakhir Peter
Dickerson, Jump (http://jump.sourceforge.net/) merupakan salah satu effort untuk
menghasilkan development tools berbasis Java bagi Palm OS [Dick02]. Dengan Jump,
program dalam bahasa Java di-compile ke native code prosesor keluarga Motorolla
DragonBall yang menjadi prosesor handheld berbasis Palm OS 2.0 – 4.1 (Palm OS 5
menggunakan prosesor jenis lain [Palm02]). API yang digunakan oleh Jump bukanlah
API standar Java, namun API Palm OS yang di-wrap ke bahasa Java.
Pembuat SuperWaba mengklaim bahwa SuperWaba adalah extension dari Waba. Namun
pada kenyataannya, untuk menjalankan program-program Waba di SuperWaba
terkadang diperlukan modifikasi pada source code program tersebut – tidak hanya dicompile
ulang [Haza03]. Walaupun modifikasi ini relatif kecil dan tidak perlu
dilakukan untuk beberapa program, namun keberadaan inkompatibilitas ini berarti
bahwa SuperWaba bukanlah murni superset dari Waba.
Platform yang didukung SuperWaba juga lebih terbatas dibandingkan dengan Waba.
Sampai pada versi 3.51, program-program SuperWaba hanya dapat dijalankan di
Windows CE (HPC 2.11 dan PPC 2.11, untuk prosesor ARM, MIPS, maupun SH3),
Pocket PC (ARM, MIPS, SH3), Palm OS (2.0–4.1 dan 5) serta JVM (minimal Java 1.1).
Namun fasilitas pemrograman yang diberikan oleh SuperWaba jauh lebih banyak
ketimbang Waba pendahulunya. Dukungan layar warna, kaya akan user-interface
controls, dukungan exception, pemrosesan bilangan floating-point15, komunikasi via
TCP/IP network, serial port, infrared maupun bluetooth, serta adanya dukungan untuk
cooperative thread (tidak preemptive seperti thread pada umumnya) ada pada
SuperWaba.
BAB 7 – IMPLEMENTASI 84
Performa (kecepatan) yang diberikan oleh SuperWaba juga jauh di atas Waba pada
device yang sama [Haza03]. Bahkan kecepatan SuperWaba lebih dari dua kalinya Sun
MIDP (salah satu sub-platform dari J2ME) ketika keduanya diujikan pada Sony Clie􀀖
PEG-770C (33Mhz DragonBall) [Duve02].
7.1.3 Apache Xerces
Xerces merupakan pustaka pengurai (parser) XML yang dikembangkan di bawah
naungan Apache Software Foundation (ASF). Separti perangkat lunak ASF lainnya,
Xerces disebarluaskan secara open-source dengan lisensi Apache Software License. Ada
dua versi dari implementasi Xerces, masing-masing untuk C++ dan Java.
Sampai pada versi 2.4.0, fitur-fitur yang ditawarkan oleh Xerces adalah:
• eXtensible Markup Language (XML) 1.0 Second Edition Recommendation
• Namespaces in XML Recommendation
• Document Object Model (DOM) Level 2 Core, Events, and Traversal and Range
Recommendations
• Simple API for XML (SAX) 2.0 Core, and Extension
• Java APIs for XML Processing (JAXP) 1.2
• XML Schema 1.0 Structures and Datatypes Recommendations
Pembahasan mengenai pengurai XML telah diberikan pada subbab 3.6 (halaman 27).
Informasi lengkap mengenai Xerces bisa didapatkan di http://xml.apache.org/.
7.1.4 Apache Ant
Apache Ant adalah suatu build tool seperti make, namun tanpa kekurangankekurangannya.
Ant memecahkan masalah tab yang sering terjadi pada para
pengguna make. Diimplementasikan untuk Java 1.1 (untuk Ant versi 1.x), maka Ant
menjadi suatu alat yang cross-platform untuk melakukan build pada program-program
Java.
Awalnya Ant merupakan bagian dari Jakarta Tomcat, suatu web server serta JSP
container yang dibuat sebagai bagian dari Jakarta Project di bawah naungan Apache
Software Foundation (ASF). Pada waktu itu, Ant hanya digunakan untuk melakukan
build pada source code Tomcat. Seiring dengan perjalanan waktu, ternyata Ant dapat
BAB 7 – IMPLEMENTASI 85
berguna untuk proyek-proyek Jakarta lainnya. Maka pada 19 Juli 2000, versi 1.1 dari
Ant menjadi suatu proyek yang berdiri sendiri [Apac02a].
Seperti layaknya produk ASF lainnya, Ant merupakan perangkat lunak open-source
yang disebarluaskan dengan lisensi Apache Software License. Berbeda dengan lisensi
open-source GNU General Public License (GPL), produk ASF dapat dikembangkan
menjadi software komersial yang tidak open-source.
Visi dari Ant adalah simplicity, understandability, dan extensibility. Simplicity berarti
Ant haruslah mudah digunakan oleh seorang programmer yang kompeten.
Understandability berarti mudah bagi seorang programmer yang sama sekali baru
untuk mempelajari dan kemudian menggunakan Ant. Extensibility berarti Ant
haruslah mudah untuk dikembangkan dengan cara menambahkan berbagai kelas
Java kepadanya [Apac00a].
Menurut pembuat awalnya, James Duncan Davidson, Ant adalah sebuah akronim dari
Another Neat Tool. Selanjutnya nama Ant lebih diasosiasikan dengan semut yang
merupakan pekerja keras dan dapat mengangkat beban yang lebih daripada berat
tubuhnya sendiri [Apac02a].
Karena extensible, kegunaan awal Ant sebagai build tool telah terlampaui dengan
banyaknya fasilitas yang diberikan. Selain untuk meng-compile file-file Java, Ant juga
dapat melakukan packaging, deployment, javadoc, operasi-operasi CVS, automated
testing; bahkan ftp, telnet, dan e-mail. Ant juga dapat digunakan sebagai build tool
untuk lingkungan pemrograman lainnya, seperti misalnya platform .NET dari
Microsoft.
Unit kerja Ant adalah satu project, yang dimuat di dalam satu file XML. Biasanya
dinamakan build.xml, file project ini memuat beberapa target dan property set.
Pada setiap target ada serangkaian terurut task yang merupakan perintah-perintah
yang perlu dijalankan untuk melakukan build pada target tersebut. Di antara target
dimungkinkan adanya dependency yang menyatakan bahwa suatu target tertentu
membutuhkan target-target lain untuk di-build terlebih dahulu. Sedangkan property
set merupakan serangkaian konstanta yang mengendalikan proses build. Keterangan
lengkap untuk menggunakan Ant dapat ditemukan di website http://ant.apache.org/.
BAB 7 – IMPLEMENTASI 86
7.1.5 Doxygen
Doxygen (http://www.doxygen.org/) adalah sebuah alat bantu untuk membuat
dokumentasi source code. Dokumentasi dibuat sebagai comment bertanda khusus
yang diletakkan persis sebelum class, method, function, ataupun variables untuk
memberikan keterangan mengenai bagian kode yang bersangkutan. Doxygen akan
memproses source code ini dan kemudian mengambil comment-comment khusus
tersebut untuk diformat dan dijadikan sebuah dokumentasi tersendiri.
Dibuat oleh Dimitri Van Heesch, Doxygen awalnya ditujukan untuk memproses source
code C++ untuk proyek-proyek pribadi yang ditulis menggunakan pustaka Qt. Kini
source code yang dapat diproses oleh Doxygen juga meliputi Java, PHP, C#, dan juga
IDL.
Kelebihan-kelebihan Doxygen antara lain:
• Mampu membuat dokumentasi dalam berbagai format: HTML, RTF, LaTeX, man
page, XML, dan bahkan Compiled HTML (alias Windows 98 help).
• Kompatibel dengan JavaDoc 1.1, Qt-Doc dan KDOC.
• Dapat membuat class diagram dan collaboration diagram secara automatis.
• Dapat membuat tampilan source code secara hypertext, lengkap dengan syntax
highlighting.
Doxygen diimplementasikan dalam bahasa C++ dengan pustaka Qt sehingga dapat
digunakan di platform Unix dan Windows. Selain itu Doxygen juga disebarluaskan
dengan lisensi GNU GPL dan dapat di-download secara gratis.
7.2 Arsitektur
Rambutan terdiri dari dua aplikasi: sebuah aplikasi desktop dan aplikasi handheld.
Aplikasi desktop diprogram untuk API Java 2 Standard Edition (J2SE) sedangkan
aplikasi handheld diprogram untuk API SuperWaba. Kedua aplikasi ditulis dalam
bahasa pemrograman Java. Penggunaan bahasa pemrograman yang sama memungkinkan
kedua aplikasi untuk menggunakan beberapa komponen yang sama.
BAB 7 – IMPLEMENTASI 87
Swing GUI SuperWaba GUI
J2SE API SuperWaba API
Desktop
Model
Handheld
Model
desktop application handheld application
RQML Abstraction
Gambar 7.2 Selayang pandang arsitektur kedua aplikasi
Secara umum aplikasi desktop maupun handheld masing-masing terbagi dalam dua
lapisan utama: lapisan antarmuka pemakai dan lapisan model data. Lapisan
antarmuka pemakai bertanggungjawab atas tampilan grafis serta interaksi dengan
pengguna. Sedangkan lapisan model data mengatur data requirement yang diproses
oleh masing-masing aplikasi.
Kedua aplikasi ini menggunakan satu komponen yang sama, yaitu RQML Abstraction.
Komponen ini adalah serangkaian interface yang berfungsi untuk mendefinisikan
abstraksi data RQML. Pada gilirannya, kumpulan antarmuka ini diimplementasikan
oleh kelas-kelas data model pada masing-masing aplikasi desktop maupun handheld.
Akses terhadap penerapan RQML di kedua aplikasi dilakukan sebanyak mungkin
melalui abstraksi RQML ini. Dengan adanya komponen bersama ini maka konsistensi
representasi data antara aplikasi desktop dan aplikasi handheld akan lebih terjamin
– perubahan interface RQML akan beriak ke kedua data model di desktop maupun
handheld.
Rambutan terbagi atas empat package utama yang kesemuanya dinaungi dalam
package com.arcle.rmt:
• com.arcle.rmt.j2se – Aplikasi desktop
• com.arcle.rmt.superwaba – Aplikasi handheld
• com.arcle.rmt.rqml – Antarmuka-antarmuka abstraksi RQML
• com.arcle.rmt.xplat – Kelas-kelas multiguna lintas-platform
BAB 7 – IMPLEMENTASI 88
SuperWaba GUI
SuperWaba API
Handheld Model RQML Abstraction
RQML Implementation
Gambar 7.3 Selayang pandang arsitektur aplikasi handheld
7.2.1 Aplikasi Handheld
Aplikasi handheld sebenarnya terdiri dari tiga lapisan besar: lapisan SuperWaba GUI,
Handheld Model, dan RQML Implementation. Sedangkan RQML Abstraction merupakan
komponen yang digunakan bersama di desktop maupun handheld. Kesemua lapisan
bergantung pada API SuperWaba.
Lapisan SuperWaba GUI merupakan implementasi dari antarmuka pemakai. Kelaskelas
dalam lapisan ini umumnya merupakan turunan dari kelas Window yang dimiliki
oleh SuperWaba. Akses kepada data dilakukan hanya melalui lapisan-lapisan
Handheld Model ataupun RQML Abstraction; kelas-kelas di dalam RQML Implementation
tidak pernah diakses secara langsung oleh kelas-kelas GUI.
Kelas-kelas di dalam lapisan Handheld Model menyediakan layanan pengaturan
elemen-elemen RQML kepada GUI. Sebagian besar operasi yang dilakukan oleh
lapisan ini untuk menangani elemen-elemen RQML hanya bergantung kepada
antarmuka-antarmuka yang ditetapkan oleh komponen RQML Abstraction. Salah satu
perkecualian utama adalah pada saat pembuatan obyek dari elemen-elemen RQML (di
mana lapisan ini bertindak sebagai abstract factory kepada penggunanya).
Karena kelas-kelas di dalam RQML Abstraction semuanya adalah interface yang
abstrak, agar berguna mereka harus dibuat penerapannya. Lapisan RQML Implementation
menerapkan antarmuka-antarmuka ini untuk digunakan di dalam aplikasi
handheld. Karena lapisan ini terlindung dari GUI oleh lapisan Handheld Model
maupun RQML Abstraction, perubahan implementasi padanya tidak akan mempengaruhi
lapisan GUI.
Aplikasi handheld terletak di dalam package com.arcle.rmt.superwaba, dan diatur
dalam beberapa sub-package berikut:
BAB 7 – IMPLEMENTASI 89
Swing GUI
J2SE API
Desktop Model
DOM API
Xerces Implementation
RQML Abstraction
Element Adapters
Gambar 7.4 Selayang pandang arsitektur aplikasi desktop
• com.arcle.rmt.superwaba.vc
Kelas-kelas antarmuka pemakai
• com.arcle.rmt.superwaba.model
Kelas-kelas data model serta penerapan RQML.
• com.arcle.rmt.superwaba.ui
Kelas-kelas antarmuka pemakai multiguna
• com.arcle.rmt.superwaba.util
Kelas-kelas multiguna
• com.arcle.rmt.superwaba.framework
Antarmuka-antarmuka untuk framework MVC
7.2.2 Aplikasi Desktop
Aplikasi desktop juga terdiri dari tiga lapisan utama: Swing GUI, Desktop Model, dan
RQML Implementation. Lapisan RQML Abstraction adalah komponen yang sama dengan
yang digunakan di aplikasi handheld. Kesemua lapisan bergantung pada API J2SE.
Antarmuka dari aplikasi desktop menggunakan pustaka GUI Swing yang tersedia di
J2SE. Walaupun fungsi-fungsinya serupa dengan aplikasi handheld, GUI pada
aplikasi desktop meraup keuntungan layar yang lebih besar serta kemampuan
antarmuka pemakai yang lebih kaya yang umum terdapat di sebuah komputer
BAB 7 – IMPLEMENTASI 90
desktop. Akses terhadap data juga dilakukan hanya melalui kelas-kelas model dan
RQML Abstraction.
Karena sebuah komputer desktop menawarkan kemampuan pemrosesan yang lebih
besar serta antarmuka pemakai yang lebih kaya, data model di desktop mempunyai
lebih banyak fitur untuk mengambil manfaat dari kenyataan ini. Maka dari itu, data
model pada aplikasi desktop mempunyai method signature serta implementasi yang
berbeda dengan data model pada aplikasi handheld. Seperti aplikasi handheld, data
model ini juga bergantung pada antarmuka-antarmuka pada RQML Abstraction untuk
memanipulasi elemen-elemen RQML dan bertindak sebagai kelas factory untuk
membuat obyek implementasinya.
Lapisan RQML Implementation pada aplikasi desktop berbeda dengan rekannya di
handheld. Ketimbang menyimpan datanya sendiri, kelas-kelas ini bergantung pada
obyek-obyek DOM untuk mewakili data RQML di memory. Maka dari itu kelas-kelas
dalam lapisan ini secara kolektif disebut Element Adapters. Karena adapter-adapter
ini berkomunikasi dengan XML parser hanya melalui antarmuka DOM yang
disediakan, sebuah pengurai XML lainnya dapat digunakan asalkan memenuhi
standar DOM.
Aplikasi desktop terdapat dalam package-package ini:
• com.arcle.rmt.j2se.swing.vc
Kelas-kelas antarmuka pemakai.
• com.arcle.rmt.j2se.model
Kelas-kelas data model and element adapter.
• com.arcle.rmt.j2se.swing.ui
Kelas-kelas umum antarmuka pemakai
• com.arcle.rmt.j2se.util
Kelas-kelas multiguna
• com.arcle.rmt.j2se.framework
Antarmuka-antarmuka framework
7.2.3 Komponen Jembatan
BAB 7 – IMPLEMENTASI 91
SuperWaba to Java Bridge
Bridge Facade
Import Facade Export Facade
First-Class Copy Facade
Importer
First-Class
Element Copiers Exporter
J2SE API
SuperWaba API
RQML Abstraction
Handheld & Desktop Models
Gambar 7.5 Selayang pandang arsitektur komponen bridge
Ilustrasi aplikasi desktop yang ditunjukkan pada Gambar 7.4 hanya menampilkan
sebagian dari arsitekturnya secara keseluruhan. Sebuah komponen jembatan sengaja
disembunyikan agar gambar ini lebih mudah dicerna. Komponen jembatan ini
digunakan oleh aplikasi desktop untuk mengakses data yang dimiliki oleh aplikasi
handheld. Ia menangani pengubahan antara representasi data desktop dengan
handheld.
Ketika seorang pengguna membuka ataupun menyimpan dokumen handheld
menggunakan aplikasi desktop, antarmuka pemakai dari aplikasi desktop memanggil
komponen Bridge Facade untuk membaca data dalam format handheld dan memuatnya
ke dalam data model desktop serta sebaliknya. Pada gilirannya, facade ini mendelegasikan
permintaan tersebut ke Import Facade atau Export Facade yang sesuai
dengan operasi yang dilakukan. Kedua facade ini kemudian menangani operasi import
ataupun export yang diminta.
Komponen Import Facade menggunakan suatu himpunan kelas First-Class Importer
untuk memuat data dari representasi handheld ke desktop. Setiap kelas pengimpor
ini mengimpor satu jenis elemen RQML First-Class.
Dengan cara yang sama, komponen Export Facade menggunakan suatu himpunan
First-Class Exporter untuk menyimpan data dari desktop ke handheld. Mirip dengan
pengimpor, ada pemetaan satu-satu antara kelas pengekspor dengan tipe elemen
RQML First-Class.
BAB 7 – IMPLEMENTASI 92
Kedua facade bergantung pada sebuah Copy Facade untuk menyalin data antar
elemen-elemen RQML. Pada gilirannya, facade ini menggunakan sehimpunan kelas
Element Copier untuk menyalin data-data tersebut. Ada pemetaan satu-satu antara
sebuah kelas penyalin dan elemen RQML (untuk elemen first-class maupun secondclass).
Para penyalin ini hanya bergantung pada antarmuka RQML Abstraction –
mereka tidak mengetahui implementasi yang mendasari antarmuka-antarmuka ini.
Maka dari itu para penyalin ini dapat digunakan untuk menerapkan pengimpor dan
pengekspor RQML untuk berbagai implementasi data model lainnya di masa depan.
Baik facade pengimpor maupun pengekspor berinteraksi secara langsung dengan data
model di desktop maupun handheld. Bertindak sebagai client terhadap kedua model,
mereka mengambil serta menyimpan data RQML antara keberadaan-keberadaan dari
kedua model.
Kode program untuk data model aplikasi handheld dijalankan di desktop sehingga data
RQML dalam format handheld dapat dibaca dan dimuat ke dalam data model aplikasi
desktop. Walaupun data model di handheld diprogram untuk SuperWaba API, hal ini
dimungkinkan karena adanya lapisan simulasi (SuperWaba to Java Bridge) yang disediakan
oleh SuperWaba agar program-programnya dapat dijalankan di Java 1.1.
Karena itu tidaklah perlu untuk menduplikasikan logika program dari aplikasi
handheld untuk membaca datanya.
Komponen jembatan ini terletak di dalam package com.arcle.rmt.j2se.bridge dan
dibagi lagi menjadi beberapa sub-package berikut:
• com.arcle.rmt.j2se.bridge.copy
Kelas-kelas penyalin beserta facade-nya
• com.arcle.rmt.j2se.bridge.swimport
Kelas-kelas pengimpor untuk memuat data dari aplikasi handheld.
• com.arcle.rmt.j2se.bridge.swexport
Kelas-kelas pengekspor untuk menyimpan data ke dalam format handheld.
7.3 Pemetaan dari RQML ke class
Pemetaan data model RQML ke kelas dilakukan dengan cara mengubah hirarki data
model pada Gambar 4.2 (halaman 39) menjadi hirarki interface. Untuk setiap
BAB 7 – IMPLEMENTASI 93
16 Berhubung proyek ini tidak bertujuan untuk memvalidasi [Gudg00], kemungkinan
masih ada lagi ketidakselarasan yang ada selain yang sudah ditemukan.
17 Bahkan satu-satunya software requirements management berbasis RQML lainnya
yang diketahui adalah [Dhar02].
elemen RQML dibuatkan satu interface yang mewakilinya, baik bagi elemen first-class
maupun second-class – termasuk berbagai sub-elemen dari elemen-elemen first-class.
Dalam proses pembuatan hirarki interface RQML dilakukan refactoring. Bila ada dua
elemen yang mempunyai sekelompok attribut yang sama, maka dibuat satu
superinterface dari kedua interface yang mewakili elemen-elemen tersebut. Superinterface
ini memuat common attributes yang dimiliki oleh kedua elemen. Proses ini
juga dilakukan untuk kasus umum di mana ada lebih dari dua elemen yang mempunyai
attribut yang sama: untuk elemen-elemen yang mempunyai sekelompok attribut
yang sama dibuat satu atau lebih superinterface untuk interface-interface yang
mewakili elemen-elemen itu.
Dalam rangka menyederhanakan hirarki interface serta kelas-kelas yang akan mengimplementasinya,
suatu elemen yang dapat mempunyai lebih dari satu instance dari
child element untuk suatu jenis elemen yang sama – yaitu elemen-elemen anakan yang
ditulis dengan suffix ‘*’ atau ‘+’ dalam DTD [Marc99], maka interface yang mewakilinya
hanya mendukung satu instance dari child element tersebut. Ada tiga hal yang
memotivasi penyederhanaan ini:
• Ditemukan beberapa ketidakkonsistenan pada spesifikasi RQML dalam
[Gudg00]16 yang menandakan bahwa (spesifikasi) RQML masih belum stabil.
• RQML belum menjadi bakuan yang disahkan oleh suatu badan independen
(seperti misalnya ISO, IETF atau W3C) sehingga tidak perlu 100% compliant
dengan spesifikasi RQML untuk interoperabilitas dengan alat bantu berbasis
RQML lainnya17.
• Kesulitan teknis dalam pengimplementasian antarmuka pemakai yang efisien
pada aplikasi handheld untuk mendukung multiple child elements ini.
Berikut ini adalah penggalan DTD untuk elemen , ditulis kembali dari
subbab 4.6.4.1:
BAB 7 – IMPLEMENTASI 94




Elemen ini dipetakan menjadi beberapa interface yaitu RQMLSecondClass, RQMLFirst-
Class, dan Requirement:
public interface RQMLSecondClass {
public abstract java.lang.String getURI();
public abstract void setURI(java.lang.String URI);
public abstract java.lang.String getID();
public abstract void setID(java.lang.String ID);
}
Attribut-attribut priority, difficulty, status, dan stability semuanya adalah jenis
enumerasi di mana satu nilai dapat dipilih dari sekumpulan pilihan nilai yang
terbatas. Attribut-attribut ini dipetakan menjadi tipe data int di mana nilai dari tipe
enumerasinya dispesifikasikan dengan menggunakan konstanta-konstanta. Misalkan
untuk memberikan attribut status nilai approved digunakan konstanta
STATUS_APPROVED.
public interface RQMLFirstClass extends RQMLSecondClass {
public static final int PRIORITY_LOW = -1;
public static final int PRIORITY_NORMAL = 0;
public static final int PRIORITY_HIGH = 1;
public static final int DIFFICULTY_LOW = -1;
public static final int DIFFICULTY_NORMAL = 0;
public static final int DIFFICULTY_HIGH = 1;
public static final int STATUS_PROPOSED = 0;
public static final int STATUS_APPROVED = 1;
public static final int STATUS_INCORPORATED = 2;
public static final int STATUS_VALIDATED = 3;
public static final int STABILITY_LOW = -1;
public static final int STABILITY_NORMAL = 0;
public static final int STABILITY_HIGH = 1;
public abstract Name getName();
public abstract int getPriority();
public abstract int getDifficulty();
public abstract int getStatus();
public abstract int getStability();
public abstract java.lang.String getVersion();
public abstract Description getDescription();
public abstract Rationale getRationale();
public abstract void setName(Name NAME);
public abstract void setDescription(Description DESC);
public abstract void setRationale(Rationale RATIONALE);
BAB 7 – IMPLEMENTASI 95
18 Sesuai dengan salah satu nasihat dari [Gamm95], “Program to an interface, not to an
implementation.”
public abstract void setPriority(int PRIORITY);
public abstract void setDifficulty(int DIFFICULTY);
public abstract void setStatus(int STATUS);
public abstract void setVersion(java.lang.String VERSION);
public abstract void setStability(int stability);
}
Karena tag tidak menambah informasi apapun dari superclass-nya,
maka interface yang mewakilinya menjadi kosong (tidak mendefinisikan method
apapun).
public interface Requirement extends RQMLFirstClass {
}
Ketidakkonsistenan pada elemen (subbab 4.6.4.6, di halaman 47) ditanggulangi
dengan menurunkan interface Project dari interface RQMLFirstClass dan
menggunakan property-property berikut sebagai informasi tambahan yang dimiliki oleh
elemen project:
• product
• problem
• scope
• vision
Sedangkan ketidakkonsistenan pada definisi elemen (subbab 4.6.4.3 di
halaman 46) dianggap tidak ada – interface Assumption diturunkan langsung dari
RQMLFirstClass dan tidak mendefinisikan method tambahan apapun.
Dalam implementasinya, ternyata untuk mengakses property-property yang bertipe
obyek hanya method getter (dengan pola menamaan getXxx() pada definisi interface)
yang dipergunakan. Berbagai method setter (dengan pola penamaan setXxx()) hanya
digunakan untuk mengakses property-property dengan tipe sederhana, seperti String
atau int. Karena aplikasi hanya diberi interface dari kelas-kelas elemen RQML18,
maka kesulitan yang ditemui pada penerapan method setter bagi property yang juga
interface RQML adalah bagaimana caranya aplikasi dapat menciptakan obyek baru
untuk di-set ke dalam obyek RQML yang bersangkutan. Salah satu alternatif adalah
dengan memberikan sebuah factory method ataupun factory object bagi application
BAB 7 – IMPLEMENTASI 96
Document List Element List
Element Edit
Gambar 7.6 Diagram status dari antarmuka aplikasi handheld
code, namun hal ini akan mempersulit keadaan. Maka diputuskan bahwa factory
tetap hanya digunakan oleh obyek-obyek penerapan interface RQML dan obyek untuk
sub-elemen dibuat secara dinamis pada akses pertama dari elemen tersebut dengan
menggunakan method getXxxx(). Modifikasi data pada sub-elemen dilakukan
langsung pada obyek elemen tersebut dengan method setter untuk mengubah property
dengan tipe sederhana pada sub-elemen itu. Dengan kata lain, pengubahan data
dilakukan pada leaf property yang notabene memiliki tipe data sederhana.
7.4 Antarmuka pemakai
7.4.1 Aplikasi Handheld
Ada tiga layar utama di aplikasi handheld. Mereka adalah Document List, Element List,
dan Element Edit. Karena melingkupi seluruh daerah tampilan layar pada komputer
genggam, maka hanya salah satu dari layar-layar ini yang ditampilkan pada suatu
saat tertentu.
Aplikasi handheld dimulai pada tampilan Document List yang menampilkan daftar dokumen
requirement yang ada di dalam komputer genggam. Ketukan pada sebuah
nama dokumen akan membuka dokumen tersebut. Juga terdapat sebuah tombol
perintah New pada bagian bawah layar yang digunakan untuk membuat suatu dokumen
baru. Ketika pengguna mengetuk tombol ini, sebuah kotak dialog akan
ditampilkan yang menanyakan nama dari dokumen yang akan dibuat. Setelah si
pengguna memberikan sebuah nama, dokumen baru ini akan diciptakan kemudian
dibuka – seolah-olah dokumen itu telah ada sebelumnya dan sang pengguna
mengetuk namanya.
Membuka sebuah dokumen akan menampilkan layar Element List serta menampilkan
nama dokumen tersebut pada title-area di bagian atas layar. Sebenarnya layar ini
BAB 7 – IMPLEMENTASI 97
terdiri dari suatu himpunan tampilan di mana masing-masing menampilkan daftar
elemen-elemen RQML first-class dengan tipe-tipe tertentu. Masing-masing daftar
elemen ini menampilkan attribut-attribut RQML ID dan Name. Perpindahan antara
tipe elemen first-class dilakukan melalui sebuah combo box pada bagian kanan-atas
layar. Ketukan pada title-area akan menampilkan sebuah pull-down menu di mana
pengguna dapat menciptakan sebuah elemen RQML first-class baru dengan tipe yang
diinginkan. Sedangkan ketukan pada nama sebuah elemen first-class akan
menyunting elemen tersebut.
Tiga tombol perintah disediakan pada bagian bawah layar Element List:
• New – untuk menciptakan sebuah elemen first-class baru dengan tipe yang sama
dengan yang ditampikan pada saat itu.
• Close – untuk menutup dokumen yang sedang ditampilkan dan kembali ke layar
Document List.
• Delete – untuk menghapus dokumen yang sedang ditampilkan dan kembali ke
layar Document List.
Pengaturan antarmuka pemakai ini meniru gaya dari beberapa aplikasi yang disertakan
oleh Palm OS. Aplikasi-aplikasi Address Book, To Do List, Memo Pad, dan Mail
semuanya memiliki sebuah combo box pengubah kategori pada bagian kanan atas dan
suatu baris tombol perintah pada bagian bawah layar.
Ketika sang pengguna membuat sebuah elemen baru atau membuka elemen yang
telah ada, maka sebuah layar Element Edit akan ditampilkan. Layar ini juga merupakan
suatu himpunan layar di mana masing-masing layar digunakan untuk menyunting
suatu kelompok tertentu dari attribut-attribut yang dimiliki oleh sebuah elemen
RQML first-class. Combo box pengubah kategori digunakan untuk berpindah antara
pandangan-pandangan dari elemen first-class yang sama yang sedang di-edit. Daerah
judul dari layar-layar ini menampilkan tipe dari elemen yang sedang aktif.
BAB 7 – IMPLEMENTASI 98
Gambar 7.7 Layar Document
List.
Gambar 7.8 Salah satu layar
Element List; yang ini
menampilkan daftar elemen
dengan tipe Use-case.
Gambar 7.9 Salah satu layar
Element Edit; yang ini
menampilkan sebagian dari
attribut-attribut sebuah
Requirement.
7.4.2 Aplikasi Desktop
Susunan antarmuka aplikasi desktop terutama terinspirasi oleh tampilan Rational
RequisitePro. Pada dasarnya tampilan adalah sebuah jendela Multiple Document
Interface (MDI) dengan sebuah tree view yang diletakkan di bagian kiri. Daerah desktop
digunakan untuk penampilkan jendela-jendela editor elemen first-class.
BAB 7 – IMPLEMENTASI 99
Active document
file name File modified flag
Document Tree
First-Class Element Type
Active Element
First-Class Element
Active Element
Description
Desktop Area
Status Bar
Gambar 7.10 Selayang pandang tampilan aplikasi desktop
Tampilan Document Tree pada bagian kiri dari jendela menampilkan jenis-jenis
elemen first class sebagai folder di dalam tree. Klik ganda pada sebuah folder ini akan
membuat sebuah elemen first-class dengan tipe dari node tersebut. Elemen-elemen
baru juga dapat diciptakan melalui menu Requirement.
Kotak Active Element Description yang terletak persis di bawah Document Tree menampilkan
attribut description dari elemen di dalam pohon yang sedang disorot. Kotak
ini berfungsi untuk memberikan pandangan sekilas ketika pengguna sedang melihatlihat
berbagai elemen first-class yang ada di dalam dokumen – sehingga atribut ini
dapat dilihat tanpa perlu meng-edit elemen yang bersangkutan.
Bagian Desktop Area digunakan untuk menampung jendela-jendela penyunting
elemen first-class. Meraup keuntungan dari antarmuka pemakai yang lebih kaya di
komputer desktop, daerah ini mampu menampilkan lebih dari satu jendela editor.
BAB 7 – IMPLEMENTASI 100
Gambar 7.11 Contoh tampilan yang menampilkan jendela penyunting elemen first-class.
Status Bar adalah suatu daerah di bagian bawah jendela yang menampilkan informasi
status. Daerah ini disiapkan untuk pengembangan selanjutnya; pada saat ini tidak
berfungsi.
Jendela-jendela penyunting elemen first-class semuanya adalah internal frame yang diletakkan
di Desktop Area. Seperti yang terdapat pada aplikasi handheld, setiap jendela
editor mempunyai beberapa sub-bagian di mana masing-masing mempunyai
himpunan komponennya sendiri untuk menyunting bagian-bagian dari elemen firstclass
yang bersangkutan. Pada aplikasi desktop, sub-bagian ini ditaruh di dalam
sebuah tabbed pane di dalam bingkai penyunting. Ada dua tombol perintah yang terletak
pada baris bawah dari masing-masing jendela penyunting:
• Close – menutup jendela penyunting dan memasukkan perubahan-perubahan
yang dilakukan.
• Delete – menghapus elemen yang sedang di-edit dari dokumen dan kemudian
menutup jendela penyuntingnya.
7.5 Penerapan Design Patterns
BAB 7 – IMPLEMENTASI 101
RQMLSecondClass
RQMLFirstClass
Usecase Project
RQMLSecondClassImpl
RQMLFirstClassImpl
UsecaseImpl ProjectImpl
com.arcle.rmt.rqml
com.arcle.rmt.j2se.model.domimpl.rqml
com.arcle.rmt.superwaba.model.imp.rqml
Gambar 7.12 Antarmuka serta implementasi data model RQML.
7.5.1 Representasi data RQML
Sebagaimana telah digariskan di subbab 7.2, data model RQML didefinisikan oleh sebuah
hirarki interface. Kumpulan antarmuka ini kemudian diimplementasikan oleh
kelas-kelas representasi data pada aplikasi desktop maupun handheld. Untuk masingmasing
kelas antarmuka RQML terdapat satu kelas penerapannya sendiri, sehingga
terjadi korespondensi satu-satu antara kelas-kelas interface RQML dengan kelas-kelas
penerapannya.
Nampak pada Gambar 7.12, hirarki paralel ini merupakan suatu penerapan dari
bridge pattern. Berbeda dengan pola rancangan bridge yang termuat di [Gamm95],
penjembatanan antar hirarki kelas tidak dilakukan dengan cara composition maupun
acquaintance oleh root class dari salah satu hirarki. Penghubungan kedua hirarki
dicapai oleh salah satu hirarki yang menjadi kelas-kelas implementasi dari hirarki
yang lain, dengan hirarki yang kedua ini murni terdiri dari interface.
Data model aplikasi desktop terletak dalam package com.arcle.rmt.j2se.model.
domimpl.rqml. Sedangkan data model aplikasi handheld terletak di com.arcle.rmt.
superwaba.model.imp.rqml. Dalam hubungannya dengan himpunan antarmuka
RQML pada package com.arcle.rmt.rqml, bentuk hirarki data model aplikasi desktop
dengan rekannya di handheld tidaklah berbeda.
BAB 7 – IMPLEMENTASI 102
RQMLSecondClass
RQMLSecondClassImpl
com.arcle.rmt.j2se.model.domimpl
ElementAdapter Node
Element
com.arcle.rmt.j2se.model.domimpl.rqml
com.arcle.rmt.rqml org.w3c.dom
RQMLFirstClass
1
1
Gambar 7.13 Adapter pattern pada kelas representasi data untuk aplikasi desktop
7.5.2 Data model aplikasi desktop
Kelas-kelas data model pada aplikasi desktop tidak menyimpan datanya sendiri, namun
penyimpanan data RQML didelegasikan kepada obyek-obyek DOM yang dimiliki
oleh XML Parser. Obyek-obyek ini adalah instance dari interface Element (di dalam
package org.w3c.dom ). Karena itu maka penerapan RQML di desktop adalah kelaskelas
adapter untuk antarmuka ini.
Penerapan adapter pattern [Gamm95] dilakukan oleh kelas akar dari data model
aplikasi desktop yaitu ElementAdapter. Kelas ini memiliki sebuah obyek DOM Element
yang diadaptasikannya. Instance obyek DOM ini digunakan oleh kelas-kelas turunan
untuk menyimpan data RQML. Masing-masing derived class mengadaptasikan suatu
tipe elemen RQML tertentu sesuai dengan antarmuka RQML yang diterapkannya.
Selain itu ElementAdapter memuat beberapa method pembantu untuk digunakan oleh
turunan-turunannya.
Pada gilirannya, kelas ElementAdapter ini menjadi base class dari RQMLSecondClass-
Impl, yaitu penerapan dari root interface RQMLSecondClass untuk aplikasi desktop.
Pararel dengan hirarki antarmuka RQML, semua penerapan elemen RQML adalah
turunan dari kelas ini.
Sebagai bagian dari document tree, sebuah elemen XML dapat mempunyai satu atau
lebih elemen-elemen anakan. Demikian pula dengan elemen RQML yang juga
mempunyai child elements. Kelas Element menyediakan suatu mekanisme akses
terhadap elemen-elemen anakannya. Umumnya child nodes ini juga merupakan
instance dari kelas Element. Penerapan composite pattern ini dibawa dari konsep
dokumen XML.
BAB 7 – IMPLEMENTASI 103
242 protected RQMLSecondClass getFirstChild(String name, boolean forceCreate) {
243 NodeList children = getElement().getChildNodes();
244 for (int i=0; i<children.getLength(); i++) {
245 Node child = children.item(i);
246 if (child instanceof Element && name.equals(child.getNodeName())) {
247 return getFactory().createRQMLSecondClass((Element) child);
248 }
249 }
250 // child not found
251 if (forceCreate) {
252 return createChild(name);
253 }
254 return null;
255 }
Gambar 7.14 File ElementAdapter.java, baris 242 – 255
Agar extensible, aplikasi haruslah diabstraksikan dari implementasi data model yang
menggunakan DOM. Akses terhadap data RQML haruslah melalui hirarki antarmuka
RQML yang didefinisikan di package com.arcle.rmt.rqml. Sehingga apabila penerapan
representasi data berubah, lapisan-lapisan aplikasi yang lebih tinggi tidak terkena riak
dari perubahan ini.
Namun sebagai adapter, turunan-turunan dari ElementAdapter hanya dapat
mengakses instance DOM dari elemen anakan yang dimilikinya; tetapi tidak dapat
mengakses adapter dari child element tersebut. Kesulitan ini menjadi masalah ketika
client code mengakses sebuah child element: obyek yang diberikan kepada aplikasi
haruslah merupakan instance dari RQMLSecondClass, bukan instance dari kelas
Element.
Karena itu, untuk setiap child element yang ditemui dibuatlah suatu obyek adapter
baru. Obyek inilah yang diberikan kepada client code. Perilaku ini nampak pada
implementasi method getFirstChild() di kelas ElementAdapter. Method ini digunakan
untuk mendapatkan elemen anakan pertama yang mempunyai nama tertentu.
Apabila child element itu tidak ditemukan maka akan dibuat secara otomatis sehingga
method ini selalu berhasil. Terlihat pada Gambar 7.14 di baris 247 dan 252 bahwa
setiap kali sebuah child element ditemukan maka suatu obyek adapter baru diciptakan
untuknya.
Sayangnya cara ini menimbulkan suatu permasalahan baru. Penciptaan instance
adapter secara on-the-fly ini akan mengakibatkan satu instance dari elemen DOM untuk
mempunyai beberapa instance adapter yang berbeda. Redundancy ini tentulah
akan meningkatkan kebutuhan memory secara signifikan. Belum lagi dengan adanya
hubungan one-to-many antara obyek Element dengan adapter-nya, maka aplikasi tidak
BAB 7 – IMPLEMENTASI 104
dapat membandingkan kesamaan antara dua elemen hanya dengan membandingkan
instance dari masing-masing adapter-nya.
Masalah ini dipecahkan oleh kelas AdapterCacheFlyweight. Kelas ini bertindak sebagai
abstract factory kepada kelas-kelas adapter elemen DOM dengan menerapkan
interface RQMLSecondClassFactory. Namun pada saat diminta untuk menciptakan
suatu obyek adapter, kelas ini terlebih dahulu memeriksa apakah sebuah adapter
untuk elemen yang bersangkutan telah pernah dibuat sebelumnya. Pemeriksaan dilakukan
terhadap suatu cache yang merupakan pemetaan antara elemen-elemen DOM
dengan adapter-nya masing-masing. Instance adapter yang terdapat di dalam cache
akan diberikan ketimbang menciptakan suatu obyek adapter yang baru.
Letak dari penerapan flyweight pattern adalah pada penggunaan bersama dari setiap
instance adapter. Karena para client dari data model melihat AdapterCacheFlyweight
sebagai sebuah implementasi abstract factory lewat antarmuka RQMLSecondClass-
Factory, maka mereka ‘merasa’ menciptakan obyek-obyek adapter baru dengannya.
Namun pada kenyataannya obyek adapter yang diberikan oleh AdapterCacheFlyweight
lewat method createRQMLSecondClass() yang dideklarasikan oleh RQMLSecondClass-
Factory bukanlah selalu obyek baru.
BAB 7 – IMPLEMENTASI 105
:RQMLFirstClass :ElementAdapter
getDescription()
getFirstChild()
:AdapterCacheFlyweight
createRQMLSecondClass(elem)
getCache ().ge t(elem)
:RQMLSecondClassFactory
ge tElementFa ctory()
createRQMLSecondClass(elem)
return child adapter
[not exist]
[found in cache]
com.arcle.rmt.rqml com.arcle.rmt.j2se.model.domimpl
Gambar 7.15 Jalannya penciptaan obyek adapter oleh AdapterCacheFlyweight
Contoh proses ini dapat dilihat di Gambar 7.15. Interface RQMLFirstClass mempunyai
suatu child element Description yang diakses lewat method getDescription(). Pada
saat method ini dipanggil, kelas implementasinya akan memanggil method getFirst-
Child() yang diwariskan dari superclass-nya, ElementAdapter. Method getFirst-
Child() kemudian akan menggunakan method createRQMLSecondClass() dari abstract
factory yang telah diberikan kepadanya untuk membuat adapter dari elemen anakan
yang ditemukan. Agar dapat menciptakan adapter, maka method createRQMLSecond-
Class() diberikan obyek Element yang akan diadaptasikan. Sebagai abstract factory
penerap method createRQMLSecondClass(), kelas AdapterCacheFlyweight akan
memeriksa apakah sebuah adapter untuk elemen yang diminta telah ada di dalam
cache untuk kemudian memberikan instance ini. Apabila belum ada maka sebuah
instance adapter baru akan dibuat, ditambahkan ke dalam cache, dan kemudian
diberikan ke pemanggilnya. Untuk operasi pembuatan adapter baru, kelas Adapter-
CacheFlyweight mempunyai sekumpulan instance RQMLSecondClassFactory yang
melakukan operasi instantiation sebenarnya.
BAB 7 – IMPLEMENTASI 106
RQMLSecondClass
RQMLSecondClassImpl
Mementoable
com.arcle.rmt.rqml
RQMLFirstClassImpl
GenericMemento
RQMLFirstClassImpl.Memento
RQMLSecondClassImpl.Memento
com.arcle.rmt.superwaba.model.imp
com.arcle.rmt.superwaba.model.imp.rqml
Gambar 7.16 Memento pattern pada kelas representasi data untuk aplikasi handheld.
7.5.3 Representasi data aplikasi handheld
Penerapan data model RQML pada aplikasi handheld dilakukan dengan obyek-obyek
biasa. Data RQML disimpan oleh obyek-obyek ini di dalam instance variables. Akses
terhadap data ini dilakukan lewat berbagai method yang dideklarasikan oleh
antarmuka-antarmuka RQML.
Karena tidak menggunakan pustaka pengurai XML, maka penyimpanan data ke
persistent storage di aplikasi handheld dicapai oleh persistent objects dengan penerapan
pola rancangan memento. Masing-masing kelas implementasi RQML bertindak sebagai
originator yang akan menciptakan sebuah obyek memento untuk operasi load/save.
Obyek-obyek memento ini yang akan menyimpan atau memanggil kembali data
instance variables obyek originator-nya dari/ke persistent storage. Dengan ini semua
instance variables – baik yang memiliki accessor method maupun tidak – dapat diakses
secara implisit tanpa melanggar enkapsulasi.
Pada Gambar 7.16 terlihat bahwa penerapan memento pattern [Gamm95] pada data
model handheld juga merupakan suatu variasi dari bridge pattern. Ada hirarki paralel
antara kelas-kelas memento dengan originator-nya. Perbedaan dengan bridge biasa
yaitu kelas-kelas memento ini masing-masing adalah nested class dari kelas originatornya.
Sebagai member, kelas-kelas tersarang ini memiliki akses penuh terhadap
berbagai method maupun instance variable dari kelas yang melingkupinya – bahkan
yang protected atau private sekalipun.
BAB 7 – IMPLEMENTASI 107
CopierFacade RQMLSecondClass
com.arcle.rmt.j2se.bridge.copy
RQMLSecondClassCopier
RQMLSecondClassCopy
RQMLFirstClassCopy
ChildCopier RQMLFirstClass
n
0..1
1
n
com.arcle.rmt.j2se.bridge.copy.rqml
com.arcle.rmt.rqml
Gambar 7.17 Subsistem Element Copiers.
7.5.4 Penyalin data RQML
Seperti telah disebutkan di subbab 7.2.3, ada sekelompok kelas Element Copiers yang
digunakan dalam proses import/export antara implementasi data model aplikasi
desktop dengan handheld. Kelas-kelas penyalin ini digunakan untuk mentransfer data
antara elemen-elemen RQML. Namun proses penyalinan hanya dapat mengandalkan
method-method yang diberikan oleh antarmuka-antarmuka RQML tanpa mengakses
kelas-kelas penerapannya. Batasan ini diberikan agar kelas-kelas penyalin ini dapat
digunakan untuk berbagai penerapan representasi data RQML dan tidak terbatas pada
implementasi kelas-kelas data model yang ada sekarang.
Masing-masing kelas Element Copiers berfungsi untuk menyalin satu jenis elemen
RQML saja – dengan kata lain, kelas penyalin x hanya dapat mengoperasikan obyek
yang mengimplementasikan interface RQML y. Karena suatu kelas penyalin juga harus
memiliki operasi-operasi untuk menyalin semua property dari semua superinterface
daripada interface yang diterimanya, maka kelas-kelas penyalin ini dibuat
dalam suatu hirarki kelas yang paralel dengan hirarki antarmuka RQML.
Banyaknya elemen-elemen RQML mengakibatkan banyaknya pula kelas-kelas
penyalinnya. Hal ini membuat proses penyalinan menjadi lebih sulit. Agar dapat
mentransfer data antara dua obyek RQML perlu didapatkan kelas copier yang sesuai
untuk menyalinnya. Untuk mempermudah penyalinan kelas-kelas implementasi dari
RQMLSecondClass ini maka dibuatlah suatu kelas facade yang akan memilih instance
penyalin yang sesuai dengan tipe RQML yang diberikan.
BAB 7 – IMPLEMENTASI 108
Penyederhanaan penggunaan subsistem Element Copiers oleh kelas CopierFacade
adalah satu penerapan dari facade pattern. Seperti ditampilkan di Gambar 7.17, kelas
ini memiliki obyek-obyek RQMLSecondClassCopy di mana masing-masing obyek
mempunyai kemampuan untuk menyalin suatu tipe elemen RQML tertentu. Kelas
CopierFacade sendiri juga menerapkan RQMLSecondClassCopy. Pada saat diminta
untuk menyalin satu elemen RQML ke elemen yang lainnya, facade ini akan memeriksa
tipe elemen RQML tersebut kemudian memilih instance kelas penyalin yang
sesuai. Sehingga kelas-kelas yang menggunakan subsistem ini hanya perlu
menggunakan CopierFacade tanpa perlu mengetahui keberadaan masing-masing kelas
penyalin. Selain itu facade ini juga berlaku dua arah: setiap kelas penyalin
menggunakan suatu instance ChildCopier untuk menyalin child elements dari suatu
elemen; yang tidak lain adalah obyek CopierFacade itu sendiri.
Dengan adanya hirarki paralel maka kelas-kelas Element Copiers juga menerapkan
bridge pattern. Namun karena hirarki penyalin ini tidak memiliki reference ke kelaskelas
antamuka RQML dan tidak pula menjadi kelas implementasinya, penjembatanan
yang dilakukan tidak nampak secara struktural. Garis-garis dependency pada
Gambar 7.17 yang menghubungkan suatu kelas penyalin dengan antarmuka RQML
yang dioperasikannya lebih menyatakan hubungan perilaku run-time.
7.5.5 Penerapan MVC di Handheld
Mengikuti paradigma MVC, aplikasi handheld dipecah menjadi tiga kelompok kelas:
Model, View, dan Controller. Kelas-kelas yang termasuk model adalah kelas-kelas yang
mengatur representasi data RQML di dalam device. Sedangkan view adalah kelaskelas
antarmuka pemakai dan controller adalah pengendali yang mengubah keadaankeadaan
dari suatu view.
Pada [Gamm95] disebutkan bahwa hubungan antara model dengan view menerapkan
observer pattern. Apabila data di dalam model berubah, maka masing-masing view
yang menampilkan datanya akan dipanggil agar tampilannya merefleksikan perubahan
data tersebut. Berhubung di dalam aplikasi handheld hanya ada satu view yang
aktif (sedang menampilkan data di layar) dan sebuah komputer genggam umumnya
single-user, pola rancangan observer dinilai tidak banyak berguna di situasi ini –
karena itu tidak diimplementasikan. Setelah melakukan perubahan data maka view
BAB 7 – IMPLEMENTASI 109
View
com.arcle.rmt.superwaba.ui
CommandWindow Document
AbstractDocumentWindow
DocumentWindow
Controller
DocumentWindowController
ControllerBase DocumentImpl
com.arcle.rmt.superwaba.framework com.arcle.rmt.superwaba.model
com.arcle.rmt.superwaba.model.impl
com.arcle.rmt .superwaba.vc
Gambar 7.18 Sebagian hirarki MVC pada aplikasi handheld.
hanya akan me-refresh tampilannya untuk merefleksikan data yang baru diperbaharui.
Pada SuperWaba, komponen-komponen antarmuka pemakai adalah kelas-kelas turunan
(langsung ataupun tidak langsung) dari kelas Control (di dalam package
waba.ui). Input dari pengguna diterima dalam bentuk event yang diterima oleh
method-method tertentu di kelas ini. Kelas-kelas aplikasi harus meng-override berbagai
method ini untuk dapat menangani berbagai event yang ada. Sebuah event bisa
mewakili masukan yang low-level seperti stylus tap dan keystroke, tetapi juga dapat
mewakili input yang bersifat high-level seperti button click ataupun pemilihan sebuah
menu.
Misalkan pengguna mengetuk layar dengan stylus. SuperWaba VM akan mendeteksi
kejadian ini kemudian akan membuat sebuah obyek PenEvent yang juga memuat
koordinat layar tempat ketukan ini terjadi. Kemudian method onEvent() dari obyek
Control yang mendapat ketukan akan dipanggil dengan parameter obyek PenEvent
tersebut. Definisi method onEvent() pada kelas Control sendiri tidak melakukan apaapa;
method di-override oleh aplikasi untuk memproses event yang terjadi.
Pada arsitektur MVC yang asli sebagaimana diterapkan pada bahasa pemrograman
SmallTalk [Burb92], sebuah event tidak diberikan kepada view di mana event tersebut
terjadi. Melainkan sebuah obyek lain yang disebut controller akan menjadi penerima
obyek event itu. Obyek controller inilah yang akan melakukan tindakan-tindakan yang
akan mengubah keadaan dari view.
Mengingat perbedaan arsitektur ini, maka di dalam aplikasi handheld, berbagai
method penangan event seperti onEvent() akan memeriksa obyek Event yang diteriBAB
7 – IMPLEMENTASI 110
00141 public void onEvent(Event event) {
00142 DocumentWindowController ctrl = getController();
00143 switch(event.type) {
00144 case ControlEvent.PRESSED:
00145 if (event.target == btnNew) {
00146 doNewElement();
00147 event.consumed = true;
00148 } else if (event.target == btnClose) {
00149 ctrl.cmdCloseWindow();
00150 } else if (event.target == btnDelete) {
00151 ctrl.cmdDeleteDocument();
00152 }
00241 protected void doNewElement() {
00242 ElementListController ctrl = ((ElementList)getActivePanel())
00243 .getController();
00244 ctrl.cmdNewElement();
00245 }
Gambar 7.19 File AbstractDocumentWindow.java, baris 141 – 152 dan 241 – 245.
manya kemudian mendelegasikan sebagian besar pemrosesan terhadap obyek
controller yang dimilikinya. Kelas-kelas antarmuka pemakai dari aplikasi handheld
adalah turunan tidak langsung dari Control – umumnya turunan dari kelas Container
atau Window (keduanya terletak di waba.ui). Masing-masing kelas antarmuka pemakai
ini mempunyai satu obyek dari kelas controller yang khusus dibuat untuknya.
Seperti dapat di lihat di Gambar 7.18, kelas antarmuka pemakai DocumentWindow
mempunyai kelas controller, DocumentWindowController yang obyeknya didapatkan dari
superclass-nya, AbstractDocumentWindow. Sedangkan kelas AbstractDocumentWindow
merupakan turunan dari CommandWindow, yang pada gilirannya diturunkan dari Window
(kelas tidak digambarkan). Karena controller DocumentWindowController mempunyai
reference ke obyek data model, Document, maka DocumentWindow juga dapat mengakses
obyek model ini melalui controller-nya.
Kelas DocumentWindow menerapkan tampilan layar Element List, yang menampilkan
daftar dari elemen-elemen RQML dengan tipe tertentu. Seperti telah disebutkan di
bagian 7.4.1, layar ini mempunyai beberapa sub-layar yang masing-masing digunakan
untuk menampilkan daftar elemen dengan tipe tersendiri. Hanya ada satu dari sublayar
ini yang aktif sehingga pada setiap saat hanya elemen-elemen RQML first-class
yang sejenis yang ditampilkan.
Pada cuplikan di Gambar 7.19 dapat dilihat bahwa method onEvent() dari Abstract-
DocumentWindow menerjemahkan event-event dari SuperWaba menjadi berbagai method
call untuk controller-nya. Pada baris 244 di dalam method doNewElement(), controller
BAB 7 – IMPLEMENTASI 111
19 Antarmuka pemakai seperti JSP atau bahkan antarmuka mesin seperti EJB dan
Web Services.
yang digunakan untuk menindaklanjuti event bukanlah miliknya sendiri, namun
controller dari salah satu panel yang dimilikinya. Obyek turunan dari ElementList
inilah yang menampilkan daftar elemen RQML first-class dengan tipe tertentu.
7.5.6 Penerapan Separable Model di Desktop
Di dalam separable model architecture yang diterapkan oleh Swing, masing-masing
komponen Swing mempunyai obyek model tersendiri [Fowl02]. Obyek-obyek model ini
adalah suatu kelas yang mengimplementasikan interface tertentu, tergantung dari
komponen Swing yang menggunakannya. Untuk setiap interface obyek model ini ada
kelas default yang menjadi implementasinya. Demikian halnya juga ada obyek data
model default yang dimiliki oleh masing-masing obyek Swing. Umumnya obyek default
ini dapat diganti lewat method setModel().
Karena mengikuti problem domain dari requirements engineering, maka data model
RQML tentulah berbeda dengan yang diinginkan oleh Swing. Berbagai antarmuka
RQML, beserta kelas-kelas pendukungnya dirancang tanpa menggunakan kelas
maupun interface Swing. Sebagian faktor yang mendorong keputusan rancangan ini
yaitu agar kelas-kelas representasi data bisa digunakan untuk jenis user interface lainnya19.
Selain itu juga agar mengikuti salah satu filsafat rancangan perangkat lunak:
data model yang user-interface agnostic.
Perbedaan representasi data ini membuat suatu kebutuhan bagi kelas-kelas adapter
untuk menyesuaikan representasi data RQML menjadi data model yang dibutuhkan
oleh Swing. Sebagai pustaka user interface, kelas-kelas yang menggunakan Swing
umumnya adalah kelas-kelas view – yang notabene juga memegang satu atau lebih
instance dari kelas representasi data RQML. Karena itu kelas-kelas adapter ini
umumnya diimplementasikan sebagai inner class [Sun03b] dari kelas view yang
bersangkutan. Karena satu view dapat mempunyai beberapa komponen Swing dengan
kebutuhan data model-nya masing-masing, maka kelas view tersebut dapat
mempunyai lebih dari satu inner class yang menjadi adapter representasi data untuk
komponen-komponen Swing yang dimilikinya. Adapter data model sebagai inner class
ini merupakan salah satu variasi lagi dari penerapan adapter pattern [Gamm95].
BAB 7 – IMPLEMENTASI 112
javax.swing
1
ComponentView
AbstractElementList
ElementList TreeModelAdapter
DefaultTreeModel
JTree TreeModel
JComponent
+
..j2se.swing.ui
..j2se.swing.vc
javax.swing.tree
1
1
Gambar 7.20 Penerapan separable model architecture pada aplikasi desktop.
Namun tidak semua kelas view mempunyai adapter untuk masing-masing komponen
Swing di dalamnya. Pada beberapa kasus lebih sederhana untuk menggunakan data
model default yang diberikan oleh Swing. Misalnya saja pada komponen text field yang
hanya memuat satu string. Implementasi kelas adapter untuk menterjemahkan satu
attribut RQML menjadi data model bagi text field ini tentulah lebih kompleks ketimbang
hanya menggunakan method-method setText() dan getText() yang diberikan
oleh sebuah text field untuk mengakses datanya. Karena itu kelas adapter hanya
dibuat untuk representasi data yang kompleks, seperti misalnya untuk komponen
JTree.
Pada Gambar 7.20 dapat dilihat sebagian dari penerapan adapter representasi data
pada aplikasi desktop. Kelas ElementList menerapkan komponen Document Tree
beserta Active Elemen Description yang diletakkan di sebelah kiri jendela aplikasi
desktop (lihat subbab 7.4.2). Untuk komponen Document Tree digunakan sebuah
instance dari JTree (dari package javax.swing) yang menampilkan elemen-elemen
RQML beserta tipenya. Tampilan yang dihasilkan oleh JTree ini dihasilkan oleh kelas
representasi data TreeModelAdapter, yang merupakan inner class dari Abstract-
ElementList (Notasi 􀂠 untuk inner class diadaptasi dari [Syba02]). Sedangkan
AbstractElementList adalah superclass dari ElementList yang mewariskan komponen
tree yang dimilikinya. Lewat superclass-nya, kelas TreeModelAdapter mewarisi
BAB 7 – IMPLEMENTASI 113
ActionWrapper Action
com.arcle.rmt.j2se.swing.ui javax.swing
1
ComponentOwnedActionWrapper
ExceptionSafeActionWrapper
Component
1
1
0..n java.awt
Gambar 7.21 Penerapan decorator pattern oleh kelas ExceptionSafeActionWrapper
interface TreeModel. Antarmuka inilah yang diharapkan oleh JTree dari implementasi
data model-nya.
7.5.7 Command Decorator
Beberapa komponen Swing seperti button dan menu menerapkan command pattern
[Gamm95] di dalam hubungannya dengan application code. Setiap obyek-obyek penerima
perintah ini memiliki suatu obyek Action di mana method actionPerformed()
yang dimilikinya akan dipanggil pada saat komponen yang bersangkutan di-trigger
oleh pengguna.
Perilaku default Swing pada saat sebuah exception terlempar keluar (unhandled
exception) dari event handler pada sebuah aplikasi – termasuk di dalam method
actionPerformed() – adalah menampilkan exception tersebut beserta stack trace-nya
pada standard output. Berhubung aplikasi Swing umumnya adalah program-program
GUI yang tidak mempunyai console, hal ini dapat menjadi masalah: tampilan exception
tidak nampak oleh pengguna dan seakan-akan perintah yang mengalami exception
akan berhenti secara misterius tanpa ada feedback pada tampilannya – tampilan yang
diberikan di console tidak terlihat pada user interface program GUI.
Masalah penampilan exception ini ditangani dengan penerapan decorator pattern
[Gamm95]. Kelas ExceptionSafeActionWrapper merupakan pembungkus untuk sebuah
BAB 7 – IMPLEMENTASI 114
00093 public void actionPerformed(ActionEvent e) {
00094 try {
00095 super.actionPerformed(e);
00096 } catch(Exception ex) {
00097 MoreSwingUtilities.showException(getOwnerComponent(), ex,
00098 "Unhandled exception caught in action: " + getValue(NAME));
00099 }
00100 }
Gambar 7.22 File ExceptionSafeActionWrapper.java, baris 93 – 100.
obyek Action yang menangani unhandled exception yang mungkin terjadi. Pada saat
sebuah obyek Exception terlempar ke luar dari method actionPerformed() dari obyek
yang dibungkus, method actionPerformed() dari obyek ExceptionSafeActionWrapper
yang membungkusnya akan menangani exception tersebut kemudian menampilkan
sebuah dialog box untuk menampilkan exception yang terjadi.
Kelas ExceptionSafeActionWrapper adalah subclass dari ComponentOwnedAction-
Wrapper. Superclass ini berfungsi untuk menyimpan obyek Component yang akan
menjadi parent dari dialog box yang akan ditampilkan oleh ExceptionSafeAction-
Wrapper.
Pada gilirannya, ComponentOwnedActionWrapper adalah subclass dari ActionWrapper,
yang merupakan decorator umum untuk obyek-obyek yang menerapkan interface
Action. Kelas decorator ini tidak berfungsi apa-apa dengan sendirinya selain untuk
menjadi base class bagi kelas-kelas decorator lainnya.
Pada Gambar 7.22 dapat dilihat bahwa method actionPerformed() dari Exception-
SafeActionWrapper menangkap suatu exception yang mungkin terjadi pada saat
menjalankan suatu command. Di dalam blok try..catch, method ini hanya memanggil
method yang sama dari superclass-nya. Sebagai sebuah wrapper kosong, method
superclass kemudian hanya meneruskan method call ke obyek yang dibungkusnya.
Apabila sebuah exception terjadi maka exception tersebut beserta stack trace-nya akan
ditampilkan di sebuah kotak dialog.
Namun masalah penampilan exception tadi masih belum terpecahkan seluruhnya.
Mengingat tidak hanya subclass dari Exception yang dapat dilempar, namun kelas
ExceptionSafeActionWrapper tidak menangkap exception object selain tipe ini – misalkan
subclass dari Error. Sehingga sebuah unhandled exception dengan tipe ini tetap
akan mendapatkan perilaku default Swing: ditampilkan di console. Sayangnya,
dokumentasi JDK API mengatakan bahwa subclass dari Error tidak boleh ditangkap
BAB 7 – IMPLEMENTASI 115
..j2se.model.domimpl
Observer
..j2se.swing.ui
Observable
View
JComponent
ComponentView
ElementEdit
ElementAdapter
RQMLSecondClassImpl
RQMLFirstClass RQMLFirstClassImpl
RQMLDocument
Document
javax.swing java.util
..j2se.framework
..j2se.swing.vc ..rqml
..j2se.model
..j2se.model .domimpl.rqml
Gambar 7.23 Observer pattern pada dialog penyunting RQML
oleh program aplikasi [Sun00a]. Larangan ini menjadi alasan bahwa hanya obyek
Exception yang ditangkap oleh ExceptionSafeActionWrapper. Apakah dalam kasus
khusus ini diperbolehkan untuk menangkap obyek Error masih menjadi pertanyaan.
7.5.8 Editor elemen-elemen first-class
Layar komputer desktop yang umumnya lebih luas memungkinkan aplikasinya untuk
secara wajar mengaktifkan beberapa view pada saat yang sama. Penampilan beberapa
view secara bersamaan ini menjadi alasan yang baik bagi penerapan observer pattern
[Gamm95]. Apalagi dengan adanya dukungan dari pustaka J2SE – pada package
java.util terdapat kelas Observable serta interface Observer yang telah
mengimplementasikan sebagian besar algoritma yang diperlukan bagi penerapan pola
rancangan ini.
Semua kelas view pada aplikasi desktop mengimplementasikan interface Observer.
Sedangkan kelas-kelas model diturunkan dari obyek Observable. Ketika sebuah view
sedang menampilkan data dari obyek model tertentu, view tersebut mendaftarkan diri
sebagai pengamat dari obyek model yang ditampilkan itu. Sehingga apabila data dari
model berubah – terutama akibat manipulasi dari komponen-komponen antarmuka
pemakai lainnya – view tersebut akan mendapat pemberitahuan tentang perubahan
itu sehingga dapat memperbaharui tampilannya.
BAB 7 – IMPLEMENTASI 116
Dapat dilihat dari Gambar 7.23 bahwa obyek Observable meliputi kelas-kelas penerapan
RQML – turunan dari ElementAdapter (subbab 7.5.2) – dan juga kelas
RQMLDocument yang mewakili dokumen RQML secara keseluruhan. Sebagaimana
sebuah dokumen RQML dengan elemen-elemennya, kelas RQMLDocument memiliki
obyek-obyek RQMLFirstClass yang mewakili elemen-elemen pada dokumen tersebut.
Sebagai sebuah editor RQML, rancangan aplikasi dipusatkan pada sekelompok dialog
yang berfungsi untuk meng-edit berbagai first-class RQML element yang ada (subbab
7.4.2). Apalagi dengan dukungan layar yang lebih besar yang memungkinkan
beberapa dialog penyunting ini untuk ditampilkan secara bersamaan. Penerapan
observer pattern memungkinkan hasil penyuntingan dari dialog yang satu untuk
ditampilkan pada dialog yang lain.
Pada Gambar 7.23 juga ditampilkan sebuah kelas view, yaitu ElementEdit yang
menjadi base class dari semua jendela editor RQML. Kelas ini menerapkan interface
Observer. Pada saat sebuah jendela editor sedang menyunting suatu elemen RQML,
ia akan mendaftarkan diri sebagai pengamat dari elemen yang sedang disuntingnya.
Sehingga pada saat suatu editor meng-commit perubahan pada elemen yang sama,
editor yang lain akan langsung menampilkan perubahan ini.
Semua dialog editor RQML ini diturunkan dari kelas ElementEdit. Untuk setiap jenis
elemen first-class terdapat satu kelas editor yang digunakan untuk menyunting
elemen-elemen dengan tipe tersebut. Misalkan untuk elemen Requirement ada kelas
RequirementEdit; sedangkan untuk elemen first-class dengan jenis Usecase, editor-nya
adalah UsecaseEdit. Baik RequirementEdit maupun UsecaseEdit diturunkan secara
tidak langsung dari ElementEdit (hirarki ini tidak ditampilkan untuk menghemat
tempat). Garis dependency antara ElementEdit dan RQMLFirstClass menunjukkan
hubungan antara suatu obyek penyunting RQML dengan elemen yang sedang di-edit
dilakukan di base class obyek penyunting tersebut, yaitu ElementEdit.
7.5.9 Class Map
Adanya hirarki paralel antara antarmuka-antarmuka RQML beserta kelas-kelas
aplikasi menciptakan suatu kebutuhan untuk menjalankan suatu method dari obyek
tertentu berdasarkan interface yang diimplementasikan oleh obyek lain. Dengan kata
lain, untuk suatu himpunan interface A = {a1, a2, …, an}, suatu himpunan obyek
BAB 7 – IMPLEMENTASI 117
B = {b1, b2, …, bn} yang semua obyek ini adalah dari kelas C atau kelas turunannya,
dan sebuah obyek X yang menerapkan salah satu interface ai 􀀓 A, seringkali
dibutuhkan untuk menjalankan suatu method m 􀀓 C terhadap obyek bj 􀀓 B di mana
i = j.
Karena kebutuhan ini, maka pada pertengahan pengembangan aplikasi desktop
banyak dijumpai penggalan kode yang berbentuk seperti berikut ini:
if (x instanceof A)
p.doSomething(x);
else if (x instanceof B)
q.doSomething(x);
else if (x instanceof C)
r.doSomething(x);

Suatu masalah yang tidak kecil timbul karena untaian if seperti di atas tidak hanya
melibatkan tiga atau empat obyek saja; terkadang malahan sampai tujuh atau lebih
pernyataan if yang terlibat. Belum lagi himpunan interface yang digunakan seringkali
sama di beberapa tempat yang berbeda. Hal ini tentu saja menjadi redundant code
dan menurunkan modularitas program.
Karena itu penggalan di atas kemudian di-refactor ke dalam kelas GenericClassMap.
Kelas ini digunakan untuk memetakan suatu himpunan kelas (ataupun interface)
kepada suatu himpunan obyek. Dengan demikian, kode di atas dapat dipersingkat
menjadi seperti ini:
GenericClassMap cm = new ThingMap();
y = cm.findFirstInstance(x);
y.doSomething(x);
Method findFirstInstance() dari GenericClassMap berfungsi untuk menemukan obyek
yang dipetakan oleh salah satu interface yang diimplementasikan oleh obyek x.
Apabila ditemukan, maka obyek terpetakan tersebut akan diberikan kepada
pemanggilnya – yang pada contoh di atas adalah obyek y. Ditemukannya obyek yang
dipetakan ini memungkinkan pemanggilan berbagai method yang dimilikinya.
Dalam operasinya, findFirstInstance() bergantung pada sebuah pemetaan antara
kelas dan obyek. Pemetaan ini diberikan oleh abstract factory method create-
Mappings() pada GenericClassMap yang diharuskan untuk menghasilkan sebuah
obyek Map yang terdiri dari pasangan-pasangan terurut (Class, Object). Karena
createMappings() tidak hanya diharapkan untuk menciptakan sebuah obyek namun
BAB 7 – IMPLEMENTASI 118
20 LoC: Lines of Code
juga untuk mengisinya (initialize), maka method ini dapat dikatakan juga menerapkan
strategy pattern [Gamm95].
Kelas-kelas turunan GenericClassMap mendefinisikan method ini untuk menciptakan
pemetaan yang diinginkan. Untuk masing-masing himpunan pasangan (Class,
Object) perlu diciptakan sebuah subclass dari kelas ini. Pada contoh di atas, kelas
turunan yang digunakan adalah ThingMap, yang mendefinisikan pemetaan seperti berikut
ini untuk menggantikan contoh untaian if yang pertama tadi:
public class ThingMap extends GenericClassMap {
protected Map createMappings() {
Map m = new Hashtable();
m.put(A.class, p);
m.put(B.class, q);
m.put(C.class, r);
return m;
}
}
Memang nampaknya panjang definisi method createMappings() akan hampir sama
dengan untaian if yang sebelumnya. Namun penghematan LoC20 akan dicapai apabila
perlu dibuat dua atau lebih untaian if yang keduanya memproses suatu obyek
terhadap sekelompok antarmuka/obyek yang sama. Selain itu ada tambahan keuntungan
di mana himpunan interface/object yang digunakan dapat di-configure pada
saat run-time – suatu hal yang sulit dilakukan dengan untaian if.
Kelas GenericClassMap digunakan di beberapa tempat, seperti:
• ElementEditFactoryFacade – Sebuah factory class, facade, dan juga singleton
yang digunakan untuk menciptakan instance first-class editor (subbab 7.5.8) yang
sesuai dengan obyek first-class element yang akan disunting.
• ElementTypeNodeFacade – Nested facade class dari AbstractElementList (subbab
7.5.6) yang perlu mendapatkan sebuah node yang dimiliki oleh sebuah JTree
berdasarkan tipe dari suatu first-class element.
7.5.10 First-Class Importer
Kelas data model yang mewakili data di aplikasi desktop berbeda dengan yang ada di
aplikasi handheld. Pada kelas RQMLDocument di desktop, semua elemen first-class dapat
BAB 7 – IMPLEMENTASI 119
diakses secara acak. Sedangkan pada kelas Document di aplikasi handheld, elemenelemen
first-class dikelompokkan menurut tipenya masing-masing dan akses acak
hanya dapat dilakukan terhadap suatu elemen dengan tipe tertentu.
Karena perbedaan ini, maka proses impor dari data handheld ke desktop dilakukan
oleh beberapa kelas, di mana setiap kelas pengimpor berfungsi untuk memindahkan
data dari salah satu jenis elemen first-class. Namun proses yang dilakukan oleh kelaskelas
ini umumnya sama. Untuk setiap jenis elemen first-class di handheld dilakukan
iterasi berikut pada semua elemen dengan tipe tersebut:
1. Ambil elemen dari instance Document.
2. Buat elemen dengan tipe yang sama di dalam instance RQMLDocument.
3. Salin isi dari elemen yang didapat pada langkah 1 ke dalam elemen yang
dibuat di langkah 2.
Walau pada dasarnya proses di atas sama bagi tiap jenis elemen first-class, namun
method-method yang dipanggil oleh setiap langkah tersebut berbeda. Misalkan untuk
elemen Requirement, langkah 1 memanggil method getRequirementAt() dan langkah 2
memanggil method createRequirement(). Sedangkan untuk elemen Usecase,
langkah 1 memanggil method getUsecaseAt() dan langkah 2 memanggil method
createUsecase().
Kesamaan algoritma ini diterapkan menjadi suatu template method [Gamm95] pada
base class untuk kelas-kelas pengimpor. Template method ini menggunakan beberapa
strategy method yang abstrak untuk melakukan langkah-langkah spesifik yang
dibutuhkan.
BAB 7 – IMPLEMENTASI 120
063 import com.arcle.rmt.superwaba.model.Document;
064 import com.arcle.rmt.j2se.model.RQMLDocument;
065
073 public abstract class FirstClassImport implements FirstClassImporter {
074
089 public boolean importFirstClass(Document srcDoc, RQMLDocument dstDoc) {
090 int numElems = getTotalElements(srcDoc);
091 boolean ok = true;
092 for (int i=0; i<numElems; i++) {
093 RQMLFirstClass srcElem = getElementAt(i, srcDoc);
094 RQMLFirstClass dstElem = createDestinationElement(dstDoc);
095 ok &= copyElement(srcElem, dstElem);
096 }
097 return ok;
098 }
116 protected boolean copyElement(RQMLFirstClass src, RQMLFirstClass dst) {
117 return CopierFacade.getInstance().copy(getSupportedClass(), src, dst);
118 }
132 protected abstract Class getSupportedClass();
141 protected abstract int getTotalElements(Document doc);
151 protected abstract RQMLFirstClass getElementAt(int index, Document srcDoc);
160 protected abstract RQMLFirstClass createDestinationElement(RQMLDocument doc);
161 }
Gambar 7.24 Cuplikan FirstClassImport.java
074 public class RequirementImport extends FirstClassImport {
079 protected Class getSupportedClass() {
080 return Requirement.class;
081 }
087 protected int getTotalElements(Document doc) {
088 return doc.getRequirementCount();
089 }
097 protected RQMLFirstClass getElementAt(int index, Document doc) {
098 return doc.getRequirementAt(index);
099 }
106 protected RQMLFirstClass createDestinationElement(RQMLDocument doc) {
107 return doc.createRequirement();
108 }
109 }
Gambar 7.25 Cuplikan RequirementImport.java.
Pada Gambar 7.24 dapat dilihat cuplikan base class dari kelas-kelas pengimpor, yaitu
FirstClassImport. Method importFirstClass() adalah template method yang
melakukan langkah-langkah umum pengimporan sebuah elemen first-class. Method
ini bergantung pada beberapa strategy method, getSupportedClass(),
getTotalElements(), getElementAt(), dan createDestinationElement().
Pada Gambar 7.25 dapat dilihat salah satu turunan dari FirstClassImport. Kelas
RequirementImport digunakan untuk mengimpor elemen-elemen dengan tipe
Requirement dari data model handheld ke desktop. Dari cuplikan kode ini terlihat
implementasi dari berbagai strategy method yang dibutuhkan oleh importFirst-
Class(). Method getSupportedClass() menyebutkan tipe elemen first-class yang
didukung oleh kelas pengimpor ini. Method getRequirementCount() memberikan
jumlah requirement yang ada. Method getElementAt() mendapatkan suatu elemen
BAB 7 – IMPLEMENTASI 121
requirement pada indeks tertentu. Sedangkan method createDestinationElement()
membuat suatu instance obyek Requirement pada data model aplikasi desktop.
7.6 Data Statistik
Pada bagian ini diberikan data source code metric yang dihasilkan dari Rambutan versi
terakhir tertanggal 19 Mei 2003. Hitungan ini dilakukan oleh perangkat lunak
JavaNCSS [Lee02]. JavaNCSS menggunakan besaran-besaran berikut dalam
menghasilkan source code metric:
• NCSS: Non-Commenting Source Statements – Jumlah statement di dalam
source code yang bukan komentar. Pernyataan yang dihitung bukan hanya
executable statements, namun juga deklarasi method, deklarasi class, dan
pernyataan import. Pada dasarnya, NCSS menghitung jumlah karakter ‘{’ dan
‘;’ pada source code.
• CCN: Cyclomatic Complexity Number – Juga dikenal sebagai McCabe metric,
merupakan jumlah percabangan yang ada di dalam suatu method. Untuk suatu
method, awalnya CCN bernilai satu. Kemudian nilai ini akan ditambahkan
untuk setiap statement percabangan seperti if, while, do, dan case. Terminasi
fungsi secara prematur (statement return di tengah-tengah method) juga akan
menambah nilai CCN – namun statement return di akhir method tidak dihitung.
• JVDC: JavaDoc Comments – Untuk setiap method nilai ini bernilai satu apabila
method tersebut didokumentasikan dengan JavaDoc dan bernilai nol apabila
tidak didokumentasikan.
Tabel 7.1 Ikhtisar hitungan NCSS untuk seluruh program
Packages Classes Functions NCSS Javadocs per
28.00 328.00 1354.00 7903.00 1002.00 Project
11.71 48.36 282.25 35.79 Package
4.13 24.09 3.05 Class
5.84 0.74 Function
Tabel 7.2 Ikhtisar hitungan NCSS per class
Average Object NCSS 19.24
Average Object Functions 4.13
Average Object Inner Classes 0.34
Average Object Javadoc Comments 3.05
BAB 7 – IMPLEMENTASI 122
Program NCSS 7,903.00
Tabel 7.3 Ikhtisar hitungan NCSS per method
Average Function NCSS 3.34
Average Function CCN 1.29
Average Function JVDC 0.38
Program NCSS 7,903.00
Tabel 7.4 Hitungan NCSS per package
Nr. Classes Functions NCSS Javadocs Package
1 2 11 73 11 com.arcle.rmt.j2se.bridge
2 3 8 85 12 com.arcle.rmt.j2se.bridge.copy
3 33 68 396 33 com.arcle.rmt.j2se.bridge.copy.rqml
4 2 6 36 7 com.arcle.rmt.j2se.bridge.swexport
5 10 23 108 33 com.arcle.rmt.j2se.bridge.swexport.rqml
6 2 6 41 8 com.arcle.rmt.j2se.bridge.swimport
7 10 43 158 53 com.arcle.rmt.j2se.bridge.swimport.rqml
8 2 9 24 7 com.arcle.rmt.j2se.framework
9 7 23 66 16 com.arcle.rmt.j2se.model
10 6 58 339 63 com.arcle.rmt.j2se.model.domimpl
11 34 86 561 74 com.arcle.rmt.j2se.model.domimpl.rqml
12 3 64 617 64 com.arcle.rmt.j2se.swing
13 14 79 360 68 com.arcle.rmt.j2se.swing.ui
14 6 64 633 93 com.arcle.rmt.j2se.swing.vc
15 24 100 951 52 com.arcle.rmt.j2se.swing.vc.rqml
16 8 31 141 35 com.arcle.rmt.j2se.util
17 38 46 180 68 com.arcle.rmt.rqml
18 2 4 27 3 com.arcle.rmt.superwaba
19 3 1 7 4 com.arcle.rmt.superwaba.framework
20 3 56 75 24 com.arcle.rmt.superwaba.model
21 5 86 435 49 com.arcle.rmt.superwaba.model.imp
22 33 116 892 44 com.arcle.rmt.superwaba.model.imp.rqml
23 6 48 228 44 com.arcle.rmt.superwaba.ui
24 1 19 63 2 com.arcle.rmt.superwaba.util
25 11 83 436 54 com.arcle.rmt.superwaba.vc
26 54 190 923 59 com.arcle.rmt.superwaba.vc.rqml
27 1 4 7 1 com.arcle.rmt.xplat.model
28 5 22 41 21 com.arcle.rmt.xplat.util
Total 328 1354 7903 1002
Jangka waktu pembuatan: 2 bulan (6 April 2003 – 19 Mei 2003).
Programmer: 1 orang.
BAB 7 – IMPLEMENTASI 123
124
Bab 8
PENGUJIAN
Pada bab ini diberikan hasil-hasil pengujian terhadap Rambutan. Pengujian ini
dilakukan lewat tiga sudut pandang:
• Pemenuhan terhadap requirements dan constraints yang ada di bab 6 (halaman
65).
• Kesesuaian terhadap standar RQML sebagaimana diusulkan di [Gudg00].
• Perbandingan dengan fitur-fitur yang umum dimiliki oleh berbagai alat bantu
sejenis.
8.1 Terhadap Spesifikasi Kebutuhan
Bagian ini membahas pemenuhan Rambutan terhadap berbagai requirement yang
dituliskan di subbab 6.2 (halaman 71). Seluruh requirement yang ada dituliskan kembali
diikuti dengan hasil pengujiannya.
8.1.1 Sistem membantu dalam pengumpulan informasi requirements
Aplikasi handheld membantu pengumpulan informasi requirements yang dilakukan di
luar kantor system analyst (pengguna Rambutan) di mana umumnya peralatan yang
dapat digunakan lebih terbatas. Sedangkan aplikasi desktop dapat digunakan untuk
operasi editing yang lebih intensif.
Pemenuhan: Penuh.
8.1.2 Sistem membantu dalam pengelolaan informasi requirements
Di dalam user story (subbab 6.1 di halaman 65), jenis informasi requirement yang dikelola
adalah proyek, stakeholder, requirement, istilah, masalah, dan batasan. Sedangkan
Rambutan mendukung elemen-elemen RQML Taxonomy, Requirement,
Stakeholder, Usecase, Project, Assumption, Context, Issue, dan Lexicon. Berhubung
constraint adalah salah satu jenis requirement [Grad92], maka jenis data yang
BAB 8 – PENGUJIAN 125
21 Sinkronisasi data antara komputer genggam dengan desktop-nya.
didukung oleh Rambutan adalah superset dari yang ada pada user story sehingga
kemampuannya melebihi dari kebutuhan awal. Sayangnya traceability belum
didukung oleh Rambutan sehingga requirement ini tidak seluruhnya terpenuhi.
Pemenuhan: Sebagian.
8.1.3 Sistem mempunyai sebuah modul untuk digunakan di komputer genggam
Adanya aplikasi handheld memenuhi requirement ini.
Pemenuhan: Penuh.
8.1.4 Sistem mempunyai sebuah modul untuk digunakan di komputer desktop
Adanya aplikasi desktop memenuhi requirement ini.
Pemenuhan: Penuh.
8.1.5 Informasi di aplikasi desktop dan handheld dapat dipertukarkan
Aplikasi desktop dapat membuka serta menyimpan data yang ditulis dalam format
untuk aplikasi handheld. Tetapi operasi ini harus dilakukan secara manual. Bila seorang
pengguna ingin meng-edit dokumen handheld di aplikasi desktop, ia harus
mem-backup data di aplikasi handheld, membuka dokumen handheld tersebut dengan
aplikasi desktop, melakukan modifikasi, menyimpannya, dan terakhir meng-install
kembali dokumen itu ke dalam komputer genggam. Idealnya mayoritas operasi ini
dilakukan secara transparan oleh sistem pada saat HotSync/ActiveSync21.
Pemenuhan: Sebagian.
8.2 Terhadap Batasan Rancangan
Bagian ini membahas pemenuhan Rambutan terhadap berbagai constraint yang dituliskan
di subbab 6.3 (halaman 73). Seluruh batasan yang ada dituliskan kembali diikuti
dengan hasil pengujiannya.
BAB 8 – PENGUJIAN 126
22 Seperti misalnya Apache Xindice.
23 Hitungan source code metrics ada pada subbab 7.6 di halaman 121.
8.2.1 Aplikasi harus dirancang untuk mempermudah pengembangan selanjut
nya (extensible)
Berbagai usaha telah dilakukan untuk mendukung ekstensibilitas Rambutan. Kedua
aplikasi telah dirancang secara modular dan mempergunakan design patterns. Implementasi
data model pada aplikasi desktop tidak tergantung pada Swing – yang menjadi
penerapan antarmukanya – sehingga memungkinkan penerapan jenis-jenis antarmuka
yang lain. Selain itu data model aplikasi desktop juga menggunakan API DOM
sehingga penyimpanan data berbasis file yang digunakan sekarang berpotensi untuk
ditingkatkan lewat integrasi dengan software DBMS berbasis XML22. Antarmukaantarmuka
RQML mengabstraksikan kode user interface kedua aplikasi agar konsisten
serta untuk memisahkan komponen-komponen user interface dari implementasi data
model kedua aplikasi tersebut. Kesemua itu ditambah dengan rasio JavaDoc per
fungsi23 yang mencapai nilai 0.74 – berarti untuk setiap empat method, maka tiga di
antaranya didokumentasikan.
Walaupun demikian, hasil nyata dari usaha-usaha ini belumlah nampak sampai ada
perkembangan lebih lanjut dari Rambutan dan digunakannya software ini di dalam
industri.
Pemenuhan: Belum Terbukti.
8.2.2 Menggunakan [Gamm95] design patterns
Sebagaimana telah dibahas mengenai penerapan design patterns pada kedua aplikasi
di subbab 7.5 (halaman 100) maka requirement ini terpenuhi.
Pemenuhan: Penuh.
8.2.3 Aplikasi handheld harus multi-platform
Aplikasi untuk komputer genggam diprogram untuk SuperWaba. Sedangkan Super-
Waba menyediakan berbagai runtime masing-masing untuk sistem-sistem operasi
PalmOS, Windows CE, dan PocketPC untuk berbagai jenis prosesor. Sebuah program
BAB 8 – PENGUJIAN 127
24 CVS: Concurrent Versions System – http://www.cvshome.org
SuperWaba setelah di-compile dapat dijalankan di semua sistem operasi yang
didukung oleh SuperWaba tanpa perlu kompilasi ulang.
Pemenuhan: Penuh.
8.2.4 Aplikasi desktop harus multi-platform.
Aplikasi untuk komputer desktop diprogram untuk platform J2SE, versi 1.3. Sedangkan
platform ini mendukung secara langsung setidak-tidaknya sistem-sistem operasi
Windows, Solaris, dan Linux. Selain itu ada pihak ketiga yang menyediakan platform
J2SE untuk MacOS X dan Novell Netware.
Pemenuhan: Penuh.
8.2.5 Terdapat kode program pada handheld dan desktop yang digunakan
bersama
Package-package com.arcle.rmt.rqml dan com.arcle.rmt.xplat tidak bergantung pada
API tertentu sehingga dapat digunakan untuk SuperWaba maupun J2SE. Package
com.arcle.rmt.rqml memuat berbagai interface yang mengabstraksikan sekaligus
menstandarisasi data model RQML bagi kedua aplikasi.
Pemenuhan: Penuh.
8.2.6 Aplikasi yang dibuat tidak tergantung pada metodologi RE tertentu
Karena Rambutan didasari pada RQML, yang pada gilirannya dibuat untuk mendukung
sekumpulan best practices pada RE, maka secara implisit Rambutan dapat digunakan
untuk beberapa metodologi RE.
Pemenuhan: Penuh.
8.2.7 Tidak ada pembayaran kontinu kepada pihak ketiga
Berbagai perangkat lunak yang menunjang pembuatan Rambutan, yaitu SuperWaba,
Java Development Kit (JDK) 1.3, Doxygen, Apache Ant, dan CVS24 dapat di-download
BAB 8 – PENGUJIAN 128
25 OSI: Open Source Initiative – http://www.opensource.org
secara gratis. Semua software ini, kecuali JDK, adalah perangkat lunak open-source
dengan lisensi yang telah disetujui oleh OSI25.
Pemenuhan: Penuh.
8.3 Terhadap Standar RQML
Dari sebelas elemen first-class yang didefinisikan oleh RQML, dua diantaranya yaitu
dan tidak didukung oleh Rambutan. Pengabaian ini dilakukan karena
sulit untuk membuat user interface yang efisien di aplikasi handheld yang mendukung
kedua elemen ini. Faktor lain yang menjadi alasan adalah waktu yang
tersedia untuk proyek ini sangatlah singkat.
Elemen lain yang tidak didukung adalah elemen yang berfungsi untuk menandai
sekelompok teks dengan attribut-attribut tertentu. Kesulitan yang ditemui dalam
pengimplementasian elemen ini adalah karena SuperWaba tidak menyediakan user
interface control untuk hal ini – sebuah control yang memiliki kemampuan menandai
bagian-bagian teks dengan berbagai attribut dapat dikatakan memiliki fungsionalitas
sebuah word processor mini. Pembuatan sebuah custom control untuk melakukan hal
ini juga tidak dapat dilakukan mengingat waktu yang sangat terbatas.
Penyederhanaan lain adalah untuk setiap elemen hanya dapat memiliki satu instance
dari setiap jenis child element yang dapat dimilikinya. Hal ini telah dibahas di subbab
7.3 (halaman 92).
Berikut ini dijabarkan pemenuhan Rambutan terhadap berbagai requirement yang
aslinya dibebankan terhadap RQML. Untuk setiap requirement juga diberikan
pemenuhan RQML terhadap requirement tersebut sebagaimana evaluasi terhadap hal
ini dilakukan di [Gudg00]. Berbagai requirement ini telah dibahas di subbab 4.4
(halaman 37).
BAB 8 – PENGUJIAN 129
26 [Gudg00] tidak memberikan evaluasi untuk REQ5-6.
Tabel 8.1 Pemenuhan sistem terhadap requirement RQML
Requirement Pemenuhan Keterangan
RQML Rambutan
REQ1 Penuh Penuh Aplikasi desktop menyimpan data SRS
dalam bentuk file RQML.
REQ2 Sebagian Sebagian Kedayagunaan Rambutan perlu dievaluasi
kembali di dalam penggunaannya oleh
industri.
REQ3 Sebagian Sebagian Walau kemampuan Rambutan saat ini sangat
terbatas, arsitektur serta platform yang
digunakan sangat memungkinkan
pengembangan lebih lanjut.
REQ4 Sebagian Penuh Rambutan merupakan salah satu perangkat
lunak yang menggunakan RQML baik secara
konseptual maupun sebagai data format.
REQ5 Sebagian Sebagian Rambutan tidak memaksakan metodologi
RE tertentu.
REQ5-1 Penuh Penuh Dukungan atas elemen yang
digunakan untuk membuat daftar istilah.
REQ5-2 Penuh Tidak Elemen belum didukung.
REQ5-3 Penuh Tidak Karena elemen digunakan untuk
baselining; lihat REQ5-2.
REQ5-4 Penuh Penuh Semua obyek first-class mempunyai attribut
status.
REQ5-5 Penuh Penuh Semua obyek first-class mempunyai attribut
stability.
REQ5-6 T/T26 Sebagian Semua obyek first-class mempunyai attribut
difficulty yang dapat digunakan untuk
memperkirakan kesulitan yang ditemui –
atau antisipasi akan effort yang diperlukan.
REQ5-7 Penuh Penuh Dukungan atas obyek first-class project
yang memiliki attribut-attribut scope dan
vision.
BAB 8 – PENGUJIAN 130
Tabel 8.1 Pemenuhan sistem terhadap requirement RQML
Requirement Pemenuhan Keterangan
RQML Rambutan
REQ5-8 Penuh Sebagian Walaupun obyek-obyek taxonomy dan
stakeholder didukung, obyek trace yang
seharusnya menghubungkan dua obyek
tersebut belum didukung.
REQ5-9 Penuh Sebagian Sama seperti REQ5-8.
REQ5-10 Penuh Tidak Elemen belum didukung.
REQ5-11 Penuh Sebagian Walaupun obyek-obyek taxonomy dan requirement
didukung, obyek trace yang
seharusnya menghubungkan dua obyek
tersebut belum didukung.
REQ5-12 Sebagian Sebagian Operasi copy-paste dapat dilakukan terhadap
teks di dalam requirement, walaupun
belum dapat dilakukan terhadap obyek firstclass
secara keseluruhan. Reuse juga
terbatas karena traceability belum didukung.
REQ5-13 Penuh Penuh Semua obyek first-class memiliki attribut
priority.
REQ5-14 Penuh Penuh Memang hanya requirement dalam bahasa
alami yang didukung.
REQ5-15 Penuh Tidak Sama seperti REQ5-2.
REQ5-16 Penuh Penuh Setiap obyek first-class memiliki attribut ID
yang di-generate secara default dan dapat
diubah kemudian oleh pengguna.
REQ5-17 Penuh Sebagian Sama seperti REQ5-11.
REQ5-18 T/B Tidak Sama seperti REQ5-2.
REQ6 Penuh Penuh Obyek taxonomy didukung.
REQ7 Penuh Sebagian Sama seperti REQ5-2.
REQ8 Penuh Tidak Elemen belum didukung.
REQ9 Penuh Penuh Semua obyek first-class memiliki attributattribut
name, description, dan rationale.
BAB 8 – PENGUJIAN 131
Tabel 8.1 Pemenuhan sistem terhadap requirement RQML
Requirement Pemenuhan Keterangan
RQML Rambutan
REQ10 Penuh Penuh Obyek stakeholder didukung.
REQ10-1 Penuh Penuh Obyek assumption didukung.
REQ10-2 Penuh Penuh Obyek issue didukung.
T/B: tidak terbukti.
T/T: tidak diketahui.
8.4 Terhadap Fitur dari Alat Bantu Sejenis
Bagian ini membandingkan fitur-fitur yang umum terdapat pada alat-alat bantu
manajemen requirement dengan kemampuan yang dimiliki oleh Rambutan. Berbagai
fitur yang digunakan sebagai perbandingan yaitu sebagaimana ditulis di [Koto98] dan
telah dibahas di subbab 2.5 (halaman 17). Tujuan perbandingan ini adalah untuk
mendapatkan gambaran posisi Rambutan di antara berbagai alat bantu sejenis yang
telah ada di pasaran.
8.4.1 Requirements Browser
Pada dasarnya tampilan Document Tree (subbab 7.4.2, halaman 98) adalah sebuah
requirements browser yang menampilkan obyek-obyek first-class yang ada di dalam
suatu dokumen RQML. Dengan menggunakan tampilan tree, obyek-obyek first-class
ini dikelompokkan sesuai dengan jenisnya masing-masing. Pengguna dapat memakai
tampilan ini untuk mencari serta menguibah berbagai requirement yang ada di dalam
suatu dokumen.
Pemenuhan: Penuh.
8.4.2 Query System
Pada tahap ini belum ada fasilitas search untuk mencari suatu requirement tertentu
di dalam dokumen; walaupun dengan arsitektur yang ada, fungsi ini bisa ditambahkan
kemudian.
Pemenuhan: Tidak.
BAB 8 – PENGUJIAN 132
27 Contoh program-program pengolah kata yang mendukung XML adalah OpenOffice
dan Corel WordPerfectTM.
28 Salah satu perangkat lunak version control untuk XML adalah DeltaXML –

http://www.deltaxml.com/

8.4.3 Requirement Converter
Karena aplikasi desktop menggunakan format file XML sebagai penyimpan data,
sebuah XML stylesheet dapat dibuat untuk mengubah file XML yang dihasilkan oleh
suatu program pengolah kata27 menjadi file RQML. Dengan adanya transformasi antar
file XML ini, maka stylesheet tersebut dapat disebut sebagai sebuah requirement
converter. Walaupun demikian, cara-cara untuk memelihara hubungan antara
dokumen XML sumber dengan dokumen RQML hasil transformasi masih menjadi
pertanyaan.
Pemenuhan: Sebagian.
8.4.4 Change Control System
Rambutan tidak memiliki sistem kendali versi di dalamnya. Tetapi karena format file
yang digunakan adalah file XML – yang notabene adalah file teks – maka dapat
digunakan sistem version control yang umum digunakan untuk source code, seperti
misalnya CVS. Alternatif lain daripada membuat dukungan sistem kendali versi
sendiri adalah dengan menggunakan sistem version control yang ditujukan untuk filefile
XML28.
Pemenuhan: Sebagian.
133
Bab 9
PENUTUP
9.1 Rangkuman
Laporan proyek tugas akhir ini terdiri dari dua bagian besar yaitu landasan teori dan
pembahasan. Bab-bab yang tergabung dalam landasan teori memperkenalkan berbagai
teori yang digunakan dalam pembuatan program, yaitu Requirements Management,
XML, Design Patterns, dan Requirements Markup Language. Sedangkan
pembahasan terdiri dari laporan-laporan yang berkaitan dengan program yang dibuat
yaitu Analisis dan Peracangan, Implementasi, dan Pengujian.
Bab Requirements Engineering (RE) membahas definisi requirements, proses RE,
traceability, requirements patterns, serta alat bantu RE. Untuk memotivasi pembaca,
pembahasan diawali dengan suatu dongeng yang mengilustrasikan perlunya suatu
disiplin ilmu yang menangani requirements.
Bab XML (Extensible Markup Language) membahas sejarah singkat XML, berbagai
terminologi seputar XML, XML stylesheet (XSL), Document Type Definition (DTD),
pengurai XML, serta namespaces dan Xlink.
Bab Requirements Markup Language (RQML) memberikan langkah-langkah yang diambil
dalam perancangan RQML dan diakhiri dengan pembahasan RQML DTD. Halhal
yang mempengaruhi rancangan RQML adalah fakta-fakta dari studi literatur RE,
best practices yang digariskan oleh Wiegers [Wieg99] serta suatu himpunan requirement
yang dibuat atas kedua dasar ini. Selain itu juga ada tiga quality attributes yang
diinginkan ada di dalam RQML yaitu integratibility, extensibility, dan portability.
Bab Design Patterns membahas sebuah subset dari berbagai pattern yang dimuat di
[Gamm95] dan diikuti dengan pembahasan dua arsitektur perangkat lunak. Pembahasan
pattern dilakukan dengan cara mendaftarkan nama dan niatan (intent) dari
masing-masing pattern di dalam bentuk tabel. Sedangkan dua arsitektur yang dibahas
adalah Model-View-Controller yang berasal dari SmallTalk dan Separable Model
Architecture yang diterapkan di Swing.
BAB 9 – PENUTUP 134
Bab Analisis dan Perancangan memberikan uraian analisa yang dilakukan serta rancangan
awal dari Rambutan, nama alat bantu yang dibuat. Analisa dilakukan terhadap
user story yang menghasilkan sekelompok requirement untuk pedoman pembuatan
perangkat lunak. Berbagai pertimbangan lain menghasilkan beberapa constraints yang
dibebankan pada Rambutan. Bab ini diakhiri dengan rancangan umum program dan
rancangan antarmuka pemakai.
Bab Implementasi membahas teknologi yang digunakan, arsitektur, implementasi
RQML, design patterns yang diterapkan, serta memberikan beberapa data statistik.
Berbagai teknologi yang dipakai dalam implementasi Rambutan adalah Java 2 Standard
Edition, SuperWaba, Apache Ant, dan Doxygen. Pembahasan arsitektur meliputi
tinjauan-tinjauan secara garis besar dari aplikasi desktop, aplikasi handheld, dan
subsistem yang menghubungkan keduanya. Implementasi RQML membahas cara
yang diambil untuk memetakan RQML DTD ke dalam hirarki kelas. Pembahasan
design patterns mengambil beberapa komponen program yang cukup menarik serta
membahas berbagai pattern yang diterapkannya. Sedangkan data statistik yang
diberikan adalah source code metrics yang meliputi hitungan jumlah statement, jumlah
percabangan, dan jumlah JavaDoc comments.
Bab Pengujian mengukur Rambutan dari tiga sudut pandang. Sudut pandang pertama
adalah himpunan requirements dan constraints yang sebelumnya dibahas di dalam bab
Analisis dan Perancangan. Sudut pandang kedua adalah compliance Rambutan
terhadap standar RQML (dengan mengandaikan RQML sebagai sebuah standar).
Sudut pandang ketiga adalah perbandingan fitur-fitur Rambutan dengan berbagai
fitur yang umum dimiliki oleh alat bantu sejenis, sebagaimana digariskan di dalam
[Koto98].
9.2 Kesimpulan
Selama pembuatan Rambutan dan penulisan laporan tugas akhir ini dicapai beberapa
kesimpulan, yaitu:
• Penerapan arsitektur MVC di aplikasi handheld bisa dikatakan kurang memuaskan.
Hal ini disebabkan terutama karena, tidak seperti SmallTalk yang
merupakan cikal-bakal MVC [Burb92], pustaka antarmuka pemakai SuperWaba
tidak secara spesifik dirancang untuk mengakomodasi arsitektur MVC. Harga
BAB 9 – PENUTUP 135
yang dibayar oleh pemisahan kelas view dengan controller tidak terimpaskan
dengan layering serta enkapsulasi yang lebih baik. Langkah-langkah yang
diambil untuk penerapan MVC pada aplikasi handheld dapat dilihat di subbab
7.5.5 (halaman 108).
• RQML mendefinisikan banyak tipe (jenis elemen) namun hanya sedikit dari
elemen-elemen ini yang mendefinisikan informasi yang unik. Setelah dipetakan
menjadi hirarki interface hal ini menghasilkan berbagai interface kosong
(interface yang tidak mendeklarasikan method baru) yang tidak sedikit. Akibat
lebih lanjut yaitu kelas-kelas penerapan interface ini menjadi kosong juga.
Ledakan jumlah kelas ini menjadi masalah cukup serius di aplikasi handheld di
mana ruang penyimpanan data lebih terbatas. Contoh interface kosong yang
terdapat dalam data model RQML ada di subbab 7.3 (halaman 95).
• Banyaknya kelas yang diakibatkan oleh penerapan MVC, penerapan data model
RQML (lengkap dengan berbagai interface kosongnya), serta kemampuan multiplatform
harus dibayar dengan ukuran pada aplikasi handheld yang mencapai
192KB. Ukuran yang belum termasuk SuperWaba VM ini dirasa cukup besar
bagi bagi sebuah program PalmOS – program-program native PalmOS umumnya
berukuran di bawah seratus kilobyte.
• Aplikasi desktop yang lebih canggih serta adanya subsistem penghubung ke aplikasi
handheld (subsistem Bridge Facade dengan berbagai pendukungnya)
memungkinkan lebih banyak design patterns yang dapat diterapkan di aplikasi
desktop ketimbang rekannya di handheld. Pembahasan arsitektur aplikasi
desktop ada pada sub-sub bab 7.2.2, 7.2.3, 7.5.2, 7.5.4, 7.5.6, 7.5.7, 7.5.8,
7.5.9, dan 7.5.10 (halaman 89 – 118).
• Semua orang dapat membuat kesalahan. Penyusunan [Gudg00] yang sangat
rapi dan lengkap dengan informasi traceability dari landasan teori ke perancangan
dan terus ke evaluasi tetap tidak lolos dari beberapa ketidakkonsistenan.
Contoh salah satu ketidakkonsistenan ini diberikan di subbab 4.6.4.6 (halaman
47).
• Usulan standar RQML yang dimuat di dalam [Gudg00] terbukti cukup feasible
sebagai salah satu dasar pembuatan alat bantu requirements management.
Namun masih ada beberapa hal yang perlu diselesaikan sebelum [Gudg00]
dijadikan bakuan, terutama masalah konsistensi.
BAB 9 – PENUTUP 136
• Untuk beberapa fitur seperti traceability dan grouping, perumusan sebuah antarmuka
pemakai yang praktis pada aplikasi handheld ternyata cukup sulit
karena ukuran layar komputer genggam yang relatif kecil. Belum lagi pustaka
user interface controls yang lebih terbatas akan memberikan tantangan yang
cukup besar dalam implementasi fitur-fitur ini.
• Rambutan telah menjawab tantangan market opportunity adanya sebuah alat
bantu requirements management berbasis komputer genggam. Namun, seperti
telah dirinci pada subbab 8.4 (halaman 131), fitur-fitur yang dimiliki perangkat
lunak ini masih jauh ketimbang pesaing-pesaing lainnya yang telah lebih dulu
matang. Masih jauh perjalanan Rambutan sebelum layak dipasarkan sebagai
perangkat lunak siap pakai.
9.3 Saran
Berikut ini adalah beberapa saran yang dapat dilakukan untuk penelitian lebih lanjut
yang bertolak dari tugas akhir ini:
• Mengimplementasikan dukungan terhadap elemen-elemen dan
sehingga Rambutan dapat mengakomodasikan traceability, focus group, serta
pengkategorisasian requirements yang lebih ekstensif.
• Mengimplementasikan fungsi reporting agar dokumen SRS yang dikelola oleh
Rambutan dapat dicetak hard copy. Fungsi ini dapat dilakukan dengan cara
menggunakan XML stylesheet untuk mengubah dokumen RQML menjadi HTML
ataupun PDF untuk kemudian di-print. Lebih jauh lagi, fungsi reporting dapat
dirancang untuk hanya mencetak sebuah subset dari keseluruhan requirement
yang ada sesuai dengan pilihan pemakai.
• Melakukan refactoring untuk menurunkan jumlah baris kode program serta
meningkatkan modularitas dan maintainability.
• Melakukan analisis cross-cutting concerns [Kicz97] terhadap kode program untuk
penerapan Aspect-Oriented Programming (AOP). Berhubung gabungan kedua
aplikasi telah melampaui batas lima ribu baris yang menjadi tolok ukur program
besar, maka AOP diharapkan dapat membawa pengaruh positif terhadap modularitas
Rambutan [Shah02]. Adalah suatu hal yang menarik untuk melihat apakah
AspectJ – sebuah compiler AOP untuk Java – dapat diterapkan di aplikasi
SuperWaba, yang notabene tidak menggunakan API standar Java.
BAB 9 – PENUTUP 137
• Diadakannya usability research untuk menguji Rambutan dan RQML di dalam
situasi nyata. Hal ini perlu untuk mematangkan Rambutan agar dapat menjadi
software siap pakai.
• Ekspansi cakupan Rambutan ke sistem informasi requirements management yang
multi-user, mungkin dengan dukungan basis data hybrid yang berbasis XML dan
relasional. Pada tahap ini aplikasi handheld dapat diberikan kemampuan untuk
mengirim dan menerima dokumen SRS lewat jaringan nirkabel.
• Ekspansi Rambutan untuk mendukung mobile devices yang lain; mungkin
dengan bantuan media web, WAP, mungkin bahkan di-port ke J2ME (bila
platform ini ternyata feasible – mengingat fitur dan performa J2ME lebih terbatas
ketimbang SuperWaba).
• Pengevolusian Rambutan berbarengan dengan RQML – alangkah baiknya jika
RQML dapat dijadikan suatu bakuan yang diterima oleh berbagai pihak dengan
Rambutan sebagai reference implementation dari standar tersebut.
138
A. DAFTAR PUSTAKA
[Achr03] Achrafi, Rabi. Requirements Tools. Volere Requirements Resources;
Atlantic Systems Guild, Inc. http://www.volere.co.uk/tools.htm ;

http://www.systemsguild.com/GuildSite/Robs/retools.html

[Adib02] Adibowo, Sasmito. Developing Handhelds: Targeting Personal Digital
Assistant Platforms. Arcle Technologies Publications. 6 June 2002.
[Alex77] Alexander, Christopher, Ishikawa, Sara, et. al., A Pattern Language.
Oxford University Press, New York. 1977.
[Ambl00] Ambler, Scott. Requirements Engineering Patterns. SD Magazine, CMP
Media, LLC. 2000.

http://www.sdmagazine.com/documents/s=744/sdm0005k/0005k.ht

m?temp=aK8YFuf9on
[Apac00a] Ant Specification: Version 0.5. The Apache Software Foundation.
20 April 2000
[Apac02a] Apache Ant – Frequently Asked Questions. The Apache Software Foundation.
2002. http://ant.apache.org/faq.html
[Burb92] Burbeck, Steve. Applications Programming in Smalltalk-80TM: How to use
Model-View-Controller (MVC). ParcPlace Systems, Inc. 1987, 1992.
[Booc99] Booch, Grady, James Rumbaugh, Ivar Jacobson. The Unified Modeling
Language User Guide. Addison-Wesley, 1999.
[Benn00] Bennett, Simon, Steve McRobb, Ray Farmer. Object-Oriented Systems
Analysis and Design using UML. McGraw-Hill International Editions.
2000.
[Borl93] et. al. Borland. Borland ObjectWindows Programmer’s Guide. Borland
International. 1993.
139
[Chun00] Chung, L, Nixon, B, Yu, E. & Mylopoulos, J. Non-Functional Requirements
in Software Engineering. Boston: Kluwer Academic Publishers.
2000.
[Coop98] Cooper, James W. The Design Patterns Java Companion. Addison-
Wesley Design Pattern Series. 1998.
[Cons] World-Wide Web Consortium. World Wide Web Consortium (W3C).
[Cons00a] World-Wide Web Consortium. Simple Object Access Protocol (SOAP) 1.1.
W3C Website. May 2000.
[Cree99] Creel, Christopher. Requirements by Pattern. SD Magazine, CMP Media,
LLC. 1999.

http://www.sdmagazine.com/documents/s=751/sdm9912d/9912d.ht

m
[Davi92] Davis, A. Operational Prototyping: A New Development Approach.
Software, 9(5): 70–78. 1992
[Dick02] Dickerson, Peter. Jump2 User’s Manual. 5 December 2002.

http://sourceforge.net/projects/jump

[Dhar02] Dharmawan, Zulfikar S. Alat Bantu Requirements Management Berbasis
Web Dengan Memanfaatkan Dokumen Extensible Markup Language.
University of Indonesia Research Paper. 2002.
[Dary00] Daryl, Eamon Guiney; Kulak and Eric Lavkulich. Use case: Requirements
in Practice. Addison-Wesley. 2000.
[Dorf90] Dorfman, Merlin, and Richard H Thayer. Standards, Guidelines, and
Examples of System and Software Requirements Engineering. Los
Alamitos, CA: IEEE Computer Society Press. 1990.
[Duve02] Duveau, Laurent. Bench2. aldweb Site. 12 December 2002.

http://www.aldweb.com/articles.php?lng=en&pg=24&prt=1

[Ecks99] Eckstein, Robert. XML Pocket Reference. O’Reilly. 1999.
140
[Fari03] Farine, Arnaud. SuperWaba: Java Language for PDA. SuperWaba
France. 2003.
[Fede] Federal Information Processing Standards Publications. Integration
Definition for Function Modeling (IDEF0).
[Fowl02] Fowler, Amy. A Swing Architecture Overview: The Inside Story on JFC
Component Design. Sun Microsystems Technical Document. 2002.

http://java.sun.com/products/jfc/tsc/articles/architecture/

[Gamm95] Gamma, Erich, Richard Helm, Ralph Johnson, and John Vlissides.
Design Patterns: Elements of Reusable Object-Oriented Software.
Addison-Wesley Publishing Company. 1995.
[Gogu94] Goguen, J. & Jirotka, M. Requirements Engineering: Social and Technical
Issues. London: Academic Press. 1994.
[Grad92] Grady, R. Practical Software Metrics for Project Management and Process
Improvement. Englewood Cliffs, NJ: Prentice-Hall. 1992.
[Gudg00] Gudgeirsson, Gardar. Requirements Engineering and XML. University of
York Research Paper. 2000.
[Grah99] Graham, Ian S, Liam Quinn. XML Specification Guide. Wiley. 1999.
[Gust99] Gustavsson, Andreas, & Mattias Ersson. Formalizing the Intent of Design
Patterns: An Approach Towards a Solution to The Indexing Problem.
Uppsala Universitet, Computing Science Department, Institute of
Technology. 1999.
[Haza03] Hazan, Guilherme C, Ed Crandell. SuperWaba FAQ. February 14,
2003. http://www.superwaba.com.br/faq.asp
[IBM] et. al., IBM. OpenDoc.
[Inco02] INCOSE RM Tools Working Group. Tools Survey: Requirements Management
(RM) Tools. International Council on Systems Engineering. December
29, 2002. http://www.incose.org/tools/tooltax.html
141
[Jark98] Jarke, Matthias. Requirements Tracing: Communications of the ACM.
1998. 41(12):32-36.
[Jone95] Jones, David A., Donald M. York, John F. Nallon, Joseph Simpson.
Factors Influencing Requirements Management Toolset Selection. INCOSE
Requirements Working Group. 1995.

http://www.incose.org/lib/rmtools.html

[Kicz97] Kiczales, Gregor, et. al. Aspect-Oriented Programming. ECOOP 1997.

http://aspectj.org/documentation/papers/AndSlides/ECOOP1997-AOP

.pdf
[Koto98] Kotonya, Gerald, Ian Sommerville. Requirements Engineering – Processes
and Techniques. Wiley. 1998.
[Lee02] Lee, Chr Clemens. JavaNCSS – A Source Measurement Suite for Java.
2002. http://www.kclee.com/clemens/java/javancss/
[Lams98] van Lamsweerde, A. Darimont, R. & Letier, E. Managing Conflicts in
Goal-Driven Requirements Engineering. IEEE Transactions on Software
Engineering, 24(11): 908-926. 1998
[Leff00] Leffingwell, Dean & Don Widrig. Managing Software Requirements: A
Unified Approach. Addison-Wesley. 2000.
[Maid96] Maiden, N. CREWS-SAVRE: Scenarios for Acquiring and Validating
Requirements. Automated Software Engineering. 5(4): 419-446. 1996
[Marc99] Marchal, Benoiˆt. XML By Example. Que. 1999.
[McDe94] McDermid, John. Software Engineer’s Reference Book. Butterworth
Heinmann. 1994.
[Micr] et. al. Microsoft. BizTalk.
[Nuse00] Nuseibeh, Bashar, & Steve Easterbrook. Requirements Engineering: A
Roadmap. Department of Computing, Imperial College, London, UK and
Department of Computer Science, University of Toronto, Ontario,
Canada (respectively). 2000.
142
[Oxfo90] Oxford Dictionary of Computing. Oxford University Press. 1990
[Palm] et. al. Palm. Zen of Palm. Palm, Inc.
[Palm02] Palm OS® 5 Development Overview. PalmSource, Inc. 2002.

http://www.palmos.com/dev/support/docs/palmos50/

[Pres01] Pressman, Roger S. Software Engineering: A Practitioner’s Approach.
McGraw-Hill Higher Education. 2001.
[Robb01] Robbins, Stephen P. Organizational Behavior 9th ed. Prentice-Hall
International, Inc. 2001.
[Saut03] Sauter, Vicky. The King’s Companion. 2003.
[Shaw96] Shaw, M & Gaines B. Requirements Acquisition. Software Engineering
Journal, 11(3): 149-165. 1996
[Shah02] Shahab, Quonita M. Aspect-Oriented Programming (AOP) untuk Menangani
Masalah pada Software Modularity. University of Indonesia Research
Paper. 2002.
[Stan97] The Java Dependency Mechanism and the MVC Approach. Stanford
Genome. 1997.

http://java.cnam.fr/public_html/Iagl99/dazy/UML_MVC/MVC/Steve/i

ntro.html
[Sun00a] Java™ 2 SDK, Standard Edition Documentation, version 1.3. Sun Microsystems.
2000.
[Sun00b] Java™ 2 Micro Edition (J2ME) Technology for Creating Mobile Devices.
Sun Microsystems. May 19, 2000.
[Sun01a] J2EE Design Patterns. Sun Microsystems. 2001.
[Sun02a] What is JavaTM Technology? Sun Microsystems. 24 June 2002.

http://java.sun.com/java2/whatis/

[Sun03a] The Java Tutorial: Creating a GUI with JFC/Swing. Sun Microsystems,
Inc. 1995-2003. http://java.sun.com/docs/books/tutorial
143
[Sun03b] The Java Tutorial: Learning the Java Language. Sun Microsystems, Inc.
1995-2003. http://java.sun.com/docs/books/tutorial
[Syba02] PowerDesigner OOM User’s Guide. Sybase PowerDesigner Help Files,
version 9.5.1. December 2002.
[Wall00] Wallace, Nathan. Design Patterns in Web Programming. E-gineer article.
March 8th, 2000. http://www.e-gineer.com/articles/
[Whit99] Whitten, Bentley, et. Al. System Analysis and Design Methods.
McGraw-Hill. 1999.
[Wieg99] Wiegers, Karl E. Software Requirements. Microsoft Press. 1999.
[Wieg00] Wiegers, Karl E. When Telepathy Won’t Do: Requirements Engineering
Key Practices. Cutter IT Journal. May 2000.
[Wild99] Wild, Rick. Happy Fingers. WabaSoft. 1999.

http://www.wabasoft.com/happyfingers.shtml

[Vill99] Viller, S & Sommerville, I. Social Analysis in the Requirements Engineering
Process: from ethnography to method. 4th International Symposium
on Requirements Engineering (RE ‘99), Limerick, Ireland, 7-11th June
1999.
[Zave97] Zave, P. Classification of Research Efforts in Requirements Engineering.
ACM Computing Surveys, 29(4): 315-321. 1997.

bank.
•Self-service, contohnya mesin ATM.
•Antar sistem, contohnya transaksi antar
bank.
Dari definisi di atas, maka sebuah servis
yang diciptakan dengan prinsip SOA dan
didukung oleh sistem TI harus mendukung
secara langsung servis yang diberikan
perusahaan kepada customer, client, partner,
masyarakat dan organisasi lain.
SOA dan Web Service
Web Service adalah
sebuah standar yang
sebenarnya telah
ada sebelum SOA
dikenal. Web service
pada dasarnya
adalah sebuah
abstraksi dalam
p e n g emb a n g a n
software yang memungkinkan
komponen
dalam sebuah
aplikasi saling berinteraksi
tanpa ada
batasan bahasa
pemrograman yang
digunakan atau host
dimana servis itu dieksekusi.
Gabungan SOA dan Web Service merupakan
hubungan yang saling menguntungkan
keduanya. Web Service semakin
diterima dengan luas karena manfaat yang
diberikan oleh SOA, sedangkan SOA
mendapatkan keuntungan karena sifat Web
Service yang merupakan standar terbuka.
Jadi SOA yang diimplementasikan dengan
web service akan dapat berinteraksi dengan
A Service-Oriented Architecture (SOA) is
a style of design that guides all aspects of
creating and using business services
throughout their lifecycle (from conception to
retirement), as well as defining and provisioning
the IT infrastructure that allows
different applications to exchange data and
participate in business processes regardless
of the operating systems or programming
languages underlying those applications. [1]
Pendahuluan
Dewasa ini dunia bisnis berkembang
dengan sangat pesat. Banyak perusahaan
baru muncul dan tenggelam dalam waktu
yang singkat. Semua ini merupakan
tantangan dan menimbulkan pertanyaan.
Bagaimana dunia bisnis yang kita geluti bisa
tetap bertahan? Mengapa ada perusahaan
yang begitu digdaya tetap menjadi unggul
walaupun diserang oleh berbagai kompetitornya?
Mengapa pula ada perusahaan
yang memiliki visi dan sumber daya bagus
tetapi tidak dapat bertahan lama? Kuncinya
adalah servis. Semua perusahaan (komersil
maupun pemerintah) pada dasarnya memberikan
servis kepada konsumen. Satu hal
yang sering dilupakan adalah bahwa customer
tidak peduli dengan teknologi, tetapi
peduli pada servis dan pengiriman yang
efektif [2]. Mungkin saja, dengan teknologi
yang mutakhir konsumen akan tertarik
dengan produk yang ditawarkan. Kendalanya
adalah, dalam dunia yang mana
informasi dapat dengan mudah diperoleh,
masalah teknologi menjadi sesuatu yang
tidak bisa menjadi andalan satu-satunya.
Cepat atau lambat kompetitor kita akan
menguasai teknologi itu atau bahkan melebihinya.
Satu-satunya yang membuat
customer tetap setia adalah pelayanan yang
memuaskan.
Untuk dapat bertahan dalam iklim yang
serba cepat ini, perusahaan memerlukan
flexibilitas dan efisiensi yang tinggi. Flexibel
terhadap perubahan dalam bisnis akan
membuat perusahaan mudah beradaptasi
terhadap perubahan. Efisiensi dalam memanfaatkan
resource yang ada akan memaksimalkan
aset dan menambah keuntungan
tersendiri.
Apakah SOA itu?
Semua perusahaan dan organisasi pemerintah
pada dasarnya memberikan
servis, contohnya:
•Bank: tabungan, kartu kredit, box penyimpanan,
pinjaman.
•Asuransi: asuransi mobil, rumah, kesehatan,
kecelakaan.
•Kepolisian: penegakan hukum, pendidikan
masyarakat.
Servis dapat berupa:
•Lewat manusia, contohnya teller pada
Mengapa SOA?
Mengapa kita meminta tolong orang lain
untuk mengerjakan sesuatu? Karena
mereka adalah ahlinya. Mengkonsumsi
suatu servis untuk menyelesaikan suatu
permasalahan biasanya lebih murah dan
lebih efektif daripada jika harus dikerjakan
sendiri sementara kita bukan ahlinya dalam
permasalahan itu. Dapatkah dibayangkan
jika kita harus melakukan segala hal yang
kita perlukan sendirian? Pada saat ini
kehidupan kita sedikit banyak telah
berorientasi kepada servis misalnya servis
transportasi, telekomunikasi, ritel, kesehatan,
dan finansial.
Analogi yang sama dapat kita gunakan
untuk menjawab
pert
a n y a a n
“Mengapa kita memerlukan SOA (Service-
Oriented Architecture)?”
Sebenarnya SOA sama saja dengan proses
lain yang bertujuan untuk memodularisasi
perangkat lunak. Proses ini telah berlangsung
sekian lama dalam industri TI. Perbedaannya
adalah bahwa SOA memberi
kesempatan kepada perusahaan untuk
mengidentifikasikan core competency
mereka dan untuk menentukan apakah core
competency tersebut akan disediakan
sebagai servis kepada industri dan partner
bisnis. Dan sebaliknya, apakah suatu
perusahaan memutuskan bahwa apa yang
semula dianggap sebagai core competency
sebenarnya bukan core competency sehingga
mereka memutuskan untuk membeli
saja servis yang disediakan oleh pihak lain.
Diharapkan dengan memakai SOA, respon
bisnis terhadap perubahan kondisi pasar
akan lebih cepat dan lebih sedikit memakan
biaya karena alih-alih harus membuat dari
awal aplikasi yang diperlukan, dimungkinkan
untuk melakukan penggunaan
kembali aset TI yang sudah ada, tak peduli
apakah itu milik sendiri maupun harus
memakai dari pihak lain.
Loose Coupling
Syarat agar tujuan SOA tercapai pastinya
tidak mudah. Servis yang tersedia harus
memiliki penawaran yang jelas, mudah
diakses, dan mudah digunakan. Servis juga
Service types
Service-Oriented Architecture: Selayang Pandang
INSIDE
THIS ISSUE:
SOA: Selayang
Pandang
1
SOA, SOAP,
dan Produk
eBdesk
1
Tips:
Pemrograman
2
Menambahkan
Aplikasi Baru
di Portal
eBdesk
2
Tips & Tricks 4
Immune OR
Cure?
4
eBdesk in a
Brief
4
SOA, SOAP, dan Produk eBdesk
Maret – April 2006
SPECIAL
POINTS OF
INTEREST:
• SOA
• SOAP
• (Web) Services
• Produk eBdesk
• SOA dalam aksi
(portal channel)
• Immune OR
Cure?
http://www.ebdesk.com
eBdesk Technology Jl. Raden Patah No. 21 Bandung Indonesia 40132 Tlp. 022-2502423 Fax. 022-2533792
EDISI 1
ke hal. 2 …
ke hal. 3 …
Sri Ariyani, Head of Product Engineering-ET
Subroto, Head of Product Maintenance-ET
P A G E 2
Service-Oriented Architecture: Selayang Pandang…
Menambahkan Aplikasi Baru di Portal eBdesk
“Semudah meletakkan kertas di atas meja
kemudian menulis di atasnya…!”
Membangun aplikasi baru di atas portal eBdesk
terdengar seperti sesuatu yang sulit. Hal ini
mungkin disebabkan orang lebih terbiasa
dengan mindset membangun program di atas
sistem operasi dan bahasa tertentu. Sebenarnya,
desain portal ini telah dirancang untuk
tujuan pembangunan berbagai aplikasi baru
yang akan berjalan diatasnya (add-on application)
dengan sangat mudah, melalui berbagai
bahasa pemrograman yang bervariasi. Anda
tinggal memilih bahasa yang Anda sukai dan
kemudian mengintegrasikannya ke portal
eBdesk. Semudah Anda meletakkan kertas di
atas meja dan kemudian menulis di atasnya.
Sekedar contoh, Anda dapat dengan mudah
membangun aplikasi baru yang menggunakan
web service. Anda juga dapat me-reuse web
service, misalnya membuat dua client yang
memakai satu service menggunakan PHP.
Agar memperoleh gambaran nyata tentang
pembangunan aplikasi baru di portal eBdesk,
marilah kita buat sebuah channel kecil bernama
“Dictionary” di Frontpage, yaitu sebuah aplikasi
kamus online.
Kembali ke cerita awal, semudah meletakkan
kertas. Ibaratkan aplikasi yang Anda bangun
adalah sebuah kertas, maka mejanya adalah
database eBdesk.
“Tapi di
d a t a b a s e
eBdesk ada
lebih dari 300
tabel! ”
J a n g a n
k h a w a t i r ,
meja seluas
300 cm2 tentu
tidak akan
t e r p a k a i
semua untuk
m e n a r u h
benda seluas
4 cm2 bukan?
Begitulah… kita hanya butuh empat buah tabel
saja untuk meletakkan aplikasi baru kita di
portal. Keempat tabel itu adalah:
1)EB_CHANNELS: Mendaftarkan atribut
channel yang dibuat, khususnya nama
channel, yaitu Dictionary beserta ID channelnya
2)EB_HANDLES: Mendaftarkan aplikasi sebagai
pengisi channel. Program yang akan
mengisi channel Dictionary adalah misc-fpdict.
php
3)EB_CHANNEL_HANDLES: Penghubung/
pemetaan channel dengan handle-nya
4)EB_CHANNEL_HIERARCHY: Penentuan
posisi channel, dalam hal ini channel Dictionary
berada di bawah channel Frontpage-
Home karena channel Dictionary akan dimunculkan
di channel Frontpage-Home
Apakah Anda melihat template query diatas
begitu rimbun seperti hutan perawan? Jika iya,
Anda cukup berkonsentrasi ke bagian yang
dicetak tebal saja karena bagian lainya
cenderung tetap dan dapat di jadikan template
untuk pembuatan aplikasi di atas portal
eBdesk. Jadi, jika ingin membangun channel
baru, Anda cukup meng-edit template query
tersebut.
masing-masing perusahaan itu menggunakan
aplikasi yang tidak bisa saling berkomunikasi
sehingga cara yang mungkin dilakukan
hanyalah cara manual yang sudah pasti
akan memakan waktu lama. Jika semua
aplikasi yang dipakai sudah menerapkan
SOA, masing-masing dapat saling berkomunikasi
sehingga diperoleh hasil/respon realtime.
Bayangkan juga sebuah agen perjalanan
yang menyediakan jasa wisata liburan.
Perusahaan ini harus bekerjasama dengan
hotel dan jasa angkutan yang ada di lokasi
wisata. Solusi yang umum dilakukan adalah
membuat sistem integrasi untuk aplikasi
yang ada. Itu berarti untuk setiap pembukaan
lokasi wisata baru atau penambahan
hotel baru, sistemnya harus di-setup agar
dapat menyesuaikan. Proses setup ini jelas
memakan waktu dan biaya yang tidak
sedikit jika tidak menggunakan prinsip SOA.
SOA dan Akses Multi-channel
Sekarang ini hampir semua bank sudah
memungkinkan nasabahnya mengakses
layanan dari berbagai sumber, mulai dari
cara konvensional melalui teler, cara layanan
mandiri melalui ATM, lewat internet atau
handphone, dan layanan hotline phone
banking. Semua ini bertujuan makin memudahkan
nasabah untuk mendapatkan layanan.
Tetapi jika semua access-point itu tidak
terintegrasi dengan baik, bukan kepuasan
yang akan didapatkan nasabah.
Sebuah Permulaan dari Perjalanan
Panjang
Penerapan SOA pada perusahaan jelas
merupakan investasi yang mahal dan berjangka
panjang. Perusahaan tidak akan
mendapatkan manfaatnya secara langsung
hanya dengan mengganti semua aplikasi
yang dipakai mendukung SOA. Hanya ketika
perusahaan dapat membuat proses bisnis
baru, dan membuat aplikasi hanya dengan
menggunakan servis yang telah ada baik
sebagian maupun keseluruhan, barulah
perusahaan itu memperoleh manfaat SOA.
Ketika perusahaan itu merger dengan perusahaan
lain dan diperlukan sebuah sistem
pelaporan baru yang mengintegrasikan
sistem yang ada, dapat dibuat dengan lebih
cepat, barulah manfaat SOA dapat dirasakan.
Penerapan SOA adalah sebuah awal dari
perjalanan untuk mendapatkan fleksibilitas
aplikasi yang digunakan untuk mendukung
proses bisnis. SOA akan memisahkan mana
yang menjadi keahlian orang TI dan orang
bisnis. Tugas orang TI adalah merancang
servis, sedangkan tugas orang bisnis adalah
mengkombinasikan servis-servis yang ada
untuk menghasilkan sebuah nilai baru, yang
pada akhirnya menjadi sebuah keuntungan
baru perusahaan.
Referensi
[1] Understanding SOA with Web Services, Eric
Newcomer & Greg Lomow, Addison Wesley Prefosesional,
2004
[2] Service Blueprint: Roadmap for Execution, Ravi
Kalakota & Marcia Robinson, Addison Wesley, 2003
produk lain yang sama-sama menggunakan
web service tidak peduli vendor pembuatnya.
SOA dan Integrasi
Peranan SOA dalam integrasi proses bisnis,
bisa dalam internal perusahaan maupun antar
perusahaan. Dalam internal perusahaan,
penerapan SOA memungkinan unit-unit bisnis
bekerja secara sinergi, dari pabrikasi hingga
distribusi dapat lebih sinkron.
Kerjasama antar perusahaan bukan hal yang
mustahil lagi pada masa ini. Sebuah perusahaan
yang membuka layanan pembelian online
harus dapat mengirimkan produknya kepada
c u s -
t o m e r .
Untuk itu,
ia harus
bekerja
s a m a
dengan
a g e n
pengi r i -
m a n ,
y a n g
akhirnya
a k a n
bekerja
s a m a
l a g i
dengan
j a s a
p e n e r -
bangan
k a r g o .
Bayangkan,
jika
Services
in Banking
http://www.ebdesk.com
eBdesk Technology Jl. Raden Patah No. 21 Bandung Indonesia 40132 Tlp. 022-2502423 Fax. 022-2533792
A Service-Oriented
Architecture (SOA) is
a style of design that
guides all aspects of
creating and using
business services
throughout their lifecycle
(from conception to
retirement), as well as
defining and provisioning
the IT infrastructure
that allows different
applications to exchange
data and participate in
business processes
regardless of the
operating systems or
programming languages
u n d e r l y i ng those
applications.
Agus Pratondo, Head of QA/QC-ET
ke hal. 3 …
Channel Dictionary
berbahasa Inggris dan
Indonesia
— EB_CHANNELS
insert into EB_CHANNELS
(EB_CID,EB_CTYPE,EB_CNAME,EB_CDESC,EB_CFORMAT,EB_CPOS_X,EB_CCUSTOM,EB_CSEARCHABLE,EB_CDEFAULT
) values (51401888,3,’Dictionary’,’eBdesk Online Dictionary’,’

  $search$
$result$
 ‘,1,’1′,’0′,’0′)
— EB_HANDLES
insert into EB_HANDLES
(EB_HID,EB_HLIB,EB_HVOID,EB_HTYPE,EB_HLANGUAGE,EB_HDBHOST,EB_HDBNAME,EB_HDBTYPE,EB_HDBUSER,EB
_HDBPASSWORD,EB_HTIME_OUT) values (51401888,’localhost:80′,’/ebhtml/other-sites/misc/misc-fpdict.
php’,0,’CGI’,”,'[domain]’,’ODBC_’,’ebdesk’,’manager’,30)
— EB_CHANNEL_HANDLES
insert into EB_CHANNEL_HANDLES (EB_CID,EB_HID) values (51401888,51401888)
— EB_CHANNEL_HIERARCHY
insert into EB_CHANNEL_HIERARCHY (EB_CID,EB_CHPARENT) values (51401888,51401000)
Template query
TIPS: Pemrograman
C Programming
Swap tanpa variabel sementara
Kita dapat menggunakan operasi bit untuk
melakukan swap nilai variabel tanpa menggunakan
variabel sementara. Berikut ini contoh
fungsi yang akan melakukan swap variabel
bernilai integer:
void swap(int& __restrict a, int&
__restrict b)
{
assert(&a != &b);
a ^= b;
b ^= a;
a ^= b;
}
Integer to String
Memanfaatkan fungsi snprintf untuk membuat
fungsi untuk mengubah integer ke string. Berikut
ini adalah contoh fungsi yang akan mengubah
integer dari parameter masukan menjadi string:
#include
#include
char* itoa(int num)
{
int size = log10(num) + 1;
char *x = malloc(size);
snprintf(x, size, “%d”, num);
}
HTML Programming
Menambah text pada dokumen HTML secara
langsung pada saat runtime (javascript).
Fungsi berikut ini akan menambahkan elemen

yang berisi text “Hello World” pada akhir
dokumen HTML.
function addHeading()
{
heading_node = document.createElement
(“H1″);
heading_text = document.createTextNode
(“Hello World”);
heading_node.appendChild(heading_text);
document.body.appendChild
(heading_node);
}
Mengubah style dokumen HTML pada saat
runtime (javascript).
Fungsi berikut ini akan mengubah ukuran font
pada body HTML menjadi ukuran 14:
function changeSize()
{
body_tag = document.body;
body_tag.style.fontSize = “14pt”;
Agus Hilman, Head of Product Support-ET
SOA, SOAP, dan Produk eBdesk…
E D I S I : 1 P A G E 3
biasanya selalu tersedia namun bersifat idle hingga saat
muncul permintaan, serta tidak tergantung pada konteks
dari konsumen. Implementasi dari servis bisa berubah
namun perubahannya sebisa mungkin tidak merusak
pelayanan yang sedang diberikan kepada konsumen.
Secara teknologi, servis dapat disediakan oleh web service
yang bersifat loose coupling, sesuai yang diungkapkan
oleh Hao He di dalam sebuah artikelnya [1]:
SOA is an architectural style whose goal is to achieve
loose coupling among interacting software agents.
Berikut deskripsi dari loose coupling [3]:
The friction-free linking enabled by web services (or any
SOA). Loosely coupled services, even if they use incompatible
system technologies, can be joined together on
demand to create composite services, or disassembled just
as easily into their functional components. Participants
must establish a shared semantic framework to ensure
messages retain a consistent meaning across participating
services.
Agar loose coupling tercapai, ada batasan arsitektural yang
harus dianut:
1) Menggunakan antarmuka yang sederhana yang hanya
menerima semantik umum dan tersedia secara universal.
2) Menggunakan message deskriptif yang menganut suatu
extensible schema. Schema membatasi struktur dan
vocabulary dari message. Extensible schema memungkinkan
kemunculan versi baru dari servis tanpa merusak
servis yang sudah ada.
SOAP dan SOA
Ada dua teknologi utama yang mendukung SOA yaitu
SOAP (Simple Object Access Protocol) dan REST
(Representational State Transfer). Yang akan kita bahas
berikutnya adalah yang pertama.
SOAP Version 1.2 (SOAP) is a lightweight protocol intended
for exchanging structured information in a decentralized,
distributed environment. It uses XML technologies
to define an extensible messaging framework providing a
message construct that can be exchanged over a variety of
underlying protocols. The framework has been designed to
be independent of any particular programming model and
other implementation specific semantics. [4]
Dua batasan arsitektural dari SOA difasilitasi oleh SOAP
yang merupakan protokol ringan untuk keperluan tukarmenukar
informasi terstruktur dengan menggunakan
teknologi XML yang bersifat extensible dan dapat dipertukarkan
melalui berbagai macam protokol.
eBdesk Product dan SOAP
Produk eBdesk menyediakan beberapa service yang
memakai teknologi SOAP antara lain:
– eBdesk Platform Services
– eBdesk Knowledge Services
– eBdesk eXpedition Workflow Engines
– eBdesk Calendar Services
Keempat jenis service tersebut merupakan back-engine dari
aplikasi-aplikasi web yang merupakan platform dan add-on
eBdesk eXpander yaitu aplikasi eBdesk eNcyclo Document
Management, eBdesk eXpedition Workflow, dan eBdesk
Calendar.
Seperti yang telah disampaikan pada bagian pertama, salah
satu latar belakang dari SOA adalah identifikasi core competency
atau spesialisasi. Keempat jenis servis yang dimiliki
Produk eBdesk memiliki spesialisasi masing-masing.
eBdesk Platform Services
Utamanya adalah mengelola entitas (user, group, organization),
sumber daya, serta hak aksesnya termasuk otentikasi
dan lisensi.
eBdesk Knowledge Services
Spesialisasinya adalah pada taxonomy, content management,
dan search. Terdiri atas beberapa web services yaitu:
– Taxonomy Server. Merupakan bagian dari eBdesk Knowledge
Services yang menangani pengelolaan taxonomy,
content submission, mengumpulkan content dari sumbersumber
yang telah ditentukan, menyediakan metadata dari
content yang tersimpan, serta mengelola content dengan
segala aktivitas yang berkaitan dengannya.
– Content Manager Engine. Merupakan bagian dari eBdesk
Knowledge Services yang berfungsi menyimpan dan mengirim
content dalam format asli, membuat indeks dari content yang
tersimpan, dan menyediakan version tracking dari content.
– Search Server. Merupakan bagian dari eBdesk Knowledge
Services yang menangani pencarian terhadap semua content
yang tersimpan.
eBdesk eXpedition Workflow Services
Spesialisasinya adalah pada pembuatan, eksekusi, dan
pengelolaan process definition. Terdiri atas beberapa web
services yaitu:
– Core Engine. Berfungsi untuk menangani inisiasi transaksi
dari suatu workflow, perutean, form submission, delegasi,
decision, tracking transaksi, serta pembatalan transaksi.
– Design Service. Berfungsi untuk membuat dan mengelola
form, membuat dan mengelola process definition, serta
menyediakan akses terhadap error log pada eksekusi database
query serta eksekusi script.
– Admin Service. Berfungsi untuk mengelola role, hak akses
dan data kontak user, custom database, serta melakukan
penghapusan transaksi.
– Moderator Engine. Berfungsi untuk mengambil data transaksi
yang sedang ditangani oleh Core Engine, membuat
statistiknya, serta menghasilkan report dengan pilihan-pilihan
Dengan mengatur tampilan di channel Personalization
> Page > Content yang di sebelah kirinya terdapat channel
Channels dan dilanjutkan meng-expand eBdesk > My
Desk > Frontpage > Home, serta men-cek Dictionary,
maka selesailah sudah proses registrasi channel ke portal.
Anda seperti baru saja meletakkan sebuah kertas di atas
meja, sangat mudah! Dan jangan lupa untuk mengeset
access-right user untuk aplikasi ini!
Anda sudah bisa melihat hasilnya di frontpage sebagai
berikut:
“Loh, kok yang muncul pesan error ?!”
Pesan ini muncul karena memang tidak ada aplikasi yang
akan mengisi channel Dictionary. Kita baru saja meletakkan
‘sebuah kertas’ dan sama sekali belum ‘menulisnya’.
Untuk dapat menampilkan sesuatu, kita harus menuliskan
‘sesuatu’ di channel yang bersangkutan.
Pengisi channel Dictionary ini telah dideklarasikan di table
EB_HANDLES; di /ebhtml/other-sites/misc/misc-fpdict.
php (ebhtml adalah alias tempat file index portal).
Jika dibuat file program sederhana misc-fp-dict.php
seperti ini (sekedar menuliskan “hello…”) maka channel
sudah mampu menampilkan sebuah
pesan sederhana yang diinginkan.
Menambahkan Aplikasi Baru di Portal eBdesk…
De m i k i a n l a h ,
proses menulis
program
s e de r -
h a n a
sebuah
aplikasi
baru di
portal eBdesk.
Untuk selanjutnya pemrograman dapat diperluas menjadi
program yang lebih menarik dan menggunakan teknologi yang
telah ada. Aplikasi Dictionary, merupakan contoh sederhana
pengembangan program di atas.
Aplikasi Dictionary ini menggunakan sebuah service sederhana
yang dibuat dengan PHP untuk menangani pencarian
terjemahan Bahasa Indonesia – Inggris, dan menambahkan
perbendaharaan kata dalam databasenya.
File misc-fp-dict.php bersama dengan file ebtag.h yang
berfungsi untuk pengintegrasian dengan
theme portal, akan membangkitkan dokumen
yang di dalamnya terdapat fungsi-fungsi
Javascript. Fungsi ini akan melakukan request
ke svc-dict.php. File terakhir ini berperan
sebagai service untuk melayani permintaan
operasi Dictionary yang berupa mencari
terjemahan dari Bahasa Inggris ke Indonesia
dan sebaliknya serta menambah perbendawww.
ebdesk.com
eBdesk Technology Jl. Raden Patah No. 21 Bandung Indonesia 40132 Tlp. 022-2502423 Fax. 022-2533792
haraan kata tanpa melakukan request sebuah page utuh
di portal eBdesk. Fungsi Javascript diletakkan di file
terpisah di rq-dict.js dan AjaxRequest.js (merupakan
file third party, Author: Matt Kruse). Operasi detil dari
service Dictionary diletakkan di get-word.php yang akan
memanfaatkan file global.php untuk urusan koneksi ke
database.
Untuk sempurnanya aplikasi Dictionary ini maka perlu file
xml untuk keperluan mendukung multi-bahasa yaitu :
eb51401888-en.xml untuk bahasa Inggris dan
eb51401888-id.xml untuk bahasa Indonesia. File image
untuk button juga perlu ditambahkan yaitu search.gif dan
apply_lt_on.gif.
Hasilnya dapat dilihat di hal. 2.
Untuk implementasi detil aplikasi Dictionary ini, Anda
dapat mendownload source code-nya di:

http://www.ebdesk.com/download/example-codedictionary.

zip
Mudah bukan? Coba dan buktikan sendiri!
Referensi
[eBdesk eXpander SDK] Beginner’s Guide PHP Programmers.pdf

Tulisan “Hello …” di channel
yang telah ditentukan.
– Archive Audit Engine. Melakukan audit trail terhadap
transaksi-transaksi yang pernah dieksekusi oleh Core
Engine serta menampilkan data transaksi yang pernah
di-archive.
eBdesk Calendar Service
Terdiri atas satu service yang menangani pengelolaan
event, termasuk delegasi, sharing, recurrence, serta
undangan rapat.
Merujuk kepada cita-cita yang diinginkan oleh adanya
SOA yaitu terciptanya nilai baru dari penggunaan kembali
servis-servis yang sudah tersedia, muncul pertanyaan:
bisakah servis-servis yang disediakan oleh Produk
eBdeskl dipakai untuk mencapai hal itu? Akankah servisservis
tersebut hanya akan berperan sebagai backengine
dari web client application yang sudah ada
sekarang?
Secara teknik, karena dibangun menggunakan teknologi
SOAP, servis-servis yang sudah ada dapat dipakai
dalam SOA dengan pembenahan terus-menerus. Pembenahan
adalah sesuatu yang wajar dalam SOA karena
sebuah sistem perangkat lunak yang dibangun dengan
SOA dibangun untuk siap diubah, bukan agar tetap
selamanya. Pembangunannya juga cenderung bersifat
incremental.
Akan tetapi, SOA bukan melulu soal teknologi. SOA
semestinya membawa bisnis dan TI untuk dipadukan. Ini
menjadi pekerjaan rumah dari sisi bisnis. Pada penerapan
yang paling sederhana, servis-servis tersebut dapat:
– Reusable untuk membuat client aplications baru yang
berbeda dengan yang ada sekarang, tidak hanya berbentuk
web client, tidak menawarkan end-user feature
yang sama, tidak menggunakan tampilan yang sama
– Reusable untuk membuat solusi-solusi permasalahan
yang muncul
– Combine satu sama lain untuk membentuk servis baru
Apa lagi yang dapat dilakukan dari servis yang
disediakan Produk eBdesk bersama servis disediakan
pihak lain, menjadi sebuah tantangan kreativitas dalam
hal bisnis.
Referensi
[1] What is Service-Oriented Architecture? by Hao He September
30, 2003, http://webservices.xml.com/pub/a/ws/2003/09/30/soa.html
[2] Constructing Software For Service Oriented Architecture, by
Jean-Jacques Dubray, Ph.D. Lecture, 03/26/2004, The Pennsylvania
State University, The Smeal College of Business Administration,

http://www.ebpml.org/csfsoa.ppt

[3] http://looselycoupled.com/glossary/loose%20coupling
[4] http://www.w3.org/TR/soap12-part1/#intro
[5] Insight and outlook, Part 1: Why and when should you choose
SOA? http://www-128.ibm.com/developerworks/library/ar-itio1/
Aplikasi Populer
Firefox
Merupakan web browser yang sedang
“naik daun” dan tampil makin matang serta
bersaing melawan dominasi MSIE.
•Tekan tombol Ctrl+K untuk mengakses
langsung Search Box yang terletak pada
bagian kanan atas.
•Dengan posisi kursor pada Search Box,
anda dapat mengubah Search Engine
yang akan digunakan dengan menekan
Ctrl+Up atau Ctrl+Down.
•Ctrl+Shift+Del untuk menghapus datadata
privat, seperti history, form, password,
cookies, cache.
Exodus
Merupakan salah satu jabber-client (opensource)
yang berjalan di atas sistem
operasi windows dan dibuat menggunakan
Borland Delphi. Aplikasi ini juga merupakan
basis dari eBdesk Messenger.
•Ctrl+E untuk menampilkan emoticon yang
bisa digunakan untuk percakapan.
•Ctr+P untuk mengubah dan menampilkan
Custom Status.
Produk eBdesk
•Calendar. Anda dapat melihat langsung
daily events pada hari tertentu aplikasi
Calendar dengan mengklik tanggal tertentu
pada channel Calendar yang terletak
pada frontpage.
•Mail. Anda dapat mem-filter mail dengan
menggunakan Filtering Rules yang dapat
diakses melalui Mail > Settings > Filters
> Content. Filter dapat dilakukan terhadap
mail yang datang berdasarkan
header From, To/Cc, Subject, dan Body
yang mengandung kata-kata tertentu
untuk ditempatkan pada folder tertentu
sehingga lebih teratur.
•Mail. Jika anda sedang cuti, maka anda
dapat mengaktifkan fungsi Vacation
Response yang akan menjawab setiap
email yang masuk dengan jawaban yang
telah ditentukan sebelumnya, misalnya
dengan memberitahukan bahwa anda
sedang liburan dan akan kembali dalam
beberapa hari lagi. Fungsi ini dapat diakses
melalui menu Mail > Settings >
Vacation Response.
•Polling. Anda dapat mengubah tipe chart
pada polling dengan meng-klik chart pada
channel polling dan pilih salah satu tipe
yang disediakan (3D View, Line/Area/Bar/
Pie).
Rubrik ini khusus untuk membahas permasalahan-
permasalahan seputar deployment Produk-
Produk eBdesk, pemrograman aplikasi untuk
portal eBdesk, dan hal umum serta FAQ
teknologi yang sedang berkembang (technology
trend).
Dua hal yang akan dibahas, yaitu:
•Immune. Merupakan tindakan-tindakan
pencegahan yang seyogyanya dilakukan untuk
meminimasi terjadinya hal-hal yang menyimpang
dari perencanaan awal baik dalam memrogram
atau men-deploy sebuah aplikasi di portal
eBdesk
•Cure. Merupakan tindakan-tindakan
“pengobatan” atau yang lebih dikenal dengan
troubleshooting jika terjadi kesalahan.
Bagi Anda yang memiliki pertanyaan-pertanyaan
atau permasalahan seputar Produk eBdesk, dapat
me n y amp a i k a n n y a v i a e -ma i l k e
e-Net@ebdesk.com yang selanjutnya akan
dimuat dan dibahas di rubrik ini.
TIPS & TRICKS
eBdesk berdiri tahun 1998, awal dari dimulainya bisnis Internet. Bermula dengan pengembangan produk
corporate portal, saat ini eBdesk berkembang menjadi perusahaan business enabler dengan produkproduk,
solusi-solusi dan layanan-layanannya. Merosotnya bisnis global dan jatuhnya bisnis dotcom dalam
tahun pertama berdiri memang merupakan pukulan telak dan sangat berat, tetapi eBdesk tidak hanya
mampu bertahan namun juga makin melejit dari hari ke hari.
Organisasi eBdesk terdiri atas eBdesk Ltd sebagai holding company, terbagi menjadi Product &
Technology, International Operation, and Solutions & Services. Organisasi tersebut mencerminkan visi,
misi, dan strategi kami untuk membangun produk, menyediakan solusi dan layanan untuk pasar
internasional. Mei 2005, jumlah konsumen telah mencapai lebih dari 100 di penjuru dunia, kebanyakan
adalah perusahaan besar dengan lebih dari 10.000 karyawan.
eBdesk bekerja sama dengan mitra dalam bidang marketing, implementasi, pembangunan solusi, sebagai
bagian dari program kemitraan internasional. Hal ini juga mencakup persetujuan distribusi, bundle produk,
pengembangan bersama, atau joint venture untuk membentuk sebuah perusahaan baru.
http://www.ebdesk.com
eBdesk Technology Jl. Raden Patah No. 21 Bandung Indonesia 40132 Tlp. 022-2502423 Fax. 022-2533792
Agus Hilman, Head of Product Support-ET
Ada 4 tipe paket utama produk eBdesk, antara lain:
• eBdesk eXpander Corporate Portal
Paket aplikasi ini terdiri atas dua bagian besar:
– Platform. Basis dasar dari aplikasi-aplikasi add-on yang
berjalan di atasnya.
– Collaboration. Aplikasi-aplikasi add-on untuk kolaborasi
seperti mail, calendar, forum, news, dsb.
• eBdesk eXpedition Workflow
User dapat mendesain, mensimulasikan, menerapkan,
memantau, dan mengelola workflow banyak proses bisnis
berbeda.
• eBdesk eNcyclo Document Management
Mengorganisir semua tipe dokumen, mulai dari pembuatan,
persetujuan, pengarsipan, sampai distribusi.
• eBdesk eXpert Knowledge Management
Memelihara siklus data, informasi, pengetahuan. Memiliki
taksonomi, spider, ahli, dan pembentukan komunitas.
Immune OR Cure?
Slamet Puji Santuso, Product VP-ET
Update Produk eBdesk
eBdesk eXpander Corporate Portal
• News: Paging, Related Articles
• Forum: plain view, grouping category
• Mail: user search, user list paging
• Organization: open/closed mailing-list
eBdesk eXpedition Workflow
• Mass Processing
• Load on Demand
Others
• AutoSubmitter
• Blog
• Bookmark (Frontpage channel)
• Dictionary (dimuat di edisi ini)

pemrograman .net


Common Programming Error 5.5
When using the optional Case Else statement in a Select Case structure, failure to
place the Case Else as the last Case is a syntax error. 5.5
Testing and Debugging Tip 5.3
Provide a Case Else in Select Case structures. Cases not handled in a Select Case
structure are ignored unless a Case Else is provided. The inclusion of a Case Else statement
facilitates the processing of exceptional conditions. In some situations, no Case Else
processing is needed. 5.3
Case statements also can use relational operators to determine whether the controlling
expression satisfies a condition. For example
Case Is < 0
uses keyword Is along with the relational operator, <, to test for values less than 0.
Figure 5.11 flowcharts the Select Case structure.
Fig. 5.11 Select Case multiple-selection structure flowchart.
Case a Case a action(s)
.
.
.
Case b action(s)
Case z
Case Else action(s)
Case b
Case z action(s)
true
true
true
false
false
false
Chapter 5 Control Structures: Part 2 159
Again, note that (besides small circles and flowlines) the flowchart contains only rectangle
and diamond symbols. Imagine, as we did in the previous chapter, that the programmer
has access to a deep bin of empty structures. This time, the bin contains Select
Case structures, and the programmer can stack and nest as many as are necessary with
other control structures to form a structured implementation of an algorithm’s flow of control.
The programmer fills the rectangles and diamonds with actions and decisions appropriate
to the algorithm. Although nested control structures are common, it is rare to find
nested Select Case structures in a program.
In Chapter 10, Object-Oriented Programming: Part 2, we present a more elegant
method of implementing multiple selection logic. We use a technique called polymorphism
to create programs that are often clearer, more manageable, and easier to extend than programs
that use Select Case logic.
5.6 Do/Loop While Repetition Structure
The Do/Loop While repetition structure is similar to the While structure and Do
While/Loop structure. In the While and Do While/Loop structures, the loop-continuation
condition is tested at the beginning of the loop, before the body of the loop is performed.
The Do/Loop While structure tests the loop-continuation condition after the loop
body is performed. Therefore, in a Do/Loop While structure, the loop body is always executed
at least once. When a Do/Loop While structure terminates, execution continues
with the statement after the Loop While clause. The program in Fig. 5.12 uses a Do/Loop
While structure to output the values 1–5.
Testing and Debugging Tip 5.4
Infinite loops occur when the loop-continuation condition in a While, Do While/Loop or
Do/Loop While structure never becomes false. 5.4
1 ' Fig. 5.12: DoWhile.vb
2 ' Demonstrating the Do/Loop While repetition structure.
34
Module modDoWhile
Pemrograman Web/TI/ AK045216/2 sks
Contoh script ASP- 1
•VBScript adalah bahasa scripting standar untuk membuat halaman ASP.
Pada contoh-contoh script berikut digunakan VBScript:
•Contoh 1 :
– Langkah pembuatan :
• Masukkan text ‘Hello World’ pada variabel FirstVar
• Buat tag awal HTML
• Gunakan untuk menampilkan isi variabel FirstVar
• Akhiri tag HTML
– Script lengkap :

• Example 1





56

Sub Main()
7 Dim counter As Integer = 1
89
‘ print values 1 to 5
10 Do
11 Console.Write(counter & ” “)
12 counter += 1
13 Loop While counter 5
14
15 End Sub ‘ Main
16
17 End Module ‘ modLoopUntil
1 2 3 4 5
Fig. 5.14 Do/Loop Until repetition structure (part 2 of 2).
Fig. 5.15 Do/Loop Until repetition structure flowchart.
condition
action(s)
true
false
162 Control Structures: Part 2 Chapter 5
Testing and Debugging Tip 5.6
In a counter-controlled loop, make sure the control variable is incremented (or decremented)
appropriately in the body of the loop. 5.6
Testing and Debugging Tip 5.7
In a sentinel-controlled loop, make sure the sentinel value is eventually input. 5.7
Testing and Debugging Tip 5.8
Including a final value in the condition of a repetition structure (and choosing the appropriate
relational operator) can reduce the risk of off-by-one errors. For example, in a While
loop used to print the values 1–10, the loop-continuation condition should be counter <=
10, rather than counter < 10 (which is an off-by-one error) or counter 10
25
26 ‘ skip remaining code in loop only if counter = 5
27 If counter = 5 Then
28 Exit Do
29 End If
30
31 counter += 1
32 Loop
33
34 output &= “counter = ” & counter & _
35 ” after exiting Do Until/Loop structure” & vbCrLf
36
37 While counter <= 10
38
39 ' skip remaining code in loop only if counter = 7
40 If counter = 7 Then
41 Exit While
42 End If
43
44 counter += 1
45 End While
46
47 output &= "counter = " & counter & _
48 " after exiting While structure"
49
50 MessageBox.Show(output, "Exit Test", _
51 MessageBoxButtons.OK, MessageBoxIcon.Information)
52 End Sub ' Main
53
54 End Module ' modExitTest
Fig. 5.16 Exit keyword in repetition structures (part 2 of 2).
164 Control Structures: Part 2 Chapter 5
body of the If/Then structure (lines 27–29) does not execute, and counter is incremented
(line 31). However, when counter is 5, the Exit Do statement (line 28) executes,
terminating the loop. The assignment statement (lines 34–35) appends the value of
counter to output. Note that the program does not increment counter (line 31) after
the Exit Do statement executes.
The While structure (lines 37–45) behaves similarly to the Do While/Loop. In this
case, the value of counter is 5 when the loop begins executing. When counter is 7,
the Exit While statement (line 41) executes, terminating execution of the While structure.
Lines 47–48 append the final value of counter to String variable output, which
is displayed in a message dialog (lines 50–51).
Software Engineering Observation 5.1
Some programmers feel that Exit Do, Exit While and Exit For violate the principles
of structured programming. The effects of these statements can be achieved by structured
programming techniques that we discuss soon. 5.1
Software Engineering Observation 5.2
Debates abound regarding the relative importance of quality software engineering and program
performance. Often, one of these goals is accomplished at the expense of the other. For
all but the most performance-intensive situations, apply the following guidelines: First, make
your code simple and correct; then make it fast and small, but only if necessary. 5.2
5.9 Logical Operators
So far, we have studied only simple conditions, such as count 1000
and number sentinelValue. Each selection and repetition structure evaluated
only one condition with one of the operators >, =, <=, = and . To make a decision
that relied on the evaluation of multiple conditions, we performed these tests in separate
statements or in nested If/Then or If/Then/Else structures.
To handle multiple conditions more efficiently, Visual Basic provides logical operators
that can be used to form complex conditions by combining simple ones. The logical
operators are AndAlso, And, OrElse, Or, Xor and Not. We consider examples that use
each of these operators.
Suppose we wish to ensure that two conditions are both true in a program before a certain
path of execution is chosen. In such case, we can use the logical AndAlso operator as follows:
If gender = “F” AndAlso age >= 65 Then
seniorFemales += 1
End If
This If/Then statement contains two simple conditions. The condition gender = “F”
determines whether a person is female and the condition age >= 65 determines whether a
person is a senior citizen. The two simple conditions are evaluated first, because the precedences
of = and >= are both higher than the precedence of AndAlso. The If/Then statement
then considers the combined condition
gender = “F” AndAlso age >= 65
Chapter 5 Control Structures: Part 2 165
This condition evaluates to true if and only if both of the simple conditions are true. When this
combined condition is true, the count of seniorFemales is incremented by 1. However,
if either or both of the simple conditions are false, the program skips the increment and proceeds
to the statement following the If/Then structure. The readability of the preceding
combined condition can be improved by adding redundant (i.e., unnecessary) parentheses:
(gender = “F”) AndAlso (age >= 65)
Figure 5.17 illustrates the effect of using the AndAlso operator with two expressions.
The table lists all four possible combinations of true and false values for expression1 and
expression2. Such tables often are called truth tables. Visual Basic evaluates to true or false
expressions that include relational operators, equality operators and logical operators.
Now let us consider the OrElse operator. Suppose we wish to ensure that either or
both of two conditions are true before we choose a certain path of execution. We use the
OrElse operator in the following program segment:
If (semesterAverage >= 90 OrElse finalExam >= 90) Then
Console.WriteLine(“Student grade is A”)
End If
This statement also contains two simple conditions. The condition semesterAverage
>= 90 is evaluated to determine whether the student deserves an “A” in the course because
of an outstanding performance throughout the semester. The condition finalExam >=
90 is evaluated to determine if the student deserves an “A” in the course because of an outstanding
performance on the final exam. The If/Then statement then considers the combined
condition
(semesterAverage >= 90 OrElse finalExam >= 90)
and awards the student an “A” if either or both of the conditions are true. Note that the text
“Student grade is A” is always printed, unless both of the conditions are false.
Figure 5.18 provides a truth table for the OrElse operator.
The AndAlso operator has a higher precedence than the OrElse operator. An
expression containing AndAlso or OrElse operators is evaluated only until truth or falsity
is known. For example, evaluation of the expression
(gender = “F” AndAlso age >= 65)
expression1 expression2 expression1 AndAlso expression2
False False False
False True False
True False False
True True True
Fig. 5.17 Truth table for the AndAlso operator.
166 Control Structures: Part 2 Chapter 5
stops immediately if gender is not equal to “F” (i.e., the entire expression is false); the
evaluation of the second expression is irrelevant because the first condition is false. Evaluation
of the second condition occurs if and only if gender is equal to “F” (i.e., the entire
expression could still be true if the condition age >= 65 is true). This performance feature
for the evaluation of AndAlso and OrElse expressions is called short-circuit evaluation.
Performance Tip 5.2
In expressions using operator AndAlso, if the separate conditions are independent of one
another, place the condition most likely to be false as the leftmost condition. In expressions
using operator OrElse, make the condition most likely to be true the leftmost condition.
Each of these suggestions can reduce a program’s execution time. 5.2
The logical AND operator without short-circuit evaluation (And) and the logical
inclusive OR operator without short-circuit evaluation (Or) are similar to the AndAlso
and OrElse operators, with one exception—the And and Or logical operators always
evaluate both of their operands. No short-circuit evaluation occurs when And and Or are
employed. For example, the expression
(gender = “F” And age >= 65)
evaluates age >= 65, even if gender is not equal to “F”.
Normally, there is no compelling reason to use the And and Or operators instead of
AndAlso and OrElse. However, some programmers make use of them when the right
operand of a condition produces a side effect (such as a modification of a variable’s value) or
if the right operand includes a required method call, as in the following program segment:
Console.WriteLine(“How old are you?”)
If (gender = “F” And Console.ReadLine() >= 65) Then
Console.WriteLine(“You are a female senior citizen.”)
End If
Here, the And operator guarantees that the condition Console.ReadLine() >= 65 is
evaluated, so ReadLine is called regardless of whether the overall expression is true or
false. It would be better to write this code as two separate statements—the first would store
the result of Console.ReadLine() in a variable, then the second would use that variable
with the AndAlso operator in the condition.
Testing and Debugging Tip 5.9
Avoid expressions with side effects in conditions; these side effects often cause subtle errors.5.9
expression1 expression2 expression1 OrElse expression2
False False False
False True True
True False True
True True True
Fig. 5.18 Truth table for the OrElse operator.
Chapter 5 Control Structures: Part 2 167
A condition containing the logical exclusive OR (Xor) operator is true if and only if
one of its operands results in a true value and the other results in a false value. If both operands
are true or both are false, the entire condition is false. Figure 5.19 presents a truth table
for the logical exclusive OR operator (Xor). This operator always evaluates both of its
operands (i.e., there is no short-circuit evaluation).
Visual Basic’s Not (logical negation) operator enables a programmer to “reverse” the
meaning of a condition. Unlike the logical operators AndAlso, And, OrElse, Or and
Xor, that each combine two conditions (i.e., these are all binary operators), the logical
negation operator is a unary operator, requiring only one operand. The logical negation
operator is placed before a condition to choose a path of execution if the original condition
(without the logical negation operator) is false. The logical negation operator is demonstrated
by the following program segment:
If Not (grade = sentinelValue) Then
Console.WriteLine(“The next grade is ” & grade)
End If
The parentheses around the condition grade = sentinelValue are necessary,
because the logical negation operator (Not) has a higher precedence than the equality operator.
Figure 5.20 provides a truth table for the logical negation operator.
In most cases, the programmer can avoid using logical negation by expressing the condition
differently with relational or equality operators. For example, the preceding statement
can be written as follows:
If grade sentinelValue Then
Console.WriteLine(“The next grade is ” & grade)
End If
This flexibility aids programmers in expressing conditions more naturally.
expression1 expression2 expression1 Xor expression2
False False False
False True True
True False True
True True False
Fig. 5.19 Truth table for the logical exclusive OR (Xor) operator.
expression Not expression
False True
True False
Fig. 5.20 Truth table for operator Not (logical NOT).
168 Control Structures: Part 2 Chapter 5
The Windows application in Fig. 5.21 demonstrates the use of the logical operators by
displaying their truth tables in six labels.
1 ‘ Fig. 5.21: LogicalOperator.vb
2 ‘ Using logical operators.
34
Public Class FrmLogicalOperator
5 Inherits System.Windows.Forms.Form
67
‘ Visual Studio .NET generated code
89
Private Sub FrmLogicalOperator_Load( _
10 ByVal sender As System.Object, _
11 ByVal e As System.EventArgs) Handles MyBase.Load
12
13 lblAndAlso.Text = “AndAlso” & vbCrLf & vbCrLf & _
14 “False AndAlso False: ” & (False AndAlso False) & _
15 vbCrLf & “False AndAlso True: ” & _
16 (False AndAlso True) & vbCrLf & _
17 “True AndAlso False: ” & (True AndAlso False) & _
18 vbCrLf & “True AndAlso True: ” & (True AndAlso True)
19
20 lblOrElse.Text = “OrElse” & vbCrLf & vbCrLf & _
21 “False OrElse False: ” & (False OrElse False) & _
22 vbCrLf & “False OrElse True: ” & (False OrElse True) & _
23 vbCrLf & “True OrElse False: ” & (True OrElse False) & _
24 vbCrLf & “True OrElse True: ” & (True OrElse True)
25
26 lblAnd.Text = “And” & vbCrLf & vbCrLf & _
27 “False And False: ” & (False And False) & vbCrLf & _
28 “False And True: ” & (False And True) & vbCrLf & _
29 “True And False: ” & (True And False) & vbCrLf & _
30 “True And True: ” & (True And True)
31
32 lblOr.Text = “Or” & vbCrLf & _
33 vbCrLf & “False Or False: ” & (False Or False) & _
34 vbCrLf & “False Or True: ” & (False Or True) & _
35 vbCrLf & “True Or False: ” & (True Or False) & _
36 vbCrLf & “True Or True: ” & (True Or True)
37
38 lblXor.Text = “Xor” & vbCrLf & _
39 vbCrLf & “False Xor False: ” & (False Xor False) & _
40 vbCrLf & “False Xor True: ” & (False Xor True) & _
41 vbCrLf & “True Xor False: ” & (True Xor False) & _
42 vbCrLf & “True Xor True: ” & (True Xor True)
43
44 lblNot.Text = “Not” & vbCrLf & vbCrLf & _
45 “Not False: ” & (Not False) & vbCrLf & “Not True: ” & _
46 (Not True)
47
48 End Sub ‘ FrmLogicalOperator_Load
49
50 End Class ‘ FrmLogicalOperator
Fig. 5.21 Logical operator truth tables (part 1 of 2).
Chapter 5 Control Structures: Part 2 169
Line 4 begins class FrmLogicalOperator. Recall from our discussion in Chapter
4 that Visual Studio creates the initial code for a Windows application. Programmers then
enhance this code to create their own applications. Because the code created by Visual
Studio uses many concepts that have not been presented yet, we replace the Visual Studio
generated code with the comment in line 7. In Chapter 12, we carefully explain the Visual
Studio generated code line-by-line. Line 9 begins the definition of procedure
FrmLogicalOperator_Load. An empty procedure definition for a Windows application
can be obtained by double-clicking the form in the Design view. Procedures created
this way are executed when the program loads. In this case, the procedure creates Strings
representing the truth tables of the logical operators and displays them on six labels using
the Text property. Lines 13–18 demonstrate operator AndAlso; lines 20–24 demonstrate
operator OrElse. The remainder of procedure FrmLogicalOperator_Load demonstrates
the And, Or, Xor and Not operators. We use keywords True and False in the
program to specify values of the Boolean data type. Notice that when a Boolean value
is concatenated to a String, Visual Basic concatenates the string “False” or “True”
on the basis of the Boolean’s value.
The chart in Fig. 5.22 displays the precedence of the Visual Basic operators introduced
so far. The operators are shown from top to bottom in decreasing order of precedence.
Operators Type
() parentheses
^ exponentiation
+ – unary plus and minus
* / multiplicative
\ integer division
Mod modulus
Fig. 5.22 Precedence and associativity of the operators discussed so far
(part 1 of 2).
Fig. 5.21 Logical operator truth tables (part 2 of 2).
170 Control Structures: Part 2 Chapter 5
5.10 Structured Programming Summary
Just as architects design buildings by employing the collective wisdom of their profession,
so should programmers design programs. Our field is younger than architecture is, and our
collective wisdom is considerably sparser. We have learned that structured programming
produces programs that are easier to understand, test, debug, modify and prove correct in a
mathematical sense than unstructured programs. Visual Basic’s control structures are summarized
in Fig. 5.23 and Fig. 5.24.
+ – additive
& concatenation
< >= = relational and equality
Not logical NOT
And AndAlso logical AND
Or OrElse logical inclusive OR
Xor logical exclusive OR
Fig. 5.23 Visual Basic’s single-entry/single-exit sequence and selection structures.
Operators Type
Fig. 5.22 Precedence and associativity of the operators discussed so far
(part 2 of 2).
Sequence
If/Then structure
(single selection)
If/Then/Else structure
(double selection)
Select Case structure
(multiple selection)

Selection

F T
F
T
F
T
F
T
F
T
Chapter 5 Control Structures: Part 2 171
Small circles in the figures indicate the single entry point and the single exit point of
each structure. Connecting individual flowchart symbols arbitrarily can lead to unstructured
programs. Therefore, the programming profession has chosen to employ only a limited
set of control structures and to build structured programs by combining control
structures in only two simple ways.
Fig. 5.24 Visual Basic’s single-entry/single-exit repetition structures.
Do/Loop Until structure
While structure For/Next structure
Do/Loop While structure
Repetition
Do While/Loop structure Do Until/Loop structure
For Each/Next structure (introduced in Chapter 7)
F
T
F
T
F
F T
T
F
T F
T
F
T
172 Control Structures: Part 2 Chapter 5
For the sake of simplicity, only single-entry/single-exit control structures are used—
there is only one way to enter and only one way to exit each control structure. To connect
control structures in sequence to form structured programs, the exit point of one control
structure is connected to the entry point of the next control structure (i.e., the control structures
simply are placed one after another in a program). We call this process control structure
stacking. The rules for the formation of structured programs also allow control
structures to be nested, i.e., placed one inside the other. Figure 5.25 contains the rules for
the formation of properly structured programs. The rules assume that the rectangle flowchart
symbol can indicate any action, including input/output.
Applying the rules of Fig. 5.25 always results in a structured flowchart with a neat,
building-block appearance. For example, repeatedly applying rule 2 to the simplest flowchart
(Fig. 5.26) results in a structured flowchart that contains many rectangles in sequence
(Fig. 5.27). Notice that rule 2 generates a stack of control structures; therefore, we call rule
2 the stacking rule.
Rule 3 is the nesting rule. Repeatedly applying rule 3 to the simplest flowchart results
in a flowchart with neatly nested control structures. For example, in Fig. 5.28, the rectangle
in the simplest flowchart (in the top-left portion of the figure) is first replaced with a
double-selection (If/Then/Else) structure. Then, rule 3 is applied again to both rectangles
in the double-selection structure, replacing each of these rectangles with a doubleselection
structure. The dashed boxes around each of the double-selection structures represent
the rectangles that were replaced with these structures.
Good Programming Practice 5.4
Excessive levels of nesting can make a program difficult to understand. As a general rule, try
to avoid using more than three levels of nesting. 5.4
Rule 4 generates larger, more involved and deeply-nested structures. The flowcharts
that emerge from applying the rules in Fig. 5.25 constitute the set of all possible structured
flowcharts and the set of all possible structured programs.The structured approach has the
advantage of using only eleven simple single-entry/single-exit pieces and allowing us to
combine them in only two simple ways. Figure 5.29 depicts the kinds of correctly stacked
building blocks that emerge from applying rule 2 and the kinds of correctly nested building
blocks that emerge from applying rule 3. The figure also shows the kind of overlapped
building blocks that cannot appear in structured flowcharts.
Rules for Forming Structured Programs
1) Begin with the “simplest flowchart” (Fig. 5.26).
2) Any rectangle (action) can be replaced by two rectangles (actions) in sequence.
3) Any rectangle (action) can be replaced by any control structure (sequence, If/Then, If/
Then/Else, Select Case, While, Do/Loop While, Do While/Loop, Do Until/
Loop, Do/Loop Until, For/Next or the For Each/Next structure introduced in
Chapter 7, Arrays).
4) Rules 2 and 3 may be applied as often as you like and in any order.
Fig. 5.25 Structured programming rules.
Chapter 5 Control Structures: Part 2 173
If the rules in Fig. 5.25 are followed, an unstructured flowchart (such as that in
Fig. 5.30) cannot be created. If you are uncertain about whether a particular flowchart is
structured, apply the rules in Fig. 5.25 in reverse to try to reduce the flowchart to the simplest
flowchart. If the flowchart can be reduced to the simplest flowchart, the original flowchart
is structured; otherwise, it is not.
Structured programming promotes simplicity. Bohm and Jacopini have demonstrated
that only three forms of control are necessary:
• sequence
• selection
• repetition
Sequence is trivial. Selection is implemented in one of three ways:
• If/Then structure (single selection)
• If/Then/Else structure (double selection)
• Select Case structure (multiple selection)
It can be proven straightforwardly that the If/Then structure is sufficient to provide any
form of selection. Everything done with the If/Then/Else structure and the Select
Case structure can be implemented by combining multiple If/Then structures (although
perhaps not as elegantly).
Fig. 5.26 Simplest flowchart.
Fig. 5.27 Repeatedly applying rule 2 of Fig. 5.25 to the simplest flowchart.

Rule 2 Rule 2 Rule 2
174 Control Structures: Part 2 Chapter 5
Repetition is implemented in one of seven ways:
• While structure
• Do While/Loop structure
• Do/Loop While structure
• Do Until/Loop structure
• Do/Loop Until structure
• For/Next structure
• For Each/Next structure (introduced in Chapter 7)
It can be proven straightforwardly that the While structure is sufficient to provide any
form of repetition. Everything that can be done with the Do While/Loop, Do/Loop
While, Do Until/Loop, Do/Loop Until, For/Next and For Each/Next structures
can be done with the While structure (although perhaps not as elegantly).
Fig. 5.28 Applying rule 3 of Fig. 5.25 to the simplest flowchart.
Rule 3
Rule 3 Rule 3
Chapter 5 Control Structures: Part 2 175
The combination of these results illustrates that any form of control ever needed in a
Visual Basic program can be expressed in terms of:
• sequence
• If/Then structure (selection)
• While structure (repetition)
These control structures can be combined in only two ways—stacking and nesting. Indeed,
structured programming promotes simplicity.
In this chapter, we discussed the composition of programs from control structures that
contain actions and decisions. In Chapter 6, Procedures, we introduce another program
structuring unit called the procedure. We show how to construct large programs by combining
procedures that are composed of control structures. We also discuss the ways in
which procedures promote software reusability. In Chapter 8, Object-Based Programming,
we offer a detailed introduction to another Visual Basic program structuring unit, called the
class. We then create objects from classes (that are composed of procedures) and proceed
with our treatment of object-oriented programming—the key focus of this book.
Fig. 5.29 Stacked, nested and overlapped building blocks.
Fig. 5.30 Unstructured flowchart.
Overlapping building blocks
(Illegal in structured programs)
Stacked building blocks Nested building blocks
176 Control Structures: Part 2 Chapter 5
SUMMARY
• Counter-controlled repetition requires the name of a control variable (or loop counter), the initial
value of the control variable, the increment (or decrement) by which the control variable is modified
during each iteration of the loop and the condition that tests for the final value of the control
variable (i.e., whether looping should continue).
• Declarations that include initialization are executable statements.
• The For/Next repetition structure handles the details of counter-controlled repetition. The required
To keyword specifies the initial value and the final value of the control variable. The optional
Step keyword specifies the increment.
• Counting loops should not be controlled with floating-point variables. Floating-point values are
represented only approximately in the computer’s memory, often resulting in imprecise counter
values and inaccurate tests for termination.
• When supplying four arguments to method MessageBox.Show, the first two arguments are
strings displayed in the dialog and the dialog’s title bar. The third and fourth arguments are constants
representing buttons and icons, respectively.
• Method String.Format inserts values into a String using Visual Basic’s format codes.
• Visual Basic provides the Decimal data type, which is designed specifically for monetary calculations.
It is inappropriate to use Single or Double for dollar amounts.
• Visual Basic provides the Select Case multiple-selection structure to test a variable or expression
separately for each value that the variable or expression might assume. The Select Case
structure consists of a series of Case labels and an optional Case Else. Each Case contains
statements to be executed if that Case is selected.
• Each Case in a Select Case structure can test for a specific value, a range of values (using
keyword To) or a condition (using keyword Is and a relational operator). The comma can be used
to specify a list of values, ranges and conditions that satisfy a Case statement.
• The Do/Loop While and Do/Loop Until structures test the loop-continuation condition after
the loop body is performed; therefore, the loop body is always executed at least once.
• The Exit Do, Exit While and Exit For statements alter the flow of control by causing immediate
exit from a repetition structure.
• The logical operators are AndAlso (logical AND with short-circuit evaluation), And (logical
AND without short-circuit evaluation), OrElse (logical inclusive OR with short-circuit evaluation),
Or (logical inclusive OR without short-circuit evaluation), Xor (logical exclusive OR) and
Not (logical NOT, also called logical negation).
• The AndAlso operator can be used to ensure that two conditions are both true.
• The OrElse operator can be used to ensure that at least one of two conditions is true.
• The And and Or operators are similar to the AndAlso and OrElse operators, except that they
always evaluate both of their operands.
• A condition containing the logical exclusive OR (Xor) operator is true if and only if exactly one
of its operands is true.
• A condition that begins with the logical NOT (Not) operator is true if and only if the condition to
the right of the logical NOT operator is false.
• In flowcharts, small circles indicate the single entry point and exit point of each structure.
• Connecting individual flowchart symbols arbitrarily can lead to unstructured programs. Therefore,
the programming profession has chosen to employ only a limited set of control structures and to
build structured programs by combining control structures in only two simple ways.
Chapter 5 Control Structures: Part 2 177
• To connect control structures in sequence to form structured programs, the exit point of one control
structure is connected to the entry point of the next control structure (i.e., the control structures simply
are placed one after another in a program). We call this process “control structure stacking.”
• The rules for forming structured programs also allow control structures to be nested.
• Structured programming promotes simplicity.
• Bohm and Jacopini have demonstrated that only three forms of control are necessary—sequence,
selection and repetition.
• Selection is implemented with one of three structures—If/Then, If/Then/Else and
Select Case.
• Repetition is implemented with one of seven structures—While, Do While/Loop, Do/Loop
While, Do Until/Loop, Do/Loop Until, For/Next, and For Each/Next (introduced in
Chapter 7, Arrays).
• The If/Then structure is sufficient to provide any form of selection.
• The While structure is sufficient to provide any form of repetition.
• Control structures can be combined in only two ways—stacking and nesting.
TERMINOLOGY
AbortRetryIgnore constant iteration of a loop
body of a loop levels of nesting
Boolean values logical AND with short-circuit
buttons for a message dialog evaluation (AndAlso)
Case keyword logical AND without short-circuit
Case Else statement valuation (And)
control structure logical exclusive OR (Xor)
control-structure nesting logical inclusive OR with short-circuit
control-structure stacking evaluation (OrElse)
controlling expression logical inclusive OR without short-circuit
counter-controlled repetition evaluation (Or)
Decimal data type logical NOT (Not)
decrement of loop logical operator
diamond symbol loop body
Do/Loop Until structure loop counter
Do/Loop While structure loop-continuation condition
double-selection structure message dialog button
End Select statement message dialog icon
entry point of a control structure MessageBoxButtons.
Exit Do statement AbortRetryIgnore constant
Exit For statement MessageBoxButtons.OK constant
Exit While statement MessageBoxButtons.OKCancel constant
For Each/Next structure MessageBoxButtons.RetryCancel
For/Next structure constant
For/Next header MessageBoxButtons.YesNo constant
hexadecimal (base16) number system MessageBoxButtons.YesNoCancel
icon for a message dialog constant
If/Then structure MessageBoxButtons class
If/Then/Else structure MessageBoxIcon class
increment of control variable MessageBoxIcon.Error constant
Is keyword MessageBoxIcon.Exclamation constant
178 Control Structures: Part 2 Chapter 5
SELF-REVIEW EXERCISES
5.1 State whether each of the following is true or false. If false, explain why.
a) The Case Else is required in the Select Case selection structure.
b) The expression x > y AndAlso a y is true or a < b is true.
c) An expression containing the OrElse operator is true if either or both of its operands is
true.
d) The expression x 4 is true if x is less than or equal to y and y is greater
than 4.
e) Logical operator Or performs short-circuit evaluation.
f) A While structure with the header
While (x > 10 AndAlso x < 100)
iterates while 10 < x operator
with the keyword.
d) In a For/Next structure, incrementing occurs the body of the structure is
performed.
e) Placing expressions whose values do not change inside structures can lead
to poor performance.
f) The four types of MessageBox icons are exclamation, information, error and
.
g) The expression following the keywords Select Case is called the .
5.3 Write a Visual Basic statement or a set of Visual Basic statements to accomplish each of the
following:
MessageBoxIcon.Information constant sequence
MessageBoxIcon.Question constant short-circuit evaluation
multiple-selection structure Show method of class MessageBox
nested building block simplest flowchart
nested control structure single selection
nesting single-entry/single-exit sequence, selection and
nesting rule repetition structures
Next keyword stacking rule
overlapped building block Step keyword in a For/Next structure
program construction principle String formatting code
rectangle symbol structured programming
repetition To keyword in a For/Next structure
Select Case structure unary operator
selection unstructured flowchart
Chapter 5 Control Structures: Part 2 179
a) Sum the odd integers between 1 and 99 using a For/Next structure. Assume that the
integer variables sum and count have been declared.
b) Write a statement that exits a While loop.
c) Print the integers from 1 to 20, using a Do/Loop While loop and the counter variable x.
Assume that the variable x has been declared, but not initialized. Print only five integers
per line. [Hint: Use the calculation x Mod 5. When the value of this is 0, print a newline
character; otherwise, print a tab character. Call Console.WriteLine to output the
newline character and call Console.Write(vbTab) to output the tab character.]
d) Repeat part c, using a For/Next structure.
ANSWERS TO SELF-REVIEW EXERCISES
5.1 a) False. The Case Else is optional. b) False. Both of the relational expressions must be
true for the entire expression to be true. c) True. d) True. 4. e) False. Logical operator Or always evaluates
both of its operands. f) True. g) True. h) False. There is often a trade-off between good software
engineering and high performance. i) False. The AndAlso operator has higher precedence than the
OrElse operator.
5.2 a) Step. b) Decimal. c) Is. d) after. e) repetition. f) question mark. g) controlling expression.
5.3 a) sum = 0
For count = 1 To 99 Step 2
sum += count
Next
b) Exit While
c) x = 1
Do
Console.Write(x)
If x Mod 5 = 0 Then
Console.WriteLine()
Else
Console.Write(vbTab)
End If
x += 1
Loop While x <= 20
or
x = 1
Do
If x Mod 5 = 0 Then
Console.WriteLine(x)
Else
Console.Write(x & vbTab)
End If
180 Control Structures: Part 2 Chapter 5
x += 1
Loop While x <= 20
d) For x = 1 To 20
Console.Write(x)
If x Mod 5 = 0 Then
Console.WriteLine()
Else
Console.Write(vbTab)
End If
Next
or
For x = 1 To 20
If x Mod 5 = 0 Then
Console.WriteLine(x)
Else
Console.Write(x & vbTab)
End If
Next
EXERCISES
5.4 The factorial method is used frequently in probability problems. The factorial of a positive
integer n (written n! and pronounced “n factorial”) is equal to the product of the positive integers from
1 to n. Even for relatively small values of n, the factorial method yields extremely large numbers. For
instance, when n is 13, n! is 6227020800—a number too large to be represented with data type Integer
(a 32-bit integer value). To calculate the factorials of large values of n, data type Long (a 64-
bit integer value) must be used. Write a program that evaluates the factorials of the integers from 1 to
20 using data type Long. Display the results in a two column output table. [Hint: create a Windows
application, use Labels as the columns and the vbCrLf constant to line up the rows.] The first column
should display the n values (1–20). The second column should display n!.
5.5 Write two programs that each print a table of the binary, octal, and hexadecimal equivalents
of the decimal numbers in the range 1–256. If you are not familiar with these number systems, read
Appendix B, Number Systems, first.
a) For the first program, print the results to the console without using any String formats.
b) For the second program, print the results to the console using both the decimal and hexadecimal
String formats (there are no formats for binary and octal in Visual Basic).
5.6 (Pythagorean Triples) Some right triangles have sides that are all integers. A set of three integer
values for the sides of a right triangle is called a Pythagorean triple. These three sides must satisfy
the relationship that the sum of the squares of the two sides is equal to the square of the
hypotenuse. Write a program to find all Pythagorean triples for side1, side2 and hypotenuse,
none larger than 30. Use a triple-nested For/Next loop that tries all possibilities. This is an example
of “brute force” computing. You will learn in more advanced computer science courses that there are
some problems for which there is no known algorithmic approach other than using sheer brute force.
Chapter 5 Control Structures: Part 2 181
5.7 Write a program that displays the following patterns separately, one below the other. Use
For/Next loops to generate the patterns. All asterisks (*) should be printed by a single statement of
the form Console.Write("*") (this causes the asterisks to print side by side). A statement of
the form Console.WriteLine() can be used to position to the next line and a statement of the
form Console.WriteLine(" ") can be used to display spaces for the last two patterns. There
should be no other output statements in the program. [Hint: The last two patterns require that each
line begin with an appropriate number of blanks.] Maximize your use of repetition (with nested For/
Next structures) and minimize the number of output statements.
5.8 Modify Exercise 5.7 to combine your code from the four separate triangles of asterisks into
a single program that prints all four patterns side by side, making clever use of nested For/Next
loops.
5.9 Write a program that prints the following diamond shape. You may use output statements that
print a single asterisk (*), a single space or a single newline character. Maximize your use of repetition
(with nested For/Next structures) and minimize the number of output statements.
5.10 Modify the program you wrote in Exercise 5.9 to read an odd number in the range from 1 to
19 to specify the number of rows in the diamond. Your program should then display a diamond of the
appropriate size. Use a Do/Loop Until to validate user input.
(A) (B) (C) (D)
* ********** ********** *
** ********* ********* **
*** ******** ******** ***
**** ******* ******* ****
***** ****** ****** *****
****** ***** ***** ******
******* **** **** *******
******** *** *** ********
********* ** ** *********
********** * * **********
*
***
*****
*******
*********
*******
*****
***
*
6
Procedures
Objectives
• To construct programs modularly from pieces called
procedures.
• To introduce the common Math methods available in
the Framework Class Library.
• To create new procedures.
• To understand the mechanisms used to pass
information between procedures.
• To introduce simulation techniques that employ
random-number generation.
• To understand how the visibility of identifiers is
limited to specific regions of programs.
• To understand how to write and use recursive
procedures (procedures that call themselves).
Form ever follows function.
Louis Henri Sullivan
E pluribus unum.
(One composed of many.)
Virgil
O! call back yesterday, bid time return.
William Shakespeare, Richard II
Call me Ishmael.
Herman Melville, Moby Dick
When you call me that, smile.
Owen Wister
Chapter 6 Procedures 183
6.1 Introduction
Most computer programs that solve real-world problems are much larger than the programs
presented in the first few chapters of this text. Experience has shown that the best way to
develop and maintain a large program is to construct it from small, manageable pieces. This
technique is known as divide and conquer. In this chapter, we describe many key features
of the Visual Basic language that facilitate the design, implementation, operation and maintenance
of large programs.
6.2 Modules, Classes and Procedures
Visual Basic programs consist of many pieces, including modules and classes. The programmer
combines new modules and classes with “prepackaged” classes available in the .NET
Framework Class Library (FCL). These modules and classes are composed of smaller pieces
called procedures. When procedures are contained in a class, we refer to them as methods.
The FCL provides a rich collection of classes and methods for performing common
mathematical calculations, string manipulations, character manipulations, input/output
Outline
6.1 Introduction
6.2 Modules, Classes and Procedures
6.3 Sub Procedures
6.4 Function Procedures
6.5 Methods
6.6 Argument Promotion
6.7 Option Strict and Data-Type Conversions
6.8 Value Types and Reference Types
6.9 Passing Arguments: Pass-by-Value vs. Pass-by-Reference
6.10 Duration of Identifiers
6.11 Scope Rules
6.12 Random-Number Generation
6.13 Example: Game of Chance
6.14 Recursion
6.15 Example Using Recursion: Fibonacci Series
6.16 Recursion vs. Iteration
6.17 Procedure Overloading and Optional Arguments
6.17.1 Procedure Overloading
6.17.2 Optional Arguments
6.18 Modules

Pemrograman Web/TI/ AK045216/2 sks
Contoh script ASP- 1
•VBScript adalah bahasa scripting standar untuk membuat halaman ASP.
Pada contoh-contoh script berikut digunakan VBScript:
•Contoh 1 :
– Langkah pembuatan :
• Masukkan text ‘Hello World’ pada variabel FirstVar
• Buat tag awal HTML
• Gunakan untuk menampilkan isi variabel FirstVar
• Akhiri tag HTML
– Script lengkap :

• Example 1





Summary • Terminology • Self-Review Exercises • Answers to Self-Review Exercises • Exercises
184 Procedures Chapter 6
operations, error checking and many other useful operations. This framework makes the
programmer’s job easier, because the methods provide many of the capabilities programmers
need. In earlier chapters, we introduced some FCL classes, such as Console, which
provides methods for inputting and outputting data.
Software Engineering Observation 6.1
Familiarize yourself with the rich collection of classes and methods in the Framework Class
Library. 6.1
Software Engineering Observation 6.2
When possible, use .NET Framework classes and methods instead of writing new classes and
methods. This reduces program development time and avoids introducing new errors. 6.2
Performance Tip 6.1
.NET Framework Class Library methods are written to perform efficiently. 6.1
Although the FCL provides methods that perform many common tasks, it cannot provide
every conceivable feature that a programmer could want, so Visual Basic allows programmers
to create their own programmer-defined procedures to meet the unique
requirements of a particular problem. Three types of procedures exist: Sub procedures,
Function procedures and event procedures. Throughout this chapter, the term “procedure”
refers to both Sub procedures and Function procedures unless otherwise noted.
Programmers write procedures to define specific tasks that a program may use many
times during its execution. Although the same programmer-defined procedure can be executed
at multiple points in a program, the actual statements that define the procedure are
written only once.
A procedure is invoked (i.e., made to perform its designated task) by a procedure call.
The procedure call specifies the procedure name and provides information (as arguments)
that the callee (i.e, the procedure being called) requires to do its job. When the procedure
completes its task, it returns control to the caller (i.e., the calling procedure). In some cases,
the procedure also returns a result to the caller. A common analogy for this is the hierarchical
form of management. A boss (the caller) asks a worker (the callee) to perform a task
and return (i.e., report on) the results when the task is done. The boss does not need to know
how the worker performs the designated task. For example, the worker might call other
workers—the boss would be unaware of this. Soon, we show how this hiding of implementation
details promotes good software engineering. Figure 6.1 depicts a Boss procedure
communicating with worker procedures Worker1, Worker2 and Worker3 in a hierarchical
manner. Note that Worker1 acts as a “boss” procedure to Worker4 and Worker5
in this particular example.
There are several motivations for the division of code into procedures. First, the divideand-
conquer approach makes program development more manageable. Another motivation
is software reusability—the ability to use existing procedures as building blocks for new
programs. When proper naming and definition conventions are applied, programs can be
created from standardized pieces that accomplish specific tasks, to minimize the need for
customized code. A third motivation involves avoiding the repetition of code in a program.
When code is packaged as a procedure, the code can be executed from several locations in
a program simply by calling, or invoking, the procedure.
Chapter 6 Procedures 185
Good Programming Practice 6.1
Use modularity to increase the clarity and organization of a program. This not only helps others
understand the program, but also aids in program development, testing and debugging. 6.1
Software Engineering Observation 6.3
To promote reusability, the capabilities of each procedure should be limited to the performance
of a single, well-defined task, and the name of the procedure should express that task
effectively. 6.3
Software Engineering Observation 6.4
If you cannot choose a concise name that expresses the task performed by a procedure, the
procedure could be attempting to perform too many diverse tasks. It is usually best to divide
such a procedure into several smaller procedures. 6.4
6.3 Sub Procedures
The programs presented earlier in the book each contained at least one procedure definition
(e.g., Main) that called FCL methods (such as Console.WriteLine) to accomplish
the program’s tasks. We now consider how to write customized procedures.
Consider the console application in Fig. 6.2, which uses a Sub procedure (invoked
from the application’s Main procedure) to print a worker’s payment information.
Fig. 6.1 Hierarchical boss-procedure/worker-procedure relationship.
Boss
Worker1 Worker2 Worker3
Worker4 Worker5
1 ‘ Fig. 6.2: Payment.vb
2 ‘ Sub procedure that prints payment information.
34
Module modPayment
56
Sub Main()
78
‘ call Sub procedure PrintPay 4 times
9 PrintPay(40, 10.5)
10 PrintPay(38, 21.75)
Fig. 6.2 Sub procedure for printing payment information (part 1 of 2).
186 Procedures Chapter 6
The program contains two procedure definitions. Lines 6–14 define Sub procedure
Main, which executes when the console application is loaded. Lines 17–21 define Sub
procedure PrintPay, which executes when it is invoked, or called, from another procedure,
in this case Main.
Main makes four calls (lines 9–12) to Sub procedure PrintPay, causing
PrintPay to execute four times. Although the procedure arguments in this example are
constants, arguments can also be variables or expressions. For example, the statement
PrintPay(employeeOneExtraHours, employeeOneWage * 1.5)
could be used to display payment information for an employee who is being paid time-anda-
half for working overtime.
When Main calls PrintPay, the program makes a copy of the value of each argument
(e.g., 40 and 10.5 on line 9), and program control transfers to the first line of procedure
PrintPay. Procedure PrintPay receives the copied values and stores them in
the parameter variables hours and wage. Then, PrintPay calculates hours * wage
and displays the result, using the currency format (line 20). When the End Sub statement
on line 21 is encountered, control is returned to the calling procedure, Main.
The first line of procedure PrintPay (line 17) shows (inside the parentheses) that
PrintPay declares a Double variable hours and a Decimal variable wage. These
parameters hold the values passed to PrintPay within the definition of this procedure.
Notice that the entire procedure definition of PrintPay appears within the body of
module modPayment. All procedures must be defined inside a module or a class.
The format of a procedure definition is
Sub procedure-name(parameter-list)
declarations and statements
End Sub
11 PrintPay(20, 13)
12 PrintPay(50, 14)
13
14 End Sub ‘ Main
15
16 ‘ print dollar amount earned in command window
17 Sub PrintPay(ByVal hours As Double, ByVal wage As Decimal)
18
19 ‘ pay = hours * wage
20 Console.WriteLine(“The payment is {0:C}”, hours * wage)
21 End Sub ‘ PrintPay
22
23 End Module ‘ modPayment
The payment is $420.00
The payment is $826.50
The payment is $260.00
The payment is $700.00
Fig. 6.2 Sub procedure for printing payment information (part 2 of 2).
Chapter 6 Procedures 187
Good Programming Practice 6.2
Place a blank line between procedure definitions to separate the procedures and enhance
program readability. 6.2
Common Programming Error 6.1
Defining a procedure outside of a class or module definition is a syntax error. 6.1
The first line is sometimes known as the procedure header. The procedure-name, which
directly follows the Sub keyword in the procedure header, can be any valid identifier and
is used to call this Sub procedure within the program.
The parameter-list is a comma-separated list in which the Sub procedure declares
each parameter variable’s type and name. There must be one argument in the procedure call
for each parameter in the procedure header (we will see an exception to this rule in
Section 6.17). The arguments also must be compatible with the parameter’s type (i.e.,
Visual Basic must be able to assign the value of the argument to the parameter). For
example, a parameter of type Double could receive the value of 7.35, 22 or –.03546, but
not “hello”, because a Double value cannot contain a String. In Section 6.6 we discuss
this issue in detail. If a procedure does not receive any values, the parameter list is
empty (i.e., the procedure name is followed by an empty set of parentheses).
Notice that the parameter declarations in the procedure header for PrintPay (line
17) look similar to variable declarations, but use keyword ByVal instead of Dim. ByVal
specifies that the calling program should pass a copy of the value of the argument in the
procedure call to the parameter, which can be used in the Sub procedure body. Section 6.9
discusses argument passing in detail.
Common Programming Error 6.2
Declaring a variable in the procedure’s body with the same name as a parameter variable
in the procedure header is a syntax error. 6.2
Testing and Debugging Tip 6.1
Although it is allowable, an argument passed to a procedure should not have the same name
as the corresponding parameter in the procedure definition. This distinction prevents ambiguity
that could lead to logic errors. 6.1
The declarations and statements in the procedure definition form the procedure body.
The procedure body contains Visual Basic code that performs actions, generally by manipulating
or interacting with the parameters. The procedure body must be terminated with
keywords End Sub, which define the end of the procedure. The procedure body is also
referred to as a block. A block is a sequence of statements and declarations grouped
together as the body of some structure and terminated with an End, Next, Else or Loop
statement, depending on the type of structure. Variables can be declared in any block, and
blocks can be nested.
Common Programming Error 6.3
Defining a procedure inside another procedure is a syntax error—procedures cannot be
nested. 6.3
Control returns to the caller when execution reaches the End Sub statement (i.e., the
end of the procedure body). Alternatively, keywords Return and Exit Sub can be used
188 Procedures Chapter 6
anywhere in a procedure to return control to the point at which a Sub procedure was
invoked. We discuss Return and Exit Sub in detail, momentarily.
Good Programming Practice 6.3
The selection of meaningful procedure names and parameter names makes programs more
readable and reduces the need for excessive comments. 6.3
Software Engineering Observation 6.5
Procedure names tend to be verbs because procedures typically perform operations on data.
By convention, programmer-defined procedure names begin with an uppercase first letter.
For example, a procedure that sends an e-mail message might be named SendMail. 6.5
Software Engineering Observation 6.6
A procedure that requires a large number of parameters might be performing too many tasks.
Consider dividing the procedure into smaller procedures that perform separate tasks. As a
“rule of thumb,” the procedure header should fit on one line (if possible). 6.6
Software Engineering Observation 6.7
As a “rule of thumb,” a procedure should be limited to one printed page. Better yet, a procedure
should be no longer than half a printed page. Regardless of how long a procedure is,
it should perform one task well. 6.7
Testing and Debugging Tip 6.2
Small procedures are easier to test, debug and understand than large procedures. 6.2
Performance Tip 6.2
When a programmer divides a procedure into several procedures that communicate with one
another, this communication takes time and sometimes leads to poor execution performance. 6.2
Software Engineering Observation 6.8
The procedure header and procedure calls all must agree with regard to the number, type
and order of parameters. We discuss exceptions to this in Section 6.17. 6.8
6.4 Function Procedures
Function procedures are similar to Sub procedures, with one important difference:
Function procedures return a value (i.e., send a value) to the caller, whereas Sub procedures
do not. The console application in Fig. 6.3 uses Function procedure Square to
calculate the squares of the Integers from 1–10.
1 ‘ Fig. 6.3: SquareInteger.vb
2 ‘ Function procedure to square a number.
34
Module modSquareInteger
56
Sub Main()
7 Dim i As Integer ‘ counter
8
Fig. 6.3 Function procedure for squaring an integer (part 1 of 2).
Chapter 6 Procedures 189
The For structure (lines 12–14) displays the results of squaring the Integers from 1–
10. Each iteration of the loop calculates the square of control variable i and displays it in the
command window.
Function procedure Square is invoked (line 13) with the expression Square(i).
When program control reaches this expression, the program calls Function Square (lines
20–22). At this point, the program makes a copy of the value of i (the argument), and program
control transfers to the first line of Function Square. Square receives the copy
of i’s value and stores it in the parameter y. Line 21 is a Return statement, which terminates
execution of the procedure and returns the result of y ^ 2 to the calling program. The
result is returned to the point on line 13 where Square was invoked. Line 13 displays the
value of i and the value returned by Square in the command window. This process is
repeated 10 times.
The format of a Function procedure definition is
Function procedure-name(parameter-list) As return-type
declarations and statements
End Function
The procedure-name, parameter-list, and the declarations and statements in a Function
procedure definition behave like the corresponding elements in a Sub procedure definition.
9 Console.WriteLine(“Number” & vbTab & “Square” & vbCrLf)
10
11 ‘ square numbers from 1 to 10
12 For i = 1 To 10
13 Console.WriteLine(i & vbTab & Square(i))
14 Next
15
16 End Sub ‘ Main
17
18 ‘ Function Square is executed
19 ‘ only when the function is explicitly called.
20 Function Square(ByVal y As Integer) As Integer
21 Return y ^ 2
22 End Function ‘ Square
23
24 End Module ‘ modSquareInteger
Number Square
1 1
2 4
3 9
4 16
5 25
6 36
7 49
8 64
9 81
10 100
Fig. 6.3 Function procedure for squaring an integer (part 2 of 2).
190 Procedures Chapter 6
In the Function header, the return-type indicates the data type of the result returned from
the Function to its caller. The statement
Return expression
can occur anywhere in a Function procedure body and returns the value of expression
to the caller. If necessary, Visual Basic attempts to convert the expression to the Function
procedure’s return-type. Functions Return exactly one value. When a Return
statement is executed, control returns immediately to the point at which that
procedure was invoked.
Common Programming Error 6.4
If the expression in a Return statement cannot be converted to the Function procedure’s
return-type, a runtime error is generated. 6.4
Common Programming Error 6.5
Failure to return a value from a Function procedure (e.g., by forgetting to provide a Return
statement) causes the procedure to return the default value for the return-type, often
producing incorrect output. 6.5
6.5 Methods
A method is any procedure that is contained within a class. We have already presented several
FCL methods (i.e., methods contained in classes that are part of the FCL). Programmers
also can define custom methods in programmer-defined classes, such as a class used
to define a Windows application. The Windows application in Fig. 6.4 uses two methods
to calculate the largest of three Doubles.
1 ‘ Fig. 6.4: Maximum.vb
2 ‘ Program finds the maximum of three numbers input.
34
Public Class FrmMaximum
5 Inherits System.Windows.Forms.Form
67
‘ prompts for three inputs
8 Friend WithEvents lblOne As System.Windows.Forms.Label
9 Friend WithEvents lblTwo As System.Windows.Forms.Label
10 Friend WithEvents lblThree As System.Windows.Forms.Label
11
12 ‘ displays result
13 Friend WithEvents lblMaximum As System.Windows.Forms.Label
14
15 ‘ read three numbers
16 Friend WithEvents txtFirst As System.Windows.Forms.TextBox
17 Friend WithEvents txtSecond As System.Windows.Forms.TextBox
18 Friend WithEvents txtThird As System.Windows.Forms.TextBox
19
20 ‘ reads inputs and calculate results
21 Friend WithEvents cmdMaximum As System.Windows.Forms.Button
22
Fig. 6.4 Method that determines the largest of three numbers (part 1 of 2).
Chapter 6 Procedures 191
Until now, many of our applications have facilitated user interaction via either the
command window (in which the user can type an input value into the program) or a message
dialog (which displays a message to the user and allows the user to click OK to dismiss
the dialog). In Chapter 4, Control Structures: Part 1, we introduced Windows applications
by creating a program that displays information in a label on a form.
Although the command window and message dialogs are valid ways to receive input
from a user and display output, they are limited in their capabilities—the command
window can obtain only one line of input at a time from the user, and a message dialog
can display only one message. It is common to receive multiple inputs at the same time
(such as the three values in this example), or to display many pieces of data at once. To
introduce more sophisticated user interface programming, the program in Fig. 6.4 uses
GUI event handling (i.e., the ability to respond to a state change in the GUI, such as when
the user clicks a button).
23 ‘ Visual Studio .NET generated code
24
25 ‘ obtain values in each text box, call procedure Maximum
26 Private Sub cmdMaximum_Click(ByVal sender As System.Object, _
27 ByVal e As System.EventArgs) Handles cmdMaximum.Click
28
29 Dim value1, value2, value3 As Double
30
31 value1 = txtFirst.Text
32 value2 = txtSecond.Text
33 value3 = txtThird.Text
34
35 lblMaximum.Text = Maximum(value1, value2, value3)
36 End Sub ‘ cmdMaximum_Click
37
38 ‘ find maximum of three parameter values
39 Function Maximum(ByVal valueOne As Double, _
40 ByVal valueTwo As Double, ByVal valueThree As Double)
41
42 Return Math.Max(Math.Max(valueOne, valueTwo), valueThree)
43 End Function ‘ Maximum
44
45 End Class ‘ FrmMaximum
Fig. 6.4 Method that determines the largest of three numbers (part 2 of 2).
192 Procedures Chapter 6
Class FrmMaximum uses a GUI consisting of three TextBoxes (txtFirst, txt-
Second and txtThird) for user input, a Button (cmdMaximum) to invoke the calculation
and four Labels, including lblMaximum, which displays the results. We create
these components visually, using the Toolbox, and change their properties in the Properties
window. Lines 7–21 are declarations indicating the name of each component.
Although these lines of code are actually part of the Visual Studio .NET generated code,
we display them to indicate the objects that are part of the form (as always, the complete
code for this program is on the CD-ROM that accompanies this book and at
http://www.deitel.com).
Line 5 indicates that class FrmMaximum Inherits from System.Windows.
Forms.Form. Remember that all forms inherit from class System.Windows.
Forms.Form. A class can inherit attributes and behaviors (data and methods)
from another class if that class is specified to the right of the Inherits keyword. We discuss
inheritance in detail in Chapter 9, Object-Oriented Programming: Inheritance.
FrmMaximum contains two programmer-defined methods. Method Maximum (lines
39–43) takes three Double parameters and returns the value of the largest parameter. Note
that this method definition looks just like the definition of a Function procedure in a
module. The program also includes method cmdMaximum_Click (lines 26–36). When
the user double-clicks a component, such as a Button, in Design mode, the IDE generates
a method that Handles an event (i.e., an event handler). An event represents a user
action, such as clicking a Button or altering a value. An event handler is a method that is
executed (called) when a certain event is raised (occurs). In this case, method
cmdMaximum_Click handles the event in which Button cmdMaximum is clicked.
Programmers write code to perform certain tasks when such events occur. By employing
both events and objects, programmers can create applications that enable more sophisticated
user interactions than those we have seen previously. Event-handler names created
by the IDE begin with the object’s name, followed by an underscore and the name of the
event. We explain how to create our own event handlers, which can be given any name, in
Chapter 12, Graphical User Interface Concepts: Part 1.
When the user clicks cmdMaximum, procedure cmdMaximum_Click (lines 26–36)
executes. Lines 31–33 retrieve the values in the three TextBoxes, using the Text property.
The values are converted implicitly to type Double and stored in variables value1,
value2 and value3.
Line 35 calls method Maximum (lines 39–43) with the arguments value1, value2
and value3. The values of these arguments are then stored in parameters valueOne,
valueTwo and valueThree in method Maximum. Maximum returns the result of the
expression on line 42, which makes two calls to method Max of the Math class. Method
Max returns the largest of its two Double arguments, meaning the computation in line 42
first compares valueOne and valueTwo, then compares the value returned by the first
method call to valueThree. Calls to methods, such as Math.Max, that are defined in a
class in the FCL must include the class name and the dot (.) operator (also called the
member access operator). However, calls to methods defined in the class that contains the
method call need only specify the method name.
When control returns to method cmdMaximum_Click, line 35 assigns the value
returned by method Maximum to lblMaximum’s Text property, causing it to be displayed
for the user.
Chapter 6 Procedures 193
The reader may notice that typing the opening parenthesis after a method or procedure
name causes Visual Studio to display a window containing the procedure’s argument
names and types. This is the Parameter Info feature (Fig. 6.5) of the IDE. Parameter Info
greatly simplifies coding by identifying accessible procedures and their arguments. The
Parameter Info feature displays information for programmer-defined procedures and all
methods contained in the FCL.
Good Programming Practice 6.4
Selecting descriptive parameter names makes the information provided by the Parameter Info
feature more meaningful. 6.4
Visual Basic also provides the IntelliSense feature, which displays all the members in
a class. For instance, when the programmer types the dot (.) operator (also called the
member access operator) after the class name, Math, in Fig. 6.6, IntelliSense provides a
list of all the available methods in class Math. The Math class contains numerous methods
that allow the programmer to perform a variety of common mathematical calculations.
Fig. 6.5 Parameter Info feature of the Visual Studio .NET IDE.
Fig. 6.6 IntelliSense feature of the Visual Studio .NET IDE.
Parameter Info window
194 Procedures Chapter 6
As an example of the variety of FCL methods, some Math class methods are summarized
in Fig. 6.7. Throughout the table, the variables x and y are of type Double; however,
many of the methods also provide versions that take values of other data types as arguments.
In addition, the Math class also defines two mathematical constants: Math.PI and
Math.E. The constant Math.PI (3.14159265358979323846) of class Math is the
ratio of a circle’s circumference to its diameter (i.e., twice the radius). The constant
Math.E (2.7182818284590452354) is the base value for natural logarithms (calculated
with the Math.Log method).
Common Programming Error 6.6
Failure to invoke a Math class method by preceding the method name with the class name
Math and a dot operator (.) is a syntax error. 6.6
Method Description Example
Abs(x) returns the absolute value of x Abs(23.7) is 23.7
Abs(0) is 0
Abs(-23.7) is 23.7
Ceiling(x) rounds x to the smallest integer
not less than x
Ceiling(9.2) is 10.0
Ceiling(-9.8) is -9.0
Cos(x) returns the trigonometric cosine
of x (x in radians)
Cos(0.0) is 1.0
Exp(x) returns the exponential ex Exp(1.0) is approximately
2.71828182845905
Exp(2.0) is approximately
7.38905609893065
Floor(x) rounds x to the largest integer
not greater than x
Floor(9.2) is 9.0
Floor(-9.8) is -10.0
Log(x) returns the natural logarithm of
x (base e)
Log(2.7182818284590451)
is approximately 1.0
Log(7.3890560989306504)
is approximately 2.0
Max(x, y) returns the larger value of x and
y (also has versions for
Single, Integer and Long
values)
Max(2.3, 12.7) is 12.7
Max(-2.3, -12.7) is -2.3
Min(x, y) returns the smaller value of x
and y (also has versions for
Single, Integer and Long
values)
Min(2.3, 12.7) is 2.3
Min(-2.3, -12.7) is -12.7
Pow(x, y) calculates x raised to power y
(xy)
Pow(2.0, 7.0) is 128.0
Pow(9.0, .5) is 3.0
Sin(x) returns the trigonometric sine of
x (x in radians)
Sin(0.0) is 0.0
Fig. 6.7 Math class methods (part 1 of 2).
Chapter 6 Procedures 195
Software Engineering Observation 6.9
It is not necessary to add an assembly reference to use the Math class methods in a program,
because class Math is located in namespace System, which is implicitly added to all console
applications. 6.9
6.6 Argument Promotion
An important feature of procedure definitions is the coercion of arguments (i.e., the forcing
of arguments to the appropriate data type so that they can be passed to a procedure). Visual
Basic supports both widening and narrowing conversions. Widening conversion occurs
when a type is converted to another type (usually one that can hold more data) without losing
data, whereas a narrowing conversion occurs when there is potential for data loss during
the conversion (usually to a type that holds a smaller amount of data). Figure 6.8 lists
the widening conversions supported by Visual Basic.
For example, the Math class method Sqrt can be called with an Integer argument,
even though the method is defined in the Math class to receive a Double argument. The
statement
Console.Write(Math.Sqrt(4))
correctly evaluates Math.Sqrt(4) and prints the value 2. Visual Basic promotes (i.e.,
converts) the Integer value 4 to the Double value 4.0 before the value is passed to
Math.Sqrt. In this case, the argument value does not correspond precisely to the parameter
type in the method definition, so an implicit widening conversion changes the value to
the proper type before the method is called. Visual Basic also performs narrowing conversions
on arguments passed to procedures. For example, if String variable number contains
the value “4”, the method call Math.Sqrt(number) correctly evaluates to 2.
However, some implicit narrowing conversions can fail, resulting in runtime errors and
logic errors. For example, if number contains the value “hello”, passing it as an argument
to method Math.Sqrt causes a runtime error. In the next section, we discuss some
measures the programmer can take to help avoid such issues.
Common Programming Error 6.7
When performing a narrowing conversion (e.g., Double to Integer), conversion of a
primitive-data-type value to another primitive data type might change the value. Also, the
conversion of any integral value to a floating-point value and back to an integral value could
introduce rounding errors into the result. 6.7
Sqrt(x) returns the square root of x Sqrt(9.0) is 3.0
Sqrt(2.0) is 1.4142135623731
Tan(x) returns the trigonometric
tangent of x (x in radians)
Tan(0.0) is 0.0
Method Description Example
Fig. 6.7 Math class methods (part 2 of 2).
196 Procedures Chapter 6
Argument promotion applies not only to primitive data-type values passed as arguments
to methods, but also to expressions containing values of two or more data types. Such expressions
are referred to as mixed-type expressions. In a mixed-type expression, each value is promoted
to the “highest” data type in the expression (i.e., widening conversions are made until
the values are of the same type). For example, if singleNumber is of type Single and
integerNumber is of type Integer, when Visual Basic evaluates the expression
singleNumber + integerNumber
the value of integerNumber is converted to type Single, then added to single-
Number, producing a Single result. Although the values’ original data types are maintained,
a temporary version of each value is created for use in the expression, and the data
types of the temporary versions are modified appropriately.
6.7 Option Strict and Data-Type Conversions
Visual Basic provides several options for controlling the way the compiler handles data
types. These options can help programmers eliminate such errors as those caused by narrowing
conversions, making code more reliable and secure. The first option is Option
Explicit, which is set to On by default, meaning it was enabled in the Visual Basic programs
created in Chapters 2–5. Option Explicit forces the programmer to declare explicitly
all variables before they are used in a program. Forcing explicit declarations
eliminates spelling errors and other subtle errors that may occur if Option Explicit is
turned off. For example, when Option Explicit is set to Off, the compiler interprets
misspelled variable names as new variable declarations, which create subtle errors that can
be difficult to debug.
A second option, which is by default set to Off, is Option Strict. Visual Basic provides
Option Strict as a means to increase program clarity and reduce debugging time.
Type Conversion Types
Boolean Object
Byte Short, Integer, Long, Decimal, Single, Double or Object
Char String or Object
Date Object
Decimal Single, Double or Object
Double Object
Integer Long, Decimal, Single, Double or Object
Long Decimal, Single, Double or Object
Object none
Short Integer, Long, Decimal, Single, Double or Object
Single Double or Object
String Object
Fig. 6.8 Widening conversions.
Chapter 6 Procedures 197
When set to On, Option Strict causes the compiler to check all conversions and
requires the programmer to perform an explicit conversion for all narrowing conversions
that could cause data loss (e.g., conversion from Double to Integer) or program termination
(e.g., conversion of a String, such as “hello”, to type Integer).
The methods in class Convert change data types explicitly. The name of each conversion
method is the word To, followed by the name of the data type to which the method
converts its argument. For instance, to store a String input by the user in variable
number of type Integer (represented in Visual Basic .NET as type Int32, a 32-bit
integer) with Option Strict set to On, we use the statement
number = Convert.ToInt32(Console.ReadLine())
When Option Strict is set to Off, Visual Basic performs such type conversions
implicitly, meaning the programmer might not realize that a narrowing conversion is being
performed. If the data being converted is incompatible with the new data type, a runtime
error occurs. Option Strict draws the programmer’s attention to narrowing conversions
so that they can be eliminated or handled properly. In Chapter 11, Exception Handling,
we discuss how to handle the errors caused by failed narrowing conversions.
Software Engineering Observation 6.10
Performing explicit conversions allows programs to execute more efficiently by eliminating the
need to determine the data type of the value being changed before the conversion executes. 6.10
From this point forward, all code examples have Option Strict set to On.
Option Strict can be activated through the IDE by right-clicking the project name in
the Solution Explorer. From the resulting menu, select Properties to open the Property
Pages dialog Fig. 6.9. From the directory tree on the left side of the dialog, select
Build from the Common Properties list. In the middle of the dialog is a drop-down box
labeled Option Strict:. By default, the option is set to Off. Choose On from the dropdown
box and press Apply.
Fig. 6.9 Property Pages dialog with Option Strict set to On.
198 Procedures Chapter 6
Setting Option Strict to On in the Property Pages applies the change globally,
to the entire project. The programmer also can enable Option Strict within an individual
code file by typing Option Strict On at the start of the file above any declarations
or Imports statements.
6.8 Value Types and Reference Types
In the next section, we discuss passing arguments to procedures by value and by reference.
To understand this, we first need to make a distinction between data types in Visual Basic.
All Visual Basic data types can be categorized as either value types or reference types. A
variable of a value type contains data of that type. Normally, value types are used for a single
piece of data, such as an Integer or a Double value. By contrast, a variable of a
reference type (sometimes called a reference) contains a location in memory where data is
stored. The location in memory can contain many individual pieces of data. Collectively,
reference types are known as objects and are discussed in detail in Chapters 8, 9 and 10,
Object-Based Programming, Object-Oriented Programming: Inheritance, and Object-Oriented
Programming: Polymorphism.
Both value types and reference types include built-in types and types that the programmer
can create. The built-in value types include the integral types (Byte, Short,
Integer and Long), the floating-point types (Single and Double) and types
Boolean, Date, Decimal and Char. The built-in reference types include Object and
String (although type String often behaves more like a value type, as we discuss in
the next section). The value types that can be constructed by the programmer include
Structures and Enumerations. The reference types that can be created by the programmer
include classes, interfaces and delegates. Programmer-defined types are discussed
in greater detail in Chapter 8, Object-Based Programming, Chapter 9, Object-
Oriented Programming: Inheritance and Chapter 15, Strings, Characters and Regular
Expressions.
The table in Fig. 6.10 lists the primitive data types, which form the building blocks for
more complicated types, such as classes. If Option Explicit is set to On, all variables
must have a type before they can be used in a program. This requirement is referred to as
strong typing.
Type
Size
in bits Values Standard
Boolean 16 True or False
Char 16 One Unicode character (Unicode character set)
Byte 8 0 to 255
Date 64 1 January 0001 to 31 December 9999
0:00:00 to 23:59:59
Decimal 128 1.0E-28 to 7.9E+28
Short 16 –32,768 to 32,767
Fig. 6.10 Visual Basic primitive data types (part 1 of 2).
Chapter 6 Procedures 199
Each value type in the table is accompanied by its size in bits (there are 8 bits to a byte)
and its range of values. To promote portability, Microsoft chose to use internationally recognized
standards for both character formats (Unicode) and floating-point numbers (IEEE
754). We discuss the Unicode character formats in Appendix F, Unicode.
Values typed directly in program code are called literals. Each literal corresponds to
one of the primitive data types. We already have seen literals for commonly-used types,
such as String, Integer and Double. However, some of Visual Basic’s data types use
special notations for creating literals. For instance, to create a literal of type Char, follow
a single-character String with the type character c. The statement
Dim character As Char = “Z”c
declares Char variable character and initializes it to the “Z” character.
Similarly, literals of specific integral data types can be created by following an integer
with the type character S (for Short), I (for Integer) or L (for Long). To create
floating-point literals, follow a floating-point number with type character F (for Single)
or R (for Double). Type character D can be used to create Decimal literals.
Visual Basic also allows programmers to type floating-point literals in scientific notation,
by following a floating-point number by the character E and a positive or negative
exponent of 10. For example, 1.909E-5 corresponds to the value 0.00001909. This
notation is useful for specifying floating-point values that are too large or too small to be
written in fixed-point notation.
Figure 6.11 displays Visual Basic’s type characters and examples of literals for each
data type. All literals must be within the range for the literal’s type, as specified in Fig. 6.10.
Integer 32 –2,147,483,648 to
2,147,483,647
Long 64 –9,223,372,036,854,775,808
to 9,223,372,036,854,775,807
Single 32 ±1.5E-45 to ±3.4E+38 (IEEE 754 floating point)
Double 64 ±5.0E–324 to ±1.7E+308 (IEEE 754 floating point)
Object 32 Data of any type
String 0 to ~2000000000 Unicode characters (Unicode character set)
Type
Size
in bits Values Standard
Fig. 6.10 Visual Basic primitive data types (part 2 of 2).
Type Type character Example
Char c “u”c
Single F 9.802E+31F
Fig. 6.11 Literals with type characters (part 1 of 2).
200 Procedures Chapter 6
6.9 Passing Arguments: Pass-by-Value vs. Pass-by-Reference
Arguments are passed in one of two ways: Pass-by-value and pass-by-reference (also
called call-by-value and call-by-reference). When an argument is passed by value, the program
makes a copy of the argument’s value and passes that copy to the called procedure.
With pass-by-value, changes to the called procedure’s copy do not affect the original variable’s
value. In contrast, when an argument is passed by reference, the caller gives the
called procedure the ability to access and modify the caller’s original data directly.
Figure 6.12 demonstrates passing value-type arguments by value and by reference.1
The program passes three value-type variables, number1, number2 and number3, in
different ways to procedures SquareByValue (lines 39–45) and SquareByReference
(lines 48–54). Keyword ByVal in the procedure header of SquareByValue (line 39) indicates
that value-type arguments should be passed by value. When number1 is passed to
SquareByValue (line 13), a copy of the value stored in number1 (i.e., 2) is passed to the
procedure. Therefore, the value of number1 in the calling procedure, Main, is not modified
when parameter number is squared in procedure SquareByValue (line 42).
Procedure SquareByReference uses keyword ByRef (line 48) to receive its
value-type parameter by reference. When Main calls SquareByReference (line 23),
a reference to the value stored in number2 is passed, which gives SquareByReference
direct access to the value stored in the original variable. Thus, the value stored in
number2 after SquareByReference finishes executing is the same as the final value
of parameter number.
When arguments are enclosed in parentheses, (), a copy of the value of the argument
is passed to the procedure, even if the procedure header includes keyword ByRef. Thus,
the value of number3 does not change after it is passed to SquareByReference (line
33) via parentheses.
Passing value-type arguments with keyword ByRef is useful when procedures need
to alter argument values directly. However, passing by reference can weaken security,
because the called procedure can modify the caller’s data.
Reference-type variables passed with keyword ByVal are effectively passed by reference,
as the value that is copied is the reference for the object. Although Visual Basic
allows programmers to use keyword ByRef with reference-type parameters, it is usually
Double R 6.04E-187R
Decimal D 128309.76D
Short S 3420S
Integer I -867I
Long L 19235827493259374L
1. In Chapter 7 we discuss passing reference-type arguments by value and by reference.
Type Type character Example
Fig. 6.11 Literals with type characters (part 2 of 2).
Chapter 6 Procedures 201
not necessary to do so except with type String. Although they technically are reference
types, String arguments cannot be modified directly when passed with keyword ByVal,
due to some subtle details of the String data type, which we discuss in Chapter 15,
Strings, Characters and Regular Expressions.
1 ‘ Fig. 6.12: ByRefTest.vb
2 ‘ Demonstrates passing by reference.
34
Module modByRefTest
56
‘ squares three values ByVal and ByRef, displays results
7 Sub Main()
8 Dim number1 As Integer = 2
9
10 Console.WriteLine(“Passing a value-type argument by value:”)
11 Console.WriteLine(“Before calling SquareByValue, ” & _
12 “number1 is {0}”, number1)
13 SquareByValue(number1) ‘ passes number1 by value
14 Console.WriteLine(“After returning from SquareByValue, ” & _
15 “number1 is {0}” & vbCrLf, number1)
16
17 Dim number2 As Integer = 2
18
19 Console.WriteLine(“Passing a value-type argument” & _
20 ” by reference:”)
21 Console.WriteLine(“Before calling SquareByReference, ” & _
22 “number2 is {0}”, number2)
23 SquareByReference(number2) ‘ passes number2 by reference
24 Console.WriteLine(“After returning from ” & _
25 “SquareByReference, number2 is {0}” & vbCrLf, number2)
26
27 Dim number3 As Integer = 2
28
29 Console.WriteLine(“Passing a value-type argument” & _
30 ” by reference, but in parentheses:”)
31 Console.WriteLine(“Before calling SquareByReference ” & _
32 “using parentheses, number3 is {0}”, number3)
33 SquareByReference((number3)) ‘ passes number3 by value
34 Console.WriteLine(“After returning from ” & _
35 “SquareByReference, number3 is {0}”, number3)
36
37 End Sub ‘ Main
38
39 ‘ squares number by value (note ByVal keyword)
40 Sub SquareByValue(ByVal number As Integer)
41 Console.WriteLine(“After entering SquareByValue, ” & _
42 “number is {0}”, number)
43 number *= number
44 Console.WriteLine(“Before exiting SquareByValue, ” & _
45 “number is {0}”, number)
46 End Sub ‘ SquareByValue
47
Fig. 6.12 ByVal and ByRef used to pass value-type arguments (part 1 of 2).
202 Procedures Chapter 6
Testing and Debugging Tip 6.3
When passing arguments by value, changes to the called procedure’s copy do not affect the
original variable’s value. This prevents possible side effects that could hinder the development
of correct and reliable software systems. Always pass value-type arguments by value
unless you explicitly intend for the called procedure to modify the caller’s data. 6.3
Software Engineering Observation 6.11
Although keywords ByVal and ByRef may be used to pass reference-type variables by value
or by reference, the called procedure can manipulate the caller’s reference-type variable
directly in both cases. Therefore, it is rarely appropriate to use ByRef with reference-type
variables. We discuss this subtle issue in detail in Chapter 7, Arrays. 6.11
6.10 Duration of Identifiers
Throughout the earlier chapters of this book, we have used identifiers for various purposes,
including as variable names and as the names of user-defined procedures, modules and
classes. Every identifier has certain attributes, including duration and scope.
An identifier’s duration (also called its lifetime) is the period during which the identifier
exists in memory. Some identifiers exist briefly, some are created and destroyed repeatedly,
yet others are maintained through the entire execution of a program.
48 ‘ squares number by reference (note ByRef keyword)
49 Sub SquareByReference(ByRef number As Integer)
50 Console.WriteLine(“After entering SquareByReference” & _
51 “, number is {0}”, number)
52 number *= number
53 Console.WriteLine(“Before exiting SquareByReference” & _
54 “, number is {0}”, number)
55 End Sub ‘ SquareByReference
56
57 End Module ‘ modByRefTest
Passing a value-type argument by value:
Before calling SquareByValue, number1 is 2
After entering SquareByValue, number is 2
Before exiting SquareByValue, number is 4
After returning from SquareByValue, number1 is 2
Passing a value-type argument by reference:
Before calling SquareByReference, number2 is 2
After entering SquareByReference, number is 2
Before exiting SquareByReference, number is 4
After returning from SquareByReference, number2 is 4
Passing a value-type argument by reference, but in parentheses:
Before calling SquareByReference using parentheses, number3 is 2
After entering SquareByReference, number is 2
Before exiting SquareByReference, number is 4
After returning from SquareByReference, number3 is 2
Fig. 6.12 ByVal and ByRef used to pass value-type arguments (part 2 of 2).
Chapter 6 Procedures 203
Software Engineering Observation 6.12
When returning information from a Function procedure via a Return statement, valuetype
variables always are returned by value (i.e., a copy is returned), whereas reference-type
variables always are returned by reference (i.e., a reference to an object is returned). 6.12
The scope of an identifier is the portion of a program in which the variable’s identifier
can be referenced. Some identifiers can be referenced throughout a program; others can be
referenced only from limited portions of a program (such as within a single procedure). This
section discusses the duration of identifiers. Section 6.11 discusses the scope of identifiers.
Identifiers that represent local variables in a procedure (i.e., parameters and variables
declared in the procedure body) have automatic duration. Automatic-duration variables are
created when program control enters the procedure in which they are declared, exist while
the procedure is active and are destroyed when the procedure is exited.2 For the remainder
of the text, we refer to variables of automatic duration simply as automatic variables, or
local variables.
Variables declared inside a module or class, but outside any procedure definition, exist
as long as their containing class or module is loaded in memory. Variables declared in a
module exist throughout a program’s execution. By default, a variable declared in a class,
such as a Form class for a Windows application, is an instance variable. In the case of a
Form, this means that the variable is created when the Form loads and exists until the
Form is closed. We discuss instance variables in detail in Chapter 8, Object-Based Programming.
Software Engineering Observation 6.13
Automatic duration is an example of the principle of least privilege. This principle states that
each component of a system should have only the rights and privileges it needs to accomplish
its designated task. This helps prevent accidental and/or malicious errors from occurring in
systems. Why have variables stored in memory and accessible when they are not needed? 6.13
6.11 Scope Rules
The scope (sometimes called declaration space) of a variable, reference or procedure identifier
is the portion of the program in which the identifier can be accessed. The possible
scopes for an identifier are class scope, module scope, namespace scope and block scope.
Members of a class have class scope, which means that they are visible in what is
known as the declaration space of a class. Class scope begins at the class identifier after
keyword Class and terminates at the End Class statement. This scope enables a method
of that class to invoke directly all members defined in that class and to access members
inherited into that class.3 In a sense, members of a class are global to the methods of the
class in which they are defined. This means that the methods can modify instance variables
of the class (i.e., variables declared in the class definition, but outside any method definition)
directly and invoke other methods of the class.
2. Variables in a procedure can also be declared using keyword Static, in which case the variable
is created and initialized during the first execution of the procedure then maintains its value between
subsequent calls to the procedure.
3. In Chapter 8, Object-Based Programming, we see that Shared members are an exception to this
rule.
204 Procedures Chapter 6
In Visual Basic .NET, identifiers declared inside a block, such as the body of a procedure
definition or the body of an If/Then selection structure, have block scope (local-variable
declaration space). Block scope begins at the identifier’s declaration and ends at the block’s
End statement (or equivalent, e.g., Next). Local variables of a procedure have block scope.
Procedure parameters also have block scope, because they are considered local variables of
the procedure. Any block can contain variable declarations. When blocks are nested in a body
of a procedure, an error is generated if an identifier declared in an outer block has the same
name as an identifier declared in an inner block. However, if a local variable in a called procedure
shares its name with a variable with class scope, such as an instance variable, the classscope
variable is “hidden” until the called procedure terminates execution.
Variables declared in a module have module scope, which is similar to class scope.
Variables declared in a module are accessible to all procedures defined in the module.
Module scope and class scope are sometimes referred to collectively as module scope. Like
class-scope variables, module-scope variables are hidden when they have the same identifier
as a local variable.
By default, procedures defined in a module have namespace scope, which generally
means that they may be accessed throughout a project. Namespace scope is useful in
projects that contain multiple pieces (i.e., modules and classes). If a project contains a
module and a class, methods in the class can access the procedures of the module. Although
variables declared in a module have module scope, they can be given namespace scope by
replacing keyword Dim with keyword Public in the declaration. We discuss how to add
modules to projects in Section 6.18.
Good Programming Practice 6.5
Avoid local-variable names that hide class-variable or module-variable names. 6.5
The program in Fig. 6.13 demonstrates scoping issues with instance variables and local
variables. Instance variable value is declared and initialized to 1 in line 12. As explained
previously, this variable is hidden in any procedure that declares a variable named value.
The FrmScoping_Load method declares a local variable value (line 19) and initializes
it to 5. This variable is displayed on lblOutput (note the declaration on line 7, which is
actually part of the Visual Studio .NET generated code) to illustrate that the instance variable
value is hidden in FrmScoping_Load.
1 ‘ Fig. 6.13: Scoping.vb
2 ‘ Demonstrates scope rules and instance variables.
34
Public Class FrmScoping
5 Inherits System.Windows.Forms.Form
67
Friend WithEvents lblOutput As System.Windows.Forms.Label
89
‘ Visual Studio .NET generated code
10
11 ‘ instance variable can be used anywhere in class
12 Dim value As Integer = 1
13
Fig. 6.13 Scoping rules in a class (part 1 of 2).
Chapter 6 Procedures 205
14 ‘ demonstrates class scope and block scope
15 Private Sub FrmScoping_Load(ByVal sender As System.Object, _
16 ByVal e As System.EventArgs) Handles MyBase.Load
17
18 ‘ variable local to FrmScoping_Load hides instance variable
19 Dim value As Integer = 5
20
21 lblOutput.Text = “local variable value in” & _
22 ” FrmScoping_Load is ” & value
23
24 MethodA() ‘ MethodA has automatic local value
25 MethodB() ‘ MethodB uses instance variable value
26 MethodA() ‘ MethodA creates new automatic local value
27 MethodB() ‘ instance variable value retains its value
28
29 lblOutput.Text &= vbCrLf & vbCrLf & “local variable ” & _
30 “value in FrmScoping_Load is ” & value
31 End Sub ‘ FrmScoping_Load
32
33 ‘ automatic local variable value hides instance variable
34 Sub MethodA()
35 Dim value As Integer = 25 ‘ initialized after each call
36
37 lblOutput.Text &= vbCrLf & vbCrLf & “local variable ” & _
38 “value in MethodA is ” & value & ” after entering MethodA”
39 value += 1
40 lblOutput.Text &= vbCrLf & “local variable ” & _
41 “value in MethodA is ” & value & ” before exiting MethodA”
42 End Sub ‘ MethodA
43
44 ‘ uses instance variable value
45 Sub MethodB()
46 lblOutput.Text &= vbCrLf & vbCrLf & “instance variable” & _
47 ” value is ” & value & ” after entering MethodB”
48 value *= 10
49 lblOutput.Text &= vbCrLf & “instance variable ” & _
50 “value is ” & value & ” before exiting MethodB”
51 End Sub ‘ MethodB
52
53 End Class ‘ FrmScoping
Fig. 6.13 Scoping rules in a class (part 2 of 2).
206 Procedures Chapter 6
The program defines two other methods—MethodA and MethodB—which take no
arguments and return nothing. Each method is called twice from FrmScoping_Load.
MethodA defines local variable value (line 35) and initializes it to 25. When MethodA is
called, the variable is displayed in the label lblOutput, incremented and displayed again
before exiting the method. Automatic variable value is destroyed when MethodA terminates.
Thus, each time this method is called, value must be recreated and reinitialized to 25.
MethodB does not declare any variables. Therefore, when this procedure refers to variable
value, the instance variable value (line 12) is used. When MethodB is called, the
instance variable is displayed, multiplied by 10 and displayed again before exiting the
method. The next time method MethodB is called, the instance variable retains its modified
value, 10 and line 48 causes value (line 12) to become 100. Finally, the program again displays
the local variable value in method FrmScoping_Load to show that none of the
method calls modified this variable value—both methods refer to variables in other scopes.
6.12 Random-Number Generation
We now take a brief and hopefully entertaining diversion into a popular programming application—
simulation and game playing. In this section and the next, we develop a structured
game-playing program that includes multiple methods. The program employs many
of the control structures that we have studied to this point, in addition to introducing several
new concepts.
There is something in the air of a gambling casino that invigorates a wide variety of
people, ranging from the high rollers at the plush mahogany-and-felt craps tables to the
quarter-poppers at the one-armed bandits. Many of these individuals are drawn by the element
of chance—the possibility that luck will convert a pocketful of money into a mountain
of wealth. The element of chance can be introduced into computer applications through
class Random (located in namespace System).
Consider the following statements:
Dim randomObject As Random = New Random()
Dim randomNumber As Integer = randomObject.Next()
The first statement declares randomObject as a reference to an object of type Random.
The value of randomObject is initialized using keyword New, which creates a new instance
of class Random (i.e., a Random object). In Visual Basic, keyword New creates an
object of a specified type and returns the object’s location in memory.
The second statement declares Integer variable randomNumber and assigns it the
value returned by calling Random method Next. We access method Next by following
the reference name, randomObject, by the dot (.) operator and the method name.
Method Next generates a positive Integer value between zero and the constant
Int32.MaxValue (2,147,483,647). If Next produces values at random, every value in
this range has an equal chance (or probability) of being chosen when Next is called. The
values returned by Next are actually pseudo-random numbers, or a sequence of values
produced by a complex mathematical calculation. This mathematical calculation requires a
seed value, which, if different each time the program is run, causes the series of mathematical
calculations to be different as well (so that the numbers generated are indeed random).
When we create a Random object, the current time of day becomes the seed value for the
calculation. Alternatively, we can pass a seed value as an argument in the parentheses after
Chapter 6 Procedures 207
New Random. Passing in the same seed twice results in the same series of random numbers.
Using the current time of day as the seed value is effective, because the time is likely
to change for each Random object we create.
The generation of random numbers often is necessary in a program. However, the
range of values produced by Next (i.e., values between 0–2,147,483,647) often is different
from that needed in a particular application. For example, a program that simulates cointossing
might require only 0 for “heads” and 1 for “tails.” A program that simulates the
rolling of a six-sided die would require random Integers from 1–6. Similarly, a program
that randomly predicts the next type of spaceship (out of four possibilities) that flies across
the horizon in a video game might require random Integers from 1–4.
By passing an argument to method Next as follows
value = 1 + randomObject.Next(6)
we can produce integers in the range 1–6. When a single argument is passed to Next, the
values returned by Next will be in the range from 0 to (but not including) the value of that
argument. This is called scaling. The number 6 is the scaling factor. We shift the range of
numbers produced by adding 1 to our previous result, so that the return values are between
1 and 6, rather than 0 and 5. The values produced by Next are always in the range
x ≤x + randomObject.Next(y) y
Visual Basic simplifies this process by allowing the programmer to pass two arguments
to Next. For example, the above statement also could be written as
value = randomObject.Next(1, 7)
Note that we must use 7 as the second argument to method Next to produce integers
in the range from 1–6. The first argument indicates the minimum value in our desired range,
whereas the second is equal to 1 + the maximum value desired. Thus, the values produced
by this version of Next will always be in the range
x ≤randomObject.Next(x, y) y
In this case, x is the shifting value, and y-x is the scaling factor. Figure 6.14 demonstrates
the use of class Random and method Next by simulating 20 rolls of a six-sided die and
showing the value of each roll in a MessageBox. Note that all the values are in the range
from 1–6, inclusive.
The program in Fig. 6.15 uses class Random to simulate rolling four six-sided dice. We
then use some of the functionality from this program in another example (Fig. 6.16) to demonstrate
that the numbers generated by Next occur with approximately equal likelihood.
In Fig. 6.15, we use event-handling method cmdRoll_Click, which executes whenever
the user clicks cmdRoll, resulting in method DisplayDie being called four times,
once for each Label on the Form. Calling DisplayDie (lines 35–44) causes four dice to
appear as if they are being rolled each time cmdRoll is clicked. Note that, when this program
runs, the dice images do not appear until the user clicks cmdRoll for the first time.
Method DisplayDie specifies the correct image for the face value calculated by
method Next (line 38). Notice that we declare randomObject as an instance variable of
FrmRollDice (line 21). This allows the same Random object to be used each time Disvbhtp2_
208 Procedures Chapter 6
playDie executes. We use the Image property (line 41) to display an image on a label. We
set the property’s value with an assignment statement (lines 41–43). Notice that we specify
the image to display through procedure FromFile in class Image (contained in the
System.Drawing namespace). Method Directory.GetCurrentDirectory
(contained in the System.IO namespace) returns the location of the folder in which the current
project is located, including bin, the directory containing the compiled project files. The
die images must be placed in this folder for the solutions in Fig. 6.15 and Fig. 6.16 to operate
properly. The graphics used in this example and several other examples in this chapter were
created with Adobe® Photoshop™ Elements and are located in the project directory available
on the CD-ROM that accompanies this book and at http://www.deitel.com.
Notice that we must include an Imports directive (line 4) to use classes in
System.IO, but not to use classes in System.Drawing. By default, Windows applications
import several namespaces, including Microsoft.VisualBasic, System,
System.Drawing, System.Windows.Forms and System.Collections. The
se namespaces are imported for the entire project, eliminating the need for Imports directives
in individual project files. Other namespaces can be imported into a project via the
Property Pages dialog (opened by selecting Project > Properties from the menu bar)
in the Imports listing under Common Properties. Some of the namespaces imported
by default are not used in this example. For instance, we do not yet use namespace
System.Collections, which allows programmers to create collections of objects (see
Chapter 24, Data Structures and Collections).
The Windows application in Fig. 6.16 rolls 12 dice to show that the numbers generated
by class Random occur with approximately equal frequencies. The program displays the
cumulative frequencies of each face in a TextBox.
1 ‘ Fig. 6.14: RandomInteger.vb
2 ‘ Generating random integers.
34
Imports System.Windows.Forms
56
Module modRandomInteger
78
Sub Main()
9 Dim randomObject As Random = New Random()
10 Dim randomNumber As Integer
11 Dim output As String = “”
12 Dim i As Integer
13
14 For i = 1 To 20
15 randomNumber = randomObject.Next(1, 7)
16 output &= randomNumber & ” “
17
18 If i Mod 5 = 0 Then ‘ is i a multiple of 5?
19 output &= vbCrLf
20 End If
21
22 Next
Fig. 6.14 Random integers created by calling method Next of class Random
(part 1 of 2).
Chapter 6 Procedures 209
23
24 MessageBox.Show(output, “20 Random Numbers from 1 to 6″, _
25 MessageBoxButtons.OK, MessageBoxIcon.Information)
26 End Sub ‘ Main
27
28 End Module ‘ modRandomInteger
1 ‘ Fig. 6.15: RollDice.vb
2 ‘ Rolling four dice.
34
Imports System.IO
56
Public Class FrmRollDice
7 Inherits System.Windows.Forms.Form
89
‘ button for rolling dice
10 Friend WithEvents cmdRoll As System.Windows.Forms.Button
11
12 ‘ labels to display die images
13 Friend WithEvents lblDie1 As System.Windows.Forms.Label
14 Friend WithEvents lblDie2 As System.Windows.Forms.Label
15 Friend WithEvents lblDie3 As System.Windows.Forms.Label
16 Friend WithEvents lblDie4 As System.Windows.Forms.Label
17
18 ‘ Visual Studio .NET generated code
19
20 ‘ declare Random object reference
21 Dim randomNumber As Random = New Random()
22
23 ‘ display results of four rolls
24 Private Sub cmdRoll_Click(ByVal sender As System.Object, _
25 ByVal e As System.EventArgs) Handles cmdRoll.Click
26
27 ‘ method randomly assigns a face to each die
28 DisplayDie(lblDie1)
29 DisplayDie(lblDie2)
30 DisplayDie(lblDie3)
31 DisplayDie(lblDie4)
32 End Sub ‘ cmdRoll_Click
33
Fig. 6.15 Demonstrates 4 die rolls (part 1 of 2).
Fig. 6.14 Random integers created by calling method Next of class Random
(part 2 of 2).
210 Procedures Chapter 6
Figure 6.16 contains two screenshots: One on the left that shows the program when the
program initially executes and one on the right that shows the program after the user has
clicked Roll over 200 times. If the values produced by method Next are indeed random,
the frequencies of the face values (1–6) should be approximately the same (as the left
screenshot illustrates).
To show that the die rolls occur with approximately equal likelihood, the program in
Fig. 6.16 has been modified to keep some simple statistics. We declare counters for each of
the possible rolls in line 31. Notice that the counters are instance variables, i.e., variables
with class scope. Lines 60–76 display the frequency of each roll as percentages using the
“P” format code.
As the program output demonstrates, we have utilized function Next to simulate the
rolling of a six-sided die. Over the course of many die rolls, each of the possible faces from
1–6 appears with equal likelihood, or approximately one-sixth of the time. Note that no
Case Else is provided in the Select structure (lines 91–111), because we know that the
values generated are in the range 1–6. In Chapter 7, Arrays, we explain how to replace the
entire Select structure in this program with a single-line statement.
Run the program several times and observe the results. Notice that a different sequence
of random numbers is obtained each time the program is executed, causing the resulting frequencies
to vary.
34 ‘ get a random die image
35 Sub DisplayDie(ByVal dieLabel As Label)
36
37 ‘ generate random integer in range 1 to 6
38 Dim face As Integer = randomNumber.Next(1, 7)
39
40 ‘ load corresponding image
41 dieLabel.Image = Image.FromFile( _
42 Directory.GetCurrentDirectory & “\Images\die” & _
43 face & “.png”)
44 End Sub ‘ DisplayDie
45
46 End Class ‘ FrmRollDice
Fig. 6.15 Demonstrates 4 die rolls (part 2 of 2).
Chapter 6 Procedures 211
1 ‘ Fig. 6.16: RollTwelveDice.vb
2 ‘ Rolling 12 dice with frequency chart.
34
Imports System.IO
56
Public Class FrmRollTwelveDice
7 Inherits System.Windows.Forms.Form
89
‘ labels to display die images
10 Friend WithEvents lblDie1 As System.Windows.Forms.Label
11 Friend WithEvents lblDie2 As System.Windows.Forms.Label
12 Friend WithEvents lblDie3 As System.Windows.Forms.Label
13 Friend WithEvents lblDie4 As System.Windows.Forms.Label
14 Friend WithEvents lblDie5 As System.Windows.Forms.Label
15 Friend WithEvents lblDie6 As System.Windows.Forms.Label
16 Friend WithEvents lblDie7 As System.Windows.Forms.Label
17 Friend WithEvents lblDie8 As System.Windows.Forms.Label
18 Friend WithEvents lblDie9 As System.Windows.Forms.Label
19 Friend WithEvents lblDie10 As System.Windows.Forms.Label
20 Friend WithEvents lblDie11 As System.Windows.Forms.Label
21 Friend WithEvents lblDie12 As System.Windows.Forms.Label
22
23 ‘ displays roll frequencies
24 Friend WithEvents displayTextBox As _
25 System.Windows.Forms.TextBox
26
27 ‘ Visual Studio .NET generated code
28
29 ‘ declarations
30 Dim randomObject As Random = New Random()
31 Dim ones, twos, threes, fours, fives, sixes As Integer
32
33 Private Sub cmdRoll_Click _
34 (ByVal sender As System.Object, _
35 ByVal e As System.EventArgs) Handles cmdRoll.Click
36
37 ‘ assign random faces to 12 dice using DisplayDie
38 DisplayDie(lblDie1)
39 DisplayDie(lblDie2)
40 DisplayDie(lblDie3)
41 DisplayDie(lblDie4)
42 DisplayDie(lblDie5)
43 DisplayDie(lblDie6)
44 DisplayDie(lblDie7)
45 DisplayDie(lblDie8)
46 DisplayDie(lblDie9)
47 DisplayDie(lblDie10)
48 DisplayDie(lblDie11)
49 DisplayDie(lblDie12)
50
51 Dim total As Integer = ones + twos + threes + fours + _
52 fives + sixes
53
Fig. 6.16 Random class used to simulate rolling 12 six-sided dice (part 1 of 3).
212 Procedures Chapter 6
54 Dim output As String
55
56 ‘ display frequencies of faces
57 output = “Face” & vbTab & vbTab & _
58 “Frequency” & vbTab & “Percent”
59
60 output &= vbCrLf & “1” & vbTab & vbTab & ones & _
61 vbTab & vbTab & String.Format(“{0:P}”, ones / total)
62
63 output &= vbCrLf & “2” & vbTab & vbTab & twos & vbTab & _
64 vbTab & String.Format(“{0:P}”, twos / total)
65
66 output &= vbCrLf & “3” & vbTab & vbTab & threes & vbTab & _
67 vbTab & String.Format(“{0:P}”, threes / total)
68
69 output &= vbCrLf & “4” & vbTab & vbTab & fours & vbTab & _
70 vbTab & String.Format(“{0:P}”, fours / total)
71
72 output &= vbCrLf & “5” & vbTab & vbTab & fives & vbTab & _
73 vbTab & String.Format(“{0:P}”, fives / total)
74
75 output &= vbCrLf & “6” & vbTab & vbTab & sixes & vbTab & _
76 vbTab & String.Format(“{0:P}”, sixes / total) & vbCrLf
77
78 displayTextBox.Text = output
79 End Sub ‘ cmdRoll_Click
80
81 ‘ display a single die image
82 Sub DisplayDie(ByVal dieLabel As Label)
83
84 Dim face As Integer = randomObject.Next(1, 7)
85
86 dieLabel.Image = _
87 Image.FromFile(Directory.GetCurrentDirectory & _
88 “\Images\die” & face & “.png”)
89
90 ‘ maintain count of die faces
91 Select Case face
92
93 Case 1
94 ones += 1
95
96 Case 2
97 twos += 1
98
99 Case 3
100 threes += 1
101
102 Case 4
103 fours += 1
104
105 Case 5
106 fives += 1
Fig. 6.16 Random class used to simulate rolling 12 six-sided dice (part 2 of 3).
Chapter 6 Procedures 213
6.13 Example: Game of Chance
One of the most popular games of chance is a dice game known as “craps,” played in casinos
and back alleys throughout the world. The rules of the game are straightforward:
A player rolls two dice. Each die has six faces. Each face contains 1, 2, 3, 4, 5 or 6 spots.
After the dice have come to rest, the sum of the spots on the two upward faces is calculated.
If the sum is 7 or 11 on the first throw, the player wins. If the sum is 2, 3 or 12 on the first
throw (called “craps”), the player loses (i.e., the “house” wins). If the sum is 4, 5, 6, 8, 9 or
10 on the first throw, that sum becomes the player’s “point.” To win, players must continue
rolling the dice until they “make their point” (i.e., roll their point value). The player loses by
rolling a 7 before making the point.
The application in Fig. 6.17 simulates the game of craps.
107
108 Case 6
109 sixes += 1
110
111 End Select
112
113 End Sub ‘ DisplayDie
114
End Class ‘ FrmRollTwelveDice
Fig. 6.16 Random class used to simulate rolling 12 six-sided dice (part 3 of 3).
214 Procedures Chapter 6
Notice that the player must roll two dice on the first and all subsequent rolls. When
executing the application, click the Play button to play the game. The form displays the
results of each roll. The screen captures depict the execution of two games.
Lines 9–21 indicate that this program uses classes PictureBox, Label, Button
and GroupBox from namespace System.Windows.Forms. Although the Windows
Form Designer uses the full name for these classes (e.g., System.Windows.
Forms.PictureBox), we show only the class names for simplicity. Class names
are sufficient in this case, because System.Windows.Forms is imported by default for
Windows applications.
This program introduces several new GUI components. The first, called a GroupBox,
displays the user’s point. A GroupBox is a container used to group related components.
Within the GroupBox pointDiceGroup, we add two PictureBoxes, which are
components that display images. Components are added to a GroupBox by dragging and
dropping a component onto the GroupBox.
Before introducing any method definitions, the program includes several declarations,
including our first Enumeration on lines 26–32 and our first Constant identifiers on lines
35–36. Constant identifiers and Enumerations enhance program readability by providing
descriptive identifiers for numbers or Strings that have special meaning. Constant
identifiers and Enumerations help programmers ensure that values are consistent
throughout a program. Keyword Const creates a single constant identifier; Enumerations
are used to define groups of related constants. In this case, we create Constant identifiers
for the file names that are used throughout the program and create an Enumeration of
descriptive names for the various dice combinations in Craps (i.e., SNAKE_EYES, TREY,
CRAPS, YO_LEVEN and BOX_CARS). Constant identifiers must be assigned constant
values and cannot be modified after they are declared.
1 ‘ Fig 6.17: CrapsGame.vb
2 ‘ Playing a craps game.
34
Imports System.IO
56
Public Class FrmCrapsGame
7 Inherits System.Windows.Forms.Form
89
Friend WithEvents cmdRoll As Button ‘ rolls dice
10 Friend WithEvents cmdPlay As Button ‘ starts new game
11
12 ‘ dice displayed after each roll
13 Friend WithEvents picDie1 As PictureBox
14 Friend WithEvents picDie2 As PictureBox
15
16 ‘ pointDiceGroup groups dice representing player’s point
17 Friend WithEvents pointDiceGroup As GroupBox
18 Friend WithEvents picPointDie1 As PictureBox
19 Friend WithEvents picPointDie2 As PictureBox
20
21 Friend WithEvents lblStatus As Label
22
Fig. 6.17 Craps game using class Random (part 1 of 4).
Chapter 6 Procedures 215
23 ‘ Visual Studio .NET generated code
24
25 ‘ die-roll constants
26 Enum DiceNames
27 SNAKE_EYES = 2
28 TREY = 3
29 CRAPS = 7
30 YO_LEVEN = 11
31 BOX_CARS = 12
32 End Enum
33
34 ‘ file-name and directory constants
35 Const FILE_PREFIX As String = “/images/die”
36 Const FILE_SUFFIX As String = “.png”
37
38 Dim myPoint As Integer
39 Dim myDie1 As Integer
40 Dim myDie2 As Integer
41 Dim randomObject As Random = New Random()
42
43 ‘ begins new game and determines point
44 Private Sub cmdPlay_Click(ByVal sender As System.Object, _
45 ByVal e As System.EventArgs) Handles cmdPlay.Click
46
47 ‘ initialize variables for new game
48 myPoint = 0
49 pointDiceGroup.Text = “Point”
50 lblStatus.Text = “”
51
52 ‘ remove point-die images
53 picPointDie1.Image = Nothing
54 picPointDie2.Image = Nothing
55
56 Dim sum As Integer = RollDice()
57
58 ‘ check die roll
59 Select Case sum
60
61 Case DiceNames.CRAPS, DiceNames.YO_LEVEN
62
63 ‘ disable roll button
64 cmdRoll.Enabled = False
65 lblStatus.Text = “You Win!!!”
66
67 Case DiceNames.SNAKE_EYES, _
68 DiceNames.TREY, DiceNames.BOX_CARS
69
70 cmdRoll.Enabled = False
71 lblStatus.Text = “Sorry. You Lose.”
72
73 Case Else
74 myPoint = sum
75 pointDiceGroup.Text = “Point is ” & sum
Fig. 6.17 Craps game using class Random (part 2 of 4).
216 Procedures Chapter 6
76 lblStatus.Text = “Roll Again!”
77 DisplayDie(picPointDie1, myDie1)
78 DisplayDie(picPointDie2, myDie2)
79 cmdPlay.Enabled = False
80 cmdRoll.Enabled = True
81
82 End Select
83
84 End Sub ‘ cmdPlay_Click
85
86 ‘ determines outcome of next roll
87 Private Sub cmdRoll_Click(ByVal sender As System.Object, _
88 ByVal e As System.EventArgs) Handles cmdRoll.Click
89
90 Dim sum As Integer = RollDice()
91
92 ‘ check outcome of roll
93 If sum = myPoint Then
94 lblStatus.Text = “You Win!!!”
95 cmdRoll.Enabled = False
96 cmdPlay.Enabled = True
97 ElseIf sum = DiceNames.CRAPS Then
98 lblStatus.Text = “Sorry. You Lose.”
99 cmdRoll.Enabled = False
100 cmdPlay.Enabled = True
101 End If
102
103 End Sub ‘ cmdRoll_Click
104
105 ‘ display die image
106 Sub DisplayDie(ByVal picDie As PictureBox, _
107 ByVal face As Integer)
108
109 ‘ assign die image to picture box
110 picDie.Image = _
111 Image.FromFile(Directory.GetCurrentDirectory & _
112 FILE_PREFIX & face & FILE_SUFFIX)
113 End Sub ‘ DisplayDie
114
115 ‘ generate random die rolls
116 Function RollDice() As Integer
117 Dim die1, die2 As Integer
118
119 ‘ determine random integer
120 die1 = randomObject.Next(1, 7)
121 die2 = randomObject.Next(1, 7)
122
123 ‘ display rolls
124 DisplayDie(picDie1, die1)
125 DisplayDie(picDie2, die2)
126
Fig. 6.17 Craps game using class Random (part 3 of 4).
Chapter 6 Procedures 217
After the constant-identifier declarations and the declarations for several instance variables
(lines 38–41), method cmdPlay_Click is defined (lines 44–84). Method
cmdPlay_Click is the event handler for the event cmdPlay.Click (created by
double-clicking cmdPlay in Design mode). In this example, the method’s task is to process
a user’s interaction with Button cmdPlay (which displays the text Play on the user
interface).
When the user clicks the Play button, method cmdPlay_Click sets up a new game
by initializing several values (lines 48–50). Setting the Image property of
picPointDie1 and picPointDie2 to Nothing (lines 53–54) causes the PictureBoxes
to appear blank. Keyword Nothing can be used with reference-type variables
to specify that no object is associated with the variable.
Method cmdPlay_Click executes the game’s opening roll by calling RollDice
(line 56). Internally, RollDice (lines 116–132) generates two random numbers and calls
method DisplayDie (lines 106–113), which loads an appropriate die image on the PictureBox
passed to it.
127 ‘ set values
128 myDie1 = die1
129 myDie2 = die2
130
131 Return die1 + die2
132 End Function ‘ RollDice
133
134 End Class ‘ FrmCrapsGame
Fig. 6.17 Craps game using class Random (part 4 of 4).
GroupBox PictureBoxes (displaying images)
218 Procedures Chapter 6
When RollDice returns, the Select structure (lines 59–82) analyzes the roll
returned by RollDice to determine how play should continue (i.e., by terminating the
game with a win or loss, or by enabling subsequent rolls). Depending on the value of the
roll, the buttons cmdRoll and cmdPlay become either enabled or disabled. Disabling a
Button causes no action to be performed when the Button is clicked. Buttons can be
enabled and disabled by setting the Enabled property to True or False.
If Button cmdRoll is enabled, clicking it invokes method cmdRoll_Click
(lines 87–103), which executes an additional roll of the dice. Method cmdRoll_Click
then analyzes the roll, letting users know whether they won or lost.
6.14 Recursion
In most of the programs we have discussed so far, procedures have called one another in a
disciplined, hierarchical manner. However, in some instances, it is useful to enable procedures
to call themselves. A recursive procedure is a procedure that calls itself either directly
or indirectly (i.e., through another procedure). Recursion is an important topic that is
discussed at length in upper-level computer science courses. In this section and the next,
we present simple examples of recursion.
Prior to examining actual programs containing recursive procedures, we first consider
recursion conceptually. Recursive problem-solving approaches have a number of elements
in common. A recursive procedure is called to solve a problem. The procedure actually
knows how to solve only the simplest case(s), or base case(s). If the procedure is called
with a base case, the procedure returns a result. If the procedure is called with a more complex
problem, the procedure divides the problem into two conceptual pieces; a piece that
the procedure knows how to perform (base case), and a piece that the procedure does not
know how to perform. To make recursion feasible, the latter piece must resemble the original
problem, but be a slightly simpler or smaller version of it. The procedure invokes
(calls) a fresh copy of itself to work on the smaller problem—this is referred to as a recursive
call, or a recursion step. The recursion step also normally includes the keyword
Return, because its result will be combined with the portion of the problem that the procedure
knew how to solve. Such a combination will form a result that will be passed back
to the original caller.
The recursion step executes while the original call to the procedure is still “open” (i.e.,
has not finished executing). The recursion step can result in many more recursive calls, as
the procedure divides each new subproblem into two conceptual pieces. As the procedure
continues to call itself with slightly simpler versions of the original problem, the sequence
of smaller and smaller problems must converge on the base case, so that the recursion can
eventually terminate. At that point, the procedure recognizes the base case and returns a
result to the previous copy of the procedure. A sequence of returns ensues up the line until
the original procedure call returns the final result to the caller. As an example of these concepts,
let us write a recursive program that performs a popular mathematical calculation.
The factorial of a nonnegative integer n, written n! (and read “n factorial”), is the product
n • ( n – 1 ) • ( n – 2 ) • … • 1
with 1! equal to 1, and 0! defined as 1. For example, 5! is the product 5 • 4 • 3 • 2 • 1, which
is equal to 120.
Chapter 6 Procedures 219
The factorial of an integer number greater than or equal to 0 can be calculated iteratively
(nonrecursively) using a For repetition structure, as follows:
Dim counter, factorial As Integer = 1
For counter = number To 1 Step -1
factorial *= counter
Next
We arrive at a recursive definition of the factorial procedure with the following relationship:
n! = n • ( n – 1 )!
For example, 5! is clearly equal to 5 • 4!, as is shown by the following:
5! = 5 • 4 • 3 • 2 • 1
5! = 5 • ( 4 • 3 • 2 • 1 )
5! = 5 • ( 4! )
A recursive evaluation of 5! would proceed as in Fig. 6.18. Figure 6.18a shows how
the succession of recursive calls proceeds until 1! is evaluated to be 1, which terminates the
recursion. Figure 6.18b depicts the values that are returned from each recursive call to its
caller until the final value is calculated and returned.
The program of Fig. 6.19 recursively calculates and prints factorials. (The choice of
the data type Long will be explained soon). The recursive method Factorial (lines 33–
41) first tests (line 35) to determine whether its terminating condition is true (i.e., number
is less than or equal to 1). If number is less than or equal to 1, Factorial returns 1, no
further recursion is necessary, and the method returns. If number is greater than 1, line 38
expresses the problem as the product of number and a recursive call to Factorial, evaluating
the factorial of number – 1. Note that Factorial(number – 1) is a slightly
simpler problem than the original calculation, Factorial(number).
Fig. 6.18 Recursive evaluation of 5!.
5!
5 * 4!
4 * 3!
3 * 2!
2 * 1!
1
(a) Procession of recursive calls (b) Values returned from each recursive call
5!
5 * 4!
4 * 3!
3 * 2!
2 * 1!
1
Final value = 120
5! = 5 * 24 = 120 is returned
4! = 4 * 6 = 24 is returned
3! = 3 * 2 = 6 is returned
2! = 2 * 1 = 2 is returned
1 returned
220 Procedures Chapter 6
Function Factorial (line 33) receives a parameter of type Long and returns a
result of type Long. As is seen in the output window of Fig. 6.19, factorial values escalate
quickly. We choose data type Long to enable the program to calculate factorials greater than
12!. Unfortunately, the values produced by the Factorial method increase at such a rate
that the range of even the Long type is quickly exceeded. This points to a weakness in most
programming languages: They are not easily extended to handle the unique requirements of
various applications, such as the evaluation of large factorials. As we will see in our treatment
of object-oriented programming beginning in Chapter 8, Visual Basic is an extensible language—
programmers with unique requirements can extend the language with new data types
(called classes). For example, a programmer could create a HugeInteger class that would
enable a program to calculate the factorials of arbitrarily large numbers.
1 ‘ Fig. 6.19: Factorial.vb
2 ‘ Calculating factorials using recursion.
34
Public Class FrmFactorial
5 Inherits System.Windows.Forms.Form
67
Friend WithEvents lblEnter As Label ‘ prompts for Integer
8 Friend WithEvents lblFactorial As Label ‘ indicates output
9
10 Friend WithEvents txtInput As TextBox ‘ reads an Integer
11 Friend WithEvents txtDisplay As TextBox ‘ displays output
12
13 Friend WithEvents cmdCalculate As Button ‘ generates output
14
15 ‘ Visual Studio .NET generated code
16
17 Private Sub cmdCalculate_Click(ByVal sender As System.Object, _
18 ByVal e As System.EventArgs) Handles cmdCalculate.Click
19
20 Dim value As Integer = Convert.ToInt32(txtInput.Text)
21 Dim i As Integer
22 Dim output As String
23
24 txtDisplay.Text = “”
25
26 For i = 0 To value
27 txtDisplay.Text &= i & “! = ” & Factorial(i) & vbCrLf
28 Next
29
30 End Sub ‘ cmdCalculate_Click
31
32 ‘ recursively generates factorial of number
33 Function Factorial(ByVal number As Long) As Long
34
35 If number Add Module.]
FrmDiceModuleTest in Fig. 6.26 demonstrates using the modDice procedures to
respond to button clicks. Procedure cmdRollDie1_Click (lines 23–27) rolls a die and
obtains the default image. We call procedures contained in modDice by following the
module name with the dot (.) operator and the procedure name. Using the functionality
provided by modDice, the body of this procedure requires only one statement (line 26).
Thus, we easily can create a similar Button, cmdRollDie2. In this case, procedure
cmdRollDie2_Click (lines 29–34) uses the Optional argument to prefix the image
name and select a different image. Procedure cmdRollTen_Click (lines 36–40) sets the
Text property of lblSum to the result of 10 rolls.
1 ‘ Fig. 6.25: DiceModule.vb
2 ‘ A collection of common dice procedures.
34
Imports System.IO
56
Module modDice
78
Dim randomObject As Random = New Random()
9
10 ‘ rolls single die
11 Function RollDie() As Integer
12 Return randomObject.Next(1, 7)
13 End Function ‘ RollDie
14
15 ‘ die summation procedure
16 Function RollAndSum(ByVal diceNumber As Integer) _
17 As Integer
18
19 Dim i As Integer
20 Dim sum As Integer = 0
21
Fig. 6.25 Module used to define a group of related procedures (part 1 of 2).
232 Procedures Chapter 6
For the program in Fig. 6.26, we add DiceModule.vb to the project to provide access
to the procedures defined in modDice. To include a module in a project, select
File > Add Existing Item…. In the dialog that is displayed, select the module file name
and click Open. By default, a copy the file is added to the project directory unless you specify
to open the module file as a linked file. Once a module has been added to a project, the procedures
contained in the module have namespace scope. By default, procedures with
namespace scope are accessible to all other parts of a project, such as methods in classes and
procedures in other modules. Although it is not necessary, the programmer may place the file
containing the module’s code in the same directory as the other files for the project.
22 For i = 1 To diceNumber
23 sum += RollDie()
24 Next
25
26 Return sum
27 End Function ‘ RollAndSum
28
29 ‘ returns die image
30 Function GetDieImage(ByVal dieValue As Integer, _
31 Optional ByVal baseImageName As String = “die”) _
32 As System.Drawing.Image
33
34 Return Image.FromFile( _
35 Directory.GetCurrentDirectory & _
36 “\Images\” & baseImageName & dieValue & “.png”)
37 End Function ‘ GetDieImage
38
39 End Module ‘ modDice
1 ‘ Fig. 6.26: DiceModuleTest.vb
2 ‘ Demonstrates modDiceModule procedures
34
Imports System.Drawing
56
Public Class FrmDiceModuleTest
7 Inherits System.Windows.Forms.Form
89
Friend WithEvents lblSum As Label ‘ displays 10-roll sum
10
11 Friend WithEvents diceGroup As GroupBox
12
13 ‘ dice images
14 Friend WithEvents picDie1 As PictureBox
15 Friend WithEvents picDie2 As PictureBox
16
17 Friend WithEvents cmdRollDie1 As Button ‘ rolls blue die
18 Friend WithEvents cmdRollTen As Button ‘ simulates 10 rolls
19 Friend WithEvents cmdRollDie2 As Button ‘ rolls red die
Fig. 6.26 Testing the modDice procedures (part 1 of 2).
Fig. 6.25 Module used to define a group of related procedures (part 2 of 2).
Chapter 6 Procedures 233
SUMMARY
• Experience has shown that the best way to develop and maintain a large program is to construct it
from small, manageable pieces. This technique is known as divide and conquer.
• Visual Basic programs consist of many pieces, including modules and classes.
• Modules and classes are composed of smaller pieces called procedures. When procedures are contained
in a class, we refer to them as methods.
• Visual Basic provides many classes and methods in the .NET Framework Class Library (FCL).
This rich collection of features allows programmers to develop robust applications quickly.
• Three types of procedures exist: Sub procedures, Function procedures and event procedures.
• Procedures promote software reusability—the ability to use existing procedures as building blocks
for new programs.
• The first statement of a procedure definition is the procedure header.
20
21 ‘ Visual Studio .NET generated code
22
23 Private Sub cmdRollDie1_Click(ByVal sender As System.Object, _
24 ByVal e As System.EventArgs) Handles cmdRollDie1.Click
25
26 picDie1.Image = modDice.GetDieImage(modDice.RollDie())
27 End Sub ‘ cmdRollDie1_Click
28
29 Private Sub cmdRollDie2_Click(ByVal sender As System.Object, _
30 ByVal e As System.EventArgs) Handles cmdRollDie2.Click
31
32 picDie2.Image = modDice.GetDieImage(modDice.RollDie(), _
33 “redDie”)
34 End Sub ‘ cmdRollDie2_Click
35
36 Private Sub cmdRollTen_Click(ByVal sender As System.Object, _
37 ByVal e As System.EventArgs) Handles cmdRollTen.Click
38
39 lblSum.Text = Convert.ToString(modDice.RollAndSum(10))
40 End Sub ‘ cmdRollTen_Click
41
42 End Class ‘ FrmDiceModuleTest
Fig. 6.26 Testing the modDice procedures (part 2 of 2).
234 Procedures Chapter 6
• The declarations and statements in the procedure definition form the procedure body.
• The procedure header and procedure call must agree with regard to the number, type and order of
arguments.
• The characteristics of Function procedures are similar to those of Sub procedures. However,
Function procedures return a value (i.e., send back a value) to the caller.
• In a Function header, the return type indicates the data type of the result returned from the
Function to its caller.
• Keyword Return, followed by an expression, returns a value from a Function procedure.
• If a Function procedure body does not specify a Return statement, program control returns to
the point at which a procedure was invoked when the End Function keywords are encountered.
• An event represents a user action, such as the clicking of a button or the alteration of a value.
• Calls to methods, such as Math.Max, that are defined in a separate class must include the class
name and the dot (.) operator (also called the member access operator). However, calls to methods
defined in the class that contains the method call need only specify the method name.
• The Parameter Info feature of the IDE identifies accessible procedures and their arguments. Parameter
Info greatly simplifies coding. The Parameter Info feature provides information not only
about programmer-defined procedures, but about all methods contained in the FCL.
• The IntelliSense feature displays all the members in a class.
• Widening conversion occurs when a type is converted to another type (usually one that can hold
more data) without losing data.
• Narrowing conversion occurs when there is potential for data loss during a conversion (usually to
a type that holds a smaller amount of data). Some narrowing conversions can fail, resulting in runtime
errors and logic errors.
• Visual Basic supports both widening and narrowing conversions.
• Option Explicit, which is set to On by default, forces the programmer to declare all variables
explicitly before they are used in a program. Forcing explicit declarations eliminates spelling errors
and other subtle errors that may occur if Option Explicit is turned Off.
• Option Strict, which is set to Off by default, increases program clarity and reduces debugging
time. When set to On, Option Strict requires the programmer to perform all narrowing
conversions explicitly.
• The methods in class Convert changes data types explicitly. The name of each conversion method
is the word To, followed by the name of the data type to which the method converts its argument.
• All data types can be categorized as either value types or reference types. A variable of a value
type contains data of that type. A variable of a reference type contains the location in memory
where the data is stored.
• Both value and reference types include built-in types and types that programmers can create.
• Values typed directly in program code are called literals. Each literal corresponds to one of the
primitive data types. Some of Visual Basic’s data types use special notations, such as type characters,
for creating literals.
• Arguments are passed in one of two ways: Pass-by-value and pass-by-reference (also called callby-
value and call-by-reference).
• When an argument is passed by value, the program makes a copy of the argument’s value and passes
that copy to the called procedure. Changes to the called procedure’s copy do not affect the original
variable’s value.
Chapter 6 Procedures 235
• When an argument is passed by reference, the caller gives the procedure the ability to access and
modify the caller’s original data directly. Pass-by-reference can improve performance, because it
eliminates the need to copy large data items, such as large objects; however, pass-by-reference can
weaken security, because the called procedure can modify the caller’s data.
• By default, the code editor includes keyword ByVal in parameter declarations to indicate that the
parameter is passed by value. In the case of value-type variables, this means that the value stored
in the variable is copied and passed to the procedure, preventing the procedure from accessing the
original value in the variable.
• Value-type arguments enclosed in parentheses, (), are passed by value even if the procedure
header declares the parameter with keyword ByRef.
• An identifier’s duration (also called its lifetime) is the period during which the identifier exists in
memory.
• Identifiers that represent local variables in a procedure (i.e., parameters and variables declared in
the procedure body) have automatic duration. Automatic-duration variables are created when program
control enters the procedure in which they are declared, exist while the procedure is active
and are destroyed when the procedure is exited.
• Variables declared with keyword Static inside a procedure definition have static duration,
meaning they have the same duration as the Class or Module that contains the procedure.
• The scope (sometimes called declaration space) of a variable, reference or procedure identifier is
the portion of the program in which the identifier can be accessed. The possible scopes for an identifier
are class scope, module scope, namespace scope and block scope.
• In Visual Basic .NET, identifiers declared inside a block, such as the body of a procedure definition
or the body of an If selection structure, have block scope. Block scope begins at the identifier’s
declaration and ends at the block’s End statement.
• Procedures in a module have namespace scope, which means that they may be accessed throughout
a project.
• It is possible to create variables with namespace scope by replacing keyword Dim with keyword
Public in the declaration of a variable in a module.
• Constant identifiers and Enumerations enhance program readability by providing descriptive
identifiers for numbers or Strings that have special meaning.
• A recursive procedure is a procedure that calls itself, either indirectly (i.e., through another procedure)
or directly.
• Any problem that can be solved recursively also can be solved iteratively (nonrecursively).
• The element of chance can be introduced into computer applications through class Random (located
in namespace System). Method Next returns a random number.
• Overloading allows the programmer to define several procedures with the same name, as long as
these procedures have different sets of parameters (number of parameters, types of the parameters
and order of the parameters). This allows the programmer to reduce the complexity of the program
and create a more flexible application.
• Overloaded procedures are distinguished by their signatures, which are a combination of the procedure’s
name and parameter types. The compiler uses a logical process known as overload resolution
to determine which procedure should be called.
• Procedure calls cannot be distinguished by return type. A syntax error is generated when two procedures
have the same signature and different return types. However, overloaded procedures with
different signatures can have different return types.
236 Procedures Chapter 6
• Programmers use modules to group related procedures so that they can be reused in other projects.
Modules are similar in many ways to classes; they allow programmers to build reusable components
without a full knowledge of object-oriented programming.
• Once a module has been added to a project, the procedures contained in the module have
namespace scope. By default, procedures with namespace scope are accessible to all other parts of
a project, such as methods in classes and procedures in other modules.
• Visual Basic allows programmers to create procedures that take one or more optional arguments.
When a parameter is declared as optional, the caller has the option of passing that particular argument.
Optional arguments are specified in the procedure header with keyword Optional.
TERMINOLOGY
. (dot operator) infinite recursion
argument to a procedure call inheritance
automatic duration instance variables of a class
automatic initialization of a variable interface
base case invoke
block scope iteration
Button class lifetime of an identifier
ByRef keyword local variable
ByVal keyword Math class method
call-by-reference method
call-by-value method body
calling procedure method call
class method overloading
class scope mixed-type expression
Click event Module
coercion of arguments modularizing a program with procedures
comma-separated list of arguments named constant
complexity theory narrowing conversion
Const keyword nested block
constant identifier nested control structure
control structures in iteration Next method
control structures in recursion optional argument
convergence Optional keyword
declaration overloaded procedure
default argument parameter list
divide-and-conquer approach parentheses
duration of an identifier pass-by-reference
Enum keyword pass-by-value
enumeration precedence
event handling principle of least privilege
exhausting memory procedure
exponential “explosion” of calls procedure body
Factorial method procedure call
Fibonacci series, defined recursively procedure overloading
Function procedure programmer-defined procedure
golden ratio promotions for primitive data types
hierarchical structure Public keyword
infinite loop Random class
Chapter 6 Procedures 237
SELF-REVIEW EXERCISES
6.1 Fill in the blanks in each of the following statements:
a) Procedures in Visual Basic can be defined in and .
b) A procedure is invoked with a .
c) A variable known only within the procedure in which it is defined is called a .
d) The statement in a called Function procedure can be used to pass the value
of an expression back to the calling procedure.
e) A procedure defined with keyword does not return a value.
f) The of an identifier is the portion of the program in which the identifier can
be used.
g) The three ways to return control from a called Sub procedure to a caller are ,
and .
h) The method in class Random produces random numbers.
i) Variables declared in a block or in a procedure’s parameter list are of duration.
j) A procedure that calls itself either directly or indirectly is a procedure.
k) A recursive procedure typically has two components: One that provides a means for the
recursion to terminate by testing for a case, and one that expresses the problem
as a recursive call for a problem slightly simpler than the original call.
l) In Visual Basic, it is possible to have various procedures with the same name that operate
on different types or numbers of arguments. This is called procedure .
m) Local variables declared at the beginning of a procedure have scope, as do
procedure parameters, which are considered local variables of the procedure.
n) Iteration uses a structure.
o) Recursion uses a structure.
p) Recursion achieves repetition through repeated calls.
q) It is possible to define procedures with the same , but different parameter
lists.
r) Recursion terminates when the is reached.
s) The is a comma-separated list containing the declarations of the parameters
received by the called procedure.
t) The is the data type of the result returned from a called Function procedure.
u) An is a signal that is sent when some action takes place, such as a button being
clicked.
6.2 State whether each of the following is true or false. If false, explain why.
a) Math method Abs rounds its parameter to the smallest integer.
recursive evaluation signature
recursive method simulation
reference type software reusability
Return keyword Static duration
return-value type Sub procedure
scaling factor termination test
scientific notation type character
scope of an identifier user-interface event
sequence of random numbers value type
shifting value widening conversion
side effect
238 Procedures Chapter 6
b) Math method Exp is the exponential method that calculates ex.
c) A recursive procedure is one that calls itself.
d) Conversion from type Single to type Double requires a widening conversion.
e) Variable type Char cannot be converted to type Integer.
f) When a procedure recursively calls itself, it is known as the base case.
g) Forgetting to return a value from a recursive procedure when one is needed results in a
logic error.
h) Infinite recursion occurs when a procedure converges on the base case.
i) Visual Basic supports Optional arguments.
j) Any problem that can be solved recursively also can be solved iteratively.
6.3 For the program in Fig. 6.27, state the scope (either class scope or block scope) of each of the
following elements:
a) The variable i.
b) The variable base.
c) The method Cube.
d) The method FrmCubeTest_Load.
e) The variable output.
6.4 Write an application that tests whether the examples of the Math class method calls shown
in Fig. 6.7 actually produce the indicated results.
6.5 Give the procedure header for each of the following:
a) Procedure Hypotenuse, which takes two double-precision, floating-point arguments,
side1 and side2, and returns a double-precision, floating-point result.
b) Procedure Smallest, which takes three integers, x, y and z, and returns an integer.
c) Procedure Instructions, which does not take any arguments and does not return a
value.
d) Procedure IntegerToSingle, which takes an integer argument, number, and returns
a floating-point result.
6.6 Find the error in each of the following program segments and explain how the error can be
corrected:
1 ‘ Fig. 6.27: CubeTest.vb
2 ‘ Printing the cubes of 1-10.
34
Public Class FrmCubeTest
5 Inherits System.Windows.Forms.Form
67
Friend WithEvents lblOutput As Label
89
‘ Visual Studio .NET generated code
10
11 Dim i As Integer
12
13 Private Sub FrmCubeTest_Load(ByVal sender As System.Object, _
14 ByVal e As System.EventArgs) Handles MyBase.Load
15
16 Dim output As String = “”
17
Fig. 6.27 Printing the results of cubing 10 numbers (part 1 of 2).
Chapter 6 Procedures 239
a) Sub General1()
Console.WriteLine(“Inside procedure General1″)
Sub General2()
Console.WriteLine(“Inside procedure General2″)
End Sub ‘ General2
End Sub ‘ General1
b) Function Sum(ByVal x As Integer, ByVal y As Integer) _
As Integer
Dim result As Integer
result = x + y
End Function ‘ Sum
c) Sub Printer1(ByVal value As Single)
Dim value As Single
Console.WriteLine(value)
End Sub ‘ Printer1
d) Sub Product()
Dim a As Integer = 6
Dim b As Integer = 5
Dim result As Integer = a * b
Console.WriteLine(“Result is ” & result)
Return result
End Sub ‘ Product
e) Function Sum(ByVal value As Integer) As Integer
If value = 0 Then
Return 0
Else
value += Sum(value – 1)
End If
End Function ‘ Sum
18 For i = 1 To 10
19 output &= Cube(i) & vbCrLf
20 Next
21
22 lblOutput.Text = output
23 End Sub ‘ FrmCubeTest_Load
24
25 Function Cube(ByVal base As Integer) As Integer
26 Return Convert.ToInt32(base ^ 3)
27 End Function ‘ Cube
28
29 End Class ‘ FrmCubeTest
Fig. 6.27 Printing the results of cubing 10 numbers (part 2 of 2).
240 Procedures Chapter 6
ANSWERS TO SELF-REVIEW EXERCISES
6.1 a) classes, modules. b) procedure call. c) local variable. d) Return. e) Sub. f) scope.
g) Return, Exit Sub, encountering the End Sub statement. h) Next. i) automatic. j) recursive.
k) base. l) overloading. m) block. n) repetition. o) selection. p) procedure. q) name. r) base case. s)
parameter list. t) return-value type. u) event.
6.2 a) False. Math method Abs returns the absolute value of a number. b) True. c) True. d) True.
e) False. Type Char can be converted to type Integer with a narrowing conversion. f) False. A
procedure’s recursively calling itself is known as the recursive call or recursion step. g) True. h) False.
Infinite recursion occurs when a recursive procedure does not converge on the base case. i) True.
j) True.
6.3 a) Class scope. b) Block scope. c) Class scope. d) Class scope. e) Block scope.
6.4 The following code demonstrates the use of some Math library method calls:
1 ‘ Ex. 6.4: MathTest.vb
2 ‘ Testing the Math class methods
34
Module modMathTest
56
Sub Main()
7 Console.WriteLine(“Math.Abs(23.7) = ” & _
8 Convert.ToString(Math.Abs(23.7)))
9 Console.WriteLine(“Math.Abs(0.0) = ” & _
10 Convert.ToString(Math.Abs(0)))
11 Console.WriteLine(“Math.Abs(-23.7) = ” & _
12 Convert.ToString(Math.Abs(-23.7)))
13 Console.WriteLine(“Math.Ceiling(9.2) = ” & _
14 Convert.ToString(Math.Ceiling(9.2)))
15 Console.WriteLine(“Math.Ceiling(-9.8) = ” & _
16 Convert.ToString(Math.Ceiling(-9.8)))
17 Console.WriteLine(“Math.Cos(0.0) = ” & _
18 Convert.ToString(Math.Cos(0)))
19 Console.WriteLine(“Math.Exp(1.0) = ” & _
20 Convert.ToString(Math.Exp(1)))
21 Console.WriteLine(“Math.Exp(2.0) = ” & _
22 Convert.ToString(Math.Exp(2)))
23 Console.WriteLine(“Math.Floor(9.2) = ” & _
24 Convert.ToString(Math.Floor(9.2)))
25 Console.WriteLine(“Math.Floor(-9.8) = ” & _
26 Convert.ToString(Math.Floor(-9.8)))
27 Console.WriteLine(“Math.Log(2.718282) = ” & _
28 Convert.ToString(Math.Log(2.718282)))
29 Console.WriteLine(“Math.Log(7.389056) = ” & _
30 Convert.ToString(Math.Log(7.389056)))
31 Console.WriteLine(“Math.Max(2.3, 12.7) = ” & _
32 Convert.ToString(Math.Max(2.3, 12.7)))
33 Console.WriteLine(“Math.Max(-2.3, -12.7) = ” & _
34 Convert.ToString(Math.Max(-2.3, -12.7)))
35 Console.WriteLine(“Math.Min(2.3, 12.7) = ” & _
36 Convert.ToString(Math.Min(2.3, 12.7)))
37 Console.WriteLine(“Math.Min(-2.3, -12.7) = ” & _
38 Convert.ToString(Math.Min(-2.3, -12.7)))
Chapter 6 Procedures 241
6.5 a) Function Hypotenuse(ByVal side1 As Double, _
ByVal side2 As Double) As Double
b) Function Smallest(ByVal x As Integer, _
ByVal y As Integer, ByVal z As Integer) As Integer
c) Sub Instructions()
d) Function IntegerToSingle(ByVal number As Integer) As Single
6.6 a) Error: Procedure General2 is defined in procedure General1.
Correction: Move the definition of General2 out of the definition of General1.
b) Error: The procedure is supposed to return an Integer, but does not.
Correction: Delete the statement result = x + y and place the following statement in
the method:
39 Console.WriteLine(“Math.Pow(2, 7) = ” & _
40 Convert.ToString(Math.Pow(2, 7)))
41 Console.WriteLine(“Math.Pow(9, .5) = ” & _
42 Convert.ToString(Math.Pow(9, 0.5)))
43 Console.WriteLine(“Math.Sin(0.0) = ” & _
44 Convert.ToString(Math.Sin(0)))
45 Console.WriteLine(“Math.Sqrt(9.0) = ” & _
46 Convert.ToString(Math.Sqrt(9)))
47 Console.WriteLine(“Math.Sqrt(2.0) = ” & _
48 Convert.ToString(Math.Sqrt(2)))
49 Console.WriteLine(“Math.Tan(0.0) = ” & _
50 Convert.ToString(Math.Tan(0)))
51
52 End Sub ‘ Main
53
54 End Module ‘ modMathTest
Math.Abs(23.7) = 23.7
Math.Abs(0.0) = 0
Math.Abs(-23.7) = 23.7
Math.Ceiling(9.2) = 10
Math.Ceiling(-9.8) = -9
Math.Cos(0.0) = 1
Math.Exp(1.0) = 2.71828182845905
Math.Exp(2.0) = 7.38905609893065
Math.Floor(9.2) = 9
Math.Floor(-9.8) = -10
Math.Log(2.718282) = 1.00000006310639
Math.Log(7.389056) = 1.99999998661119
Math.Max(2.3, 12.7) = 12.7
Math.Max(-2.3, -12.7) = -2.3
Math.Min(2.3, 12.7) = 2.3
Math.Min(-2.3, -12.7) = -12.7
Math.Pow(2, 7) = 128
Math.Pow(9, .5) = 3
Math.Sin(0.0) = 0
Math.Sqrt(9.0) = 3
Math.Sqrt(2.0) = 1.4142135623731
Math.Tan(0.0) = 0
242 Procedures Chapter 6
Return x + y
or add the following statement at the end of the method body:
Return result
c) Error: Parameter value is redefined in the procedure definition.
Correction: Delete the declaration Dim value As Single.
d) Error: The procedure returns a value, but is defined as a Sub procedure.
Correction: Change the procedure to a Function procedure with return type Integer.
e) Error: The result of value += Sum(value – 1) is not returned by this recursive method,
resulting in a logic error.
Correction: Rewrite the statement in the Else clause as
Return value + sum(value – 1)
EXERCISES
6.7 What is the value of x after each of the following statements is performed?
a) x = Math.Abs(7.5)
b) x = Math.Floor(7.5)
c) x = Math.Abs(0.0)
d) x = Math.Ceiling(0.0)
e) x = Math.Abs(-6.4)
f) x = Math.Ceiling(-6.4)
g) x = Math.Ceiling(-Math.Abs(-8 + Math.Floor(-5.5)))
6.8 A parking garage charges a $2.00 minimum fee to park for up to three hours. The garage
charges an additional $0.50 per hour for each hour or part thereof in excess of three hours. The maximum
charge for any given 24-hour period is $10.00. Assume that no car parks for longer than 24
hours at a time. Write a program that calculates and displays the parking charges for each customer
who parked a car in this garage yesterday. You should enter in a TextBox the hours parked for each
customer. The program should display the charge for the current customer. The program should use
the method CalculateCharges to determine the charge for each customer. Use the techniques
described in the chapter to read the Double value from a TextBox.
6.9 Write a method IntegerPower(base, exponent) that returns the value of
baseexponent
For example, IntegerPower(3, 4) = 3 * 3 * 3 * 3. Assume that exponent is a positive integer
and that base is an integer. Method IntegerPower should use a For/Next loop or While loop to
control the calculation. Do not use any Math library methods or the exponentiation operator, ^. Incorporate
this method into a Windows application that reads integer values from TextBoxes for base
and exponent from the user and performs the calculation by calling method IntegerPower.
6.10 Define a method Hypotenuse that calculates the length of the hypotenuse of a right triangle
when the other two sides are given. The method should take two arguments of type Double and
return the hypotenuse as a Double. Incorporate this method into a Windows application that reads
integer values for side1 and side2 from TextBoxes and performs the calculation with the Hypotenuse
method. Determine the length of the hypotenuse for each of the following triangles:
Chapter 6 Procedures 243
6.11 Write a method SquareOfAsterisks that displays a solid square of asterisks whose side
is specified in integer parameter side. For example, if side is 4, the method displays
****
****
****
****
Incorporate this method into a Windows application that reads an integer value for side from the
user and performs the drawing with the SquareOfAsterisks method. This method should
gather data from Textboxes and should print to a Label.
6.12 Modify the method created in Exercise 6.11 to form the square out of whatever character is
contained in parameter fillCharacter. Thus, if side is 5 and fillCharacter is “#”, this
method should print
#####
#####
#####
#####
#####
6.13 Write a Windows application that simulates coin tossing. Let the program toss the coin each
time the user presses the Toss button. Count the number of times each side of the coin appears. Display
the results. The program should call a separate method Flip, which takes no arguments and returns
False for tails and True for heads. [Note: If the program simulates the coin
tossing realistically, each side of the coin should appear approximately half the time.]
6.14 Computers are playing an increasing role in education. Write a program that will help an elementary
school student learn multiplication. Use the Next method from an object of type Random
to produce two positive one-digit integers. It should display a question, such as
How much is 6 times 7?
The student should then type the answer into a TextBox. Your program should check the student’s
answer. If it is correct, display “Very good!” in a Label, then ask another multiplication question.
If the answer is incorrect, display “No. Please try again.” in the same Label, then let
the student try the same question again until the student finally gets it right. A separate method
should be used to generate each new question. This method should be called once when the program
begins execution and then each time the user answers a question correctly.
6.15 (Towers of Hanoi) Every budding computer scientist must grapple with certain classic problems;
the Towers of Hanoi (Fig. 6.28) is one of the most famous. Legend has it that, in a temple in
the Far East, priests are attempting to move a stack of disks from one peg to another. The initial stack
had 64 disks threaded onto one peg and arranged from bottom to top by decreasing size. The priests
are attempting to move the stack from this peg to a second peg, under the constraints that exactly one
disk is moved at a time and that at no time may a larger disk be placed above a smaller disk. A third
peg is available for temporarily holding disks. Supposedly, the world will end when the priests complete
their task, so there is little incentive for us to facilitate their efforts.
Triangle Side 1 Side 2
1 3.0 4.0
2 5.0 12.0
3 8.0 15.0
244 Procedures Chapter 6
Let us assume that the priests are attempting to move the disks from peg 1 to peg 3. We wish to
develop an algorithm that prints the precise sequence of peg-to-peg disk transfers.
If we were to approach this problem with conventional techniques, we would find ourselves
hopelessly knotted up in managing the disks. However, if we approach the problem with recursion in
mind, it becomes tractable. Moving n disks can be viewed in terms of moving only n – 1 disks (and
hence, the recursion) as follows:
a) Move n – 1 disks from peg 1 to peg 2, using peg 3 as a temporary holding area.
b) Move the last disk (the largest) from peg 1 to peg 3.
c) Move the n – 1 disks from peg 2 to peg 3, using peg 1 as a temporary holding area.
The process ends when the last task involves moving n = 1 disk (i.e., the base case). This is
accomplished by moving the disk without the need for a temporary holding area.
Write a program to solve the Towers of Hanoi problem. Allow the user to enter the number of
disks in a TextBox. Use a recursive Tower method with four parameters:
a) The number of disks to be moved
b) The peg on which these disks are threaded initially
c) The peg to which this stack of disks is to be moved
d) The peg to be used as a temporary holding area
Your program should display in a TextBox with scrolling functionality the precise instructions
for moving the disks from the starting peg to the destination peg. For example, to move a stack
of three disks from peg 1 to peg 3, your program should print the following series of moves:
1 →3 (This means move one disk from peg 1 to peg 3.)
1 →2
3 →2
1 →3
2 →1
2 →3
1 →3
Fig. 6.28 Towers of Hanoi for the case with four disks.
7
Arrays
Objectives
• To introduce the array data structure.
• To understand how arrays store, sort and search lists
and tables of values.
• To understand how to declare an array, initialize an
array and refer to individual elements of an array.
• To be able to pass arrays to methods.
• To understand basic sorting techniques.
• To be able to declare and manipulate
multi-dimensional arrays.
With sobs and tears he sorted out
Those of the largest size …
Lewis Carroll
Attempt the end, and never stand to doubt;
Nothing’s so hard, but search will find it out.
Robert Herrick
Now go, write it before them in a table,
and note it in a book.
Isaiah 30:8
‘Tis in my memory lock’d,
And you yourself shall keep the key of it.
William Shakespeare
246 Arrays Chapter 7
William Shakespeare
7.1 Introduction
This chapter introduces basic concepts and features of data structures. Arrays are data structures
consisting of data items of the same type. Arrays are “static” entities, in that they remain
the same size once they are created, although an array reference may be reassigned to
a new array of a different size. We begin by discussing constructing and accessing arrays;
we build on this knowledge to conduct more complex manipulations of arrays, including
powerful searching and sorting techniques. We then demonstrate the creation of more sophisticated
arrays that have multiple dimensions. Chapter 24, Data Structures and Collections,
introduces dynamic data structures, such as lists, queues, stacks and trees, which can
grow and shrink as programs execute. This later chapter also presents Visual Basic’s predefined
data structures that enable the programmer to use existing data structures for lists,
queues, stacks and trees, rather than “reinventing the wheel.”
7.2 Arrays
An array is a group of contiguous memory locations that have the same name and the same
type. Array names follow the same conventions that apply to other variable names, as was
discussed in Chapter 3, Introduction to Visual Basic Programming. To refer to a particular
Outline
7.1 Introduction
7.2 Arrays
7.3 Declaring and Allocating Arrays
7.4 Examples Using Arrays
7.4.1 Allocating an Array
7.4.2 Initializing the Values in an Array
7.4.3 Summing the Elements of an Array
7.4.4 Using Arrays to Analyze Survey Results
7.4.5 Using Histograms to Display Array Data Graphically
7.5 Passing Arrays to Procedures
7.6 Passing Arrays: ByVal vs. ByRef
7.7 Sorting Arrays
7.8 Searching Arrays: Linear Search and Binary Search
7.8.1 Searching an Array with Linear Search
7.8.2 Searching a Sorted Array with Binary Search
7.9 Multidimensional Rectangular and Jagged Arrays
7.10 Variable-Length Parameter Lists
7.11 For Each/Next Repetition Structure
Summary • Terminology • Self-Review Exercises • Answers to Self-Review Exercises • Exercises•
Special Section: Recursion Exercises
Chapter 7 Arrays 247
location or element in an array, we specify the name of the array and the position number
of the element to which we refer. Position numbers are values that indicate specific locations
within arrays.
Figure 7.1 depicts an integer array named numberArray. This array contains 12 elements,
any one of which can be referred to by giving the name of the array followed by the
position number of the element in parentheses (). The first element in every array is the
zeroth element. Thus, the first element of array numberArray is referred to as number-
Array(0), the second element of array numberArray is referred to as number-
Array(1), the seventh element of array numberArray is referred to as
numberArray(6) and so on. The ith element of array numberArray is referred to as
numberArray(i – 1).
The position number in parentheses more formally is called an index (or a subscript).
An index must be an integer or an integer expression. If a program uses an expression as an
index, the expression is evaluated first to determine the index. For example, if variable
value1 is equal to 5, and variable value2 is equal to 6, then the statement
numberArray(value1 + value2) += 2
adds 2 to array element numberArray(11). Note that an indexed array name (i.e., the
array name followed by an index enclosed in parentheses) is an lvalue—it can be used on
the left side of an assignment statement to place a new value into an array element.
Fig. 7.1 Array consisting of 12 elements.
Name of array (note
that all elements of this
array have the same
name, numberArray)
Position number (index or
subscript) of the element
within array numberArray
numberArray(0)
numberArray(1)
numberArray(2)
numberArray(3)
numberArray(4)
numberArray(5)
numberArray(6)
numberArray(7)
numberArray(8)
numberArray(9)
numberArray(10)
numberArray(11)
-45
6
0
72
1543
-89
0
62
-3
1
6453
78
248 Arrays Chapter 7
Let us examine array numberArray in Fig. 7.1 more closely. The name of the array
is numberArray. The 12 elements of the array are referred to as numberArray(0)
through numberArray(11). The value of numberArray(0) is -45, the value of
numberArray(1) is 6, the value of numberArray(2) is 0, the value of number-
Array(7) is 62 and the value of numberArray(11) is 78. Values stored in arrays can
be employed in various calculations and applications. For example, to determine the sum
of the values contained in the first three elements of array numberArray and then store
the result in variable sum, we would write
sum = numberArray(0) + numberArray(1) + numberArray(2)
To divide the value of the seventh element of array numberArray by 2 and assign the
result to the variable result, we would write
result = numberArray(6) \ 2
Common Programming Error 7.1
It is important to note the difference between the “seventh element of the array” and “array
element seven.” Array indices begin at 0, which means that the “seventh element of the array”
has the index 6, whereas “array element seven” has the index 7 and is actually the
eighth element of the array. This confusion is a common source of “off-by-one” errors. 7.1
Every array in Visual Basic “knows” its own length. The length of the array (i.e., 12
in this case) is determined by the following expression:
numberArray.Length
All arrays have access to the methods and properties of class System.Array, including
the Length property. For instance, method GetUpperBound returns the index of the
last element in the array. Method GetUpperBound takes one argument indicating a dimension
of the array. We discuss arrays with multiple dimensions in Section 7.9. For onedimensional
arrays, such as numberArray, the argument passed to GetUpperBound
is 0. For example, expression
numberArray.GetUpperBound(0)
returns 11. Notice that the value returned by method GetUpperBound is one less than
the value of the array’s Length property. Classes, objects and class methods are discussed
in detail in Chapter 8, Object-Based Programming.
7.3 Declaring and Allocating Arrays
Arrays occupy space in memory. The amount of memory required by an array depends on
the length of the array and the size of the data type of the elements in the array. The declaration
of an array creates a variable that can store a reference to an array but does not create
the array in memory. To declare an array, the programmer provides the array’s name and
data type. The following statement declares the array in Fig. 7.1:
Dim numberArray As Integer()
Chapter 7 Arrays 249
The parentheses that follow the data type indicate that numberArray is an array.
Arrays can be declared to contain any data type. In an array of primitive data types, every
element of the array contains one value of the declared data type. For example, every element
of an Integer array contains an Integer value.
Before the array can be used, the programmer must specify the size of the array and
allocate memory for the array, using keyword New. Recall from Chapter 6 that keyword
New creates an object. Arrays are represented as objects in Visual Basic, so they too, must
be allocated using keyword New. The value stored in the array variable is actually a reference
to the location in the computer’s memory where the array object is created. All nonprimitive-
type variables are reference variables (normally called references). To allocate
memory for the array numberArray after it has been declared, the statement
numberArray = New Integer(11) {}
is used. In our example, the number 11 defines the upper bound for the array. Array bounds
determine what indices can be used to access an element in the array. Here, the array
bounds are 0 (which is implicit in the preceding statement) and 11, meaning that an index
outside these bounds cannot be used to access elements in the array. Notice that the actual
size of the array is one larger than the upper bound specified in the allocation.
The required braces ({ and }) are called an initializer list and specify the initial values
of the elements in the array. When the initializer list is empty, the elements in the array are
initialized to the default value for the data type of the elements of the array. The default
value is 0 for numeric primitive data-type variables, False for Boolean variables and
Nothing for references. Keyword Nothing denotes an empty reference (i.e., a value
indicating that a reference variable has not been assigned an address in the computer’s
memory). The initializer list also can contain a comma-separated list specifying the initial
values of the elements in the array. For instance,
Dim numbers As Integer()
numbers = New Integer() {1, 2, 3, 6}
declares and allocates an array containing four Integer values. Visual Basic can determine
the array bounds from the number of elements in the initializer list. Thus, it is not necessary
to specify the size of the array when a non-empty initializer list is present.
The allocation of an array can be combined into the declaration, as in the statement
Dim numberArray As Integer() = New Integer(11) {}
Separating the declaration and allocation statements is useful, however, when the size of an
array depends on user input or on values calculated at runtime.
Programmers can declare arrays via several alternative methods, which we discuss
throughout this chapter. For example, several arrays can be declared with a single statement;
the following statement declares two array variables of type Double():
Dim array1, array2 As Double()
7.4 Examples Using Arrays
This section presents several examples that demonstrate the declaration, allocation and initialization
of arrays, as well as various manipulations of array elements. For simplicity, the
250 Arrays Chapter 7
examples in this section use arrays that contain elements of type Integer. Please remember
that a program can declare an array to have elements of any data type.
7.4.1 Allocating an Array
The program of Fig. 7.2 uses keyword New to allocate an array of 10 Integer elements,
which are initially zero (the default value in an array of type Integer). The program displays
the array elements in tabular format in a dialog.
1 ‘ Fig. 7.2: CreateArray.vb
2 ‘ Declaring and allocating an array.
34
Imports System.Windows.Forms
56
Module modCreateArray
78
Sub Main()
9 Dim output As String
10 Dim i As Integer
11
12 Dim array As Integer() ‘ declare array variable
13 array = New Integer(9) {} ‘ allocate memory for array
14
15 output &= “Subscript ” & vbTab & “Value” & vbCrLf
16
17 ‘ display values in array
18 For i = 0 To array.GetUpperBound(0)
19 output &= i & vbTab & array(i) & vbCrLf
20 Next
21
22 output &= vbCrLf & “The array contains ” & _
23 array.Length & ” elements.”
24
25 MessageBox.Show(output, “Array of Integer Values”, _
26 MessageBoxButtons.OK, MessageBoxIcon.Information)
27 End Sub ‘ Main
28
29 End Module ‘ modCreateArray
Fig. 7.2 Creating an array.
Chapter 7 Arrays 251
Line 12 declares array—a variable capable of storing a reference to an array of
Integer elements. Line 13 allocates an array of 10 elements using New and assigns it to
array. The program builds its output in String output. Line 15 appends to output
the headings for the columns displayed by the program. The columns represent the index
for each array element and the value of each array element, respectively.
Lines 18–20 use a For structure to append the index number (represented by i) and
value of each array element (array(i)) to output. Note the use of zero-based counting
(remember, indices start at 0), so that the loop accesses every array element. Also notice,
in the header of the For structure, the expression array.GetUpperBound(0), used
to retrieve the upper bound of the array. The Length property (lines 22–23) returns the
number of elements in the array.
7.4.2 Initializing the Values in an Array
The program of Fig. 7.3 creates two integer arrays of 10 elements each and sets the values
of the elements, using an initializer list and a For structure. The arrays are displayed in tabular
format in a message dialog.
Line 12 uses one statement to declare array1 and array2 as variables that are
capable of referring to arrays of integers. Lines 16–17 allocate the 10 elements of array1
with New and initialize the values in the array, using an initializer list. Line 20 allocates
array2, whose size is determined by the expression array1.GetUpperBound(0),
meaning array1 and array2, in this particular program, have the same upper bound.
1 ‘ Fig. 7.3: InitArray.vb
2 ‘ Initializing arrays.
34
Imports System.Windows.Forms
56
Module modInitArray
78
Sub Main()
9 Dim output As String
10 Dim i As Integer
11
12 Dim array1, array2 As Integer() ‘ declare two arrays
13
14 ‘ initializer list specifies number of elements
15 ‘ and value of each element
16 array1 = New Integer() {32, 27, 64, 18, 95, _
17 14, 90, 70, 60, 37}
18
19 ‘ allocate array2 based on length of array1
20 array2 = New Integer(array1.GetUpperBound(0)) {}
21
22 ‘ set values in array2 by a calculation
23 For i = 0 To array2.GetUpperBound(0)
24 array2(i) = 2 + 2 * i
25 Next
26
Fig. 7.3 Initializing array elements two different ways (part 1 of 2).
252 Arrays Chapter 7
The For structure in lines 23–25 initializes each element in array2. The elements in
array2 are initialized (line 24) to the even integers 2, 4, 6, …, 20. These numbers are
generated by multiplying each successive value of the loop counter by 2 and adding 2 to
the product. The For structure in lines 31–34 uses the values in the arrays to build String
output, which is displayed in a MessageBox (lines 36–37).
7.4.3 Summing the Elements of an Array
Often, the elements of an array represent a series of values that are employed in a calculation.
For example, if the elements of an array represent a group of students’ exam grades, the instructor
might wish to total the elements of the array, then calculate the class average for the
exam. The program in Fig. 7.4 sums the values contained in a 10-element integer array.
27 output &= “Subscript ” & vbTab & “Array1″ & vbTab & _
28 “Array2″ & vbCrLf
29
30 ‘ display values for both arrays
31 For i = 0 To array1.GetUpperBound(0)
32 output &= i & vbTab & array1(i) & vbTab & array2(i) & _
33 vbCrLf
34 Next
35
36 MessageBox.Show(output, “Array of Integer Values”, _
37 MessageBoxButtons.OK, MessageBoxIcon.Information)
38 End Sub ‘ Main
39
40 End Module ‘ modInitArray
1 ‘ Fig. 7.4: SumArray.vb
2 ‘ Computing sum of elements in array.
34
Imports System.Windows.Forms
56
Module modSumArray
7
Fig. 7.4 Computing the sum of the elements in an array (part 1 of 2).
Fig. 7.3 Initializing array elements two different ways (part 2 of 2).
Chapter 7 Arrays 253
Lines 9–10 declare, allocate and initialize the 10-element array array. Line 16, in the
body of the For structure, performs the addition. Alternatively, the values supplied as initializers
for array could have been read into the program. For example, the user could
enter the values through a TextBox, or the values could be read from a file on disk. Additional
information about reading values into a program can be found in Chapter 17, Files
and Streams.
7.4.4 Using Arrays to Analyze Survey Results
Our next example uses arrays to summarize data collected in a survey. Consider the following
problem statement:
Forty students were asked to rate on a scale of 1 to 10 the quality of the food in the student
cafeteria, with 1 being “awful” and 10 being “excellent”. Place the 40 responses in an integer
array and determine the frequency of each rating.
This exercise represents a typical array-processing application (Fig. 7.5). We wish to
summarize the number of responses of each type (i.e., 1–10). Array responses (lines
14–16) is a 40-element integer array containing the students’ responses to the survey. Using
an 11-element array frequency, we can count the number of occurrences of each
response. We ignore the first element, frequency(0), because it is more logical to have
a survey response of 1 result in frequency(1) being incremented rather than incrementing
frequency(0). We can use each response directly as an index on the frequency
array. Each element of the array is used as a counter for one of the possible types
8 Sub Main()
9 Dim array As Integer() = New Integer() _
10 {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
11
12 Dim total As Integer = 0, i As Integer = 0
13
14 ‘ sum array element values
15 For i = 0 To array.GetUpperBound(0)
16 total += array(i)
17 Next
18
19 MessageBox.Show(“Total of array elements: ” & total, _
20 “Sum the elements of an Array”, MessageBoxButtons.OK, _
21 MessageBoxIcon.Information)
22 End Sub ‘ Main
23
24 End Module ‘ modSumArray
Fig. 7.4 Computing the sum of the elements in an array (part 2 of 2).
254 Arrays Chapter 7
of survey responses—frequency(1) counts the number of students who rated the food
as 1, frequency(7) counts the number of students who rated the food 7 and so on.
1 ‘ Fig. 7.5: StudentPoll.vb
2 ‘ Using arrays to display poll results.
34
Imports System.Windows.Forms
56
Module modStudentPoll
78
Sub Main()
9 Dim answer, rating As Integer
10 Dim output As String
11
12 ‘ student response array (typically input at run time)
13 Dim responses As Integer()
14 responses = New Integer() {1, 2, 6, 4, 8, 5, 9, 7, _
15 8, 10, 1, 6, 3, 8, 6, 10, 3, 8, 2, 7, 6, 5, 7, 6, _
16 8, 6, 7, 5, 6, 6, 5, 6, 7, 5, 6, 4, 8, 6, 8, 10}
17
18 ‘ response frequency array (indices 0 through 10)
19 Dim frequency As Integer() = New Integer(10) {}
20
21 ‘ count frequencies
22 For answer = 0 To responses.GetUpperBound(0)
23 frequency(responses(answer)) += 1
24 Next
25
26 output &= “Rating ” & vbTab & “Frequency ” & vbCrLf
27
28 For rating = 1 To frequency.GetUpperBound(0)
29 output &= rating & vbTab & frequency(rating) & vbCrLf
30 Next
31
32 MessageBox.Show(output, “Student Poll Program”, _
33 MessageBoxButtons.OK, MessageBoxIcon.Information)
34 End Sub ‘ Main
35
36 End Module ‘ modStudentPoll
Fig. 7.5 Simple student-poll analysis program.
Chapter 7 Arrays 255
Good Programming Practice 7.1
Strive for program clarity. Sometimes, it is worthwhile to forgo the most efficient use of memory
or processor time if the trade-off results in a clearer program. 7.1
Performance Tip 7.1
Sometimes, performance considerations outweigh clarity considerations. 7.1
The For structure (lines 22–24) reads the responses from the array responses one
at a time and increments one of the 10 counters in the frequency array (frequency(
1) to frequency(10)). The key statement in the loop appears in line 23. This
statement increments the appropriate frequency counter as determined by the value of
responses(answer).
Let us consider several iterations of the For structure. When counter answer is 0,
responses(answer) is the value of responses(0) (i.e., 1—see line 14). Therefore,
frequency(responses(answer)) actually is interpreted as frequency(
1), meaning the first counter in array frequency is incremented by one. In
evaluating the expression frequency(responses(answer)), Visual Basic starts
with the value in the innermost set of parentheses (answer, currently 0). The value of
answer is plugged into the expression, and Visual Basic evaluates the next set of parentheses
(responses(answer)). That value is used as the index for the frequency
array to determine which counter to increment (in this case, the 1 counter).
When answer is 1, responses(answer) is the value of responses(1) (i.e.,
2—see line 14). As a result, frequency(responses(answer)) actually is interpreted
as frequency(2), causing array element 2 (the third element of the array) to be
incremented.
When answer is 2, responses(answer) is the value of responses(2) (i.e.,
6—see line 14), so frequency(responses(answer)) is interpreted as frequency(
6), causing array element 6 (the seventh element of the array) to be incremented
and so on. Note that, regardless of the number of responses processed in the survey, only
an 11-element array (in which we ignore element zero) is required to summarize the results,
because all the response values are between 1 and 10, and the index values for an 11-element
array are 0–10. Note that, in the output in Fig. 7.5, the numbers in the frequency
column correctly add to 40 (the elements of the frequency array were initialized to zero
when the array was allocated with New).
If the data contained out-of-range values, such as 13, the program would attempt to add
1 to frequency(13). This is outside the bounds of the array. In other languages like C
and C++ programming languages, such a reference would be allowed by the compiler and
at execution time. The program would “walk” past the end of the array to where it thought
element number 13 was located and would add 1 to whatever happened to be stored at that
memory location. This could modify another variable in the program, possibly causing
incorrect results or even premature program termination. Visual Basic provides mechanisms
that prevent accessing elements outside the bounds of arrays.
Common Programming Error 7.2
Referencing an element outside the array bounds is a runtime error. 7.2
256 Arrays Chapter 7
Testing and Debugging Tip 7.1
When a program is executed, array element indices are checked for validity (i.e., all indices
must be greater than or equal to 0 and less than the length of the array). If an attempt is made
to use an invalid index to access an element, Visual Basic generates an IndexOutOfRangeException
exception. Exceptions are discussed in greater detail in Chapter 11, Exception
Handling. 7.1
Testing and Debugging Tip 7.2
When looping through an array, the array index should remain between 0 and the upper
bound of the array (i.e., the value returned by method GetUpperBound). The initial and
final values used in the repetition structure should prevent accessing elements outside this
range. 7.2
Testing and Debugging Tip 7.3
Programs should confirm the validity of all input values to prevent erroneous information
from affecting calculations. 7.3
7.4.5 Using Histograms to Display Array Data Graphically
Many programs present data to users in a visual or graphical format. For example, numeric
values are often displayed as bars in a bar chart, in which longer bars represent larger numeric
values. Figure 7.6 displays numeric data graphically by creating a histogram that depicts
each numeric value as a bar of asterisks (*).
1 ‘ Fig. 7.6: Histogram.vb
2 ‘ Using data to create histograms.
34
Imports System.Windows.Forms
56
Module modHistogram
78
Sub Main()
9 Dim output As String ‘ output string
10 Dim i, j As Integer ‘ counters
11
12 ‘ create data array
13 Dim array1 As Integer() = New Integer() _
14 {19, 3, 15, 7, 11, 9, 13, 5, 17, 1}
15
16 output &= “Element ” & vbTab & “Value ” & vbTab & _
17 “Histogram”
18
19 For i = 0 To array1.GetUpperBound(0)
20 output &= vbCrLf & i & vbTab & array1(i) & vbTab
21
22 For j = 1 To array1(i)
23 output &= “*” ‘ add one asterisk
24 Next
25
26 Next
Fig. 7.6 Program that prints histograms (part 1 of 2).
Chapter 7 Arrays 257
The program reads numbers from an array and graphs the information in the form of a
bar chart, or histogram. Each number is printed, and a bar consisting of a corresponding
number of asterisks is displayed beside the number. The nested For loops (lines 19–26)
append the bars to the String that is displayed in the MessageBox. Note the end value
(array1(i)) of the inner For structure on line 22. Each time the inner For structure is
reached (line 22), it counts from 1 to array1(i), using a value in array1 to determine
the final value of the control variable j—the number of asterisks to display.
Sometimes programs use a series of counter variables to summarize data, such as the
results of a survey. In Chapter 6, Procedures, we used a series of counters in our die-rolling
program to track the number of occurrences of each side on a six-sided die as the program
rolled the die 12 times. We indicated that there is a more elegant way of doing what we did
in Fig. 6.11 for writing the dice-rolling program. An array version of this application is
shown in Fig. 7.7.
27
28 MessageBox.show(output, “Histogram Printing Program”, _
29 MessageBoxButtons.OK, MessageBoxIcon.Information)
30 End Sub ‘ Main
31
32 End Module ‘ modHistogram
1 ‘ Fig. 7.7: RollDie.vb
2 ‘ Rolling 12 dice with frequency chart.
34
‘ Note: Directory.GetCurrentDirectory returns the directory of
5 ‘ the folder where the current project is plus
6 ‘ “bin/”. This is where the images must be placed
7 ‘ for the example to work properly.
89
Imports System.IO
10 Imports System.Windows.Forms
11
12 Public Class FrmRollDie
13 Inherits System.Windows.Forms.Form
14
Fig. 7.7 Using arrays to eliminate a Select Case structure (part 1 of 4).
Fig. 7.6 Program that prints histograms (part 2 of 2).
258 Arrays Chapter 7
15 Dim randomNumber As Random = New Random()
16 Dim frequency As Integer() = New Integer(6) {}
17
18 ‘ labels
19 Friend WithEvents lblDie1 As Label
20 Friend WithEvents lblDie2 As Label
21 Friend WithEvents lblDie3 As Label
22 Friend WithEvents lblDie4 As Label
23 Friend WithEvents lblDie5 As Label
24 Friend WithEvents lblDie6 As Label
25 Friend WithEvents lblDie7 As Label
26 Friend WithEvents lblDie8 As Label
27 Friend WithEvents lblDie9 As Label
28 Friend WithEvents lblDie11 As Label
29 Friend WithEvents lblDie10 As Label
30 Friend WithEvents lblDie12 As Label
31
32 ‘ text box
33 Friend WithEvents txtDisplay As TextBox
34
35 ‘ button
36 Friend WithEvents cmdRoll As Button
37
38 ‘ Visual Studio .NET generated code
39
40 ‘ event handler for cmdRoll button
41 Private Sub cmdRoll_Click(ByVal sender As System.Object, _
42 ByVal e As System.EventArgs) Handles cmdRoll.Click
43
44 ‘ pass labels to a method that
45 ‘ randomly assigns a face to each die
46 DisplayDie(lblDie1)
47 DisplayDie(lblDie2)
48 DisplayDie(lblDie3)
49 DisplayDie(lblDie4)
50 DisplayDie(lblDie5)
51 DisplayDie(lblDie6)
52 DisplayDie(lblDie7)
53 DisplayDie(lblDie8)
54 DisplayDie(lblDie9)
55 DisplayDie(lblDie10)
56 DisplayDie(lblDie11)
57 DisplayDie(lblDie12)
58
59 Dim total As Double = 0
60 Dim i As Integer
61
62 For i = 1 To frequency.GetUpperBound(0)
63 total += frequency(i)
64 Next
65
66 txtDisplay.Text = “Face” & vbTab & vbTab & “Frequency” & _
67 vbTab & vbTab & “Percent” & vbCrLf
Fig. 7.7 Using arrays to eliminate a Select Case structure (part 2 of 4).
Chapter 7 Arrays 259
68
69 ‘ output frequency values
70 For i = 1 To frequency.GetUpperBound(0)
71 txtDisplay.Text &= i & vbTab & vbTab & frequency(i) & _
72 vbTab & vbTab & vbTab & String.Format(“{0:N}”, _
73 frequency(i) / total * 100) & “%” & vbCrLf
74 Next
75
76 End Sub ‘ cmdRoll_Click
77
78 ‘ simulate roll, display proper
79 ‘ image and increment frequency
80 Sub DisplayDie(ByVal lblDie As Label)
81 Dim face As Integer = 1 + randomNumber.Next(6)
82
83 lblDie.Image = _
84 Image.FromFile(Directory.GetCurrentDirectory & _
85 “\Images\die” & face & “.png”)
86
87 frequency(face) += 1
88 End Sub ‘ DisplayDie
89
90 End Class ‘ FrmRollDie
Fig. 7.7 Using arrays to eliminate a Select Case structure (part 3 of 4).
260 Arrays Chapter 7
Lines 91–111 of Fig. 6.16 are replaced by line 87, which uses face’s value as the
index for array frequency to determine which element should be incremented during
each iteration of the loop. The random number calculation on line 81 produces numbers
from 1–6 (the values for a six-sided die); thus, the frequency array must have seven elements
to allow the index values 1–6. In this program, we ignore element 0 of array frequency.
Lines 66–74 replace lines 57–78 from Fig. 6.16. We can loop through array
frequency; therefore, we do not have to enumerate each line of text to display in the
Label, as we did in Fig. 6.16.
7.5 Passing Arrays to Procedures
To pass an array argument to a procedure, specify the name of the array without using parentheses.
For example, if array hourlyTemperatures has been declared as
Dim hourlyTemperatures As Integer() = New Integer(24) {}
the procedure call
DayData(hourlyTemperatures)
passes array hourlyTemperatures to procedure DayData.
Fig. 7.7 Using arrays to eliminate a Select Case structure (part 4 of 4).
Chapter 7 Arrays 261
Every array object “knows” its own upper bound (i.e., the value returned by the method
GetUpperBound), so, when we pass an array object to a procedure, we do not need to
pass the upper bound of the array as a separate argument.
For a procedure to receive an array through a procedure call, the procedure’s parameter
list must specify that an array will be received. For example, the procedure header for Day-
Data might be written as
Sub DayData(ByVal temperatureData As Integer())
indicating that DayData expects to receive an Integer array in parameter temperatureData.
In Visual Basic, arrays always are passed by reference, yet it is normally inappropriate
to use keyword ByRef in the procedure definition header. We discuss this subtle
(and somewhat complex) issue in more detail in Section 7.6.
Although entire arrays are always passed by reference, individual array elements can be
passed in the same manner as simple variables of that type. For instance, array element values
of primitive data types, such as Integer, can be passed by value or by reference, depending
on the procedure definition. To pass an array element to a procedure, use the indexed name
of the array element as an argument in the call to the procedure. The program in Fig. 7.8 demonstrates
the difference between passing an entire array and passing an array element.
1 ‘ Fig. 7.8: PassArray.vb
2 ‘ Passing arrays and individual array elements to procedures.
34
Imports System.Windows.Forms
56
Module modPassArray
7 Dim output As String
89
Sub Main()
10 Dim array1 As Integer() = New Integer() {1, 2, 3, 4, 5}
11 Dim i As Integer
12
13 output = “EFFECTS OF PASSING ENTIRE ARRAY ” & _
14 “BY REFERENCE:” & vbCrLf & vbCrLf & _
15 “The values of the original array are:” & vbCrLf
16
17 ‘ display original elements of array1
18 For i = 0 To array1.GetUpperBound(0)
19 output &= ” ” & array1(i)
20 Next
21
22 ModifyArray(array1) ‘ array is passed by reference
23
24 output &= vbCrLf & _
25 “The values of the modified array are:” & vbCrLf
26
27 ‘ display modified elements of array1
28 For i = 0 To array1.GetUpperBound(0)
29 output &= ” ” & array1(i)
30 Next
Fig. 7.8 Passing arrays and individual array elements to procedures (part 1 of 3).
262 Arrays Chapter 7
31
32 output &= vbCrLf & vbCrLf & _
33 “EFFECTS OF PASSING ARRAY ELEMENT ” & _
34 “BY VALUE:” & vbCrLf & vbCrLf & “array1(3) ” & _
35 “before ModifyElementByVal: ” & array1(3)
36
37 ‘ array element passed by value
38 ModifyElementByVal(array1(3))
39
40 output &= vbCrLf & “array1(3) after ” & _
41 “ModifyElementByVal: ” & array1(3)
42
43 output &= vbCrLf & vbCrLf & “EFFECTS OF PASSING ” & _
44 “ARRAY ELEMENT BY REFERENCE: ” & vbCrLf & vbCrLf & _
45 “array1(3) before ModifyElementByRef: ” & array1(3)
46
47 ‘ array element passed by reference
48 ModifyElementByRef(array1(3))
49
50 output &= vbCrLf & “array1(3) after ” & _
51 “ModifyElementByRef: ” & array1(3)
52
53 MessageBox.Show(output, “Passing Arrays”, _
54 MessageBoxButtons.OK, MessageBoxIcon.Information)
55 End Sub ‘ Main
56
57 ‘ procedure modifies array it receives (note ByVal)
58 Sub ModifyArray(ByVal arrayParameter As Integer())
59 Dim j As Integer
60
61 For j = 0 To arrayParameter.GetUpperBound(0)
62 arrayParameter(j) *= 2
63 Next
64
65 End Sub ‘ ModifyArray
66
67 ‘ procedure modifies integer passed to it
68 ‘ original is not be modified (note ByVal)
69 Sub ModifyElementByVal(ByVal element As Integer)
70
71 output &= vbCrLf & “Value received in ” & _
72 “ModifyElementByVal: ” & element
73 element *= 2
74 output &= vbCrLf & “Value calculated in ” & _
75 “ModifyElementByVal: ” & element
76 End Sub ‘ ModifyElementByVal
77
78 ‘ procedure modifies integer passed to it
79 ‘ original is be modified (note ByRef)
80 Sub ModifyElementByRef(ByRef element As Integer)
81
82 output &= vbCrLf & “Value received in ” & _
83 “ModifyElementByRef: ” & element
Fig. 7.8 Passing arrays and individual array elements to procedures (part 2 of 3).
Chapter 7 Arrays 263
The For/Next structure on lines 18–20 appends the five elements of integer array
array1 (line 10) to String output. Line 22 passes array1 to procedure ModifyArray
(line 58), which then multiplies each element by 2 (line 62). To illustrate that
array1’s elements were modified in the called procedure (i.e., as enabled by passing by
reference), the For/Next structure in lines 28–30 appends the five elements of array1
to output. As the screen capture indicates, the elements of array1 are indeed modified
by ModifyArray.
To show the value of array1(3) before the call to ModifyElementByVal, lines
32–35 append the value of array1(3) to String output. Line 38 invokes procedure
ModifyElementByVal and passes array1(3). When array1(3) is passed by
value, the Integer value in the fourth position of array array1 (now an 8) is copied
and is passed to procedure ModifyElementByVal, where it becomes the value of argument
element. Procedure ModifyElementByVal then multiplies element by 2
(line 73). The parameter of ModifyElementByVal is a local variable that is destroyed
when the procedure terminates. Thus, when control is returned to Main, the unmodified
value of array1(3) is appended to the string variable output (lines 40–41).
Lines 43–51 demonstrate the effects of procedure ModifyElementByRef (lines
80–87). This procedure performs the same calculation as ModifyElementByVal, multiplying
element by 2. In this case, array1(3) is passed by reference, meaning the
value of array1(3) appended to output (lines 50–51) is the same as the value calculated
in the procedure.
Common Programming Error 7.3
In the passing of an array to a procedure, including an empty pair of parentheses after the
array name is a syntax error. 7.3
84 element *= 2
85 output &= vbCrLf & “Value calculated in ” & _
86 “ModifyElementByRef: ” & element
87 End Sub ‘ ModifyElementByRef
88
89 End Module ‘ modPassArray
Fig. 7.8 Passing arrays and individual array elements to procedures (part 3 of 3).
264 Arrays Chapter 7
7.6 Passing Arrays: ByVal vs. ByRef
In Visual Basic .NET, a variable that “stores” an object, such as an array, does not actually
store the object itself. Instead, such a variable stores a reference to the object (i.e., the location
in the computer’s memory where the object is already stored). The distinction between
reference variables and primitive data type variables raises some subtle issues that programmers
must understand to create secure, stable programs.
When used to declare a value-type parameter, keyword ByVal causes the value of the
argument to be copied to a local variable in the procedure. Changes to the local variable are
reflected in the local copy of that variable, but not in the original variable in the calling program.
However, if the argument passed using keyword ByVal is of a reference type, the
value copied is also a reference to the original object in the computer’s memory. Thus, reference
types (like arrays and other objects) passed via keyword ByVal are actually passed
by reference, meaning changes to the objects in called procedures affect the original objects
in the callers.
Performance Tip 7.2
Passing arrays and other objects by reference makes sense for performance reasons. If arrays
were passed by value, a copy of each element would be passed. For large, frequently
passed arrays, this would waste time and would consume considerable storage for the copies
of the arrays—both of these problems cause poor performance. 7.2
Visual Basic also allows procedures to pass references with keyword ByRef. This is
a subtle capability, which, if misused, can lead to problems. For instance, when a referencetype
object like an array is passed with ByRef, the called procedure actually gains control
over the passed reference itself, allowing the called procedure to replace the original reference
in the caller with a different object or even with Nothing. Such behavior can lead to
unpredictable effects, which can be disastrous in mission-critical applications. The program
in Fig. 7.9 demonstrates the subtle difference between passing a reference ByVal vs.
passing a reference ByRef.
Lines 11–12 declare two integer array variables, firstArray and firstArray-
Copy (we make the copy so we can determine whether reference firstArray gets overwritten).
Line 15 allocates an array containing Integer values 1, 2 and 3 and stores the
array reference in variable firstArray. The assignment statement on line 16 copies reference
firstArray to variable firstArrayCopy, causing these variables to reference the
same array object. The For/Next structure in lines 24–26 prints the contents of firstArray
before it is passed to procedure FirstDouble on line 29 so we can verify that this
array is passed by reference (i.e., the called method indeed changes the array’s contents).
The For/Next structure in procedure FirstDouble (lines 94–96) multiplies the
values of all the elements in the array by 2. Line 99 allocates a new array containing the
values 11, 12 and 13; the reference for this array then is assigned to parameter array (in
an attempt to overwrite reference firstArray in Main—this, of course, will not
happen, because the reference was passed ByVal). After procedure FirstDouble executes,
the For/Next structure on lines 35–37 prints the contents of firstArray, demonstrating
that the values of the elements have been changed by the procedure (and
confirming that in Visual Basic, .NET arrays are always passed by reference). The If
structure on lines 40–46 uses the Is operator to compare references firstArray (which
we just attempted to overwrite) and firstArrayCopy. Visual Basic provides operator
Chapter 7 Arrays 265
Is for comparing references to determine whether they are referencing the same object.
The expression on line 40 is true if the operands to binary operator Is indeed reference the
same object. In this case, the object represented is the array allocated in line 15—not the
array allocated in procedure FirstDouble (line 99).
1 ‘ Fig. 7.9: ArrayReferenceTest.vb
2 ‘ Testing the effects of passing array references using
3 ‘ ByVal and ByRef.
45
Module modArrayReferenceTest
67
Sub Main()
8 Dim i As Integer
9
10 ‘ declare array references
11 Dim firstArray As Integer()
12 Dim firstArrayCopy As Integer()
13
14 ‘ allocate firstArray and copy its reference
15 firstArray = New Integer() {1, 2, 3}
16 firstArrayCopy = firstArray
17
18 Console.WriteLine(“Test passing array reference ” & _
19 “using ByVal.”)
20 Console.Write(“Contents of firstArray before ” & _
21 “calling FirstDouble: “)
22
23 ‘ print contents of firstArray
24 For i = 0 To firstArray.GetUpperBound(0)
25 Console.Write(firstArray(i) & ” “)
26 Next
27
28 ‘ pass firstArray using ByVal
29 FirstDouble(firstArray)
30
31 Console.Write(vbCrLf & “Contents of firstArray after ” & _
32 “calling FirstDouble: “)
33
34 ‘ print contents of firstArray
35 For i = 0 To firstArray.GetUpperBound(0)
36 Console.Write(firstArray(i) & ” “)
37 Next
38
39 ‘ test whether reference was changed by FirstDouble
40 If firstArray Is firstArrayCopy Then
41 Console.WriteLine(vbCrLf & “The references are ” & _
42 “equal.”)
43 Else
44 Console.WriteLine(vbCrLf & “The references are ” & _
45 “not equal.”)
46 End If
47
Fig. 7.9 Passing an array reference with ByVal and ByRef (part 1 of 3).
266 Arrays Chapter 7
48 ‘ declare array references
49 Dim secondArray As Integer()
50 Dim secondArrayCopy As Integer()
51
52 ‘ allocate secondArray and copy its reference
53 secondArray = New Integer() {1, 2, 3}
54 secondArrayCopy = secondArray
55
56 Console.WriteLine(vbCrLf & “Test passing array ” & _
57 “reference using ByRef.”)
58 Console.Write(“Contents of secondArray before ” & _
59 “calling SecondDouble: “)
60
61 ‘ print contents of secondArray before procedure call
62 For i = 0 To secondArray.GetUpperBound(0)
63 Console.Write(secondArray(i) & ” “)
64 Next
65
66 ‘ pass secondArray using ByRef
67 SecondDouble(secondArray)
68
69 Console.Write(vbCrLf & “Contents of secondArray ” & _
70 “after calling SecondDouble: “)
71
72 ‘ print contents of secondArray after procedure call
73 For i = 0 To secondArray.GetUpperBound(0)
74 Console.Write(secondArray(i) & ” “)
75 Next
76
77 ‘ test whether the reference was changed by SecondDouble
78 If secondArray Is secondArrayCopy Then
79 Console.WriteLine(vbCrLf & “The references are ” & _
80 “equal.”)
81 Else
82 Console.WriteLine(vbCrLf & “The references are ” & _
83 “not equal.”)
84 End If
85
86 End Sub ‘ Main
87
88 ‘ procedure modifies elements of array and assigns
89 ‘ new reference (note ByVal)
90 Sub FirstDouble(ByVal array As Integer())
91 Dim i As Integer
92
93 ‘ double each element value
94 For i = 0 To array.GetUpperBound(0)
95 array(i) *= 2
96 Next
97
98 ‘ create new reference and assign it to array
99 array = New Integer() {11, 12, 13}
100 End Sub ‘ FirstDouble
Fig. 7.9 Passing an array reference with ByVal and ByRef (part 2 of 3).
Chapter 7 Arrays 267
Lines 48–84 in procedure Main perform similar tests, using array variables second-
Array and secondArrayCopy and procedure SecondDouble (lines 104–114). Procedure
SecondDouble performs the same operations as FirstDouble, but receives its
array argument with ByRef. In this case, the reference stored in secondArray after the
procedure call is a reference to the array allocated on line 113 of SecondDouble, demonstrating
that a reference passed with ByRef can be modified by the called procedure so
that the reference actually points to a different object, in this case an array allocated in procedure
SecondDouble. The If structure in lines 78–84 demonstrates that second-
Array and secondArrayCopy no longer represent the same array.
Software Engineering Observation 7.1
Using ByVal to receive a reference-type object parameter does not cause the object to pass
by value—the object still passes by reference. Rather, ByVal causes the object’s reference
to pass by value. This prevents a called procedure from overwriting a reference in the caller.
In the vast majority of cases, protecting the caller’s reference from modification is the desired
behavior. If you encounter a situation where you truly want the called procedure to
modify the caller’s reference, pass the reference-type object ByRef—but, again, such situations
are rare. 7.1
Software Engineering Observation 7.2
In Visual Basic .NET, reference-type objects (including arrays) always pass by reference. So,
a called procedure receiving a reference to an object in a caller can change the caller’s object.7.2
101
102 ‘ procedure modifies elements of array and assigns
103 ‘ new reference (note ByRef)
104 Sub SecondDouble(ByRef array As Integer())
105 Dim i As Integer
106
107 ‘ double contents of array
108 For i = 0 To array.GetUpperBound(0)
109 array(i) *= 2
110 Next
111
112 ‘ create new reference and assign it to array
113 array = New Integer() {11, 12, 13}
114 End Sub ‘ SecondDouble
115
116 End Module ‘ modPassArray
Test passing array reference using ByVal.
Contents of firstArray before calling FirstDouble: 1 2 3
Contents of firstArray after calling FirstDouble: 2 4 6
The references are equal.
Test passing array reference using ByRef.
Contents of secondArray before calling SecondDouble: 1 2 3
Contents of secondArray after calling SecondDouble: 11 12 13
The references are not equal.
Fig. 7.9 Passing an array reference with ByVal and ByRef (part 3 of 3).
268 Arrays Chapter 7
7.7 Sorting Arrays
Sorting data (i.e., arranging the data into some particular order, such as ascending or descending
order) is one of the most popular computing applications. For example, a bank
sorts all checks by account number, so that it can prepare individual bank statements at the
end of each month. Telephone companies sort their lists of accounts by last name and, within
last-name listings, by first name, to make it easy to find phone numbers. Virtually every
organization must sort some data and, often, massive amounts of it. Sorting is an intriguing
problem that has attracted some of the most intense research efforts in the computer-science
field. This section discusses one of the simplest sorting schemes. In the exercises at the end
of this chapter, we investigate a more sophisticated sorting algorithm.
Performance Tip 7.3
Sometimes, the simplest algorithms perform poorly. Their virtue is that they are easy to write,
test and debug. Complex algorithms may be needed for a program to achieve maximum performance.
7.3
The module shown in Fig. 7.10 contains procedures for sorting the values of an integer
array into ascending order. The technique we use is called the bubble sort, or the sinking
sort, because in an ascending sort smaller values gradually “bubble” their way to the top of
the array (i.e., toward the first element) like air bubbles rising in water, while larger values
sink to the bottom (i.e., toward the end) of the array. The technique uses nested loops to
make several passes through the array. Each pass compares successive pairs of elements. If
a pair is in increasing order (or the values are equal), the bubble sort leaves the values as
they are. If a pair is in decreasing order, the bubble sort swaps their values in the array.
1 ‘ Fig. 7.10: BubbleSort.vb
2 ‘ Procedures for sorting an integer array.
34
Module modBubbleSort
56
‘ sort array using bubble sort algorithm
7 Sub BubbleSort(ByVal sortArray As Integer())
8 Dim pass, i As Integer
9
10 For pass = 1 To sortArray.GetUpperBound(0)
11
12 For i = 0 To sortArray.GetUpperBound(0) – 1
13
14 If sortArray(i) > sortArray(i + 1) Then
15 Swap(sortArray, i)
16 End If
17
18 Next
19
20 Next
21
22 End Sub ‘ BubbleSort
23
Fig. 7.10 BubbleSort procedure in modBubbleSort (part 1 of 2).
Chapter 7 Arrays 269
The module contains procedures BubbleSort and Swap. Procedure BubbleSort
(lines 7–22) sorts the elements of its parameter, sortArray. Procedure BubbleSort
calls procedure Swap (lines 25–33) as necessary to transpose two of the array elements.
The Windows application in Fig. 7.11 demonstrates procedure BubbleSort (Fig. 7.10)
by sorting an array of 10 randomly-generated elements (which may contain duplicates).
24 ‘ swap two array elements
25 Sub Swap(ByVal swapArray As Integer(), _
26 ByVal first As Integer)
27
28 Dim hold As Integer
29
30 hold = swapArray(first)
31 swapArray(first) = swapArray(first + 1)
32 swapArray(first + 1) = hold
33 End Sub ‘ Swap
34
35 End Module ‘ modBubbleSort
1 ‘ Fig. 7.11: BubbleSortTest.vb
2 ‘ Program creates random numbers and sorts them.
34
Imports System.Windows.Forms
56
Public Class FrmBubbleSort
7 Inherits System.Windows.Forms.Form
89
‘ buttons
10 Friend WithEvents cmdCreate As Button
11 Friend WithEvents cmdSort As Button
12
13 ‘ labels
14 Friend WithEvents lblOriginal As Label
15 Friend WithEvents lblSorted As Label
16
17 ‘ textboxes
18 Friend WithEvents txtOriginal As TextBox
19 Friend WithEvents txtSorted As TextBox
20
21 ‘ Visual Studio .NET generated code
22
23 Dim array As Integer() = New Integer(9) {}
24
25 ‘ creates random generated numbers
26 Private Sub cmdCreate_Click(ByVal sender As System.Object, _
27 ByVal e As System.EventArgs) Handles cmdCreate.Click
28
Fig. 7.11 Sorting an array with bubble sort (part 1 of 3).
Fig. 7.10 BubbleSort procedure in modBubbleSort (part 2 of 2).
270 Arrays Chapter 7
29 Dim output As String
30 Dim randomNumber As Random = New Random()
31 Dim i As Integer
32
33 txtSorted.Text = “”
34
35 ‘ create 10 random numbers and append to output
36 For i = 0 To array.GetUpperBound(0)
37 array(i) = randomNumber.Next(100)
38 output &= array(i) & vbCrLf
39 Next
40
41 txtOriginal.Text = output ‘ display numbers
42 cmdSort.Enabled = True ‘ enables cmdSort button
43 End Sub ‘ cmdCreate_Click
44
45 ‘ sorts randomly generated numbers
46 Private Sub cmdSort_Click(ByVal sender As System.Object, _
47 ByVal e As System.EventArgs) Handles cmdSort.Click
48
49 Dim output As String
50 Dim i As Integer
51
52 ‘ sort array
53 modBubbleSort.BubbleSort(array)
54
55 ‘ creates string with sorted numbers
56 For i = 0 To array.GetUpperBound(0)
57 output &= array(i) & vbCrLf
58 Next
59
60 txtSorted.Text = output ‘ display numbers
61 cmdSort.Enabled = False
62 End Sub ‘ cmdSort_Click
63
64 End Class ‘ FrmBubbleSort
Fig. 7.11 Sorting an array with bubble sort (part 2 of 3).
Chapter 7 Arrays 271
The program contains methods cmdCreate_Click and cmdSort_Click.
Method cmdCreate_Click (lines 26–43) assigns 10 random values to the elements of
array and displays the contents of the array in txtOriginal. Method
cmdSort_Click (lines 46–62) sorts array by calling procedure BubbleSort from
modBubbleSort.
Procedure BubbleSort receives the array as parameter sortArray. The nested
For/Next structures in lines 10–20 of Fig. 7.10 performs the sort. The outer loop controls
the number of passes of the array. The inner loop (lines 12–18) controls the comparisons
and swapping (if necessary) of the elements during each pass.
Procedure BubbleSort first compares sortArray(0) to sortArray(1), then
sortArray(1) to sortArray(2), and so on until it completes the pass by comparing
sortArray(8) to sortArray(9). Although there are 10 elements, the comparison
loop performs only nine comparisons (because the comparisons each involve a pair of numbers).
The comparisons performed in a bubble sort could cause a large value to move down
the array (sink) many positions on a single pass. However, a small value cannot move up
(bubble) more than one position per pass. On the first pass, the largest value is guaranteed
to sink to the bottom element of the array, sortArray(9). On the second pass, the
second-largest value is guaranteed to sink to sortArray(8). On the ninth pass, the ninth
largest value sinks to sortArray(1), leaving the smallest value in sortArray(0).
Thus, only nine passes are required to sort a 10-element array (and, in general, only n-1
passes are needed to sort an n-element array).
If a comparison reveals that the two elements are in descending order, BubbleSort
calls procedure Swap to exchange the two elements, placing them in ascending order in the
array. Procedure Swap receives the array (which it calls swapArray) and the index of the
first element of the array to transpose (with the subsequent element). The exchange is performed
by three assignments
hold = swapArray(first)
swapArray(first) = swapArray(first + 1)
swapArray(first + 1) = hold
Fig. 7.11 Sorting an array with bubble sort (part 3 of 3).
272 Arrays Chapter 7
where the extra variable hold temporarily stores one of the two values being swapped. The
swap cannot be performed with only the two assignments
swapArray(first) = swapArray(first + 1)
swapArray(first + 1) = swapArray(first)
If swapArray(first) is 7 and swapArray(first + 1) is 5, after the first assignment
both array elements contains 5, and the value 7 is lost—hence, the need for the extra
variable hold.
The advantage of the bubble sort is that it is easy to program. However, the bubble sort
runs slowly, as becomes apparent when sorting large arrays. In the exercises, we develop
efficient versions of the bubble sort and investigate a more efficient and more complex sort,
quicksort. More advanced courses (often titled “Data Structures” or “Algorithms” or
“Computational Complexity”) investigate sorting and searching in greater depth.
7.8 Searching Arrays: Linear Search and Binary Search
Often, programmers work with large amounts of data stored in arrays. It might be necessary
in this case to determine whether an array contains a value that matches a certain key value.
The process of locating a particular element value in an array is called searching. In this section,
we discuss two searching techniques—the simple linear search technique and the more
efficient (but more complex) binary search technique. Exercises 7.8 and 7.9 at the end of this
chapter ask you to implement recursive versions of the linear and binary searches.
7.8.1 Searching an Array with Linear Search
Module modLinearSearch in Fig. 7.12 contains a procedure for performing a linear
search. Procedure LinearSearch (lines 7–22) uses a For/Next structure containing an
If structure (lines 15–17) to compare each element of an array with a search key. If the
search key is found, the procedure returns the index value for the element, indicating the
position of the search key in the array. If the search key is not found, the procedure returns
–1. (The value –1 is a good choice because it is not a valid index number.) If the elements
of the array being searched are unordered, it is just as likely that the value will be found in
the first element as in the last, so the procedure will have to compare the search key with
half the elements of the array, on average.
1 ‘ Fig. 7.12: LinearSearch.vb
2 ‘ Linear search of an array.
34
Module modLinearSearch
56
‘ iterates through array
7 Function LinearSearch(ByVal key As Integer, _
8 ByVal numbers As Integer()) As Integer
9
10 Dim n As Integer
11
Fig

Fig. 7.12 Procedures for performing a linear search (part 1 of 2).
Chapter 7 Arrays 273
The program in Fig. 7.13 uses module modLinearSearch to search a 20-element
array filled with random values created when the user clicks cmdCreate. The user then
types a search key in a TextBox (named txtInput) and clicks cmdSearch to start
the search.
12 ‘ structure iterates linearly through array
13 For n = 0 To numbers.GetUpperBound(0)
14
15 If numbers(n) = key Then
16 Return n
17 End If
18
19 Next
20
21 Return -1
22 End Function ‘ LinearSearch
23
24 End Module ‘ modLinearSearch
1 ‘ Fig. 7.13: LinearSearchTest.vb
2 ‘ Linear search of an array.
34
Imports System.Windows.Forms
56
Public Class FrmLinearSearchTest
7 Inherits System.Windows.Forms.Form
89
‘ buttons
10 Friend WithEvents cmdSearch As Button
11 Friend WithEvents cmdCreate As Button
12
13 ‘ text boxes
14 Friend WithEvents txtInput As TextBox
15 Friend WithEvents txtData As TextBox
16
17 ‘ labels
18 Friend WithEvents lblEnter As Label
19 Friend WithEvents lblResult As Label
20
21 ‘ Visual Studio .NET generated code
22
23 Dim array1 As Integer() = New Integer(19) {}
24
25 ‘ creates random data
26 Private Sub cmdCreate_Click(ByVal sender As System.Object, _
27 ByVal e As System.EventArgs) Handles cmdCreate.Click
28
29 Dim output As String
30 Dim randomNumber As Random = New Random()
31 Dim i As Integer
Fig. 7.13 Linear search of an array (part 1 of 3).
Fig. 7.12 Procedures for performing a linear search (part 2 of 2).
274 Arrays Chapter 7
32
33 output = “Index” & vbTab & “Value” & vbCrLf
34
35 ‘ creates string containing 11 random numbers
36 For i = 0 To array1.GetUpperBound(0)
37 array1(i) = randomNumber.Next(1000)
38 output &= i & vbTab & array1(i) & vbCrLf
39 Next
40
41 txtData.Text = output ‘ displays numbers
42 txtInput.Text = “” ‘ clear search key text box
43 cmdSearch.Enabled = True ‘ enable search button
44 End Sub ‘ cmdCreate_Click
45
46 ‘ searches key of element
47 Private Sub cmdSearch_Click(ByVal sender As System.Object, _
48 ByVal e As System.EventArgs) Handles cmdSearch.Click
49
50 ‘ if search key text box is empty, display
51 ‘ message and exit procedure
52 If txtInput.Text = “” Then
53 MessageBox.Show(“You must enter a search key.”)
54 Exit Sub
55 End If
56
57 Dim searchKey As Integer = Convert.ToInt32(txtInput.Text)
58 Dim element As Integer = LinearSearch(searchKey, array1)
59
60 If element -1 Then
61 lblResult.Text = “Found Value in index ” & element
62 Else
63 lblResult.Text = “Value Not Found”
64 End If
65
66 End Sub ‘ cmdSearch_Click
67
68 End Class ‘ FrmLinearSearch
Fig. 7.13 Linear search of an array (part 2 of 3).
Chapter 7 Arrays 275
7.8.2 Searching a Sorted Array with Binary Search
The linear search method works well for small or unsorted arrays. However, for large arrays,
linear searching is inefficient. If the array is sorted, the high-speed binary search technique
can be used.
After each comparison, the binary search algorithm eliminates from consideration half
the elements in the array that is being searched. The algorithm locates the middle array element
and compares it with the search key. If they are equal, the search key has been found,
and the index of that element is returned. Otherwise, the problem is reduced to searching
half of the array. If the search key is less than the middle array element, the second half of
the array is eliminated from consideration, and searching continues with only the first half
of the array; otherwise, the second half of the array is searched. If the search key is not the
middle element in the specified subarray (a piece of the original array), the algorithm is
repeated in one quarter of the original array. The search continues until the search key is
equal to the middle element of a subarray, or until the subarray consists of one element that
is not equal to the search key (i.e., the search key is not found).
In a worst-case scenario, searching a sorted array of 1024 elements via binary search
requires only 10 comparisons. Repeatedly dividing 1024 by 2 (after each comparison, we
eliminate from consideration half the array) yields the successive values 512, 256, 128, 64,
32, 16, 8, 4, 2 and 1. The number 1024 (210) is divided by 2 only ten times to get the value
1, and division by 2 is equivalent to one comparison in the binary search algorithm. A
sorted array of 1,048,576 (220) elements takes a maximum of 20 comparisons to find the
key! Similarly, a key can be found in a sorted array of one billion elements in a maximum
of 30 comparisons! This is a tremendous increase in performance over the linear search,
which required comparing the search key with an average of half the elements in the array.
For a one-billion-element array, the difference is between an average of 500 million comparisons
and a maximum of 30 comparisons! The maximum number of comparisons
needed to complete a binary search of any sorted array is indicated by the exponent of the
first power of 2 that is greater than or equal to the number of elements in the array.
Figure 7.14 presents the iterative version of method BinarySearch (lines 60–86).
The method receives two arguments—integer array array1 (the array to search), and
integer searchKey (the search key). The array is passed to BinarySearch, even
Fig. 7.13 Linear search of an array (part 3 of 3).
276 Arrays Chapter 7
though the array is an instance variable of the class. Once again, this is done because an
array normally is passed to a procedure of another class for searching.
1 ‘ Fig. 7.14: BinarySearchTest.vb
2 ‘ Demonstrating binary search of an array.
34
Imports System.Windows.Forms
56
Public Class FrmBinarySearch
7 Inherits System.Windows.Forms.Form
89
‘ labels
10 Friend WithEvents lblEnterKey As Label
11 Friend WithEvents lblResult As Label
12 Friend WithEvents lblResultOutput As Label
13 Friend WithEvents lblDisplay As Label
14 Friend WithEvents lblIndex As Label
15 Friend WithEvents lblIndexes As Label
16
17 ‘ button
18 Friend WithEvents cmdFindKey As Button
19
20 ‘ text box
21 Friend WithEvents txtInput As TextBox
22
23 ‘ Visual Studio .NET generated code
24
25 Dim array1 As Integer() = New Integer(14) {}
26
27 ‘ FrmBinarySearch initializes array1 to ascending values
28 ‘ 0, 2, 4, 6, …, 28 when first loaded
29 Private Sub FrmBinarySearch_Load(ByVal sender As System.Object, _
30 ByVal e As System.EventArgs) Handles MyBase.Load
31
32 Dim i As Integer
33
34 For i = 0 To array1.GetUpperBound(0)
35 array1(i) = 2 * i
36 Next
37
38 End Sub ‘ FrmBinarySearch_Load
39
40 ‘ event handler for cmdFindKey button
41 Private Sub cmdFindKey_Click(ByVal sender As System.Object, _
42 ByVal e As System.EventArgs) Handles cmdFindKey.Click
43
44 Dim searchKey As Integer = Convert.ToInt32(txtInput.Text)
45
46 lblDisplay.Text = “”
47
48 ‘ perform binary search
49 Dim element As Integer = BinarySearch(array1, searchKey)
50
Fig. 7.14 Binary search of a sorted array (part 1 of 3).
Chapter 7 Arrays 277
51 If element -1 Then
52 lblResultOutput.Text = “Found value in element ” & element
53 Else
54 lblResultOutput.Text = “Value not found”
55 End If
56
57 End Sub ‘ cmdFindKey_Click
58
59 ‘ performs binary search
60 Function BinarySearch(ByVal array As Integer(), _
61 ByVal key As Integer) As Integer
62
63 Dim low As Integer = 0 ‘ low index
64 Dim high As Integer = array.GetUpperBound(0) ‘ high index
65 Dim middle As Integer ‘ middle index
66
67 While low <= high
68 middle = (low + high) \ 2
69
70 ' the following line displays part
71 ' of the array being manipulated during
72 ' each iteration of loop
73 BuildOutput(low, middle, high)
74
75 If key = array(middle) Then ' match
76 Return middle
77 ElseIf key < array(middle) Then ' search low end
78 high = middle – 1 ' of array
79 Else
80 low = middle + 1
81 End If
82
83 End While
84
85 Return -1 ' search key not found
86 End Function ' BinarySearch
87
88 Sub BuildOutput(ByVal low As Integer, _
89 ByVal middle As Integer, ByVal high As Integer)
90
91 Dim i As Integer
92
93 For i = 0 To array1.GetUpperBound(0)
94
95 If i high Then
96 lblDisplay.Text &= ” “
97 ElseIf i = middle Then ‘ mark middle element in output
98 lblDisplay.Text &= String.Format(“{0:D2}”, _
99 array1(i)) & “* “
100 Else
101 lblDisplay.Text &= String.Format(“{0:D2}”, _
102 array1(i)) & ” “
103 End If
Fig. 7.14 Binary search of a sorted array (part 2 of 3).
278 Arrays Chapter 7
104
105 Next i
106
107 lblDisplay.Text &= vbCrLf
108 End Sub ‘ BuildOutput
109
110 End Class ‘ FrmBinarySearch
Fig. 7.14 Binary search of a sorted array (part 3 of 3).
Chapter 7 Arrays 279
Line 68 calculates the middle element of the array being searched by determining the
number of elements in the array and then dividing this value by 2. Recall that using the \
operator causes the remainder to be discarded. What happens, then, when there is an even
number of elements in the array? In this case there is no “middle” element, and the middle
of our array is actually between the two middle elements. When this occurs, the calculation
on line 68 returns the smaller of the two middle values.
The If/Else structure on lines 75–81 compares the middle element of the array to key.
If key matches the middle element of a subarray (line 75), middle (the index of the current
element) is returned, indicating that the value was found and the search is complete.
If key does not match the middle element of a subarray, the low index or high
index (both declared in the method) is adjusted so that a smaller subarray can be searched.
If key is less than the middle element (line 77), the high index is set to middle – 1, and
the search is continued on the elements from low to middle – 1. If key is greater than
the middle element (line 79), the low index is set to middle + 1, and the search is continued
on the elements from middle + 1 to high.
The program uses a 15-element array. The first power of 2 greater than or equal to the
number of array elements is 16 (24), so at most four comparisons are required to find the
key. To illustrate this concept, method BinarySearch calls method BuildOutput
(line 88) to output each subarray during the binary search process. The middle element in
each subarray is marked with an asterisk (*) to indicate the element with which the key is
compared. The format string “{0:D2}” on lines 98 and 101 causes the values to be formatted
as integers with at least two digits. Each search in this example results in a maximum
of four lines of output—one per comparison.
7.9 Multidimensional Rectangular and Jagged Arrays
So far, we have studied one-dimensional (or single-subscripted) arrays—i.e., those that
contain one row of values. In this section, we introduce multidimensional (often called multiple-
subscripted) arrays, which require two or more indices to identify particular elements.
We concentrate on two-dimensional (often called double-subscripted) arrays, or arrays that
contain multiple rows of values. There are two types of multidimensional arrays—rectangular
and jagged. Rectangular arrays with two indices often represent tables of values consisting
of information arranged in rows and columns. Each row is the same size, and each
column is the same size (hence, the term “rectangular”). To identify a particular table element,
we must specify the two indices—by convention, the first identifies the element’s
row, the second the element’s column. Figure 7.15 illustrates a two-dimensional rectangular
array, a, containing three rows and four columns. A rectangular two-dimensional array
with m rows and n columns is called an m-by-n array; the array in Fig. 7.15 is referred to
as a 3-by-4 array.
Every element in array a is identified in Fig. 7.15 by an element name of the form
a(i, j), where a is the name of the array and i and j are the indices that uniquely identify
the row and column of each element in array a. Notice that, because array indices are
determined through zero-based counting, the names of the elements in the first row have a
first index of 0; the names of the elements in the fourth column have a second index of 3.
Multidimensional arrays are initialized in declarations using the same process and notations
employed for one-dimensional arrays. For example, a two-dimensional rectangular
array numbers with two rows and two columns could be declared and initialized with
280 Arrays Chapter 7
Dim numbers As Integer(,) = New Integer(1,1) {}
numbers(0, 0) = 1
numbers(0, 1) = 2
numbers(1, 0) = 3
numbers(1, 1) = 4
Alternatively, the initialization can be written on one line, as shown below:
Dim numbers As Integer(,) = New Integer(,) {{1, 2}, {3, 4}}
The values are grouped by row in braces, with 1 and 2 initializing numbers(0,0) and
numbers(0,1), and 3 and 4 initializing numbers(1,0) and numbers(1,1). The
compiler determines the number of rows by counting the number of subinitializer lists (represented
by sets of braces) in the main initializer list. Then, the compiler determines the
number of columns in each row by counting the number of initializer values in the subinitializer
list for that row. In rectangular arrays, each row has the same number of values.
Jagged arrays are maintained as arrays of arrays. Unlike rectangular arrays, rows in
jagged arrays can be of different lengths. The statements
Dim array2 As Integer()() ‘ declare jagged array
array2 = New Integer(1)() {} ‘ allocate two rows
‘ allocate columns for row 0
array2(0) = New Integer() {1, 2}
‘ allocate columns for 1
array2(1) = New Integer() {3, 4, 5}
create Integer array array2 with row 0 (which is an array itself) containing two elements
(1 and 2), and row 1 containing three elements (3, 4 and 5). Notice that the array
name, followed by a single index (e.g., array2(0)), behaves exactly like a normal onedimensional
array variable. A one-dimensional array can be created and assigned to that
value.
Fig. 7.15 Two-dimensional array with three rows and four columns.
Row 0
Row 1
Row 2
Column 0 Column 1 Column 2 Column 3
Column index (or subscript)
Row index (or subscript)
Array name
a(1, 0) a(1, 1) a(1, 2) a(1, 3)
a(0, 0) a(0, 1) a(0, 2) a(0, 3)
a(2, 0) a(2, 1) a(2, 2) a(2, 3)
Chapter 7 Arrays 281
The program in Fig. 7.16 demonstrates the initialization of a rectangular array
(array1) and a jagged array (array2) in declarations and the use of nested For/Next
loops to traverse the arrays (i.e., to manipulate every array element).
The program declares two arrays in method Main. The allocation of array1 (line 14)
provides six initializers in two sublists. The first sublist initializes the first row (row 0) of the
array to the values 1, 2 and 3; the second sublist initializes the second row (row 1) of the array
to the values 4, 5 and 6. The declaration and allocation of array2 (line 17) create a jagged
array of 3 arrays (specified by the 2 in the first set of parentheses after keyword Integer).
Lines 18–20 initialize each subarray so that the first subarray contains the values 1 and 2, the
second contains the value 3 and the last contains the values 4, 5 and 6.
The nested For/Next structures in lines 24–31 append the elements of array1 to
string output. The nested For/Next structures traverse the arrays in two dimensions.
The outer For/Next structure traverses the rows; the inner For/Next structure traverses
the columns within a row. Each For/Next structure calls method GetUpperBound to
obtain the upper bound of the dimension it traverses. Notice that the dimensions are zerobased,
meaning the rows are dimension 0 and the columns are dimension 1.
1 ‘ Fig. 7.16: MultidimensionalArrays.vb
2 ‘ Initializing multi-dimensional arrays.
34
Imports System.Windows.Forms
56
Module modMultidimensionalArrays
78
Sub Main()
9 Dim output As String
10 Dim i, j As Integer
11
12 ‘ create rectangular two-dimensional array
13 Dim array1 As Integer(,)
14 array1 = New Integer(,) {{1, 2, 3}, {4, 5, 6}}
15
16 ‘ create jagged two-dimensional array
17 Dim array2 As Integer()() = New Integer(2)() {}
18
19 array2(0) = New Integer() {1, 2}
20 array2(1) = New Integer() {3}
21 array2(2) = New Integer() {4, 5, 6}
22
23 output = “Values in array1 by row are ” & vbCrLf
24
25 For i = 0 To array1.GetUpperBound(0)
26
27 For j = 0 To array1.GetUpperBound(1)
28 output &= array1(i, j) & ” “
29 Next
30
31 output &= vbCrLf
32 Next
33
Fig. 7.16 Initializing multidimensional arrays (part 1 of 2).
282 Arrays Chapter 7
The nested For/Next structures in lines 36–43 behave similarly for array2. However,
in a jagged two-dimensional array, the second dimension is actually the first dimension
of a separate array. In the example, the inner For/Next structure determines the
number of columns in each row of the array by passing argument 0 to method GetUpper-
Bound, called on the array returned by accessing a single row of the jagged array. Arrays
of dimensions higher than two can be traversed using one nested For/Next structure for
each dimension.
Many common array manipulations use For/Next repetition structures. Imagine a
jagged array jaggedArray, which contains 3 rows, or arrays. The following For/Next
structure sets all the elements in the third row of array jaggedArray to zero:
For column = 0 To jaggedArray(2).GetUpperBound(0)
jaggedArray(2)(column) = 0
Next
We specified the third row; therefore, we know that the first index is always 2 (0 is the first
row and 1 is the second row). The For/Next loop varies only the second index (i.e., the
column index). Notice the use of jaggedArray(2).GetUpperBound(0) as the end
value of the For/Next structure. In this expression, we call the GetUpperBound method
on the array contained in the third row of jaggedArray. This statement demonstrates
that each row of jaggedArray is itself an array, and therefore methods called on this val-
34 output &= vbCrLf & “Values in array2 by row are ” & _
35 vbCrLf
36
37 For i = 0 To array2.GetUpperBound(0)
38
39 For j = 0 To array2(i).GetUpperBound(0)
40 output &= array2(i)(j) & ” “
41 Next
42
43 output &= vbCrLf
44 Next
45
46 MessageBox.Show(output, _
47 “Initializing Multi-Dimensional Arrays”, _
48 MessageBoxButtons.OK, MessageBoxIcon.Information)
49 End Sub ‘ Main
50
51 End Module ‘ modMultidimensionalArrays
Fig. 7.16 Initializing multidimensional arrays (part 2 of 2).
Chapter 7 Arrays 283
ue behave as they would for a typical array. The preceding For/Next structure is equivalent
to the assignment statements
jaggedArray(2)(0) = 0
jaggedArray(2)(1) = 0
jaggedArray(2)(2) = 0
jaggedArray(2)(3) = 0
The following nested For/Next structure determines the total of all the elements in array
jaggedArray. We use method GetUpperBound in the headers of the For/Next
structures to determine the number of rows in jaggedArray and the number of columns
in each row.
Dim total, row, column As Integer
For row = 0 To jaggedArray.GetUpperBound(0)
For column = 0 To jaggedArray(row).GetUpperBound(0)
total += jaggedArray(row)(column)
Next
Next
The nested For/Next structure totals the elements of the array one row at a time. The outer
For/Next structure begins by setting the row index to 0, so the elements of the first row
can be totaled by the inner For/Next structure. The outer For/Next structure then increments
row to 1, so the second row can be totaled. The outer For/Next structure increments
row to 2, so the third row can be totaled. The result can be displayed when the outer
For/Next structure terminates.
The program in Fig. 7.17 performs several other array manipulations on a 3-by-4 array
grades. Each row of the array represents a student, and each column represents a grade
on one of the four exams that the student took during the semester. The array manipulations
are performed by four procedures: Procedure Minimum (line 44) determines the lowest
grade of any student for the semester. Procedure Maximum (line 66) determines the highest
grade of any student for the semester. Procedure Average (line 89) determines a particular
student’s semester average. Procedure BuildString (line 103) appends the twodimensional
array to string output in tabular format.
1 ‘ Fig 7.17: JaggedArray.vb
2 ‘ Jagged two-dimensional array example.
34
Imports System.Windows.Forms
56
Module modJaggedArray
7 Dim lastStudent, lastExam As Integer
8 Dim output As String
9
10 Sub Main()
11 Dim i As Integer
Fig. 7.17 Using jagged two-dimensional arrays (part 1 of 4).
284 Arrays Chapter 7
12
13 ‘ jagged array with 3 rows of exam scores
14 Dim gradeArray As Integer()() = New Integer(2)() {}
15
16 ‘ allocate each row with 4 student grades
17 gradeArray(0) = New Integer() {77, 68, 86, 73}
18 gradeArray(1) = New Integer() {98, 87, 89, 81}
19 gradeArray(2) = New Integer() {70, 90, 86, 81}
20
21 ‘ upper bounds for array manipulations
22 lastStudent = gradeArray.GetUpperBound(0)
23 lastExam = gradeArray(0).GetUpperBound(0)
24
25 output = “Students \ Exams” & vbCrLf
26
27 ‘ build output string
28 BuildString(gradeArray)
29 output &= vbCrLf & vbCrLf & “Lowest grade: ” & _
30 Minimum(gradeArray) & vbCrLf & “Highest grade: ” & _
31 Maximum(gradeArray) & vbCrLf
32
33 ‘ calculate each student’s average
34 For i = 0 To lastStudent
35 output &= vbCrLf & “Average for student ” & _
36 i & ” is ” & Average(gradeArray(i))
37 Next
38
39 MessageBox.Show(output, “Jagged two-dimensional array”, _
40 MessageBoxButtons.OK, MessageBoxIcon.Information)
41 End Sub ‘ Main
42
43 ‘ find minimum grade
44 Function Minimum(ByVal grades As Integer()()) _
45 As Integer
46
47 Dim lowGrade As Integer = 100
48 Dim i, j As Integer
49
50 For i = 0 To lastStudent
51
52 For j = 0 To lastExam
53
54 If grades(i)(j) highGrade Then
77 highGrade = grades(i)(j)
78 End If
79
80 Next
81
82 Next
83
84 Return highGrade
85 End Function ‘ Maximum
86
87 ‘ determine the average grade for student
88 ‘ (or set of grades)
89 Function Average(ByVal setOfGrades As Integer()) _
90 As Double
91
92 Dim i As Integer, total As Integer = 0
93
94 ‘ find sum of student’s grades
95 For i = 0 To lastExam
96 total += setOfGrades(i)
97 Next
98
99 Return total / setOfGrades.Length
100 End Function ‘ Average
101
102 ‘ creates String displaying array
103 Sub BuildString(ByVal grades As Integer()())
104 Dim i, j As Integer
105
106 ‘ align column heads
107 output &= ” “
108
109 For i = 0 To lastExam
110 output &= “(” & i & “) “
111 Next
112
113 For i = 0 To lastStudent
114 output &= vbCrLf & ” (” & i & “) “
115
Fig. 7.17 Using jagged two-dimensional arrays (part 3 of 4).
286 Arrays Chapter 7
Procedures Minimum, Maximum and BuildString use array grades and the
variables lastStudent (upper bound for rows in the array) and lastExam (upper
bound for columns in the array). Each procedure uses nested For/Next structures to
iterate through array grades. Consider the nested For/Next structures in procedure
Minimum (lines 50–60). The outer For/Next structure sets i (i.e., the row index) to 0 so
the elements of the first row can be compared with variable lowGrade in the inner For/
Next structure (line 54). The inner For/Next structure loops through the four grades of
a particular row and compares each grade with lowGrade. If a grade is less than low-
Grade, then lowGrade is assigned that grade. The outer For/Next structure then increments
the row index by 1. The elements of the second row are compared with variable
lowGrade. The outer For/Next structure then increments the row index to 2. The elements
of the third row are compared with variable lowGrade. When execution of the
nested structures is complete (line 62), lowGrade contains the smallest grade in the twodimensional
array. Procedure Maximum behaves similarly to procedure Minimum.
Procedure Average takes one argument—a one-dimensional array of test results for
a particular student. Average is called (line 36) with argument gradeArray(i), which
is row i of the jagged two-dimensional array grades. For example, the argument
grades(1) represents the four grades for student 1 (i.e., a one-dimensional array of
grades). Remember that a jagged two-dimensional array is an array with elements that are
one-dimensional arrays. Procedure Average calculates the sum of the array elements,
divides the total by the number of test results (obtained using the Length property) and
then returns the floating-point result as a Double value (line 89).
116 For j = 0 To lastExam
117 output &= grades(i)(j) & ” “
118 Next
119
120 Next
121
122 End Sub ‘ BuildString
123
124 End Module ‘ modJaggedArray
Fig. 7.17 Using jagged two-dimensional arrays (part 4 of 4).
Chapter 7 Arrays 287
7.10 Variable-Length Parameter Lists
It is possible to create procedures that receive a variable number of arguments, using keyword
ParamArray. The program in Fig. 7.18 calls programmer-defined procedure
AnyNumberArguments three times, passing a different number of values each time.
The values passed into procedure AnyNumberArguments are stored in one-dimensional
Integer array array1, which is declared using ParamArray.
Common Programming Error 7.4
Attempting to declare a parameter variable to the right of the ParamArray array variable
is a syntax error. 7.4
Common Programming Error 7.5
Attempting to use ParamArray with a multidimensional array is a syntax error. 7.5
1 ‘ Fig. 7.18: ParamArrayTest.vb
2 ‘ Using ParamArray to create variable-length parameter lists.
34
Module modParamArrayTest
56
Sub Main()
7 AnyNumberArguments()
8 AnyNumberArguments(2, 3)
9 AnyNumberArguments(7, 8, 9, 10, 11, 12)
10
11 End Sub ‘ Main
12
13 ‘ receives any number of arguments in array
14 Sub AnyNumberArguments(ByVal ParamArray array1 _
15 As Integer())
16
17 Dim i, total As Integer
18 total = 0
19
20 If array1.Length = 0 Then
21 Console.WriteLine(“Procedure AnyNumberArguments” & _
22 ” received 0 arguments.”)
23 Else
24 Console.Write(“The total of “)
25
26 For i = 0 To array1.GetUpperBound(0)
27 Console.Write(array1(i) & ” “)
28 total += array1(i)
29 Next
30
31 Console.WriteLine(“is {0}.”, total)
32 End If
33
34 End Sub ‘ AnyNumberArguments
35
36 End Module ‘ modParamArrayTest
Fig. 7.18 Creating variable-length parameter lists (part 1 of 2).
288 Arrays Chapter 7
Common Programming Error 7.6
Using ByRef with ParamArray is a syntax error. 7.6
We call procedure AnyNumberArguments in lines 7–9, passing a different number
of arguments each time. This procedure is defined on lines 14–34 and applies keyword
ParamArray to array1 in line 14. The If structure on lines 20–32 determines whether
the number of arguments passed to the procedure is zero. If not, lines 24–31 display
array1’s elements and their sum. All arguments passed to the ParamArray array must
be of the same type as the array, otherwise a syntax error occurs. Though we used an
Integer array in this example, any type of array can be used.
In the last chapter, we discussed procedure overloading. Often, programmers prefer to
use procedure overloading rather than writing procedures with variable-length parameter
lists.
Good Programming Practice 7.2
To increase a program’s readability and performance, the programmer should use procedure
overloading in favor of procedures with variable-length parameter lists. 7.2
7.11 For Each/Next Repetition Structure
Visual Basic provides the For Each/Next repetition structure for iterating through the
values in a data structure, such as an array. When used with one-dimensional arrays, For
Each/Next behaves like a For/Next structure that iterates through the range of indices
from 0 to the value returned by GetUpperBound(0). Instead of a counter, For Each/
Next uses a variable to represent the value of each element. The program in Fig. 7.19 uses
the For Each/Next structure to determine the minimum value in a two-dimensional array
of grades.
Procedure AnyNumberArguments received 0 arguments.
The total of 2 3 is 5.
The total of 7 8 9 10 11 12 is 57.
Fig. 7.18 Creating variable-length parameter lists (part 2 of 2).
1 ‘ Fig. 7.19: ForEach.vb
2 ‘ Program uses For Each/Next to find a minimum grade.
34
Module modForEach
56
Sub Main()
7 Dim gradeArray As Integer(,) = New Integer(,) _
8 {{77, 68, 86, 73}, {98, 87, 89, 81}, {70, 90, 86, 81}}
9
10 Dim grade As Integer
11 Dim lowGrade As Integer = 100
12
Fig. 7.19 Using For Each/Next with an array (part 1 of 2).
Chapter 7 Arrays 289
The program behaves similarly to procedure Minimum of Fig. 7.17, but consolidates
the nested For structures into one For Each structure. The header of the For Each repetition
structure (line 13) specifies a variable, grade, and an array, gradeArray. The
For Each/Next structure iterates through all the elements in gradeArray, sequentially
assigning each value to variable grade. The values are compared to variable lowGrade
(line 15), which stores the lowest grade in the array.
For rectangular arrays, the repetition of the For Each/Next structure begins with the
element whose indices are all zero, then iterates through all possible combinations of
indices, incrementing the rightmost index first. When the rightmost index reaches its upper
bound, it is reset to zero, and the index to the left of it is incremented by 1. In this case,
grade takes the values as they are ordered in the initializer list in line 8. When all the
grades have been processed, lowGrade is displayed.
Although many array calculations are handled best with a counter, For Each is useful
when the indices of the elements are not important. For Each/Next particularly is useful
for looping through arrays of objects, as we discuss in Chapter 10, Object-Oriented Programming:
Polymorphism
In this chapter, we showed how to program with arrays. We mentioned that Visual
Basic .NET arrays are objects. In Chapter 8, Object-Based Programming, we show how to
create classes, which are essentially the “blueprints” from which objects are instantiated
(i.e., created).
SUMMARY
• An array is a group of contiguous memory locations that have the same name and are of the same
type.
• The first element in every array is the zeroth element (i.e., element 0).
• The position number in parentheses more formally is called the index (or the subscript). An index
must be an integer or an integer expression.
• All arrays have access to the methods and properties of class System.Array, including the
GetUpperBound method and the Length property.
• To reference the ith element of an array, use i – 1 as the index.
13 For Each grade In gradeArray
14
15 If grade Add Class. Enter the class name in the Name text field and
click the Open button. Note that the class name (ending with the .vb file extension)
appears in the Solution Explorer below the project name.
The following application consists of class CTime (Fig. 8.1) and module modTime-
Test (Fig. 8.2). Class CTime contains the information needed to represent a specific time;
module modTimeTest contains method Main, which uses an instance of class CTime to
run the application.
In Fig. 8.1, lines 4–5 begin the CTime class definition, indicating that class CTime
inherits from class Object (of namespace System). Visual Basic programmers use
inheritance to create classes from existing classes. The Inherits keyword (line 5) followed
by class name Object indicates that class CTime inherits existing pieces of class
Object. If the programmer does not include line 5, the Visual Basic compiler includes it
implicitly. Because this is the first chapter that exposes classes, we include these declarations
for the classes in this chapter; however, we remove them in Chapter 9. A complete
understanding of inheritance is not necessary to the understanding of the concepts and programs
in this chapter. We explore inheritance in detail in Chapter 9.
1 ‘ Fig. 8.1: CTime.vb
2 ‘ Represents time in 24-hour format.
34
Class CTime
5 Inherits Object
67
‘ declare Integer instance values for hour, minute and second
8 Private mHour As Integer ‘ 0 – 23
9 Private mMinute As Integer ‘ 0 – 59
10 Private mSecond As Integer ‘ 0 – 59
11
12 ‘ Method New is the CTime constructor method, which initializes
13 ‘ instance variables to zero
14 Public Sub New()
15 SetTime(0, 0, 0)
16 End Sub ‘ New
17
18 ‘ set new time value using universal time;
19 ‘ perform validity checks on data;
20 ‘ set invalid values to zero
21 Public Sub SetTime(ByVal hourValue As Integer, _
22 ByVal minuteValue As Integer, ByVal secondValue As Integer)
23
24 ‘ check if hour is between 0 and 23, then set hour
25 If (hourValue >= 0 AndAlso hourValue = 0 AndAlso minuteValue = 0 AndAlso secondValue < 60) Then
40 mSecond = secondValue
41 Else
42 mSecond = 0
43 End If
44
45 End Sub ' SetTime
46
47 ' convert String to universal-time format
48 Public Function ToUniversalString() As String
49 Return String.Format("{0}:{1:D2}:{2:D2}", _
50 mHour, mMinute, mSecond)
51 End Function ' ToUniversalString
52
53 ' convert to String in standard-time format
54 Public Function ToStandardString() As String
55 Dim suffix As String = " PM"
56 Dim format As String = "{0}:{1:D2}:{2:D2}"
57 Dim standardHour As Integer
58
59 ' determine whether time is AM or PM
60 If mHour = 0 AndAlso hourValue = 0 AndAlso minuteValue = 0 AndAlso secondValue < 60) Then
67 mSecond = secondValue
68 Else
69 mSecond = 0
70 End If
71
72 End Sub ' SetTime
73
74 ' convert String to universal-time format
75 Public Function ToUniversalString() As String
76 Return String.Format("{0}:{1:D2}:{2:D2}", _
77 mHour, mMinute, mSecond)
78 End Function ' ToUniversalString
79
80 ' convert to String in standard-time format
81 Public Function ToStandardString() As String
82 Dim suffix As String = " PM"
83 Dim format As String = "{0}:{1:D2}:{2:D2}"
84 Dim standardHour As Integer
85
86 ' determine whether time is AM or PM
87 If mHour = 0 AndAlso value = 0 AndAlso value = 0 AndAlso value < 60) Then
109 mSecond = value
110 Else
111 mSecond = 0
112 End If
113
114 End Set
115
116 End Property ' Second
117
118 ' convert String to universal-time format
119 Public Function ToUniversalString() As String
120 Return String.Format("{0}:{1:D2}:{2:D2}", _
121 mHour, mMinute, mSecond)
122 End Function ' ToUniversalString
123
124 ' convert to String in standard-time format
125 Public Function ToStandardString() As String
126 Dim suffix As String = " PM"
127 Dim format As String = "{0}:{1:D2}:{2:D2}"
128 Dim standardHour As Integer
129
130 ' determine whether time is AM or PM
131 If mHour 0 AndAlso monthValue 0 AndAlso _
45 testDayValue <= daysPerMonth(mMonth)) Then
46
47 Return testDayValue
48 End If
49
50 ' check for leap year in February
51 If (mMonth = 2 AndAlso testDayValue = 29 AndAlso _
52 mYear Mod 400 = 0 OrElse mYear Mod 4 = 0 AndAlso _
53 mYear Mod 100 0) Then
54
55 Return testDayValue
56 Else
57
58 ‘ inform user of error
59 Dim errorMessage As String = _
60 “day ” & testDayValue & “invalid. Set to day 1. “
61
62 MessageBox.Show(errorMessage, “”, _
63 MessageBoxButtons.OK, MessageBoxIcon.Error)
64
65 Return 1 ‘ leave object in consistent state
66 End If
67
68 End Function ‘ CheckDay
69
70 ‘ create string containing month/day/year format
71 Public Function ToStandardString() As String
72 Return mMonth & “/” & mDay & “/” & mYear
73 End Function ‘ ToStandardString
74
75 End Class ‘ CDay
Fig. 8.8 CDay class encapsulates day, month and year information (part 2 of 2).
Chapter 8 Object-Based Programming 323
Class CEmployee (Fig. 8.9) holds information relating to an employee’s birthday
and hire date (lines 7–10) using instance variables mFirstName, mLastName,
mBirthDate and mHireDate. Members mBirthDate and mHireDate are references
to CDay objects, each of which contains instance variables mMonth, mDay and
mYear. In this example, class CEmployee is composed of two references of class CDay.
The CEmployee constructor (lines 13–32) takes eight arguments (firstNameValue,
lastNameValue, birthMonthValue, birthDayValue, birthYearValue,
hireMonthValue, hireDayValue and hireYearValue). Lines 26–27 pass arguments
birthMonthValue, birthDayValue and birthYearValue to the CDay
constructor to create the mBirthDate object. Similarly, lines 30–31 pass arguments
hireMonthValue, hireDayValue and hireYearValue to the CDay constructor
to create the mHireDate object.
Module modCompositionTest (Fig. 8.10) runs the application with method
Main. Lines 9–10 instantiate a CEmployee object (“Bob Jones” with birthday 7/
24/1949 and hire date 3/12/1988), and lines 12–13 display the information to the
user in a MessageBox.
1 ‘ Fig. 8.9: CEmployee.vb
2 ‘ Represent employee name, birthday and hire date.
34
Class CEmployee
5 Inherits Object
67
Private mFirstName As String
8 Private mLastName As String
9 Private mBirthDate As CDay ‘ member object reference
10 Private mHireDate As CDay ‘ member object reference
11
12 ‘ CEmployee constructor
13 Public Sub New(ByVal firstNameValue As String, _
14 ByVal lastNameValue As String, _
15 ByVal birthMonthValue As Integer, _
16 ByVal birthDayValue As Integer, _
17 ByVal birthYearValue As Integer, _
18 ByVal hireMonthValue As Integer, _
19 ByVal hireDayValue As Integer, _
20 ByVal hireYearValue As Integer)
21
22 mFirstName = firstNameValue
23 mLastName = lastNameValue
24
25 ‘ create CDay instance for employee birthday
26 mBirthDate = New CDay(birthMonthValue, birthDayValue, _
27 birthYearValue)
28
29 ‘ create CDay instance for employee hire date
30 mHireDate = New CDay(hireMonthValue, hireDayValue, _
31 hireYearValue)
32 End Sub ‘ New
Fig. 8.9 CEmployee class encapsulates employee name, birthday and hire date
(part 1 of 2).
324 Object-Based Programming Chapter 8
8.9 Using the Me Reference
Every object can access a reference to itself via the Me reference. The Me reference is used
implicitly refer to instance variables, properties and methods of an object. We begin with
an example of using reference Me explicitly and implicitly to display the Private data of
an object.
Class CTime4 (Fig. 8.11) defines three Private instance variables—mHour, mMinute
and mSecond (line 5). The constructor (lines 8–14) receives three Integer arguments
to initialize a CTime4 object. Note that for this example, we have made the
constructor’s parameter names (lines 8–9) identical to the class’s instance variable names
(line 5). A method’s local variable that has the same name as a class’s instance variable hides
the instance variable in that method’s scope. However, the method can use reference Me to
refer to these instance variables explicitly. Lines 11–13 of Fig. 8.11 demonstrate this feature.
33
34 ‘ return employee information as standard-format String
35 Public Function ToStandardString() As String
36 Return mLastName & “, ” & mFirstName & ” Hired: ” _
37 & mHireDate.ToStandardString() & ” Birthday: ” & _
38 mBirthDate.ToStandardString()
39 End Function ‘ ToStandardString
40
41 End Class ‘ CEmployee
1 ‘ Fig. 8.10: CompositionTest.vb
2 ‘ Demonstrate an object with member object reference.
34
Imports System.Windows.Forms
56
Module modCompositionTest
78
Sub Main()
9 Dim employee As New CEmployee( _
10 “Bob”, “Jones”, 7, 24, 1949, 3, 12, 1988)
11
12 MessageBox.Show(employee.ToStandardString(), _
13 “Testing Class Employee”)
14 End Sub ‘ Main
15
16 End Module ‘ modCompositionTest
Fig. 8.10 Composition demonstration.
Fig. 8.9 CEmployee class encapsulates employee name, birthday and hire date
(part 2 of 2).
Chapter 8 Object-Based Programming 325
Method BuildString (lines 17–20) returns a String created by a statement that
uses the Me reference explicitly and implicitly. Line 18 uses the Me reference explicitly to
call method ToUniversalString, whereas line 19 uses the Me reference implicitly to
call method ToUniversalString. Note that both lines perform the same task (i.e., generate
identical output). Because of this, programmers usually do not use the Me reference
explicitly to reference methods.
Common Programming Error 8.6
For a method in which a parameter has the same name as an instance variable, use reference
Me to access the instance variable explicitly; otherwise, the method parameter is referenced. 8.6
Testing and Debugging Tip 8.3
Avoidance of method-parameter names that conflict with instance variable names helps prevent
certain subtle, hard-to-trace bugs. 8.3
Good Programming Practice 8.7
The explicit use of the Me reference can increase program clarity where Me is optional. 8.7
Module modMeTest (Fig. 8.12) runs the application that demonstrates the use of the
Me reference. Line 9 instantiates an instance of class CTime4. Lines 11–12 invoke method
BuildString, then display the results to the user in a MessageBox.
1 ‘ Fig. 8.11: CTime4.vb
2 ‘ Encapsulate time using Me reference.
34
Class CTime4
5 Private mHour, mMinute, mSecond As Integer
67
‘ CTime4 constructor
8 Public Sub New(ByVal mHour As Integer, _
9 ByVal mMinute As Integer, ByVal mSecond As Integer)
10
11 Me.mHour = mHour
12 Me.mMinute = mMinute
13 Me.mSecond = mSecond
14 End Sub ‘ New
15
16 ‘ create String using Me and implicit references
17 Public Function BuildString() As String
18 Return “Me.ToUniversalString(): ” & Me.ToUniversalString() _
19 & vbCrLf & “ToUniversalString(): ” & ToUniversalString()
20 End Function ‘ BuildString
21
22 ‘ convert to String in standard-time format
23 Public Function ToUniversalString() As String
24 Return String.Format(“{0:D2}:{1:D2}:{2:D2}”, _
25 mHour, mMinute, mSecond)
26 End Function ‘ ToUniversalString
27
28 End Class ‘ CTime4
Fig. 8.11 Class using Me reference.
326 Object-Based Programming Chapter 8
8.10 Garbage Collection
In previous examples, we have seen how a constructor method initializes data in an object
of a class after the object is created. Keyword New allocates memory for the object, then
calls that object’s constructor. The constructor might acquire other system resources, such
as network connections and database connections. Objects must have a disciplined way to
return memory and release resources when the program no longer uses those objects. Failure
to release such resources causes resource leaks.
Unlike C and C++, in which programmers must manage memory explicitly, Visual
Basic performs memory management internally. The .NET Framework performs garbage
collection of memory to return memory that is no longer needed back to the system. When
the garbage collector executes, it locates objects for which the application has no references.
Such objects can be collected at that time or in a subsequent execution of the garbage
collector. Therefore, the memory leaks that are common in such languages as C and C++,
where memory is not reclaimed automatically, are rare in Visual Basic.
Dependence on Visual Basic’s automatic garbage collection, however, might not be the
best way to manage resources. Certain resources, such as network connections, database connections
and file streams, are better handled explicitly by the programmer. One technique
employed to handle these resources (in conjunction with the garbage collector) is to define a
finalizer method that returns resources to the system. The garbage collector calls an object’s
finalizer method to perform termination housekeeping on that object just before the garbage
collector reclaims the object’s memory (this process is called finalization).
Class Object defines method Finalize, which is the finalizer method for all
Visual Basic objects. Because all Visual Basic classes inherit from class Object, they
1 ‘ Fig. 8.12: MeTest.vb
2 ‘ Demonstrates Me reference.
34
Imports System.Windows.Forms
56
Module modMeTest
78
Sub Main()