【COBOL学習|実務向け】COBOLの「IF文」を正しく使いこなす ― 構造化プログラミングの鉄則

1. 導入:なぜ今、IF文の「構造化」が重要なのか

現場で長年コードを保守していると、いわゆる「スパゲッティコード」に遭遇することがあります。その原因の多くは、条件分岐の入れ子(ネスト)が複雑化し、どこで処理が終わっているのか不明瞭なIF文にあります。特にCOBOL 85以降で導入された「END-IF」を適切に活用することは、バグを減らし、可読性の高い保守可能なプログラムを書くための第一歩です。

2. 基礎知識:IF文とピリオドの罠

COBOLのIF文における最大の注意点は「ピリオド(.)の役割」です。かつてのCOBOLでは、IF文の終了をピリオドで示していましたが、これが入れ子構造において「どのIFに対応するピリオドか」という誤解を招き、致命的なバグの原因となってきました。現在では「END-IF」を使用することで、条件分岐の範囲を明示的に区切ることが推奨されています。これにより、論理的な意図が明確になり、コンパイラも構造を正しく解釈できるようになります。

3. 実装・解決策:構造化のルール

現場での実装においては、以下のルールを徹底しましょう。
END-IFを必ず記述する:ピリオドだけに頼らず、明示的に範囲を閉じます。
ネストを深くしすぎない:IFの中にIFを重ねる場合は、可能な限りEVALUATE文への書き換えを検討してください。
ELSE句の活用:条件が明確な場合はELSEを記述し、例外処理を漏らさないようにします。

4. サンプルプログラム

以下のコードは、売上金額に応じた割引率を判定する実用的な例です。

IDENTIFICATION DIVISION.
PROGRAM-ID. SAMPLE-IF-STMT.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-SALES-AMT PIC 9(07) VALUE 150000.
01 WS-DISCOUNT-RATE PIC 9(03) VALUE 0.

PROCEDURE DIVISION.
> 売上金額に応じた条件分岐
IF WS-SALES-AMT > 100000 THEN
MOVE 10 TO WS-DISCOUNT-RATE
DISPLAY “割引率: 10%”
ELSE
IF WS-SALES-AMT > 50000 THEN
MOVE 5 TO WS-DISCOUNT-RATE
DISPLAY “割引率: 5%”
ELSE
MOVE 0 TO WS-DISCOUNT-RATE
DISPLAY “割引率: なし”
END-IF
END-IF.

> 処理の最後にはピリオドを打つが、IFの中ではEND-IFで区切る
DISPLAY “処理終了”.
STOP RUN.

5. 応用・注意点:現場で役立つアドバイス

バグ回避のヒント
IF文を記述する際、条件式が複雑になると論理演算(AND/OR)の優先順位で意図しない動きをすることがあります。不安な場合は、括弧()を使って優先順位を明確にするのがベテランの作法です。

また、古いソースコードを修正する際、END-IFがない古い形式に出会うことがあります。その場合は無理にEND-IFを付け加えると全体のピリオド構成が崩れ、広範囲に影響が及ぶ可能性があります。既存コードの改修時は、その箇所の「構造」を慎重に見極めてから修正を行うようにしてください。

コメント

タイトルとURLをコピーしました