【COBOL学習|実務向け】インラインPERFORMのルールと構造化プログラミングの鉄則

導入: なぜインラインPERFORMでは「手続き名」が禁止なのか

COBOL開発において、メンテナンス性を低下させる最大の要因は「スパゲッティコード」です。かつてのCOBOLでは、段落(Paragraph)や節(Section)を多用し、GO TO文で制御を飛ばす手法が一般的でした。しかし、現代の構造化プログラミングにおいて、インラインPERFORM(PERFORM … END-PERFORM)は、処理の局所化を強力に推進する仕組みです。このブロック内に「手続き名」を記述できない(構造化制御構文としての制約)ことは、単なる制限ではなく、コードの可読性と保守性を守るための重要な盾なのです。

基礎知識: インラインPERFORMの仕組み

インラインPERFORMとは、PERFORM文の直後にコードを記述し、END-PERFORMで閉じることで、その範囲を一つの実行単位とする手法です。
ここで重要なのは「匿名性」です。通常のPERFORMが「手続き名(段落名)」を呼び出すのに対し、インラインPERFORMは独立したコードブロックとして完結しています。これにより、外部からGO TO文でブロックの途中へ飛び込むといった「制御フローの破壊」が物理的に遮断され、処理の入り口と出口が明確になります。

実装/解決策: 構造化による制御フローの明確化

インラインPERFORMを使用する際は、処理を分割しすぎず、かつ詰め込みすぎない「適切な粒度」を意識してください。もし、インラインPERFORMの中で複雑な条件分岐や、他から参照したくなる処理が出てきた場合は、それは「手続き(段落)」として独立させるべきタイミングです。無理にインラインに押し込まず、役割を分離することが、バグを未然に防ぐコツです。

サンプルプログラム: 実用的なインラインPERFORMの活用例

以下は、配列データを集計する際の標準的なインラインPERFORMの使用例です。

IDENTIFICATION DIVISION.
PROGRAM-ID. SAMPLE-INLINE-PERFORM.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-IDX PIC 9(02).
01 WS-TOTAL PIC 9(05) VALUE 0.
01 WS-TABLE-DATA OCCURS 5 TIMES INDEXED BY IDX.
05 WS-VAL PIC 9(03).

PROCEDURE DIVISION.
> データの初期化
MOVE 10 TO WS-VAL(1) 20 TO WS-VAL(2) 30 TO WS-VAL(3) 40 TO WS-VAL(4) 50 TO WS-VAL(5).

> インラインPERFORMによる集計処理
> このブロックは匿名であり、外部からのGO TOを許容しない
PERFORM VARYING WS-IDX FROM 1 BY 1 UNTIL WS-IDX > 5
ADD WS-VAL(WS-IDX) TO WS-TOTAL
DISPLAY “現在値: ” WS-VAL(WS-IDX) ” | 小計: ” WS-TOTAL
END-PERFORM.

DISPLAY “合計: ” WS-TOTAL.
STOP RUN.

応用・注意点: 現場での運用ルール

1. 複雑なブロックの回避:
インラインPERFORMの中にさらに別のインラインPERFORMを入れ子にする(ネスト)場合は、最大でも2階層までに留めるのが現場の定石です。3階層以上になると、論理構造が追いにくくなり、保守担当者が悲鳴を上げることになります。

2. GO TOの誘惑を断つ:
インラインPERFORM内では、EXIT文を使ってブロックを抜けるのが正しい作法です。無理にGO TOで処理をスキップさせるような設計は、後々の障害調査で解析困難な不具合を招きます。「制御の入り口は一つ、出口も明確に」という基本原則を徹底しましょう。

3. 命名の代用:
インラインPERFORMに名前が付けられないことを不便に感じるかもしれませんが、それはコメント行(>)を活用して、ブロックの目的を明記することで解決してください。それが、将来の自分自身を守るドキュメントとなります。

コメント

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