以下の例は、まずマネージ COBOL ラッパー クラスでプログラムをラップすることで、マネージ アプリケーションに公開する方法について示しています。そして、他のマネージ アプリケーションがオブジェクト指向 (OO) 構文を使用して、ラッパー クラスと対話できるようにします。ラッパー クラスは次に、手続き型プログラムと対話します。
ラッパー クラスを書く方法はさまざまあり、この例では、そのうち 2 つを紹介します。
基本的な算術操作を行う、シンプルな手続き型 COBOL プログラム (計算) を使用します。Visual COBOL を使用して、手続き型プログラムのコードとその手続き型コードのマネージ COBOL ラッパー クラスを保持する、マネージ プロジェクトを作成します。また、ラッパー クラスを使用して手続き型モジュールとやり取りする、マネージ COBOL フロントエンド アプリケーション用のプロジェクトも作成します。
まず、手続き型プログラムとラッパー クラスを保持する、マネージ COBOL プロジェクトを作成する必要があります。
これによって、ワークスペースに calclib プロジェクトが作成されます。このプロジェクトには、COBOL プログラムまたはクラス ファイルは含まれません。
これによって、[New COBOL Program] ウィザードが開きます。このウィザードで、プロジェクトの src サブフォルダーにプログラムを作成し、それをデフォルト パッケージに追加します。
プロジェクトに新しいプログラムが追加され、そのプログラムがエディターで開かれます。
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 はメソッド Add を定義します。このメソッドは、手続き型コード プログラムで使用されるものと同じ comp-5 データ項目を使用します。このメソッドは、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) が呼び出されて追加操作を実行します。