50

私はつい最近、かなり標準的なオブジェクト指向の考え方から、イベント駆動型アーキテクチャを使い始めました。

私が最初に気付いたのは、プログラムの理解とトレースの難しさが、プログラムのサイズに応じて指数関数的に増加しているように見えるということでした。小さなペットのプロジェクトは簡単にフォローできますが、コードはすぐにスパゲッティに変わるように感じます.

私はこの開発の考え方に不慣れであり、オブジェクト指向の懸念のすべてが引き継がれるわけではないことを理解しています. 保守可能で理解しやすいイベント駆動型コードを作成するためのリソースはありますか? node.js や Twisted、Event Machine を使っている人はこれについてどうしていますか?

4

7 に答える 7

7

私は昨年、Yahooでこのトピックについて講演しました。

于 2011-04-08T16:21:05.073 に答える
6

これらの記事を見てみてください。

于 2011-04-08T16:26:54.930 に答える
6

Martyn Loughran は、完全にコールバック スパゲッティの回避についての優れた短い記事を書きました。

彼の記事で私が本当に楽しかったのは、スパゲッティを素敵できれいなものに改良するプロセスです。最初は少し形式化されているように見えるかもしれませんが、最終結果を見ると、彼がクリーンで読みやすいコードで真の芸術性を示していることに同意すると思います.

于 2011-04-10T06:05:54.023 に答える
4

例として Python を使用します。Python は現在、巨大な分散アプリケーションを構築するために使用しているものです。

Twisted python では、inlinecallbacks または (少し醜い) deferredGenerator スタイルのいずれかを使用して、非常に命令型のスタイルを使用できます。これらのメソッドを使用すると、読みやすく理解しやすいイベント ドリブン コールバック コードを使用するプロシージャを作成できます。実装により、関数が一連の deferred を生成する遅延シーケンスに変わります。

具体的には、コールバック関数/ラムダ/クロージャーの深くネストされたセットを構築する必要はなく、代わりに関数の制御を任意のポイントでイベント ループに戻すことができます。必要に応じて、これをコルーチンまたは協調マルチタスクとして精神的に再ラベル付けできます。それは仕事を成し遂げます。例は次のようになります (醜い deferredGenerator スタイルを使用):

@defer.deferredGenerator
def foo(arg):
    bar = nonBlockingFunction(foo)
    baz = waitForDeferred(aFunctionThatReturnsADeferredToo(bar))
    yield baz #Returns control to the event loop
    output = baz.getResult() #This gets the output of aFunctionThat...Too above
    yield output #This is how we return a result instead of using return

@defer.deferredGenerator
def aFunctionThatReturnsADeferredToo(put_bar_here):
    """Stuff happens here...."""
    ...etc...

inlineCallbacks メソッドを示す別の投稿がここにあります。これはよりクリーンですが、python 2.5 以降が必要です (Centos/RHEL 5 シリーズではなく、悲しいことに私のアプリで立ち往生しています)。使用できる場合は、そうしてください。

ご覧のとおり、これは、おなじみの古い学校の python 命令型のように見えますが、大量のネストされた関数やラムダがなくても維持するのははるかに簡単です。それでもPythonにブロックがあればいいのにと思います。

デバッグに関しては、初期化コードのどこかで defer.setDebugging(True) 呼び出しを使用して、ツイスト リアクターのデバッグをオンにすることができます。これにより、コードで例外を発生させた元のトレースバックが添付されるため、実際にエラーが発生した場所を簡単に確認できます。setDebugging ステートメントを本番環境に移行する前に編集することを忘れないでください。これにより、膨大な量の余分なイントロスペクションが発生するためです (完全に恐怖を感じたい場合は、strace で見てください)。

于 2011-04-09T04:49:56.140 に答える
4

Twisted の場合、古い deferredGenerator を使用する代わりに、inlineCallbacks をお勧めします。これにより、ブロッキング スタイルのコードを完全に記述しながら、イベント ループを適切に操作できます。

@defer.inlineCallbacks
def foo(arg):
    bar = nonBlockingFunction(foo)
    output = yield FunctionThatReturnsADeferredToo(bar)
    defer.returnValue(output) #This is how we return a result instead of using return
于 2011-04-09T06:14:20.870 に答える
1

明らかに、時間の経過とともに発展し続けるベスト プラクティスとモデルが既に存在します。

ただし、イベント化されたプログラミングが「小さなペット プロジェクト」が相互に対話する機会を提供する可能性も考慮してください。何千もの分散した個々のプロジェクトが、ユーザー定義のコールバックを通じてリアルタイムで相互作用する世界を想像してみてください。

ユーザーと開発者は、既存のアプリケーション設計に依存するのではなく、既存のプロトコルを介して Web とアプリケーションをトップダウンで再配線できます。アプリケーション設計者は、画一的なソリューションを提供したり、考えられるすべての不測の事態を心配したりするのではなく、個々のユース ケースに集中することができます。

Web Hooksを調べて、 Twilioのようなサービスがすでにどのように運用されているかを調べてください。

于 2011-04-09T04:31:03.880 に答える
1

私の唯一のアドバイスは、機能的だと思うことです。

于 2011-04-10T22:51:32.890 に答える