手続き部のヘッダ

手続き部のヘッダは、メンバに渡されるパラメータと RETURNING 項目 (メンバで計算される値) を定義します。

procedure-division-header

attribute-clause attribute-clause attribute-clause attribute-clause attribute-clause

PARAMS 句はオプションですが、最後に必要です。

コアのサンプルも参照してください。このサンプルは、[スタート > すべてのプログラム > Micro Focus Enterprise Developer > Samples] の COBOL for JVM の下にあります。

パラメータ

パラメータは、メソッドに渡される値参照または変数参照です。パラメータの実際の値は、メソッドが呼び出されるときに指定されます。各パラメータとそのタイプは、手続き部のヘッダの USING 句に指定されます。

メソッドを呼び出す場合、呼び出しでパラメータを指定します。呼び出されたメソッドは、呼び出しと同じ順序でパラメータを受け取ります。次に例を示します。

       invoke type MyClass::MyMethod(a,b)
       ...
       method-id MyMethod.
       procedure division using x as string  
                                y as binary-long.
       ...
       end method.

上記の引数 a と b は、呼び出されたメソッドに渡され、呼び出されたメソッドのパラメータ x および y にそれぞれ相当します。パラメータのタイプは、USING 句の AS 句で指定します。

次のタイプのパラメータを渡すことができます。

  • 値パラメータ。入力の場合のみ使用されます。更新は、呼び出しコードには戻されません。
  • 参照パラメータ。入力と出力の両方に使用されます。値パラメータとは異なり、メソッドが完了すると、更新は呼び出しコードに戻されます。
  • 出力パラメータ。参照パラメータと似ています。主な違いは、エントリの際にメソッドに割り当てる必要がない点ですが、メソッドの出口で割り当てる必要があります。
  • RETURNING 項目。出力の場合のみ使用されます。

パラメータは、デフォルトで参照渡しになります (値渡しになる拡張メソッドを除く)。このデフォルトを値パラメータに変更するには、METHODDEFAULT (VALUE) コンパイラ指令を設定します。

複数の値パラメータを指定する場合、以降の連続するパラメータに対してキーワード VALUE が前提になります。次の例では、v と vv は値渡し、それ以外は参照渡しになります。

       procedure division using a as binary-long
                          value v as binary-long
                                vv as binary-long
                      reference r as binary-long
                                rr as binary-long.

値パラメータ

値パラメータは、ローカル変数に相当します。その初期値は、メソッドを呼び出すと確立されます。メソッドが処理されると、ローカル変数の値が変わる可能性があります。メソッドが終了しても、呼び出しコードの元の引数は変わりません。次に例を示します。

       declare a as binary-long=3.
       invoke type MyUtils::CheckByValue(a)
       display a              *> a は引き続き 3 になる

       method-id CheckByValue static.
       procedure division using value x as binary-long.
           set x to x + 1          *> x は 4 になる
       end method.   

上記の例では、パラメータ a は値渡しになります。呼び出されたメソッドは値を増分します。ただし、呼び出しコードに戻ると、変数は変わっていません。

使用法:

  • メソッドへの入力に値パラメータを使用します。メソッドからパラメータを出力する必要がない場合、値パラメータを使用します。
  • パラメータを値で渡すには、手続き部の USING 句のメソッド署名のパラメータに VALUE キーワードを指定します。複数の値パラメータを指定する場合、以降の連続するパラメータに対してキーワード VALUE が前提になります。
  • マネージ・タイプの値パラメータは、対応する COBOL タイプとして公開されます。例えば、暗黙の小数点を使用しない符号付き数値項目は、サイズに応じて、int8、int16、int32、int64 として公開されます。

    マネージ・タイプではなく、他の COBOL データ・タイプの値パラメータは、「COBOL Type Compatibility」表で定義されるとおりに公開されます。次に例を示します。PIC X フィールドとグループは、文字列として公開されます。マネージ COBOL と他のマネージ言語のタイプの互換性を参照してください。

参照パラメータ

参照パラメータには、値自体ではなく、必要な値の参照が含まれます。

参照パラメータは、メソッドが呼び出されると値が確立されるローカル変数や、メソッドの処理中に値が変わる可能性があるローカル変数に相当します。値パラメータとは異なり、メソッドが終了すると、呼び出しコードの元の引数の値は適宜変更されます。

参照パラメータは、メソッドに対してローカルな変数のコピーを必ずしも作成するわけではないことに注意してください。代わりに、メソッドの呼び出し時に使用する場所の元の引数を参照します。メソッドの処理中に変数はローカルで変わる可能性がありますが、呼び出しコードの元の引数は必ずしも変わるわけではありません。変わる場合もあり変わらない場合もあります。元の引数の値は、メソッドが終了するまで不明です。メソッドが終了し、呼び出しコードに戻ると、呼び出しコードの元の引数の値が更新されます。

