1. 導入:なぜ今、END-SUBTRACTが必要なのか
COBOLの歴史は長く、古い資産コードでは「ピリオド(.)」のみで文の終わりを制御しているケースが多々あります。しかし、現代の保守開発において、単なるピリオドによる制御は思わぬバグの温床となります。特に複雑なIF文やPERFORM文の中にSUBTRACTが含まれる場合、END-SUBTRACTを使用することで命令の範囲を明確化し、意図しないロジックの混入を防ぐことができます。これは「構造化プログラミング」の基本であり、可読性と保守性を劇的に向上させるための必須Tipsです。
2. 基礎知識:構造化制御構文とは
COBOLの算術命令(ADD, SUBTRACT, MULTIPLY, DIVIDEなど)において、それまでのCOBOLは「文の終わりはピリオドである」というルールでした。しかし、これではネスト(入れ子)構造が深くなった際に、どのピリオドがどの制御文の終わりかを判別するのが困難になります。「終了指定子(Scope Terminator)」であるEND-SUBTRACTを使用することで、コンパイラに対して「ここまでの範囲が減算処理である」と明示的に伝えることが可能となり、コードの論理構造を整理できます。
3. 実装・解決策:範囲を明示する習慣
現場では、単に演算を行うだけでなく、演算結果が正か負かによって処理を分岐させるような複雑なロジックを組むことが一般的です。END-SUBTRACTを使用すれば、その後の処理(IF文の続きなど)に影響を与えることなく、安全に計算処理を完結させることができます。特に「IF文の中にSUBTRACTを含める」場合、END-SUBTRACTを使わないと、意図せずIF文がそこで終了してしまうという事故が発生しやすいため、必ず明示的に終了させるのがベテランの流儀です。
4. サンプルプログラム
以下は、END-SUBTRACTを活用した実用的なコード例です。
IDENTIFICATION DIVISION.
PROGRAM-ID. SUBTRACT-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-TOTAL-AMT PIC S9(07) VALUE 10000.
01 WS-SUB-AMT PIC S9(05) VALUE 2500.
PROCEDURE DIVISION.
> 減算処理の開始
SUBTRACT WS-SUB-AMT FROM WS-TOTAL-AMT
ON SIZE ERROR
DISPLAY “桁あふれが発生しました”
NOT ON SIZE ERROR
DISPLAY “減算成功。残高は: ” WS-TOTAL-AMT
END-SUBTRACT. > ここでSUBTRACTの範囲を明示的に終了
STOP RUN.
5. 応用・注意点:現場での陥りやすい罠
注意すべき点は、「古いソースコードとの混在」です。既存の古いプログラムに改修を加える際、END-SUBTRACTを途中から挿入すると、コンパイルエラーや予期せぬ動作を引き起こす場合があります。特に、ピリオドが乱用されているレガシーコードをいじる際は、周囲のピリオドを安易に削除せず、まずは構造を十分に解析してください。また、コーディング規約で「算術命令には必ず終了指定子を付ける」と定めておくことで、チーム全体のソース品質を底上げすることができます。保守性を考慮するなら、今日からでも新しい機能追加には必ずEND-SUBTRACTを取り入れましょう。

コメント