【COBOL学習|初心者向け】メソッドの途中でも迷わず帰ろう!EXIT METHOD でスマートなCOBOLを

1. 導入: なぜEXIT METHODが重要なのか?

COBOLプログラム、特にオブジェクト指向COBOL(2002年以降のモダンCOBOL)を開発する上で、「EXIT METHOD」は非常に重要な命令です。皆さんは、メソッド(手続き)の途中で「あれ?この処理、もう続ける必要ないな」とか、「エラーが見つかったから、ここで処理を止めたい」と思った経験はありませんか?そんな時、無駄に長いロジックを最後まで実行してしまうのは、コードの可読性を下げ、バグを生みやすくする原因にもなりかねません。EXIT METHODを使えば、メソッドの途中で安全かつスマートに処理を終了し、呼び出し元に制御を戻すことができます。これは、プログラムの構造をすっきりとさせ、保守性を高めるための強力な味方となるのです。

2. 基礎知識: EXIT METHODとメソッドって何?

まず、「メソッド」とは、オブジェクト指向プログラミングにおける、あるまとまった処理の手続きのことです。クラスの中に定義され、特定の役割を担います。例えば、商品の合計金額を計算するメソッド、顧客情報を登録するメソッド、などがあります。

そして、「EXIT METHOD」は、このメソッドの実行中に「ここでもう処理を終えて、呼び出し元に戻っていいですよ」と指示するための命令です。これは、まるで会議の途中で「今日の議題はここまでで結構です。あとは各自で対応してください」と宣言して退席するようなイメージです。

なぜこれが構造化プログラミングやオブジェクト指向プログラミングで重要かというと、プログラムの流れを分かりやすくするためです。条件によっては、メソッドの最後まで実行する必要がない場合があります。そんな時に、無駄な処理をスキップして、すぐに呼び出し元に戻ることで、コードがシンプルになり、理解しやすくなります。特に、エラーが発生した場合に、それ以降の処理を無理に続けようとすると、予期せぬエラーを引き起こす可能性があります。EXIT METHODを使えば、エラー発生時に即座に処理を中断し、安全な状態を保つことができます。

3. 実装/解決策: EXIT METHODの使い方

EXIT METHODの使い方は非常にシンプルです。メソッドの本体の中で、処理を終了したい箇所の直前に `EXIT METHOD` と記述するだけです。

例えば、ある計算処理を行うメソッドの中で、入力された数値がゼロだった場合は、計算ができないため、そこで処理を終了したいとします。その場合、以下のように記述します。

METHOD-ID. CalculateTotal.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 Numerator PIC 9(5) VALUE 0.
01 Denominator PIC 9(5) VALUE 0.
01 Result PIC S9(7)V9(2) VALUE 0.
01 ErrorMessage PIC X(50).

PROCEDURE DIVISION USING Numerator, Denominator RETURNING Result.

> ゼロ除算チェック
IF Denominator = 0 THEN
STRING “エラー: ゼロで除算しようとしました。” DELIMITED BY SIZE INTO ErrorMessage
DISPLAY ErrorMessage
> ここでメソッドを終了する
EXIT METHOD
END-IF.

> ここから本来の計算処理
COMPUTE Result = Numerator / Denominator.
DISPLAY “計算結果: ” Result.

END METHOD.

この例では、`Denominator`(分母)が `0` であった場合に、エラーメッセージを表示した後、`EXIT METHOD` を実行しています。これにより、`COMPUTE Result = Numerator / Denominator.` の行は実行されずに、メソッドの呼び出し元に制御が戻ります。

もし、エラーチェックだけでなく、特定の条件を満たした場合に早期に処理を終了したい場合にも、同様に `IF` 文などと組み合わせて `EXIT METHOD` を使用します。

4. サンプルプログラム: 早期リターンを体験しよう

それでは、実際に `EXIT METHOD` を使った簡単なサンプルプログラムを見てみましょう。ここでは、商品の価格から割引額を計算するメソッドを例に取ります。割引率が不正な場合は、早期に処理を終了させます。

>================================================================
> プログラム名: SAMPLE01
> 機能 : EXIT METHODのサンプルプログラム
> 作成者 : ベテランCOBOL技術者
> 作成日 : 2023/10/27
>================================================================
IDENTIFICATION DIVISION.
PROGRAM-ID. SAMPLE01.

DATA DIVISION.
WORKING-STORAGE SECTION.
> 呼び出すメソッドを持つクラスのインスタンス
01 MyCalculator OBJECT CLASS MyCalculatorClass.

> メソッドから返される結果
01 FinalPrice PIC S9(7)V9(2).
01 DiscountAmt PIC S9(7)V9(2).

PROCEDURE DIVISION.
MAIN-PROCEDURE.
DISPLAY “— EXIT METHOD サンプルプログラム 開始 —“.

> クラスのインスタンスを生成
MOVE FUNCTION ALLOCATE(“MyCalculatorClass”) TO MyCalculator.

> 正常ケース: 割引率 0.1 (10%)
DISPLAY “— ケース1: 正常な割引率 (0.1) —“.
MOVE 1000.00 TO DiscountAmt. > 初期値として価格を設定
CALL “CalculateDiscount” USING BY VALUE 1000.00, 0.1 RETURNING DiscountAmt.
DISPLAY “割引額 (正常): ” DiscountAmt.
COMPUTE FinalPrice = 1000.00 – DiscountAmt.
DISPLAY “最終価格 (正常): ” FinalPrice.
DISPLAY “————————————“.

