プロシージャー主導型RPGでは、変数はローカルに保たれる
プロシージャー主導型のRPGについて一番気に入っていることの1つは、変数がローカルに定義された状態を保つことができる点です。RPGのショップでよく起こる、次のような「惨劇」の一場面を想像してみてください。
Jake: 「Gregoryさん、今さっき、経理部から電話がありました。リバランス レポート プログラムの調子がおかしいようです。この間、そのプログラムで作業したと言っていましたよね。」
筆者: 「はい、作業しましたよ。私は、このフィールドをリセットしただけでしたが。部門間の合計行の表示/非表示に使用されるフィールドです。自分のライブラリーでテストしましたが、修正はうまくいきました。」
Jake: 「そうですか。私は先月、そのプログラムの変更作業を行いました。あのプログラムは厄介です。おまけに、「リバランス レポート プログラム」と呼ばれていますが、それだけではなく、もっといろいろな処理を行っています。もっと言えば、グローバル変数が大量にあります。」
さて、惨劇の詳しい描写は差し控えますが、ここでの教訓は、Jakeが使用した変数が、レポートとは関係ない他のサブルーチンでも使用されていたことでした。
ローカル変数を使用するということは、プロシージャー内で定義する変数は、そのプロシージャー内でのみ可視/使用可能であるということです。したがって、プロシージャー内の変数を、そのプロシージャー内以外の場所で誤って参照するということはあり得ません。これが上述の惨劇の原因でした。
1 **FREE
2 dcl-proc calculateTotalDue;
3 dcl-s totalDue packed(10:2);
4 dcl-s i int(3);
5 dcl-s itemPrice packed(10:2);
6 dcl-s quantity packed(5);
7 for i = 1 to 100;
8 itemPrice = getPrice(i);
9 quantity = getQuantity(i);
10 totalDue += itemPrice * quantity;
11 endfor;
12 return totalDue;
13 end-proc calculateTotalDue;
この例では、変数itemPriceおよびquantityは、calculateTotalDueプロシージャー内でローカルに宣言されています。このことは、これらの変数の値はプロシージャーのスタック フレームに格納され、プロシージャーが呼び出されるたびにヒープからコピーする必要がないことを意味します。これにより、特にプロシージャーが頻繁に呼び出される場合は、パフォーマンスを向上させることができます。
グローバル変数を使用すると、コードの判読や保守がしづらくなる場合があることに注意が必要です。これは、グローバル変数はプログラム内のどこからでもアクセスできるためです。そのため、それらの変数がどこで使用され、修正されているのか追跡しづらくなることがあります。したがって、グローバル変数の使用は控えめにし、必要なときにのみ使用するようにすることが重要です。
そうは言っても、グローバル変数の使用に適した時と場所もあります。たとえば、私の場合、グローバル変数は、プログラムのスタート アップ時またはプログラムのリセット時に、それらの変数を初期化する状況でのみ使用しています。もうひとつ、グローバル変数の使用が適切なケースは、複数のプロシージャーによって使用されることになる定数があるときです。
以下に、RPGLEでグローバル変数を使用する際のアドバイスをいくつか示します。
- グローバル変数は、可能な限り使用を避けます。代わりに、変数は、可能な限りプロシージャー内でローカルに宣言するようにします。
- グローバル変数を使用する必要がある場合は、それらの変数に意味が分かりやすい名前を付け(私は変数名の先頭にgbl_を付けるようにしています)、用法を丁寧に文書化しておくようにします。
- グローバル変数を複数のプロシージャーで修正しないようにします。グローバル変数を修正する必要がある場合は、一般に、1つのプロシージャーで修正を行うようにするのが最善です。たとえば、gbl_store_sales_taxという名前のグローバル変数があり、calculate_store_sales_taxという名前のプロシージャーがある場合、値を変更するのはそのプロシージャーのみにして、他のプロシージャーはすべて、その変数を使用するのみにします。
ローカル変数とグローバル変数をそれぞれどのようなときに使用したらよいかについて、アドバイスをいくつか述べました。これらを参考にすることで、コードを、判読しやすく、保守しやすく、効率的なものにすることができるとしたら幸いです。