以下の例は、まずマネージ COBOL ラッパー クラスでプログラムをラップすることで、マネージ アプリケーションに公開する方法について示しています。そして、他のマネージ アプリケーションがオブジェクト指向 (OO) 構文を使用して、ラッパー クラスと対話できるようにします。ラッパー クラスは次に、手続き型プログラムと対話します。
ラッパー クラスを書く方法はさまざまあり、この例では、そのうち 2 つを紹介します。
基本的な算術操作を行う、シンプルな手続き型 COBOL プログラム (計算) を使用します。Enterprise Developer を使用して、手続き型プログラムのコードとその手続き型コードのマネージ COBOL ラッパー クラスを保持する、マネージ プロジェクトを作成します。また、ラッパー クラスを使用して手続き型モジュールとやり取りする、マネージ COBOL フロントエンド アプリケーション用のプロジェクトも作成します。
まず、手続き型プログラムとラッパー クラスを保持する、マネージ COBOL プロジェクトを作成する必要があります。
これによって、ワークスペースに calclib プロジェクトが作成されます。このプロジェクトには、COBOL プログラムまたはクラス ファイルは含まれません。
これによって、プロジェクトの src サブフォルダーにプログラムを作成する [New COBOL Program] ウィザードを開き、それをデフォルト パッケージに追加します。
プロジェクトに新しいプログラムが追加され、そのプログラムがエディターで開かれます。
program-id. Calc.
data division.
working-storage section.
linkage section.
01 operands.
03 op1 pic 9(4) comp-5.
03 op2 pic 9(4) comp-5.
01 the-result pic 9(8) comp-5.
01 func-code pic x.
78 add-op value '+'.
78 sub-op value '-'.
78 mult-op value 'x'.
78 div-op value '/'.
procedure division using by reference func-code operands the-result.
evaluate func-code
when add-op
add op1 to op2 giving the-result
when sub-op
subtract op2 from op1 giving the-result
when mult-op
multiply op1 by op2 giving the-result
when div-op
divide op1 by op2 giving the-result
end-evaluate.
goback.
end program Calc.
デフォルトでは、Eclipse は自動的にプロジェクトをビルドするように設定されているため、変更を保存するとビルドが開始されます。プロジェクトのコンパイル時にエラーは発生しません。
手続き型プログラム用のラッパー クラスの 1 つを作成します。
これによって、[New COBOL JVM Class] ウィザードが起動します。プロジェクトの src サブフォルダーに保存される、デフォルト パッケージのパブリック クラスを作成します。
プロジェクトにファイルが追加され、そのプログラムがエディターで開かれます。
class-id calclib.WrapperClass.
working-storage section.
method-id Add.
local-storage section.
01 operands.
03 op1 pic 9(4) comp-5.
03 op2 pic 9(4) comp-5.
linkage section.
01 the-result pic 9(8) comp-5.
procedure division using by value p1 as binary-short
p2 as binary-short
returning the-result.
move p1 to op1
move p2 to op2
call "calc" using '+' operands the-result
goback.
end method.
end class.
WrapperClass 手続き型コード プログラムで使用されるものと同じ comp-5 データ項目を使用する、メソッド Add を定義します。このメソッドは、op1 と op2 を、マネージ コードで同等の型となる変数 p1 と p2 にマッピングします。このメソッドは、追加操作を実行する手続き型プログラムを呼び出します。
他のマネージ言語が元の手続き型プログラムの機能にアクセスするには、OO 構文を使用して Add メソッドを呼び出します。
プロパティ クラスとしても知られるデータ転送オブジェクト (DTO) を使用する、わずかに異なるラッパー クラスを作成します。他のマネージ言語に渡すため、ラッパー クラスのプロパティとして元のプログラムのデータ項目を公開します。
class-id calclib.ClassDTO.
working-storage section.
01 operands property all elementary.
03 op1 pic 9(4) comp-5.
03 op2 pic 9(4) comp-5.
method-id Add.
linkage section.
01 the-result pic 9(8) comp-5.
procedure division returning the-result.
call "calc" using '+' operands the-result
goback.
end method.
end class.
property all elementary の operands を使用すると、すべての基本グループ項目が ClassDTO のプロパティとして公開され、OO 構文 (他のマネージ COBOL プログラムからアクセスする場合、ClassDTO::op1 など) を使用する他のマネージ プログラムからアクセスできます。
ClassDTO 算術操作を実行する手続き型プログラムを呼び出す、類似したメソッド Add を定義します。
グループ項目全体における property キーワードの使用の代替方法は、以下の通り個別データ項目ごとにキーワードを設定することです。
01 operands.
03 op1 pic 9(4) comp-5 property as "Operand1".
03 op2 pic 9(4) comp-5 property as "Operand2".
これによって、新しい名前 Operand1 およびOperand2 でクラスのプロパティとして個別データ項目のみ公開します。
両方のラッパー クラスとやり取りできる、COBOL のマネージ フロントエンド アプリケーションのプロジェクトを作成します。
program-id. Program1 as "OOCalc.Program1".
data division.
working-storage section.
01 calc1 type calclib.WrapperClass.
01 the-result pic 9(8) comp-5.
01 calc2 type calclib.ClassDTO.
procedure division.
set calc1 to new type calclib.WrapperClass
set the-result to calc1::Add(2, 2)
set calc2 to new calclib.ClassDTO
set calc2::op1 to 5
set calc2::op2 to 4
set the-result to calc2::Add
goback.
end program Program1.
自動ビルドは、calclib プロジェクトからのクラス calclib.ClassDTO および calclib.WrapperClass を認識しないため、コードのコンパイルに失敗します。これを解決するには、OOCalc プロジェクトの JVM ビルド パスに calclib プロジェクトを追加する必要があります。
calclib は OOCalc の JVM ビルド パスにあるため、OOCalc のコードは calclib で定義されたクラスを検出し、以降のビルドが成功します。
Program1.cbl は、2 つのオブジェクト (calc1 の型のWrapperClass と型 calc2 の ClassDTO) を定義します。
プログラム実行時、このコードは calc1 と calc2 のインスタンスを作成します。そして、このコード例では、calc1 のインスタンスを作成し、追加操作を実行する Add の WrapperClass メソッドを呼び出す方法が示されています。
次に、calc2 のインスタンスが作成され、それは値を割り当てる op1 のプロパティとして公開される op2 と ClassDTO にアクセスします。追加を実行する Add の ClassDTO メソッドが呼び出されます。