Topik ini membahas nama kondisi (condition-name) level-88, yaitu penanda pada
Divisi DATA yang mengikat sejumlah nilai atau rentang nilai sebuah item induk
kepada sebuah nama yang bermakna. Dengan nama kondisi, pernyataan IF dan
EVALUATE terbaca seperti kalimat bisnis, misalnya IF DIPINJAM, dan verb
SET dapat menetapkan nilai induk melalui nama kondisinya. Demonstrasi menggunakan
program status peminjaman perpustakaan yang dikompilasi dan dijalankan pada
GnuCOBOL 3.2.
Mendefinisikan nama kondisi level-88#
Penanda level-88 ditulis tepat di bawah item induknya dan wajib memuat
klausa VALUE yang mendaftarkan nilai atau rentang yang mengaktifkannya.
Daftar nilai dipisahkan koma, sedangkan rentang ditulis dengan kata THRU,
misalnya VALUE 3 THRU 5 yang mencakup 3, 4, dan 5. Nama kondisi tidak
menyimpan data apa pun dan tidak menambah satu byte pun pada record, karena
yang disimpan hanyalah item induknya. Satu item induk dapat memiliki
beberapa nama kondisi yang masing-masing mewakili kelompok nilai berbeda.
Program berikut mendefinisikan empat status peminjaman pada field
STATUS-KODE beserta dua kelompok kode berkas pada field KODE-BERKAS.
Satu klausa VALUE juga boleh mencampur nilai tunggal dengan rentang,
misalnya VALUE 1, 3 THRU 5 yang berarti nilai 1 beserta 3 sampai 5.
Item induk beserta seluruh nama kondisinya membentuk kamus makna yang
terbaca langsung pada definisi datanya.
IDENTIFICATION DIVISION.
PROGRAM-ID. KONDISI-88.
*--------------------------------------------------------------
* Nama kondisi level-88 dengan daftar nilai, rentang VALUE
* THRU, evaluasi di IF dan EVALUATE, serta SET TO TRUE.
*--------------------------------------------------------------
DATA DIVISION.
WORKING-STORAGE SECTION.
01 PINJAMAN.
05 STATUS-KODE PIC 9.
88 DIAJUKAN VALUE 1.
88 DIPINJAM VALUE 2.
88 SELESAI VALUE 3 THRU 5.
88 HILANG VALUE 6.
05 KODE-BERKAS PIC X.
88 BERKAS-LUNAS VALUE "Y".
88 BERKAS-BELUM VALUE "N", "P".
PROCEDURE DIVISION.
UJI-NAMA-KONDISI.
MOVE 2 TO STATUS-KODE
IF DIPINJAM
DISPLAY "Kode " STATUS-KODE ": buku sedang dipinjam"
END-IF
EVALUATE TRUE
WHEN DIAJUKAN
DISPLAY "Status: menunggu pengambilan"
WHEN DIPINJAM
DISPLAY "Status: masa peminjaman berjalan"
WHEN SELESAI
DISPLAY "Status: transaksi telah selesai"
WHEN HILANG
DISPLAY "Status: buku dinyatakan hilang"
END-EVALUATE.
UJI-RENTANG-DAN-SET.
MOVE 4 TO STATUS-KODE
IF SELESAI
DISPLAY "Kode " STATUS-KODE " termasuk rentang SELESAI"
END-IF
SET DIPINJAM TO TRUE
DISPLAY "Setelah SET DIPINJAM, kode menjadi " STATUS-KODE.
UJI-DAFTAR-NILAI.
MOVE "P" TO KODE-BERKAS
IF BERKAS-BELUM
DISPLAY "Kode " KODE-BERKAS ": berkas belum lunas"
END-IF
SET BERKAS-LUNAS TO TRUE
DISPLAY "Setelah SET LUNAS, kode menjadi " KODE-BERKAS
STOP RUN.Kode 2: buku sedang dipinjam
Status: masa peminjaman berjalan
Kode 4 termasuk rentang SELESAI
Setelah SET DIPINJAM, kode menjadi 2
Kode P: berkas belum lunas
Setelah SET LUNAS, kode menjadi YSimpan berkasnya di direktori kerja, kompilasi dengan perintah berikut, lalu
jalankan ./kondisi-88.
# kompilasi program nama kondisi level-88
cobc -x kondisi-88.cblDefinisi pada program memperlihatkan kedua bentuk VALUE. Kondisi DIAJUKAN,
DIPINJAM, dan HILANG masing-masing terikat pada satu nilai, sedangkan
SELESAI terikat pada rentang VALUE 3 THRU 5. Pada field kedua, kondisi
BERKAS-BELUM mendaftar dua nilai sekaligus dengan VALUE "N", "P", yang
berarti kode N dan P sama-sama menandakan berkas belum lunas. Nama pada level
88 inilah yang digunakan program tanpa menyebut angka 1 sampai 6 sama sekali.
Evaluasi kondisi bernama di IF dan EVALUATE TRUE#
Nama kondisi merupakan ekspresi boolean yang benar apabila nilai item
induknya saat itu termasuk dalam daftar atau rentang VALUE-nya. Karena
bersifat boolean, nama tersebut digunakan langsung sebagai syarat IF tanpa
operator perbandingan, seperti IF DIPINJAM pada paragraf pertama program.
Bentuk yang sama juga tepat digunakan sebagai cabang EVALUATE TRUE, yaitu
WHEN DIAJUKAN, WHEN DIPINJAM, dan seterusnya, sehingga keputusan atas kode status
tertulis sebagai daftar kasus yang dinamai.
Baris pertama keluaran menunjukkan kode 2 yang membuat IF DIPINJAM
bernilai benar, dan baris kedua berasal dari cabang WHEN DIPINJAM yang
cocok pada EVALUATE. Baris ketiga memperlihatkan perilaku rentang. Setelah kode 4
diisi, kondisi SELESAI menjadi benar karena 4 berada di dalam rentang 3
THRU 5, meskipun tidak ada satu pun definisi yang menyebut angka 4 secara
eksplisit. Perubahan isi field otomatis mengubah kondisi mana yang aktif,
dan kode program tetap terbaca seperti daftar status. Angka kode yang
tersebar sebagai bilangan ajaib di dalam prosedur hilang seluruhnya, dan
penggantinya adalah nama yang mengandung maknanya sendiri.
Menetapkan nilai induk dengan SET TO TRUE#
Pernyataan SET nama-kondisi TO TRUE mengisi item induk dengan nilai yang
membuat kondisi tersebut benar. Apabila kondisinya terikat pada satu nilai,
nilai itulah yang ditulis ke induk, sedangkan apabila kondisinya berupa
rentang THRU, nilai awal rentang yang dipilih. Empat baris terakhir keluaran
memperlihatkan efeknya. SET DIPINJAM TO TRUE mengubah STATUS-KODE
menjadi 2, dan SET BERKAS-LUNAS TO TRUE mengubah KODE-BERKAS menjadi
huruf Y.
Bentuk penulisan ini memindahkan pengetahuan tentang nilai kode dari badan prosedur ke definisi data. Apabila kode status DIPINJAM suatu saat diubah dari 2 menjadi angka lain, hanya definisi VALUE pada level 88 yang perlu disunting, sedangkan seluruh IF, EVALUATE, dan SET tetap utuh. Keuntungan ini menjadikan nama kondisi cara baku untuk menangani kode status pada program bisnis, dan logika program mendokumentasikan dirinya tanpa tabel kode terpisah.
Kesalahan umum#
- Menganggap level-88 menyimpan data. Penanda ini hanya memetakan nama ke nilai item induknya, sehingga menulis level-88 tanpa item induk di atasnya menghasilkan error kompilasi.
- Mengira SET TO TRUE mengisi seluruh rentang. Pada kondisi dengan rentang THRU, yang ditetapkan adalah nilai awal rentangnya saja. Isi item induk secara langsung dengan nilai yang dimaksud apabila anggota lain dari rentangnya diperlukan.
- Menggandakan nama kondisi pada item induk yang berbeda. Dua kondisi
bernama sama membuat rujukan ambigu, sehingga compiler menuntut
kualifikasi seperti
DIPINJAM OF PINJAMAN.
Ringkasan#
- Level-88 mengikat nama bermakna kepada daftar nilai atau rentang THRU milik item induknya tanpa menambah penyimpanan.
- Nama kondisi digunakan langsung sebagai syarat IF dan sebagai cabang EVALUATE TRUE, dan status benar-salahnya mengikuti isi item induk.
- SET nama-kondisi TO TRUE mengisi item induk dengan nilai yang mengaktifkan kondisi tersebut, yaitu nilai tunggalnya atau nilai awal rentangnya.
- Dengan nama kondisi, perubahan kode status cukup dilakukan pada definisi VALUE tanpa menyentuh logika prosedur.
Referensi#
- GnuCOBOL — Free Software Foundation — Situs proyek GnuCOBOL 3.2 yang digunakan untuk mengompilasi dan menjalankan seluruh contoh pada topik ini.
- IBM Enterprise COBOL for z/OS documentation — IBM — Dokumentasi resmi yang memuat penanda level-88, klausa VALUE dengan rentang THRU, serta verb SET untuk nama kondisi.