ILE RPG サブプロシージャの使い方 (5) - 複数モジュールの使用 (2) サービス・プログラム -

ILE RPG サブプロシージャの使い方 (4) - 複数モジュールの使用 (1) バインド・ディレクトリ -」に続いて、もうひとつの複数モジュールをまとめて扱う方法であるサービス・プログラムを紹介したいと思います。


サービス・プログラム

バインド・ディレクトリはモジュールの名前のリストだけを持つものでしたが、モジュールそのものの実体は含まれませんでした。

モジュールの実体まで持っているオブジェクトもあります。
それがサービス・プログラムというオブジェクトになっています。

バインド・ディレクトリはコンパイル用のコマンドの記述の煩わしさを避けるためのものでした。
実際のモジュールは、CRTPGM で普通に全部指定した場合と同じように、すべてできあがった実行可能プログラムの一部になります。
プログラムのサイズもその分大きくなりますし、サブプロシージャに修正があった場合はそのモジュールを作り直す必要があり、各実行プログラムをすべて更新する必要があります。
(モジュールを CRTRPGMOD し直して UPDPGM でそのモジュールのみの更新、ということができますので、プログラムそのものを全部作り直す必要があるわけではありません。ただ、実行プログラムの数の分、行う必要がありますので面倒と言えば面倒ですね…プログラム化は可能ですが)

共有されるモジュールが多くなってくると、かなり管理がたいへんになってきますし、サイズもばかにはできません。
せっかくプログラム部品の共有化を行っているのに、活かしきれていない感がありますね。

モジュールの実体を集めて、プログラムから共有可能なオブジェクトにしてしまう、というのはどうでしょう??
プログラム本体のサイズは小さくなりますし、メインテナンスも局所化されますね。

それがサービス・プログラムというオブジェクトになります。
C でいうライブラリ(共有ライブラリ)、Java でいうユーティリティクラスに相当するもの、と考えていいと思います。

あくまで、モジュールを集めて他のプログラムから使用可能にしただけのものなので、サービス・プログラムにするための特別なコーディングなどの必要はありません

作成

そのままただモジュールを指定したり、バインドディレクトリを指定しても作成できますが、基本的には↓のような「バインダ言語」を使用して作成します。

これは、サービスプログラムの中にはどんなモジュールが入っているかというラベルをコントロールするもの、と考えていいでしょう。
モジュールの EXPORT で指定したもの(ただの EXPORT だったらプロシージャ記述の名前になります)をそのまま EXPORT の SYMBOL として記述すれば OK です。

     Pfactorial        B                   EXPORT                                                   
     Pperm             B                   EXPORT                                                   

どういう名前でモジュールを使用するかの"鑑"を記述するわけですね。

    /* CRTSRVPGM SRVPGM(MATH) MODULE(FACTORIAL PERM) SRCFILE(QSRVSRC) */        
             STRPGMEXP                                                          
             EXPORT     SYMBOL(FACTORIAL)                                       
             EXPORT     SYMBOL(PERM)                                            
             ENDPGMEXP                                                          

通常は QSRVSRC というソースファイルが存在していますので、それを開発ライブラリーに CRTDUPOBJ して、そこにソースを記述します。

ソースタイプは "BND" になります。

↓こんなかんじですね。

CRTSRVPGM で、含まれるモジュールを指定し、↑で作成したソースを指定して作成します。
でも述べましたが、モジュールそのものは普通に作成したモジュールをそのまま使用できます。

バインド・ディレクトリと同じ名前なので、あれ? と思った方がいらっしゃるかもしれませんが、同じ名前でもオブジェクトタイプが違うので同じライブラリーの中に存在させることは可能です。
(紛らわしいので本当はやめた方がいいとは思いますが)

使用方法

CRTPGM コマンドに「サービス・プログラムのバインド」パラメータがありますので、そこに指定するだけです。

メイン・プログラムはすべてのモジュールを独立させた場合のものがそのまま使用できます。

考慮点

うまく共通化できれば、サービス・プログラムに指定されるモジュールは多くなる可能性がありますよね。

バインド・ディレクトリの紹介を、サービス・プログラムと対になるようにしてしまいましたが、
実際に「モジュール」に指定されるモジュールは CRTPGM コマンドよりは CRTSRVPGM コマンドの方が多くなるはずです。

CRTSRVPGM コマンドにも BNDDIR パラメータは存在しますので、この指定に使うのが一番効果的な使い方のような気がしますね。

[Top Pageに戻る]

Ads by TOK2