次に例を示します。

       declare a as binary-long=3.
       invoke type MyUtils::CheckByReference(a)
       display a              *> a は 4 になる

       method-id CheckByReference static.
       procedure division using reference x as binary-long.
           set x to x + 1          *> x は 4 になる
       end method.

上記の例では、パラメータ a は参照渡しになります。呼び出されたメソッドは変数 a を増分します。呼び出しコードに戻ると、変数は増分した値で更新されます。

使用法:

  • 入力と出力の両方に参照パラメータを使用します。このパラメータを使用して、メソッドに値を入力し、結果の値を呼び出しコードに出力します。
  • パラメータはデフォルトで参照渡しになります。ただし、メソッド署名の以前のパラメータが参照パラメータではない場合を除きます。この場合、キーワード REFERENCE が必要です。
  • メソッドの実行中に、参照パラメータに相当する送信引数の値は変わることがあります。値は不明です。メソッドの実行中に送信引数の値が変わらないようにロックするには、SYNC 句を使用します。メソッドが終了すると、ロックは解放され、送信引数は必要に応じて更新されます。
  • マネージ・タイプを参照する参照パラメータは、相当するマネージ・タイプへのマネージ・ポインタとして直接公開されます。

    マネージ・タイプに相当しない参照パラメータ (PIC X フィールド、グループ、binary-long 以外の数値フィールドなど) は、COBOL ポインタとして公開されます。

出力パラメータ

参照パラメータと同様に、出力パラメータは新しい記憶場所を作成しませんが、呼び出しで指定された変数の記憶場所を使用します。

出力パラメータは、参照パラメータと非常に似ています。主な違いは、呼び出しコードに戻る前に割り当てられる点です。

次に例を示します。

       declare a as binary-long=4.
       declare b as binary-long.
       invoke type MyUtils::CheckByOutput(a,b)
       display "Value Param a = " &  a          *> a は引き続き 4 になる
       display "Output Param b = " & b          *> b は 16

       method-id CheckByOutput static.
       procedure division using value x as binary-long
                               output y as binary-long.
           set x to x + 10     *> x は 14 になる
           set y to x + 2      *> y は 16 になる
       end method.

上記の例では、2 つのパラメータが渡されます。この場合、変数 b は初期化されず、出力で渡されます。メソッド CheckByOutput は、変数 x および y を更新します。戻されると、出力変数 b は更新されますが、変数は変わりません。

使用法:

  • 通常、複数の戻り値があるメソッドで使用されます。
  • オプションで初期化できます。または、メソッドへの入力に値が割り当てられます。
  • メソッドが終了すると、戻すために割り当てられる必要があります。
  • マネージ・タイプを参照する出力パラメータは、相当するマネージ・タイプへのマネージ・ポインタとして直接公開されます。

    マネージ・タイプに相当しない出力パラメータ (PIC X フィールド、グループ、binary-long 以外の数値フィールドなど) は、COBOL ポインタとして公開されます。

RETURNING 項目

RETURNING 項目は、メソッドの結果を呼び出しコードに戻します。次に例を示します。

        procedure division returning myReturn as condition-value.

各メソッドには、RETURNING 項目は 1 つしかありません。ただし、戻り情報のセットをオブジェクトでパッケージ化できます。例えば、次の AddMins() メソッドは、インスタンス・オブジェクト参照 myTime を受け取って戻します。

       program-id ParamAsObject.
       01 myTime type MyTimer value new MyTimer(5 45).
     
       procedure division.
           set myTime to myTime::AddMins(myTime 70) *> インライン呼び出し
           display myTime::anHour & ":" myTime::aMin
       end program.
       
       class-id MyTimer.
       01 anHour binary-long property.  *> PROPERTY キーワードによる取得/設定が可能
       01 aMin binary-long property.
       ...
       method-id AddMins.
       01 h binary-long value 0.
       01 m binary-long value 0.
       procedure division using value a as type MyTimer 
                                      b as binary-long 
                            returning c as type MyTimer.
           set b to a::aMin + b
           divide b by 60 giving h remainder m
           set c to new MyTimer(a::anHour + h , m)
       end method.

       end class. 

上記の例は、文のインライン呼び出し構文を示しています。

       set myTime to myTime::AddMins(myTime 70)

ここで、呼び出されたメソッド AddMins() は、項目 myTime を戻します。呼び出されたメソッドは、RETURNING 項目をその署名に指定します。