オブザーバー、Pub / Sub、データバインディングの違い


163

オブザーバーパターンパブリッシュ/サブスクライブデータバインディングの違いは何ですか?

Stack Overflowで少し検索したところ、良い答えは見つかりませんでした。

私が信じるようになったのは、データバインディングは一般的な用語であり、ObserverパターンやPub / Subパターンなど、それを実装するさまざまな方法があるということです。オブザーバーパターンでは、Observableがオブザーバーを更新します。Pub / Subを使用すると、0人のパブリッシャーが特定のクラスのメッセージをパブリッシュでき、0人のサブスクライバーが特定のクラスのメッセージをサブスクライブできます。

「データバインディング」を実装する他のパターンはありますか?


私はもう1つを見つけました。Angular.jsが実行するダーティーチェックです。詳細はこちら:stackoverflow.com/questions/9682092/databinding-in-angularjs
Jess

回答:


143

これが私の3つの見解です。

データバインディング

基本的に、これは本質的に、「オブジェクトYのプロパティXの値がオブジェクトBのプロパティAの値に意味的にバインドされていることを意味します。YがオブジェクトBの変更をどのように認識またはフィードするかについては想定されていません。

オブザーバー、またはオブザーバブル/オブザーバー

オブジェクトに特定のイベントを他のユーザーに通知する機能が組み込まれたデザインパターン。通常は、特定の関数/メソッドの形状を持つオブジェクトのスロットのような実際のイベントを使用して行われます。オブザーバブルは通知を提供するものであり、オブザーバーはそれらの通知を受け取ります。.netでは、オブザーバブルはイベントを公開でき、オブザーバーは「イベントハンドラー」型のフックでそのイベントをサブスクライブします。通知が発生する特定のメカニズムや、オブザーバーが通知できるオブザーバーの数については想定されていません。

Pub / Sub

Observable / Observerパターンの別の名前(おそらくより「ブロードキャスト」セマンティクスを持つ)。これは通常、より「動的」なフレーバーを意味します-オブザーバーは通知をサブスクライブまたはサブスクライブ解除でき、1つのオブザーバブルは複数のオブザーバーに「シャウトアウト」できます。.NETでは、標準のイベントを使用できます。これは、イベントがMulticastDelegateの形式であるため、複数のサブスクライバーへのイベントの配信をサポートし、サブスクリプション解除もサポートできるためです。Pub / Subは特定のコンテキストで若干異なる意味を持っています。通常、イベントとeventerの間のより多くの「匿名性」が関係します。これは、すべてを知っている「中間者」(メッセージキューなど)が関係する、任意の数の抽象化によって促進できます。パーティー、しかし個々のパーティーはお互いについて知りません。

データバインディング、Redux

多くの「MVCのような」パターンでは、オブザーバブルは、変更された特定のプロパティに関する情報も含む「プロパティ変更通知」の何らかの方法を公開します。オブザーバーは暗黙的であり、通常はフレームワークによって作成され、オブジェクトとプロパティを特定するためにいくつかのバインディング構文を介してこれらの通知をサブスクライブします。「イベントハンドラー」は新しい値をコピーするだけで、更新または更新ロジックをトリガーする可能性があります。

Reduxに関するデータバインディング

データバインディングの代替実装?さて、これは愚かなものです:

  • オブジェクトのバインドされたプロパティを常にチェックするバックグラウンドスレッドが開始されます。
  • プロパティの値が最後のチェック以降に変更されたことをそのスレッドが検出した場合、その値をバインドされたアイテムにコピーします。

私はあなたの答えに感謝し、別のデータバインディングのアイデアを実装しようとします。
Jess

@jessemonへえ、問題ありません。オブザーバーパターンは間違いなく私が認識している「抽象的な」アプローチですが、私の恐ろしい小さな例は、無秩序で非効率的な方法ですが、「データバインディング」も行います。
JerKimball 2013年

7
正直なところ、「パブ/サブオブザーバーパターン」を聞くのはうんざりです。まったく同じではありません。Pub / Subはイベントシステムであり、オブザーバーパターンイベントシステムを使用して、オブジェクトの変更時にイベントを自動的に発行します。オブジェクトを変更するたびに手動でイベントを発行する場合は、オブザーバーパターンを使用していません。
BT

154

