導入
COBOLの記述といえば、IF文の入れ子構造(ネスト)が深くなり、可読性が低下してしまうことがよくあります。特に「複数のフラグのうち、どれか一つがONになったら処理する」といったロジックを書く際、IF文を並べるとコードが冗長になりがちです。今回紹介する「EVALUATE 1」というテクニックは、そんな複雑な分岐を驚くほどシンプルに解決するための強力な武器になります。
基礎知識
通常、EVALUATE文は「EVALUATE 変数名」のように記述し、その変数の値に応じて処理を分岐させます。しかし、EVALUATEのSubject(評価対象)に定数「1」を置くというトリッキーな書き方が可能です。
このとき、WHEN句に書く変数は「その変数が1(真)であるか」を評価することになります。つまり、複数のフラグ変数(0または1)を順番にチェックし、最初に「1」になった条件の処理だけを実行するという動作を実現できるのです。
実装/解決策
この手法を用いると、IF-ELSE IFの連鎖を排除できます。特に、優先順位のあるフラグチェックや、状態遷移の判定において、コードの視認性が劇的に向上します。論理的にも「最初に一致したWHENだけを通る」というEVALUATEの性質と合致するため、意図しない多重処理を防ぐことができます。
サンプルプログラム
以下は、3つのフラグのうち、どれか一つがONになっているかを判定し、その状態に応じた処理を行うサンプルです。
IDENTIFICATION DIVISION.
PROGRAM-ID. EVALUATE-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-FLAGS.
05 WS-FLAG-A PIC 9 VALUE 0.
05 WS-FLAG-B PIC 9 VALUE 1.
05 WS-FLAG-C PIC 9 VALUE 0.
PROCEDURE DIVISION.
MAIN-LOGIC.
- EVALUATE 1 を使うことで、条件が「1」であるWHENを探す
EVALUATE 1
WHEN WS-FLAG-A
DISPLAY “フラグAがONです。”
WHEN WS-FLAG-B
DISPLAY “フラグBがONです。”
WHEN WS-FLAG-C
DISPLAY “フラグCがONです。”
WHEN OTHER
DISPLAY “すべてのフラグがOFFです。”
END-EVALUATE.
STOP RUN.
応用・注意点
このテクニックを使用する際の注意点が二つあります。
一つ目は、「優先順位」です。EVALUATEは最初に一致したWHEN句のみを実行します。複数のフラグが同時にONになる可能性がある場合、先に記述したWHEN句が優先されることを意識してください。
二つ目は、「可読性への配慮」です。コードがスッキリするのは事実ですが、慣れていない若手技術者にとっては「なぜいきなり1を評価しているのか?」と戸惑わせる原因にもなります。必ずコメントを添え、チーム内での認識を共有しておくことが、保守性を保つ秘訣です。現場のコードを美しく保つための「大人の嗜み」として活用してください。

コメント