メニューボタン
IBMi海外記事2024.01.24

プロシージャー主導型RPGでは、変数はローカルに保たれる

Gregory Simmons 著

プロシージャー主導型の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でグローバル変数を使用する際のアドバイスをいくつか示します。

PAGE TOP