オブザーバー/オブザーバブルパターンとパブリッシャー/サブスクライバーパターンには2つの大きな違いがあります。

  1. Observer / Observableパターンは、ほとんどの場合同期的に実装されます。つまり、Observableは、何らかのイベントが発生したときに、すべてのオブザーバーの適切なメソッドを呼び出します。パブリッシャ/サブスクライバパターンは主に実装され、非同期(メッセージキューを使用して)方法。

  2. ではオブザーバー/観察可能なパターン、観察者が観察できるのを知っています。一方、パブリッシャー/サブスクライバーでは、パブリッシャーとサブスクライバーはお互いを知る必要はありません。メッセージキューの助けを借りて単に通信します。

正しく説明したように、データバインディングは一般的な用語であり、Observer / ObservableまたはPublisher / Subscriberメソッドのいずれかを使用して実装できます。データはパブリッシャー/サブスクライバーです。


7
私はO'Reilly(shop.oreilly.com/product/0636920018421.do)のJavaScript Webアプリケーションを読んでいました。第2章では、アレックスはJSイベントを使用して実装します。これはコールバックタイプの実装ですが、同期の例です。pub/sub
Jess 14

5
本を読んだことはありませんが、JSの「イベント」を使用して実装された場合、イベントは定義上非同期であるため、非同期になります。
Param 2014

3
こんにちはジェス、もちろんあなたは正しい。これらの用語の標準的な定義はありません😊–
Param

14
通常、オブザーバブルにはオブザーバーのリストがあります(このリストを反復処理して、すべてのオブザーバーにイベントを送信します)。パブリッシャーは通常、イベント/メッセージをパブリッシュするキューのみを認識しています。そのキューにサブスクライブしたコンシューマの数はわかりません。
Param 14

7
私にとって、これは2つの重要な違いです。また、オブザーバーパターンでは、オブザーバーはオブザーバブルを認識しています。一方、Pub / Subでは、パブリッシャーもコンシューマーもお互いを知る必要はありません。メッセージキューの助けを借りて単に通信します。正解です。
maryisdead 2015

23

ここでのすべての回答が、具体的な例を示すことなく、ObserverとPub / Subのパターンの微妙な違いを説明しようとしていたことを少し面白がっています。ほとんどの読者は、一方が同期で他方が非同期であるということを読んで、それぞれを実装する方法をまだ知らないに違いない。

注意すべきことは、これらのパターンの目標はコードを分離しようとすることです

オブザーバーは、オブジェクト(サブジェクトと呼ばれる)がオブジェクト(オブザーバー)に依存するオブジェクトのリストを保持し、状態の変化を自動的に通知する設計パターンです。

オブザーバーパターン

これは、(通常は関数である)observable objectすべてを保持するリストがあることを意味しますobservers。そして、このリストをたどって、楽しいときにこれらの関数を呼び出すことができます。

詳細については、このオブザーバーパターンの例を参照してください。

このパターンは、オブジェクトのデータ変更をリッスンし、それに応じて他のUIビューを更新する場合に適しています。

しかし、短所はObservable であり、オブザーバーを維持するために1つの配列のみを維持します(例では、配列はですobserversList)。

notify functionその配列に格納されているすべての関数をトリガーするが1つしかないため、更新のトリガー方法は区別されません。

異なるイベントに基づいてオブザーバーハンドラーをグループ化する場合。私達はちょうどそれを変更する必要があるobserversListObjectと同様に

var events = {
    "event1": [handler1, handler2],
    "event2": [handler3]
}

詳細については、このpubsubの例をご覧ください。

そして人々はこのバリエーションをと呼びますpub/sub。したがって、events公開したに基づいてさまざまな機能をトリガーできます。


まあこれははるかに良い、簡潔で明確な答えです。:)
CoderX 2017

高レベルでは、私は常にpubサブがオブザーバーパターンであると言いましたが、すべてが異なるフレーバーを持っています。
グリム

9

私は両方のパターンについてのあなたの結論に同意しますが、それでも、私は同じプロセスにいるときにObservableを使用し、プロセス間シナリオではPub / Subを使用します。 。

他のパターンがわからない、またはこのように言うと、このタスクで別のパターンが必要になることはありません。ほとんどのMVCフレームワークとデータバインディングの実装でさえ、通常内部的にオブザーバーの概念を使用しています。

プロセス間通信に興味がある場合は、次のことをお勧めします。

「エンタープライズ統合パターン:設計、構築、および展開メッセージングソリューション」 - http://www.addison-wesley.de/9780321200686.html

この本には、プロセス間通信タスクでも使用できるプロセスまたはクラス間でメッセージを送信する方法に関する多くのアイデアが含まれています(これにより、より疎結合な方法でプログラミングすることができました)。

これが役に立てば幸いです!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.