内部プロシージャ (.p ファイル)でプロシージャ (.p ファイル) の変数を使用する方法はありますか?
3 に答える
これはあなたが意味するものですか?
ここには、他の .p ファイルが実行される ShowTime.p という共通の .p ファイルがあります。.p ファイルの 1 つに対して特定の方法で動作させ、他のファイルに対しては別の方法で動作させたいとします。このため、パラメータを定義します。この例では、これは LOGICAL パラメータであるため、値は YES または NO のいずれかになります。ご覧のとおり、lShowDate パラメータが NO の場合、ShowTime プロシージャは TIME を表示し、lShowDate パラメータが YES の場合、DATE を表示します。
/* ShowTime.p */
DEFINE INPUT PARAMETER lShowDate AS LOGICAL.
IF lShowDate = NO THEN
MESSAGE STRING(TIME,"HH:MM:SS").
ELSE
MESSAGE STRING(TODAY,"9999/99/99").
これは、関連のない 5 つの .p ファイルの 1 つです。これは ShowTime.p プロシージャを実行し、NO のパラメータを渡します。したがって、ShowTime は TIME を表示します。
/* p1.p */
MESSAGE "P File 1".
RUN ShowTime(INPUT NO) NO-ERROR.
もう1つ、なぜですか?
/* p2.p */
MESSAGE "P File 2".
RUN ShowTime(INPUT NO) NO-ERROR.
この .p ファイルは、lShowDate パラメーターを YES として ShowTime を実行しています。これは、時刻の代わりに日付を表示することで、ShowTime プロシージャがこのファイルに対して異なる動作をすることを意味します。
/* p5.p */
MESSAGE "P File 5".
RUN ShowTime(INPUT YES) NO-ERROR.
したがって、基本的には、ShowTime という 1 つのプロシージャがあり、2 つのことのいずれかを行うことができます。この 1 つのプロシージャを実行する無関係なプロシージャは、パラメータを渡すことによって、必要なものを伝えることができます。
あなたの質問の観点から言えば、互いに関係のない5つの手順(p1.p、p2.p ... p5.p)があり、単一の手順(ShowTime.pファイル)を共有しています。共有プロシージャーはパラメーターで変更されるため、1 つの呼び出し側プロシージャー (YES パラメーターを持つプロシージャー) のみに影響を与え、他の 4 つ (NO パラメーターを持つプロシージャー) には影響を与えません。
しかし、関連のない 5 つのプロシージャが共有プロシージャを実行する方法を変更できない場合、または共有プロシージャのみを変更できる場合は、パラメーター以外の何かを決定する必要があります。これはどうですか:
/* DoThing.p */
IF SOURCE-PROCEDURE:NAME = "p5.p" THEN
MESSAGE "Do one thing".
ELSE
MESSAGE "Do something else".
これは、5 つの手順のうちの 1 つに対して 1 つのことを行い、他の 4 つに対して別のことを行います。
このような?
define variable i as integer no-undo. /* a variable in the main procedure */
procedure internalProcedure:
message "Internal Procedure (a):" i.
i = 13.
message "Internal Procedure (b):" i.
end.
/* main block
*/
i = 1.
message "Main procedure (a):" i.
run internalProcedure.
message "Main procedure (b):" i.
より難しい質問は、「グローバル スコープの変数が内部プロシージャで使用されるのを防ぐ方法はありますか」ということかもしれません。
実際の問題は次のように思われます。
単純ですが、構造的に嫌悪感を抱く解決策は、グローバル共有変数を使用することです。
多くの人が、これは悪いコーディング手法だと言うでしょう。彼らは正しい。しかし、あなたはベスト プラクティスに関するアドバイスを求めているわけではありません。
呼び出し元と呼び出し先の両方でそのような変数を作成するだけです。それを必要としない手順は、それを見逃すことはありません。
あなたの「通常の」プログラムの1つ:
/* p1.p */
message "p1, I'm normal.".
run common.p.
あなたの「特別な」プログラム:
/* p2.p */
define new global shared variable special as character no-undo.
message "p2, I'm special!".
run common.p.
message "special = " special.
共通プログラム:
/* common.p */
define new global shared variable special as character no-undo.
message "common stuff...".
if program-name(2) = "p2.p" then special = "special value".
return.
NEW GLOBAL SHARED 変数は何度でも定義でき、そのコピーは 1 つしか取得できません。「new」は既存の変数を上書きしません (GLOBAL を省略すると、動作が異なります)。
あなたはそれを要求しませんでしたし、おそらくそれを必要としないかもしれませんが、program-name(2) チェックはコール スタックを調べて、common.p が p2.p によって呼び出されたかどうかを確認します。
これを行うには他にももっと複雑な方法がありますが、それらはすべて同じ問題に帰結します。つまり、「特別な」プログラムと、もはや一般的ではない「共通の」プログラムとの間の非常に醜い結合の基礎を作成しているのです。