本文へスキップ
BecomeCoder

COBOLコース · 第3章 データを表す ― PICTURE句とレベル番号 · レッスン18

88レベル ― 条件名で読みやすくする

ローカル実施

導入

レッスン15で少しだけ触れた 88レベル。これはCOBOL独特の、とても便利な機能です。「変数の値」に名前を付けて、条件分岐を英語のように読みやすくしてくれます。

説明

たとえば「ステータスコードが 1 なら処理中、2 なら完了、9 ならエラー」というデータがあるとします。

       01  WS-STATUS-CODE       PIC 9(1).
           88  STATUS-IN-PROGRESS      VALUE 1.
           88  STATUS-COMPLETE         VALUE 2.
           88  STATUS-ERROR            VALUE 9.
  • 88 … 条件名(condition-name)を宣言する特別なレベル番号。「WS-STATUS-CODE の値が 1 のとき」という条件そのものに、STATUS-IN-PROGRESS という名前を付けています。
  • 88レベル自体はメモリ領域を持ちません。あくまで「親の変数がこの値のときに真になる、名前付きの条件」です。

これがどう役立つか、次章で学ぶIF文と組み合わせて見てみましょう。

      *> 88レベルを使わない場合
           IF WS-STATUS-CODE = 9
               DISPLAY "エラーが発生しました"
           END-IF.

      *> 88レベルを使った場合(意図がひと目で分かる)
           IF STATUS-ERROR
               DISPLAY "エラーが発生しました"
           END-IF.

IF WS-STATUS-CODE = 9 は「9って何の意味だっけ?」とコードを読む人を悩ませますが、IF STATUS-ERROR なら意図がそのまま読み取れます。これは多くの言語での「マジックナンバーを定数や列挙型(enum)に置き換える」プラクティスに近い効果を、COBOLでは88レベルによって実現しています。

値を設定するときも、専用の書き方があります。

           SET STATUS-ERROR TO TRUE.
      *>  これは「MOVE 9 TO WS-STATUS-CODE.」と同じ意味

SET 条件名 TO TRUE と書くと、対応する値(この場合 9)が自動的に親の変数へ設定されます。「数値の意味を覚えておく」負担から、コードを読む人を解放してくれる——これが88レベルの価値です。

試すには

自分がよく使いそうなステータス(「未処理・処理中・完了・失敗」など)を思い浮かべ、WS-STATUS-CODE のようなコード値と、それぞれに対応する88レベルの条件名を書き出してみましょう。次章でIF文・EVALUATE文と組み合わせて実際に使っていきます。