導入
現場でコードを読み解いていると、IF文の中に「IF A = 1 OR 2 OR 3」といった記述を見かけることがあります。これはCOBOLの仕様である「略略条件式(Abbreviated Combined Relation Conditions)」と呼ばれるものです。記述を極限まで短くできるため、一見するとスマートに見えます。しかし、この簡潔さは、時として「意図しない論理の崩壊」を招く諸刃の剣でもあります。本稿では、この機能の仕組みと、現場で安全に運用するための考え方を解説します。
基礎知識
略略条件式とは、比較対象(左辺)が共通している場合に、2回目以降の比較において左辺の記述を省略できる仕組みです。
例えば、「IF A = 1 OR A = 2」と書くべきところを、「IF A = 1 OR 2」と記述できます。
コンパイラは、省略された部分を直前の左辺で補完します。しかし、ここで注意すべきは論理演算子の優先順位です。COBOLでは「AND」が「OR」よりも先に評価されます。この優先順位を意識せずに複雑な条件を繋げると、期待した結果とは全く異なる論理が生成されてしまいます。
実装/解決策
略略条件式を安全に使うための鉄則は「ORのみで構成する」ことです。ANDが混在する場合、略略条件式を使うとコードの可読性が著しく低下します。
また、比較対象が固定値であれば、可能であれば「EVALUATE」文への書き換えを検討してください。EVALUATE文であれば、略略条件式が抱える「優先順位による誤解」を根本から排除でき、メンテナンス性も向上します。
サンプルプログラム
以下は、略略条件式の動作を確認するためのサンプルです。そのままコピーして、コンパイル環境で動作を確認してみてください。
IDENTIFICATION DIVISION.
PROGRAM-ID. ABBREVIATED-TEST.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-CODE PIC 9(02).
PROCEDURE DIVISION.
MOVE 20 TO WS-CODE.
- 略略条件式の例
- 「WS-CODE = 10 OR WS-CODE = 20 OR WS-CODE = 30」と解釈される
IF WS-CODE = 10 OR 20 OR 30
DISPLAY “一致しました: ” WS-CODE
ELSE
DISPLAY “一致しませんでした”
END-IF.
- 推奨されるEVALUATEによる記述(可読性が高い)
EVALUATE WS-CODE
WHEN 10
WHEN 20
WHEN 30
DISPLAY “EVALUATEで判定: 一致しました”
WHEN OTHER
DISPLAY “EVALUATEで判定: 一致しません”
END-EVALUATE.
STOP RUN.
応用・注意点
現場の保守において最も注意すべきは、「後任者がこの省略記法を知っているか」という点です。COBOLの標準仕様ではありますが、あえて記述を冗長にすることで、誰が読んでも論理が明白なコードにすることも「保守性の高いプログラム」への近道です。
特に、AND条件が絡む場合(例:IF A = 1 OR 2 AND B = 3)は、決して略略条件式を使用しないでください。これは「A=1 OR (A=2 AND B=3)」と解釈され、意図した「(A=1 OR A=2) AND B=3」とは異なる結果になります。現場では「複雑な条件は括弧で括るか、分解して記述する」のが、バグを未然に防ぐベテランの流儀です。

コメント