38

ViewModel は、MVVM (Model-View-ViewModel) と ASP.NET MVC の推奨実装の両方で使用される用語です。「ViewModel」の調査は、各パターンが同じ用語を使用しているため、混乱を招く可能性があります。

MVC ViewModel と MVVM ViewModel の主な違いは何ですか? たとえば、コントローラーがないことを考えると、MVVM ViewModel はよりリッチだと思います。これは本当ですか?

4

3 に答える 3

50

簡潔に答えるにはかなり難しい質問ですが、試してみます。(これらの種類の質問に対する答えは、開発者の間でまだ議論の対象になっていることに注意してください。)

MVC では、ViewModel は View をレンダリングするために必要なすべての情報を提供します。そこに含まれるデータは、モデルで定義されたデータを使用して作成されます。View は ViewModel を読み取り、出力をレンダリングします。ビューからの入力はコントローラーに渡されます。コントローラーはモデルを操作し、適切なビューモデルを構築し、これをビューに渡してレンダリングします。

MVVM では、ViewModel は MVC と同じ機能を果たしますが、ビューがモデルを操作できるようにするコマンドを提供することで、MVC コントローラーの一部を置き換えます。WPF データ バインディングは、ViewModel の変更に従ってビューの更新を管理します (これにより、MVC コントローラーの残りの機能が効果的に置き換えられます)。

于 2009-12-21T11:35:13.373 に答える
8

UIデザインパターンビンゴをプレイしてからしばらく経ちましたが、これを試してみましょう。

MVVMは、MSが考案したものです...WPFを最大限に活用するのに役立ちます。ビューの状態と動作を簡単にテスト可能なクラス(プレゼンテーションモデル)に結合し、データバインディングを使用してデータを任意のビューに取り込みます。

このリンクには、MVVMの進化についての簡単な説明があります。これをFowlerの「 GUIアーキテクチャ」シリーズと組み合わせると、あなたは道を進んでいるはずです。

更新: MVC-VMと呼ばれるものがあることを知りませんでした。どうやらASP.NETMVC群衆の発案によるものです。MVVMに似た外観とサウンド(ASP.NET MVC用に調整されていることを除く)。唯一の違いは、VMとViewの間に1:1のマッピングがあるという制限があることです。私は1:Nを推測したと思いますが、他のすべては一致します。

于 2009-12-21T10:55:45.767 に答える
5

これは(かなり)古い質問であることは知っていますが、MVCのコンテキストで「ビューモデル」を使用する例として指摘されています。これは正しくなく、どちらかまたは両方のパターンに慣れていない人は混乱を招く可能性があると私は主張します。誰がそれをやっている - stahp。理由は次のとおりです (元の質問に対する遠回りの回答でもあります)。

これがいつ発生するかの例は、この質問で見ることができます。ユーザーは、ASP.NET MVC アプリケーションで INotifyPropertyChanged を実装するビュー モデルを使用しようとしています。そのため、デスクトップとステートレス Web アプリケーションの設計を組み合わせて、アーキテクチャ上の失敗と失恋を引き起こしています。

簡単に言えば、MVC パターンには「ビュー モデル」がありません。ただし、機能的に同等なものがあり、それがコントローラーです部品とその目的について明確にするために、

MVVM (デスクトップ アプリケーション):

  • モデル- ビューとビュー モデルの間で渡されるデータを保持する、厳密に型指定されたオブジェクト
  • ビュー- ユーザーが表示し、ユーザーがシステムと対話するための UI
  • モデルの表示- ユーザー アクションを解釈し (ICommand などを介して)、それらを実行し、アプリケーションの状態を更新します。

MVC (Web アプリケーション):

  • モデル- ビューとビュー モデルの間で渡されるデータを保持する厳密に型指定された* オブジェクト
  • ビュー- モデル、コード、および HTML を組み合わせて Web ページをレンダリングする UI ジェネレーター
  • コントローラー- ユーザーの要求を受け入れて解釈し、アプリケーションの状態を更新し、View を使用してこの状態を HTML Web ページに変換します

モデルは両方のパターンで実質的に同じです。デスクトップ モデルは更新イベント通知を実装する場合があり、Web モデルは動的 (つまり、厳密に型指定されていない) である場合があり、両方に検証メソッドまたはメタデータが含まれる場合と含まれない場合があります。

デスクトップのビューは、ユーザーが見るものです。Webではブラウザがクライアント側に表示するHTMLを出力するジェネレータです。デスクトップでのユーザーの操作を解釈する必要がありますが、Web ではクライアント側の JavaScript、ブラウザー、およびサーバーに送り返される要求によって処理されます。

ビュー モデル/コントローラーは機能的にはほぼ同じですが、実装方法と動作方法が大きく異なります。 View Modelでは、ユーザーによるアプリケーションとの対話は、ICommands、ルーティング イベント、およびその他のメソッドを介して View Models に転送されます (多くの MVVM フレームワークは、View Models を UI およびアプリケーションの他の部分にフックするさまざまな方法を提供します)。 コントローラーで、コントローラーがユーザーに結果を返すために必要なすべての情報を含むリクエストが送信されます (200 OK リクエストであると仮定します)。コントローラーは、HTML ジェネレーター (ビュー) が応答を作成するために必要な状態 (別名モデル) を作成するために必要なすべての作業を実行する必要があります。設計上、コントローラーはビューとモデルの上にあり、両方を認識して制御しますが、ビューモデルはビューの隣にあり、それらの間でモデル (およびその他の情報) を渡します。

一部の人々を本当に混乱させているように見えるのは、MVC アプリケーションに混在できるクライアント側の MVVM フレームワークがあることです。これらは、ユーザーのブラウザーの JavaScript にのみ存在し、サーバー側でフォローしている特定のパターンとは何の関係もありません。クライアント側で MVVM を使用する従来の ASP Web サイトを実行できます。なんと、クライアント側で MVVM を使用する静的な HTML ページを実行できます。それらはそれほど分離しています。

これらの JavaScript MVVM フレームワークは、通常、上記のデスクトップ MVVM パターンと同様のパターンに従いますが、HTML DOM と JavaScript の性質に合わせて動作するように調整されています。たとえば、DOM に組み込まれた大規模なバインディング システムはなく、javascript の型システムは非常に限られているため、テンプレートとモデルの対応付けは WPF とは大きく異なります。また、通常はサーバーから切断されて動作し、対話する必要がある場合は、ページをコントローラーに POST するよりも AJAX 呼び出しを優先します (AJAX 呼び出しは通常、ASP.NET MVC の WebAPI コントローラーによって処理されます)。

要約すると、MVC には実際にはビュー モデルはありません。コントローラーは大まかに同等ですが、ユーザー入力を受け取り、解釈し、ユーザーに結果を返す方法が大きく異なります。「ビュー モデル」という用語を使用して MVC の何かを参照することは、混乱を招くだけなので、避ける必要があります。パターンの適切な部分には適切な用語を使用してください。衒学的に見えるかもしれませんが、物事を明確に保ち、​​両方のパターンに慣れていない人を混乱させないようにするのに役立つはずです.

于 2014-12-09T13:43:46.823 に答える