1. 導入:なぜ「IF」の書き方が重要なのか
COBOLのプログラムを書いていて、「期待した通りに処理が分岐しない」という経験はありませんか?特に複数のIF文を入れ子(ネスト)にしたとき、ELSE句がどのIFに対応しているのか分からなくなることがあります。これはプログラミングの世界で「Dangling Else(宙に浮いたELSE)」と呼ばれる有名な問題です。論理ミスを防ぎ、誰が見ても分かりやすいコードを書くために、COBOL 85以降で導入された「END-IF」の正しい使い方をマスターしましょう。
2. 基礎知識:END-IFの役割
昔のCOBOLでは、IF文の終わりをピリオド「.」で示していました。しかし、ピリオドはプログラムの区切りでもあるため、複雑な入れ子構造の中で使うと、意図しない場所でIF文が終わってしまうリスクがありました。
END-IFは、そのIF文がどこで終了するかを明示的に宣言する構文です。これを使うことで、コンパイラに対して「ここまでの処理がこのIFの範囲ですよ」と正確に伝えることができ、ELSEがどのIFに属するかを確実に制御できます。
3. 実装と解決策:END-IFで論理を固定する
複雑な条件分岐を書くときは、必ず「IF〜END-IF」のセットで記述する癖をつけましょう。これにより、ELSE句がどのIFとペアになるのかが視覚的にも明確になります。インデント(字下げ)を適切に行うことで、プログラムの読みやすさは劇的に向上します。
4. サンプルプログラム
以下のコードは、END-IFを使ってIFとELSEの関係を明確にした例です。コピーして、動作を確認してみてください。
IDENTIFICATION DIVISION.
PROGRAM-ID. IF-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 W-SCORE PIC 9(03) VALUE 80.
01 W-GRADE PIC X(10).
PROCEDURE DIVISION.
> 成績判定のサンプル
IF W-SCORE >= 60
IF W-SCORE >= 80
MOVE “合格(優)” TO W-GRADE
ELSE
MOVE “合格(良)” TO W-GRADE
END-IF > ここで内側のIFが終了
ELSE
MOVE “不合格” TO W-GRADE
END-IF. > ここで外側のIFが終了
DISPLAY “成績は: ” W-GRADE.
STOP RUN.
5. 応用・注意点:現場で陥りやすい罠
現場で最も多いミスは、「END-IFの書き忘れ」と「不要なピリオドの混在」です。
特に、古いプログラムを修正する際、途中にピリオドが入っていると、そこですべてのIF文が強制的に終了してしまいます。
・対策1:原則として、ロジックの途中にピリオドを書かない(END-IFで区切る)。
・対策2:ELSE句の直前やIF文の入れ子の中で、意図しないピリオドが残っていないか常に確認する。
END-IFを使いこなすことは、バグを未然に防ぐための第一歩です。メンテナンス性の高いコードを書くために、ぜひ今日から「ピリオド頼みの終了」を卒業しましょう!

コメント