> エラーケース: 不正な割引率 (1.5)
DISPLAY “— ケース2: 不正な割引率 (1.5) —“.
MOVE 1000.00 TO DiscountAmt. > 初期値として価格を設定
CALL “CalculateDiscount” USING BY VALUE 1000.00, 1.5 RETURNING DiscountAmt.
DISPLAY “割引額 (不正): ” DiscountAmt.
COMPUTE FinalPrice = 1000.00 – DiscountAmt.
DISPLAY “最終価格 (不正): ” FinalPrice.
DISPLAY “————————————“.

> クラスのインスタンスを解放
ฦ> FUNCTION FREE MYCALCULATOR.
ฦ> Note: 上記のFREEは、環境によっては必要ですが、
ฦ> 最新のCOBOLコンパイラでは自動管理される場合も多いです。
ฦ> 必要に応じてコメントアウト/解除してください。

DISPLAY “— EXIT METHOD サンプルプログラム 終了 —“.
STOP RUN.

>================================================================
> クラス定義: MyCalculatorClass
>================================================================
CLASS-ID. MyCalculatorClass.

DATA DIVISION.
PROCEDURE DIVISION.

>================================================================
> メソッド定義: CalculateDiscount
> 機能 : 価格と割引率から割引額を計算する
> 引数 :
> iPrice (Input) : 元の価格
> iDiscountRate (Input) : 割引率
> 返り値 :
> oDiscountAmt (Output): 計算された割引額
>================================================================
METHOD-ID. CalculateDiscount.
PROCEDURE DIVISION USING BY VALUE iPrice AS “PIC S9(7)V9(2)”,
iDiscountRate AS “PIC S9(3)V9(2)”,
RETURNING oDiscountAmt AS “PIC S9(7)V9(2)”.

> 割引率のチェック (0.00 から 1.00 の範囲内か)
IF iDiscountRate < 0 OR iDiscountRate > 1 THEN
DISPLAY “エラー: 割引率が不正です (範囲外): ” iDiscountRate
> 不正な場合は、割引額を0にしてメソッドを終了
ฦ> MOVE 0.00 TO oDiscountAmt.
ฦ> 実際には、エラーとして呼び出し元に通知する方が良い場合もあります。
ฦ> ここでは、割引額を0として早期リターンします。
ฦ> RETURN 0.00 <-- RETURN命令も使えますが、EXIT METHODで統一も可 ฦ> EXIT METHOD は、メソッドの最後に戻ることを意味します。
ฦ> したがって、ここでは oDiscountAmt に 0.00 を設定してから EXIT METHOD するのが自然です。
MOVE 0.00 TO oDiscountAmt.
ฦ> EXIT METHOD 実行
EXIT METHOD
END-IF.

> 割引率が正常な場合、割引額を計算
ฦ> MOVE iPrice iDiscountRate TO oDiscountAmt.
COMPUTE oDiscountAmt = iPrice iDiscountRate.

DISPLAY “割引計算実行: 価格=” iPrice “, 割引率=” iDiscountRate “, 割引額=” oDiscountAmt.

END METHOD.

END CLASS.

このサンプルでは、`CalculateDiscount` メソッド内で、`iDiscountRate`(割引率)が `0` 未満または `1` を超える場合に、エラーメッセージを表示し、`oDiscountAmt`(割引額)に `0.00` を設定して `EXIT METHOD` で処理を中断しています。これにより、不正な割引率が渡された場合でも、プログラム全体がクラッシュすることなく、安全に処理を継続できます。

5. 応用・注意点: より良いコードのために

  • エラーハンドリングとの連携: `EXIT METHOD` は、エラーハンドリングと非常に相性が良いです。エラーが見つかったらすぐに `EXIT METHOD` で抜け出し、呼び出し元でエラーコードをチェックしたり、適切なエラー処理を行ったりするように設計すると、コードがスッキリします。
  • RETURN命令との違い: モダンCOBOLでは、メソッドの返り値を受け取る場合、`RETURN` 命令も使用できます。例えば、`RETURN Value.` のように使います。`EXIT METHOD` は、単にメソッドを終了して呼び出し元に戻る命令ですが、`RETURN` は値を返しながら終了します。どちらを使うかは、メソッドの設計思想や、可読性を考慮して選択してください。一般的には、複雑なロジックで早期に終了したい場合は `EXIT METHOD`、計算結果などを直接返したい場合は `RETURN` を使うことが多いです。
  • 可読性の維持: `EXIT METHOD` を多用しすぎると、逆にプログラムの流れが追いにくくなることもあります。メソッドの最初の方で、明確な条件に基づいて「早期リターン」するような使い方が、最も効果的で可読性を損ないにくいでしょう。
  • デバッグのしやすさ: `EXIT METHOD` を適切に使うことで、デバッグ時に不要な処理をスキップできるため、問題箇所を特定しやすくなることがあります。

`EXIT METHOD` をマスターして、よりモダンで保守性の高いCOBOLプログラムを開発していきましょう!

コメント

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