導入
前のレッスンの最後で見たとおり、IFのネストは条件が増えるほど読みにくくなります。この問題を解決するのが EVALUATE文 です。多くの言語の switch 文に相当し、複数の条件をフラットに、見通しよく書けます。
説明
01 WS-SCORE PIC 9(3) VALUE 85.
01 WS-GRADE PIC X(1).
PROCEDURE DIVISION.
EVALUATE TRUE
WHEN WS-SCORE >= 90
MOVE "S" TO WS-GRADE
WHEN WS-SCORE >= 70
MOVE "A" TO WS-GRADE
WHEN WS-SCORE >= 50
MOVE "B" TO WS-GRADE
WHEN OTHER
MOVE "C" TO WS-GRADE
END-EVALUATE.
DISPLAY WS-GRADE.
*> 結果: A(WS-SCOREは85なので、最初に真になる WHEN WS-SCORE >= 70 が実行される)
EVALUATE TRUE… 「TRUEと一致するものを探す」という書き方をすることで、各WHENに独立した条件式を書けるようにしています(実務でよく使われる定番パターンです)。WHEN 条件… 上から順に評価され、最初に一致した節だけが実行されます(前のレッスンのIFネストと同じ「最初の一致で確定」という考え方)。WHEN OTHER… どの条件にも一致しなかったときの、いわば「それ以外すべて」の受け皿。END-EVALUATE.… EVALUATE文の終わり。
EVALUATE は「1つの値」を複数の値と比較する、素直な使い方もできます。
EVALUATE WS-GRADE
WHEN "S"
DISPLAY "特に優秀です"
WHEN "A"
DISPLAY "優秀です"
WHEN "B"
DISPLAY "合格です"
WHEN OTHER
DISPLAY "再試験が必要です"
END-EVALUATE.
さらに、WHEN には複数の条件をカンマ区切りで並べることも可能です(例: WHEN "A", "B")。深いネストになりがちな多分岐は、まずEVALUATE文で書けないかを検討する——これが読みやすいCOBOLコードの定石です。
試すには
レッスン22で書いた「S・A・B評価」のIFネストを、EVALUATE文で書き直してみましょう。ネストがなくなり、条件が横一列に並ぶことで読みやすくなる感覚を確認してください。