Nama Kondisi

Penanda level-88 yang mengubah nilai menjadi kondisi bernama sehingga logika mendokumentasikan dirinya.

Daftar isi

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.

cobol kondisi-88.cbl
       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.
text Keluaran
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 Y

Simpan berkasnya di direktori kerja, kompilasi dengan perintah berikut, lalu jalankan ./kondisi-88.

bash
# kompilasi program nama kondisi level-88
cobc -x kondisi-88.cbl

Definisi 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#