私は現在、Nutshell bookで Albahari のC# 3.0 を読んでおり、 292 ページには LINQ について次のように書かれています。
LINQ は、供給主導のプッシュモデル ではなく 、需要主導のプルモデルに従います。
上記のステートメントはどういう意味ですか? プルモデルとプッシュ
モデル
の違いは何ですか?
私はクライアントです。何かが必要で、サーバーからプルします。
私はサーバーで、何かを持っていて、それをクライアントにプッシュします。
これは、LINQ クエリがクエリに基づいてデータソースからデータを取得し、実行時にのみ行われることを意味します。サーバーが最後にデータを生成し、クライアントにデータをプッシュするプッシュ モデルとは対照的です。プッシュ モデルは、Blackberry Enterprise Server のようなもので、デバイスが絶えずクエリを実行する代わりに、メールが Blackberry デバイスにプッシュされます。これは、LINQ クエリ以降の変更がデータセットに反映されないことも意味します。
この違いを本当に理解 (そして評価) するには、ステートメントと式の違いを考慮する必要があります。ご存知のように、C# や VB などの命令型プログラミング言語では、伝統的に、ある目的を達成するために一連のステートメントを使用します。このようなスキームでは、データを取得してから、それを他のステートメントにプッシュします。対照的に、関数型プログラミングは式を使用する傾向がありますこれは単なる値です。LINQ の場合、ある時点で値に評価されるクエリ式を宣言しますが、必要になるまでそうしません。これにより、プログラマーは、プログラムがどのように動作するかではなく、プログラムが何を行うかにより集中できます。より広義には、怠惰は関数型プログラミング言語で通常採用される評価戦略を表します。たとえば、次のような宣言があるとします。
let x = 2 * y + 7
怠惰なプログラミング言語は、明示的に必要になるまで式を評価することを気にしませんが、その間はバインディングxで参照するだけです。同様に、LINQ で次のような宣言を行うと、次のようになります。
var collection = from s in S where predicate(s)
式を宣言してコレクションにバインドしましたが、コレクションで何かを行うまで実際には必要ありません。したがって、コード内のどこにでも宣言でき、使用されていないときにメモリを占有することを心配する必要はありません。したがって、コンピューターがどのように動作するかを徹底的に詳細に指定するのではなく、解決しようとしている問題についてもっと考えるようになります。それを解決することについて。
つまり、要約すると、(熱心な) 命令型のプログラミング スタイルでは、データを取得し、それを何らかの関数にプッシュして、そのデータに基づいて動作させます。(怠惰な) 関数型のプログラミングでは、式を宣言し、ある時点でそれが必要なときに評価されます。これは、データベースの場合、クエリ式の値を必要とする関数がそれをプルすることを意味します。それが必要です。ただし、プッシュ/プルは実際には不適切な用語です。
プル モデルでは、処理は結果のコンシューマーによって開始されます (結果は処理パイプラインを介して "プル" されます)。
プッシュ モデルでは、データのプロデューサーによって処理が開始されます (データは処理パイプラインに「プッシュ」されます)。
したがって、処理されるデータは、どちらの場合でも処理されるものであり、データが移動している「方向」(プッシュ/プル) は、処理をトリガーする人に関連しています。