web-dev-qa-db-ja.com

イベント駆動型アーキテクチャーのデータバインディングに対する設計パターンはありますか?

私は、node.jsがバックにあり、HTML5キャンバスがフロントエンドにあるブラウザーベースのゲームを開発しています。通信にはWebSocketを使用します。

私の計画は、クライアント側でビジネスイベントを生成することです(例: "finishJob")。クライアントは最新の関連情報をすべて保存します。

  • クライアントは、データが必要になるたびにサーバーに電話する必要はありません。例:プレーヤーのお金
  • これを達成するために、クライアントはプレーヤーチャンネルにサブスクライブします
  • すべてのオンラインプレーヤーには、チャットルームのような独自のチャネルがあります
  • プレーヤーで何かが発生するたびに、そのチャネルはプレーヤーに新しいデータを含むイベントを発生させます

ここでのMVCパターンでは、モデルはPlayer、ビューはHTML5 Canvasですが、2種類のコントローラーが必要です。

  1. ビジネスイベントを処理するコントローラー
  2. チャンネルとサブスクライバーを処理するコントローラー

私の質問:これは実行可能なオプションですか?はいの場合、これに類似したデザインパターン、またはこの種のアーキテクチャに関する記事はありますか?命名規則(「コントローラー」、「ハンドラー」、「チャネル」...)はありますか?

4
blaskov

はい

...このパターンについては、以下のリンクを参照してください...

Peers-または堅牢なObject-Networksを必要とする複雑なアプリを使用するアプリケーションを作成している場合は、イベント駆動型アーキテクチャ。

メディエーターまたはEventHub(Event-Aggrigator)の使用

最も簡単なアプローチは、 Addy Osmoni によって設計されたMediator Patternを実装することです。

これにより、次のような記述が可能になります。

// core.js
mediator.subscribe('newMemberAdded', function newMemberAddedHandler(id){
    this.membersModule.add(id);
});

.。

// membersUI.js
$('#addMember').click(function(){
    ...
    mediator.publish('newMemberAdded', 998);
    ...
});

これにより、モジュールに必要なCouplingは、他のモジュールと通信するためのmediatorへの参照のみです。

メディエーターの使用は非常に強力であり、モジュールをより多くしますLiftable(疎結合)、ただし、いくつかの規則を考慮する必要がありますEDAの開発中:

  • モジュールはinterests-のみを公開し、Query + Commandイベントは公開しません。
    • 例:eventHub.fire( 'buttonClicked')[〜#〜] not [〜#〜]eventHub.fire( 'get:membersList'、function (){...})
  • クエリ+コマンドチャネルコア/ファサードの相互作用のために予約されています(Osmoniの投稿を参照)
  • それらの回避策名詞-動詞-形容詞チャネル名:
    • 例:'log''start''change''notice'すべては、コマンドまたは発生した何かとして見ることができます。 ing共役を追加して、これを回避できます('starting'
  • 話す前に聞いてください! -そうしないと、イベントを見逃す可能性があります
  • 詳細については、上のリンクにアクセスしてください

さらに、メディエーターをWebWorkerまたはSharedWorkerにバインドして、ブラウザータブ(など)間で状態を共有し、ワーカーをよりクリーンなカップリングのためにサーバー上のEventHub

この投稿はその場しのぎのことですが、始めるのに十分だと思います!

4
Cody