web-dev-qa-db-ja.com

パブリッシュサブスクライブパターンは、gotoとどのように異なりますか?

私の理解は 後藤のステートメントは一般に嫌われる です。しかし、 publish-subscribe pattern は、コードの一部がメッセージをパブリッシュするときに、一方向の制御の転送を実行するという点で概念的に似ているようです。プログラマーは、プログラムのどの部分がこのメッセージをサブスクライブしているかわからない場合があります。

イベントがモジュール間で便利に「ホップ」するために使用される多くのJavaScriptプログラムで同様のものが見られます。パブリッシュサブスクライブパターンまたはイベントドリブンパターンについて何か不足していますか?

11
gwg

うん、あなたは間違いなく欠けています何か。後藤は通常、あなたが言ったように、一方向の制御の移行を実行するために使用されます。

ただし、イベントはそれを行いません。コードがイベントを発生させると、イベントが発行(または処理、キュー、発生...など)されると、イベントを生成したコードの次の行でコードの実行が再開されることが完全にわかります。

Gotoを使用すると、そのステートメントを呼び出すコードと受信側のコードが非常に緊密に結合されます。 gotoを使用するには、開発者が両方の場所をよく理解している必要があります。

一方、イベントを発生させるコードは通常、誰がそのイベントをリッスンすることに関心があるかを知りませんし、気にしません。 couldリスナーになる。または、100個のリスナーまたは0個のリスナーが存在する可能性があります。これらのリスナーは、イベントが発生した同じプログラムにあるか、まったく異なるアプリケーションにあるか、別のマシンにある可能性があります。パブリッシャーに関する限り、彼がイベントを生成するとすぐに、彼の仕事は完了します。

ここまで一緒にいるのであれば、上で説明したのはpub/subパターンの理想的なケースです。残念ながら、現実の世界では物事が常に理想的であるとは限らず、パブリッシャーがイベントを生成し、サブスクライバーが呼び出され、状態全体を変更し、コード実行がパブリッシャーに戻るまでに、「世界」はひっくり返された。そして、あなたは過去にこれに遭遇したと確信しています。この状態は、pub/subパターンが非常に単純な方法で実装されたときに発生することが多いためです(たとえば、C#でデリゲートまたはイベントを使用するか、Cで関数/インターフェイスポインターを使用する)/C++)。

しかし、この問題は必ずしもpub/subパターンではなく、その実装です。これが、多くのシステムがキューに依存しているため、イベントがパブリッシュされると、後で呼び出されるようにキューに入れられるだけで、パブリッシャーは、ワールドがそのままの状態で実行を終了できるようになります。パブリッシャーが作業を完了すると、イベントループ(別名ディスパッチループ)がイベントをポップオフしてサブスクライバーを呼び出します。

19
DXM

いくつかの違いがあります。まず、コードがGOTOを実行すると、制御が放棄され、制御が回復するという保証はありません。ただし、pub/subのパブリッシャーは、そのロジックを実行および実行し続け、必要に応じてメッセージを送信します。その動作は理解可能であり、予測可能です。

次に、サブスクライバーはメッセージを受信します。GOTOとは異なり、メッセージ自体にコンテキストが含まれます。メッセージのタイプとそれが運ぶすべてのプロパティは、サブスクライバーがその役割を実行するのに役立ちます。また、メッセージを処理した後も、サブスクライバーは新しいメッセージを受け取ることができます。したがって、その動作も理解可能で予測可能です。

大きな違いは、パブリッシャーとサブスクライバーの実行フローは明確に定義されており、本質的に、メッセージの送受信中にループとジョブの実行を継続することです。 GOTOを使用したコードcanは適切に記述され、整然としていますが、パフォーマンスが低下する可能性もあり、動作が明確に理解されているという保証はありません。

しかし、あなたは正しい。誰かが非常に多くのメッセージと非常に多くの小さなジャンプを含むpub/subシステムを作成して、処理フローを追跡することが悪夢になる可能性があります。一方、非常に秩序正しく動作し、理解しやすいGOTOを備えたシステムを作成することもできます。 (シンボリック言語が引き継ぐ前に、私は非常に複雑なシステムのアセンブリコードを考えています。)

ただし、通常、pub/subから得られる分離は、分散処理の問題を単純化し、システム内のロジックを分離します。また、通常、まっすぐなGOTOは、制御の流れを理解することが問題になる複雑なシステムを作成する傾向があります。

6
Rob