メソッドのシグネチャ

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

シグネチャ

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 つのパラメーターのみを渡すことができます。これは 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 は値渡しになります。呼び出し先のメソッドでは値を増分します。ただし、呼び出し元のコードに戻る際には、変数は変更されません。

使用法:

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

    マネージ型ではなく、他の COBOL データ型の値パラメーターは、「COBOL 型の互換性」表で定義されるとおりに公開されます。例:PIC X フィールドおよびグループは、文字列として公開されます。詳細については、「.NET および JVM COBOL と他の言語の型の互換性」を参照してください。

  • 値パラメーターには、オプションの構文「= 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 句を使用します。メソッドが終了するとロックは解放され、送信引数は必要に応じて更新されます。
  • Java 型を参照する参照パラメーターは、相当する Java 型に対する Java ポインターとして直接公開されます。

    Java に相当しない参照パラメーター (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 は変更されません。

使用法:

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

    Java 型に相当しない出力パラメーター (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.