2009-06-03 12 views
4

Flexアプリケーションの初期化コードでは、ユーザーの資格情報の確認、外部データのロード、JMSトピックへの接続など、一連の非同期呼び出しが行われています。これらの呼び出しのうちのいくつかは、実行されないか、または異なるパラメータで実行されます。非同期制御構造の扱い(Fluent Interface?)

これらの呼び出しはすべて非同期で発生するため、それらを制御するコードは読み込み、理解、保守、テストするのが難しいです。呼び出しごとに、次に実行する呼び出しを決定するコールバックメカニズムが必要です。

実行可能なユニットでこれらの呼び出しをラップし、それらを接続して制御するFluent Interface(FI)を持つ人がいるかどうかは不思議でした。 FIでビルド(と私たちはもちろんFIせずに、1つを構築することができ)、AsyncChainは実行ツリーになり

var asyncChain:AsyncChain = execute(LoadSystemSettings) 
.execute(LoadAppContext) 
.if(IsAutologin) 
    .execute(AutoLogin) 
.else() 
    .execute(ShowLoginScreen) 
.etc; 
asyncChain.execute(); 

:私の頭の上から

、コードは次のようになります。

私は物事を試すために、コードに飛び込む前に、これは...?

Flash Playerが、シルバー、JavaFXのようなシングルスレッドモデルで実行環境のための面白いアイデアかもしれないが、私は期待していましたいくつかのフィードバックを得る。


更新19/03/2010:私たちは、非同期プロセスを制御します春のActionScriptプロジェクトで実験的なタスクのAPIを作成しました。フィードバックをいただければ幸いです。 http://www.springactionscript.org/docs/reference/html/the_operation_api.html#tasks

答えて

0

あなたの関数は非同期でなければならないので、次のアクションを待つようにブロックすることはできません。後で実行される構造体にいくつかのコードを隠すだけです。

おなじみですか?つまり、言語をコンパイルしてVMを実行しているということです。

何も間違っているわけではありませんが、適切な意味で考えてみると、適切な文献を検索することができます。たとえば、内部構造との戦いではなく、.else()の部分がどの部分がペアであるかを知っているので、完全なパーサーを作成してプログラムに文字列を送信するだけです。

も間違いなくあなたがこれを行うことができ、簡単な仮想マシン

1

を書く上の多くの例があります。アクションと継続機能を渡すことができ、それらを非同期コールとコールバックに脅かすことができます。これはContinuation passing styleと呼ばれます。これにより、従来のロジックを一連の関数呼び出しに変換する必要があります。

非同期呼び出しをカプセル化するモナドフレームワーク(like in Haskell)を簡単に紹介します。しかし、プログラムロジックをCPSに変換しながら、複数の関数(コールバック)を作成する必要があります。参照: CPS in Haskellしかし構文は醜いです。 Schemeには優れた構文がありますが、これはSchemeの計算モデルと密接に関連しています。マクロ処理に使用できるマクロとライブラリコードです。

いくつかの言語サポートでは、構文を簡略化できます。例はF#の計算式で、正確にはasync oneです。フードの下にはモナドのコンセプトに近いものがあります。

高レベルのイベント駆動型プログラミングの別の興味深い考え方はReactive Extensions for .NET (Rx)に実装されています。アイデアはとてもシンプルです。イベントはリストと非常に類似しています。違いは、プッシュベースのコレクションを構築しないで、プッシュベースのコレクションから次の要素を取得することです。それに対応してインターフェイスを反転する:IEnumeratorのMoveNextおよびCurrentの代わりに、IObservableのOnNext、OnDoneおよびOnErrorを取得します。既存の観測値を組み合わせることで、提案したコードに近いものを得ることができます。

0

このようなプログラミングのタイプについては、非常に興味深い議論です。また、最も一般的な言語の中でも最も弱い部分であり、同期言語内で非同期ロジックを表現するのは非常に苦労します。私は同期とプログラム同期を考えることができるので、ここでの答えはここにあると信じていますが、非同期プログラム制御フローを簡単にモデル化できます。同期プログラミングは非常によく理解されており、再利用は非常に簡単です。非同期では全くありません。しかし、世界が追いつくまで...悲しいかな。

あなたが示唆しているのは面白そうですが、私はこのタイプのことを少なくとも2回はやったことがあります。実行時にifブロックを評価するのは難しい時期になると思います。私がいつも持っていた問題は、データを1つのステップから次のステップにクリーンな方法で取得することでした。ステップが実行されるまで、存在しない可能性のある値に対してifステートメントをどのように記述しますか?

私があなただったら私は州のパターンを見てみることにしました。状態パターンは、オブジェクト内のこのタイプの動作をモデル化し、遷移は非同期に実行できます。上記のような国を作成するためのFluentインターフェースを作成することができます。

今私のAIRアプリケーションでこの正確なことをやっているようになって、どのようになっていくのか、私は非常に興味があります。

2

私は特に、アプリケーションの初期化のために何か似たようなことをしました。 Flexを使用してFlashアプリケーションのほとんどを開発しているので、MXMLの使用方法を念頭に置いて記述しました。

構文はちょうど(私はタグを作ってるんだが、あなたはアイデアを得る)の配列を宣言するようになっています

<Initialize> 
    <DisplayPreloader /> 
    <LoadConfiguration id="configurationLoader" source="foo.xml" /> 
    <ParseConfiguration source="{configurationLoader.result}" /> 

    <!-- ... ---> 
</Initialize> 

を、このようなIMXMLObjectなどのインタフェースを使用してそれだけにこれを平手打ちに非常によく動作しますアプリケーションとちょっと前に、あなたの初期化コードがあります。もちろん、初期化する必要はありませんが、どこにでも適用できます。

注目すべき長所:

  • 実行順序直感的で、かつ変更しやすい(ちょうど上下のタグを移動)、リスト内の
  • 手順が本当に他のステップを気にしない
  • データバインディング構文を使用して手順の間を通過することができ、適切にカプセル化されたシングルタスクのステップは非常に簡単に再利用することができる
  • 依存性の注入を促進

注目すべき短所:

  • MXMLの== angle bracket tax
  • 複数回トリガーケアの手順はSingle Responsibility Principleに従うことに注意しなければならない場合に、データを渡すためのバインディングを使用すると、予期しない結果につながる可能性それ以外の場合は簡単に複雑すぎる可能性があります。
1

Flexを使用し、i nsightの非同期呼び出しの流れでは、私はarchecturalフレームワークMateを使用します。 Apiは次のように述べています。「Mateの基本的な部分は、アプリケーションが作成するイベントのマッピングを定義できるEventMapタグです。これは基本的にIActionListブロックのリストです。各ブロックはイベントタイプと一致します[..] "各EventMapでは、互いに論理的に接続されたいくつかの非同期サーバーコールを持つことができます。非常に読みやすい。

関連する問題