1. 導入:なぜこの記述が重要なのか
COBOLのファイル処理において、最もバグが混入しやすい場所の一つが「ファイル終了判定」のロジックです。従来の「フラグを立てて、PERFORM UNTILでループし、直後にIF文で判定する」という書き方は、コードが長くなると処理の流れが追いづらくなり、いわゆる「スパゲッティコード」の温床となります。今回解説するAT ENDとNOT AT ENDを明示的に分ける手法は、データ処理と終了判定の責務を分離し、保守性の高いクリーンなコードを実現するための必須テクニックです。
2. 基礎知識:READ文の構造化
COBOLのREAD文には、ファイル読み込みが成功したか、あるいは終端に達したかを判定するオプションが用意されています。
AT END:ファイル終端(EOF)に達した際に実行される命令句。
NOT AT END:ファイル終端以外(正常にレコードが読み込めた場合)に実行される命令句。
これらを組み合わせ、最後に「END-READ」で閉じることで、読み込みから判定までのブロックを一つの論理単位として完結させることができます。これにより、ループの外で複雑なフラグ判定を行う必要がなくなります。
3. 実装/解決策:構造化制御構文の採用
解決策は、読み込みの瞬間に「次に何をすべきか」を決定するコーディングスタイルへの転換です。具体的には、READ文の中にデータ処理(PERFORM)を直接組み込みます。これにより、ファイル読み込みの成否に関わらず、必ず処理結果が制御フローに直結するようになり、意図しないループ継続や早期終了を防ぐことができます。
4. サンプルプログラム
以下のコードは、実務でよく使われるファイル読み込みの定型パターンです。そのままコピーして自身の環境でテストしてください。
000100 PROCEDURE DIVISION.
000200 — メイン処理 —
000300 OPEN INPUT IN-FILE.
000400 SET EOF-FLAG TO FALSE.
000500
000600 PERFORM UNTIL EOF-FLAG
000700 READ IN-FILE
000800 AT END
000900 SET EOF-FLAG TO TRUE
001000 NOT AT END
001100 PERFORM PROCESS-RECORD > 正常読み込み時のみ実行される
001200 END-READ
001300 END-PERFORM.
001400
001500 CLOSE IN-FILE.
001600 STOP RUN.
001700
001800 PROCESS-RECORD.
001900 — 個別のレコード処理 —
002000 DISPLAY “READ DATA: ” IN-DATA.
5. 応用・注意点:現場での落とし穴
この手法を用いる際に注意すべき点が2つあります。
一つ目は、「入れ子の深さ」です。NOT AT ENDの中でさらに複雑な条件分岐を入れすぎると、かえって可読性が落ちます。処理が長くなる場合は、必ず別段落(PERFORM)に切り出してください。
二つ目は、「コンパイラの対応状況」です。現代の商用コンパイラであればほぼ対応していますが、非常に古いレガシー環境ではEND-READがサポートされていない場合があります。その場合は、EXIT文を用いた構造化など、プロジェクトのコーディング規約に従う必要があります。
この書き方を徹底するだけで、コードの「見通し」は格段に良くなります。ぜひ、次回の改修から取り入れてみてください。

コメント