1. 導入:なぜ「1行1ステートメント」が重要なのか
長年COBOLの保守現場に身を置いていると、数万行におよぶレガシープログラムに出くわすことは珍しくありません。そこで最も頭を悩ませるのは「処理の追いかけにくさ」です。IF文の中に複数のMOVE文が詰め込まれ、インデントもバラバラなコードは、バグの温床となります。本稿で紹介する「1行1ステートメント原則」は、コードの可読性を最大化し、後任者の解読時間を短縮するための、プロとしての必須作法です。
2. 基礎知識:構造化制御構文の基本
COBOLにおける「構造化プログラミング」とは、処理の流れを上から下へ、かつ論理構造が視覚的にわかるように記述することを指します。特に重要なのが「終了指定子(END-IF, END-PERFORM, END-EVALUATEなど)」の活用です。これらを使うことで、ピリオドの位置による制御の迷走を防ぐことができます。また、インデント(字下げ)を適切に行うことで、プログラムの階層構造がひと目で把握できるようになります。
3. 実装・解決策:美しいコードの書き方
現場で推奨されるのは、以下のルールです。
・1行に記述する命令は1つに絞る。
・IFやPERFORMの開始動詞と、それに対応するEND-~は同じ列(インデントレベル)に配置する。
・論理ブロックが深くなる場合は、4文字または8文字のスペースでインデントを維持する。
このルールを徹底するだけで、コードの「骨格」が浮き彫りになり、論理的なミスを即座に発見できるようになります。
4. サンプルプログラム
以下のコード例は、可読性を重視した標準的な記述例です。コピー&ペーストして、自身のプログラムのテンプレートとして活用してください。
IDENTIFICATION DIVISION.
PROGRAM-ID. SAMPLE-PROG.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-VAL-A PIC 9(03) VALUE 100.
01 WS-VAL-B PIC 9(03) VALUE 100.
01 WS-RESULT PIC 9(03).
PROCEDURE DIVISION.
> 構造化の基本:IF文の開始と終了を明示的に記述する
IF WS-VAL-A = WS-VAL-B
> 1行1ステートメント原則:命令ごとに改行を入れる
MOVE 1 TO WS-RESULT
DISPLAY “一致しました”
ELSE
MOVE 0 TO WS-RESULT
DISPLAY “不一致です”
END-IF.
> 終了時は必ずEND-IFを対応するIFと同じインデント位置に置く
STOP RUN.
5. 応用・注意点:現場で役立つ補足
注意すべき点は、ピリオド(.)の打ちすぎです。COBOLの初心者が陥りやすいのが、不要な場所でピリオドを打ち、IF文の範囲を強制終了させてしまうミスです。構造化制御構文(END-IF等)を使用している場合、IF文の中でのピリオドは原則不要です。最後のEND-IFの後にのみピリオドを打つ「構造化の徹底」を心がけてください。
また、既存の古いコードを修正する際、全てを書き直すのはリスクを伴います。まずは自分が修正を加える関数やパラグラフから、この「1行1ステートメント原則」を適用し、少しずつコードを「美しく」保つ文化をチーム内に広げていくことをお勧めします。読みやすいコードは、結果として自分自身の修正作業を楽にしてくれるはずです。

コメント