|
|
|
78. ILEのサブ・プロシージャーとサブ・ルーチン
|
|
ILEのサブ・プローシージャーを調べていくと従来のサブ・ルーチンとは
どのように違うのかとの 疑問が湧いてくる。
サブ・プロシージャーはサービス・プログラム(*SRVPGM) からの公開プロシージャー
だけ でなく、RPG自分自身の内部でも定義できるからである。
RPGの近代化として従来のサブ・ルーチンをサブ・プロシージャーに書き換えるようにとの
推薦を目にすることがよくある。
一見、サブ・プローシージャーもサブ・ルーチンに良く似ているようであるが
最も異なるのは サブ・プロシージャーは完全にカプセル化されていることである。
つまりサブ・プロシージャーはANSI-C やVisualBASIC、VisualC++、Java などの
関数または クラスに匹敵している。
サブ・プロシージャー内部で定義された変数はローカル変数としてサブ・プロシージャーの
中だけで有効である。これに対してサブ・ルーチンはメイン・ルーチンの一部であり、
メイン・ルーチンの変数とメモリなども共有している。
つまりサブ・ルーチンとはメイン・ルーチンの一部なのである。
サブ・ルーチンの中から GOTO 命令や CABxx などでメイン・ルーチンへジャンプすることが
できることでも、サブ・ルーチンとはメイン・ルーチンの一部であることがわかる。
変数の値がおかしいと思ったらサブ・ルーチンの中で同じ変数名が使用されていたために
障害となっていたような経験はないだろうか?
サブ・プロシージャーでローカル変数を定義としておけば、このような障害は発生しない。
さらにサブ・プロシージャーではRPG全体で定義されているグローバル変数も使用することが
できる。
ILEでは厳密に言えばメイン・ルーチンさえもメイン・プロシージャーという、ひとつの特殊な
プロシージャーである。
さらにはILE ではひとつひとつのプロシージャーに対して入り口点が用意されている。
( CRTPGM + F4 で「プログラム入り口プロシージャー・モジュール」を指定することができる。)
*SRVPGM をILEで開発する場合は必ず H仕様書に NOMAIN と記述する。
つまりメイン・プロシージャーは無いことを示すのもこのためである。
RPGの近代化のためにサブ・ルーチンをサブ・プロシージャーに書き換えるという手法は
変数の 重複を無くすためである。
このことによって他のPGM にプロシージャーをそのままコピーしても間違いなく正常に動作する ようになる。
つまりソースの再利用の可能性が高くなるのである。
ただしメイン・ルーチンとの変数の共有を意図的に行っているサブ・ルーチンにはサブ・プロシージャー への
移行では考慮が必要となる。
|
|
|
|
|