メソッドの署名

メソッドの署名を使用すると、特定の要素のヘッダー内で、渡すパラメーターおよび戻り項目を指定できます。この署名を使用する場合は、メソッド内の手続き部のヘッダーを省きます。

署名

method-signature

  • 各パラメーターは、事前にパラメーターの引き渡しモードを指定する必要があります。指定しない場合は、引き渡しモードのデフォルト値は VALUE になります。
  • PARAMS でパラメータを渡す場合は、最後に指定する必要があり、1 次元配列にします。
  • インデクサーまたはコンストラクターは、返品項目を指定できません。
  • 反復子は、iterator-id GetEven yielding res as binary-long static のように、RETURNING 項目ではなく YIELDING 項目を指定します。

パラメーター

パラメーターは、メソッドに渡される値参照または変数参照です。これらはメソッドのヘッダーまたは手続き部のヘッダーで指定できます。メソッドのヘッダーで指定されている場合は、そのメソッドから手続き部のヘッダーを省略する必要があります。

パラメーターの実際の値は、メソッドの呼び出し時に指定されます。

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

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

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

名前付きパラメーターを使用する場合、呼び出しではメソッドのヘッダーの指定と同じ順序でパラメーターを指定する必要はありません。
       invoke type MyClass::MyMethod(param y = 3.141592, param x = "Pi")
       ...
       method-id MyMethod (value x as string, y as decimal).
       ...
       end method.

呼び出し中にパラメーター x および y が指定されていれば、呼び出されたメソッドはそれを適切に受け取って使用します。呼び出し時に位置指定引数および名前付き引数を混用する場合は、名前付き引数を位置指定引数の後に指定する必要があります。

メソッドにオプションのパラメーター (デフォルト パラメーター) が含まれている場合、呼び出し中にすべての引数を渡す必要はありません。メソッド署名で指定されたデフォルト値が使用されます。
       invoke type MyClass::MyMethod(a)
       ...
       method-id MyMethod (value x as string, y as decimal = 3.141592).
       ...
       end method.

上記の呼び出しは、1 つの位置指定引数 (パラメーター x に対応) を渡すのみであるため、オプションのパラメーター y に指定された値がメソッドで使用されます。オプションのパラメーターは、値のパラメーターとしてのみ使用できます。

パラメーターの引き渡しモード

パラメーターは、USING 句の後に指定された以下のいずれかのモードを使用してメソッドに渡されます。

  • VALUE。値によって渡されるパラメーターは、変更された値を呼び出し元のコードに戻しません。
  • REFERENCE。参照によって渡されるパラメーターは、メソッドの実行中に変更された値を、メソッドの終了時に呼び出し元のコードに戻します。これらは入力および出力の両方で使用されます。
  • OUTPUT。このモードは REFERENCE に似ています。主な違いは、エントリ時にパラメーターをメソッドに割り当てる必要がない点ですが、メソッドの出口では割り当てる必要があります。
  • PARAMS。PARAMS モードを使用した場合、渡せるパラメーターは 1 つのみです。これは一次元配列とし、最後の入力パラメーターとする必要があります。

引き渡しモードが指定されていない場合、メソッドのヘッダーで指定されるパラメーターはデフォルトで VALUE モードを使用し、手続き部のヘッダーで指定されるパラメーターはデフォルトで REFERENCE モードを使用します (値渡しの拡張メソッドを除く)。このデフォルト設定を変更するには、METHODDEFAULT コンパイラ指令を設定します。

複数の値をパラメーターに指定する場合、連続する後続のパラメーターに対してはキーワード 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.

VALUE (値) パラメーター

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

       declare a as binary-long = 3
       invoke type MyUtils::CheckByValue(a)
       display a              *> a is still 3

       method-id CheckByValue static (x as binary-long).
       set x to x + 1          *> x is now 4
       end method.   

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

使用法:

  • メソッドへの入力に対して、およびメソッドからパラメーターを出力する必要がない場合には、値パラメーターを使用します。
  • マネージ タイプの値パラメーターは、対応する COBOL タイプとして公開されます。たとえば、暗黙の小数点を使用しない符号付き数値項目は、サイズに応じて、int8、int16、int32、および int64 として公開されます。

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

  • 値パラメータには、オプションの構文「= constant-expression」を含められます。そのようなパラメーターはオプションであり、式は呼び出し元のコードによってパラメーターが指定されていない場合の値を表します。

    すべてのオプションのパラメーターは、オプションでないパラメーターの後に指定する必要があります。

REFERENCE (参照) パラメーター

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

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

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

次に例を示します。

       declare a as binary-long=3
       invoke type MyUtils::CheckByReference(a)
       display a              *> a is now 4

       method-id CheckByReference static (reference x as binary-long).
       set x to x + 1          *> x is now 4
       end method.

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

使用法:

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

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

OUTPUT (出力) パラメーター

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

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

次に例を示します。

       declare a as binary-long=4
       declare b as binary-long
       invoke type MyUtils::CheckByOutput(a,b)
       display "Value Param a = " &  a          *> a is still 4
       display "Output Param b = " & b          *> b is 16

       method-id CheckByOutput static (x as binary-long, output y as binary-long).
           set x to x + 10     *> x is now 14
           set y to x + 2      *> y is now 16
       end method.

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

使用法:

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

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

PARAMS パラメーター

PARAMS キーワードで渡せるパラメーターは 1 つのみで、最後のパラメーターとします。パラメータの型は 1 次元配列にする必要があります。

このメソッドを呼び出すプログラムは、このパラメーターを所定のタイプの配列として通常の方法で渡せます。または、プログラムは PARAMS パラメーターに対応する 0 個以上のパラメーターを渡すことができ、渡された各パラメーターは配列の要素型と同じ型 (または互換型) を持ちます。この場合、コンパイラーは、指定されたパラメーター (0 以上の要素を含む) から配列を作成するコードを自動的に生成し、この配列を呼び出し元のメソッドに渡します。

RETURNING 項目

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

       method-id AddMins (a as type MyTimer, b as binary-long) returning c as type MyTimer.

各メソッドには、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) *> inline invocation
           display myTime::anHour & ":" myTime::aMin
       end program.
       
       class-id MyTimer.
       01 anHour binary-long property.  *> property keyword enables get/set
       01 aMin binary-long property.
       ...
       method-id AddMins (a as type MyTimer, b as binary-long) returning c as type MyTimer.
       01 h binary-long value 0.
       01 m binary-long value 0.
           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.