3

ユーザーがそのアクションの特定の部分を実行したいことを確認するまで、アクション(関数/メソッド呼び出し)を一時停止するための適切なアプローチを探しています。コードの実行を停止できない環境でこれを行う必要があります(私の場合はActionScriptですが、JavaScriptのアプローチは同じである必要があります)。

説明のために、これはユーザープロンプトを導入する前のアクションのモックアップです。

<preliminary-phase> // this contains data needed by all the following phases //

<mandatory-phase> // this will be always be executed //

<optional-phase> // this will always execute too, if in this form, but in some cases we need to ask the user if he wants to do it //

<ending-phase> // also mandatory //



必要なのは、条件付きのユーザープロンプト、「この部分を実行しますか?」を挿入し、<optional-phase>ユーザーが実行したい場合にのみ実行することです。

<preliminary-phase>

<mandatory-phase>

if(<user-confirmation-is-needed> and not <user-response-is-positive>){
    <do-nothing>
}
else{
    <optional-phase>
}

<ending-phase>



これをActionScript/JavaScriptで行おうとすると、次のようになります。

<preliminary-phase>

<mandatory-phase>

if(<user-confirmation-is-needed>){
    askForConfirmation(callback = function(){
        if(<user-response-is-positive>)
            <optional-phase>
        <ending-phase>
    });
    return;
}

<optional-phase>

<ending-phase>

<optional-phase>これで、との両方<ending-phase>が複製されます。また、で作成されたオブジェクトを使用しているため、<preliminary-phase>すべてのデータをそれらの関数に渡さずに外部関数に移動することはできません。


私の現在の解決策は、確認を求める前に宣言されたいくつかのローカル関数<optional-phase><ending-phase>いくつかのローカル関数を囲み<preliminary-phase>、コードを複製する代わりにそれらの関数を呼び出すことですが、コードは実行された順序ではなくなりました。

何をお勧めしますか?

注:
1。askForConfirmationは非ブロッキング機能です。これは、その呼び出しに続くコードがすぐに実行されることを意味します(これがreturn;私のアプローチにある理由です)。

4

4 に答える 4

3

注:正確な状況がわかるかどうかは100%わかりません。

ここでは、コマンドパターンが適している場合があります。それは人々が示唆していることと似ています。

順番に実行されるコマンドの配列があります。

[<preliminary-phase>, <mandatory-phase>, <optional-phase>, <ending-phase>]

コマンドを一度に1つずつ配列からシフトして、executeメソッドを呼び出すだけです。

オプションフェーズでは、ユーザーの確認が必要かどうかを確認します。必要でない場合は、コマンド完了イベントをディスパッチするオプションのコードメソッドを実行します。必要な場合は、アラートを表示し、イベントを待機し、結果を確認します。コマンド完了イベントをディスパッチするか、オプションのメソッドを呼び出します(実行してからコマンド完了をディスパッチします)。

コマンドのツリーを作成して、配列をいじることなく実行の流れを明確に示すこともできます。

これは、インストールウィザードのようなプログラムがどのように機能するかです。

実行の順序がわかりやすく、コードがチャンクにうまく分割され、各ステップの複雑さがカプセル化されているという点で優れています。たとえば、オプションフェーズは終了フェーズについて何も知りません。オプションフェーズは、ユーザーが実行前にプロンプ​​トを表示する必要がある可能性があることのみを認識し、そのすべてを内部で処理します。

http://en.wikipedia.org/wiki/Command_pattern

「コマンドオブジェクトを使用すると、選択したときにメソッド呼び出しを委任、シーケンス、または実行する必要がある一般的なコンポーネントを簡単に構築できます...」

于 2010-11-09T18:45:16.270 に答える
1

「コードは実行された順序ではなくなった」というのは、実際には問題ないようです。明確である限り、実行された順序で記述されていないコードを使用することは問題ありません。実際、コードは可変の順序で実行されるため、コードを複製せずに実行される順序でコードを記述することは不可能だと思います。これははるかに大きな悪です。適切な関数名を選択すると、あなたのアプローチは私のコードレビューに合格します。

<preliminary-phase>

<mandatory-phase>

var optional_phase = function() {
  <optional-phase>
}

var ending_phase = function() {
  <ending-phase>
}

if(<user-confirmation-is-needed>){
    askForConfirmation(function(){
        if(<user-response-is-positive>)
            optional_phase();
        ending_phase();
    });
    return;
}

optional_phase();
ending_phase();
于 2010-11-09T16:02:10.243 に答える
0

大きな変更ではありませんが、このフローが機能する場合、オプションのフェーズは繰り返されません

<preliminary-phase>

<mandatory-phase>

if(<user-confirmation-is-needed>){
    askForConfirmation(function(){
      if(<user-response-is-negative>)
      {
        <ending-phase>
        return;
      }
  });
}

<optional-phase>
<ending-phase>
于 2010-11-09T17:08:02.320 に答える
0

これはあなたが求めていることをしますか?

<preliminary-phase>

<mandatory-phase>

if(<user-confirmation-is-needed>){
    askForConfirmation(function(){
        if(<user-response-is-positive>)
            <optional-phase-as-local-function>
        <ending-phase-as-local-function>
    });
} else {
    <optional-phase-as-local-function>
    <ending-phase-as-local-function>
}
于 2010-11-09T16:05:18.113 に答える