RPG

365. プロシージャーとは

サブ・ルーチンはあくまでもメイン・ルーチンの一部であり
メイン・ルーチンが迂回したに過ぎない。
メイン・ルーチンの一部であるので使用する変数(フィールド他)も
すべてメイン・ルーチンと共有というか共通であり
これは当然のことである。

これに対してプロシージャーとはメイン・ルーチンとは
全く別の独立したロジック領域であり変数も
メイン・ルーチンからパラメータとして受け渡されると
それはプロシージャーの中だけに通用する。
このようにプロシージャー内部だけの変数のことを
ローカル変数と呼び、プロシージャーとメイン・ルーチンの
両方に共通して使用可能な変数のことをグローバル変数と
呼ぶがIBM i にはプロシージャーとメイン・ルーチンとのあいだに
共有できるグローバル変数はなかったと思う。

なぜプロシージャーがメイン・ルーチンから独立したロジックで
あるのだろうか?
このような独立したプロシージャーと同じロジックは
VisualXX のようなオープン系の開発言語では「関数」と
呼ばれる。

オープン系からILE-RPGに来た人はプロシージャーは
関数として理解してよい。
プロシージャーも関数もそれ自体が別のグローバル変数を
必要としない独立したロジックであることに意味がある。

前置きが長くなってしまったがプロシージャー(関数)の
値打ちはオブジェクトとしての再利用性である。

プロシージャー(関数)はそれ自体だけで独立して
動作できるので他のプログラムから呼び出して利用することが
できる。
サブ・ルーチンはこうはいかない。
サブ・ルーチンはメイン・ルーチンの一部なので
メイン・ルーチンの別のグローバル変数を参照しているかも
知れない。
これに対してプロシージャー(関数)は単独で動作できるように
文法上組まれているのでEXPORT(公開)してやれば
他のプログラムから呼び出して再利用することができる。

例えば消費税を算出するルーチンがあったとする。
これがサブ・ルーチンとして組まれたものであれば
税率はメイン・ルーチンに決めうちで書かれているかもしれないし
税率テーブルがあったとしてもプログラム毎に税率テーブルは
異なるのかもしれない。
要するに税率が変わったとしてもサブ・ルーチンでは
起算の元になる税率がどこに書かれているのかわかわず
それはサブ・ルーチンによって異なるので一意性もなく
すべてのサブ・ルーチンを保守しなければならなくなる。

これに対してプロシージャー(関数)であれば税金を算出する
プロシージャー(関数)は社内(または社外であっても)
ただひとつだけで済む。
税率が変わってもひとつのプロシージャー(関数)を保守するだけで
済むのである。

プロシージャー(関数)はまた他のプログラムから呼び出して
再利用することができる。
これがプロシージャー化の最も大きな利点であり目的でもある。

プロシージャーの最たるものがJavaである。
Javaの関数はClassと呼ばれていてClassからまたそれを
包含するClassを定義することができる。
ただしJavaはC++のクラスや性質を極端化してものであるので
自然に発展してきた言語に比べて無理がある。

次回はプロシージャー(関数)を具体的に定義してみよう。