48

私は最近、イベントドリブンのアーキテクチャで、かなり標準的なオブジェクト指向の考え方からの演奏を開始しました。メンテナンス可能なイベントドリブンコードの書き出し

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

私はこの開発思考には新しく、オブジェクト指向の心配のすべてが引き継がれるわけではないことを理解します。保守可能でわかりやすいイベント駆動型コードを書く上でのリソースはありますか?これについてnode.jsやTwistedやEvent Machineを使っている人はどうしますか?

答えて

4

を操作している方法を見て。

Twisted Pythonは、inlinecallbacksまたは(やや醜い)deferredGeneratorスタイルのいずれかを使用して非常に命令的なスタイルを可能にします。これらのメソッドを使用すると、読みやすく理解しやすいイベントドリブンコールバックコードを使用するプロシージャを記述できます。実装は、あなたの関数を遅れのシーケンスを生成するレイジーシーケンスに変えます。

具体的には、深くネストされたコールバック関数/ lambdas/closuresのセットを構築する必要はなく、関数の制御を任意の時点でイベントループに戻すことができます。あなたは精神的にこれをコルーチンや協調的なマルチタスクとして再分類することができます。それは仕事を終わらせる。例は次のように(醜い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方法を示し、ここでは別のポストがあるが、2.5またはそれ以降(/ RHEL 5 CentOSに下にないという意味のpythonが必要です私は悲しいかなか私のアプリのために立ち往生しているシリーズ)。あなたがそれを使用することができれば。

あなたが知っていると愛している古い学校のpython必須のもののように見えますが、ネストされた関数とlambdasのトンなしで維持する方が簡単です。私はまだPythonがブロックを持っていることを望む。

デバッグに関しては、初期化コードのどこかでdefer.setDebugging(True)コールを使用して、リアクトルのデバッグをねじりにすることができます。これにより、コード内に例外が発生した元のトレースバックがアタッチされ、実際にエラーが発生した場所を簡単に確認できます。プロダクションに行く前にsetDebuggingステートメントを編集することを覚えておいてください。膨大な量のイントロスペクションが発生します(ひどく恐ろしい場合は、straceで見てください)。

1

は明らかに時間をかけて開発していきますベストプラクティスとモデルが既に存在しています。

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

ユーザーと開発者は、既存のアプリケーション設計に頼るのではなく、既存のプロトコルを上から下に再配線することができます。アプリケーション設計者は、すべてのソリューションを提供するか、あらゆる可能性のある不測の事態を心配するのではなく、個々のユースケースに集中することができます。

Web Hooksをチェックアウトし、Twilioのようなサービスは、すでにそれは私が今巨大な分散アプリケーションを構築するために使用しています何であると私は例としてPythonを使用します

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 
6

Martyn Loughran wrote an excellent short article完全にコールバックスパゲティを避けることについて。

私が彼の記事について本当に楽しんでいたのは、のプロセスです。スパゲッティを素敵で清潔なものに改善しています。最初はちょっとフォーマルに見えるかもしれませんが、最終結果を見ると、彼はきれいで見やすいコードで本当の芸術性を示すことに同意すると思います。

1

私の助言はだと思いますです。

+2

詳細を教えてください。 – keyle

関連する問題