Progress 4gl で作業しており、初心者のプログラマーです。私は、相互に関係のない5 つの手順 (.p ファイル)があり、1 つの手順(.p ファイル) を共有している状況に取り組んでいます。
私の問題は、共有プロシージャを変更する必要があることです。これは、呼び出しプロシージャの 1 つだけに影響し、他の 4 つには影響しません。これら2つの手順を同時にリンクして、他の4つの手順への影響を防ぐ方法は何ですか.
Pls 、この問題で私を助けてください。明確でない場合は申し訳ありません
Progress 4gl で作業しており、初心者のプログラマーです。私は、相互に関係のない5 つの手順 (.p ファイル)があり、1 つの手順(.p ファイル) を共有している状況に取り組んでいます。
私の問題は、共有プロシージャを変更する必要があることです。これは、呼び出しプロシージャの 1 つだけに影響し、他の 4 つには影響しません。これら2つの手順を同時にリンクして、他の4つの手順への影響を防ぐ方法は何ですか.
Pls 、この問題で私を助けてください。明確でない場合は申し訳ありません
単純ですが、構造的に嫌悪感を抱く解決策は、グローバル共有変数を使用することです。
多くの人が、これは悪いコーディング手法だと言うでしょう。彼らは正しい。しかし、あなたはベスト プラクティスに関するアドバイスを求めているわけではありません。
呼び出し元と呼び出し先の両方でそのような変数を作成するだけです。それを必要としない手順は、それを見逃すことはありません。
あなたの「通常の」プログラムの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 によって呼び出されたかどうかを確認します。
これを行うには他にももっと複雑な方法がありますが、それらはすべて同じ問題に帰結します。つまり、「特別な」プログラムと、もはや一般的ではない「共通の」プログラムとの間の非常に醜い結合の基礎を作成しているのです。
オプション
OpenEdge のバージョンによっては、ロジックをプロシージャではなくクラスに移動できます。クラスでは、オーバーロードを使用できます
最善の方法は、共有プロシージャに「フラグ」を追加し、別の動作が必要な場合にフラグを渡すことです。共有プロシージャを変更したくないので、どのプログラムがそれを呼び出しているかを知る必要があります。