導入
レッスン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文と組み合わせて実際に使っていきます。