web-dev-qa-db-ja.com

オブザーバーパターンとリアクティブプログラミングの違いは何ですか?

最近リアクティブプログラミングという用語をよく耳にしました。しかし、それを検索したところ、発見したのはobserver patternとのいくつかの類似点だけでした。実際、私はそれらの間に違いを見つけることはできません。それらの間の概念的な違いは何ですか?なぜリアクティブプログラミングという用語が話題になったのですか?

48
Eonil

リアクティブプログラミングは、プログラムの実行を通じてデータストリームの変更を簡単に伝播するための一般的なパラダイムです。それ自体は特定のパターンやエンティティではなく、アイデア、またはプログラミングのスタイル(オブジェクト指向プログラミング、関数型プログラミングなど)です。大まかに言えば、xが変更または更新されるときの概念です。 1つの場所、xの値に依存するものは、イベントが発生するのを待つだけで周りに座っているスレッドを拘束する必要なしに、ブロックしない方法で他のさまざまな場所で再計算および更新されます。

伝統的に、xがGUIイベントである上記のパターンは、ほとんどいつも見てきました。ほとんどのGUIライブラリはシングルスレッドなので、応答を待つこの1つのスレッドを拘束することはできません。これがオブザーバーパターンの出番です。「トリガー」を提供する一般的な方法を提供し、そのような変更が行われるたびに情報を更新できるようにします(または、より一般的にはOO "イベント"が発生します。)その意味で、単純なメカニズムを提供して、veryリアクティブプログラミングの基本概念をOO(場合によっては他の)スタイル言語。

リアクティブプログラミングの完全な概念は、従来のオブザーバーパターンをはるかに超えています-単一のイベント(ユーザーのクリックなど)で特定のアクションを起動するだけでなく、そのようなイベントのパブリッシャーを作成してサブスクライブし、実行するアクションを設定できます。そのパブリッシャーで発生するイベントに基づいて、バックプレッシャーを適用してそのパブリッシャーの速度を制御したり、そのストリームのスレッド化を制御したりします。

41
Michael Berry

私は反応型プログラミングの専門家であり、反応型プログラミングの新しいツールを積極的に開発しています。因果関係など( https://github.com/erobwen/causality

簡単に言えば、リアクティブプログラミングは、「コールバック」と「リスナー」でオブザーバーパターンを使用する以上のことです。リアクティブプログラミングでは、プラットフォームがすべてのデータとUIの依存関係を管理する、より高いレベルの自動化があると想定されています。したがって、一般的な経験則として、オブザーバーパターンが使用される場合、それは反応的なシステムではありません。

プログラミングパラダイムが反応的であるかどうかを判断する別の方法は、データ構造とUIコンポーネントを更新するコードを書くか、そもそもUIコンポーネントを作成するだけのように見えるコードを書くかどうかです。したがって:

非リアクティブプログラミング:UIを作成するコード+ UIを更新するコード。

リアクティブプログラミング:UIを作成する1ブロックのコード(更新にも使用されます)

たとえば、UIを更新する非反応的な方法は、ボタンのクリックをリッスンするイベントリスナーを用意し、ユーザーがそのボタンをクリックすると、プロパティを設定するDOM内の適切な場所を見つけることです。 、子を追加するか、何かを実行するためにのクラスを追加します。

同じことを行うには、ボタンの状態をビューモード変数にバインドし、次に変更するプロパティをそのビューモード変数にバインドします。次に、ユーザーがボタンを押すと、システムはDOMの更新方法を自動的に認識します。

リアクティブプログラミングの現代的で人気のある例は、React and Angularです。たとえば、Reactをリアクティブにするのは、すべてのコンポーネントがその「レンダリング」関数をコンポーネントのUIを構築する重要なことは、このレンダリング関数は、コンポーネントが最初にレンダリングされるときだけでなく、データ/ UI状態の変更によってUIが変更されるときにも使用されることです。

2
Robert Renbris