標準の「モデル ビュー コントローラー」パターンと Microsoft のモデル/ビュー/ビューモデル パターンには違いがありますか?
ベストアンサー1
MVC/MVVM はどちらか一方を選択するものではありません。
これら 2 つのパターンは、ASP.Net と Silverlight/WPF 開発の両方で、異なる方法で出現します。
ASP.Net では、ビュー内で双方向にデータをバインドするために MVVM が使用されます。これは通常、クライアント側の実装です (例: Knockout.js を使用)。一方、MVC はサーバー側で懸念事項を分離する方法です。
Silverlight と WPF の場合、MVVM パターンはより包括的であり、MVC (またはソフトウェアを別々の役割に編成するその他のパターン) の代わりとして機能するように見えViewModel
ます。このパターンから頻繁に生じる 1 つの仮定は、コントローラーを に単純に置き換えた(頭字語でをMVC
置き換えればすべてが許されるかのように) というものでした...VM
C
ViewModel は必ずしも個別のコントローラーの必要性を置き換えるものではありません。
問題は、独立してテスト可能* であり、特に必要なときに再利用可能であるために、ビュー モデルはどのビューがそれを表示するのかを把握していないだけでなく、さらに重要なことに、そのデータがどこから来ているのかも把握していないことです。
*注: 実際には、コントローラーは ViewModel からユニット テストを必要とするロジックのほとんどを削除します。すると、VM はテストがほとんど (またはまったく) 必要ないダム コンテナーになります。VM はデザイナーとコーダーの間の単なる橋渡しであり、シンプルに保つ必要があるため、これは良いことです。
MVVM の場合でも、コントローラーには通常、すべての処理ロジックが含まれ、どのビュー モデルを使用してどのビューにどのデータを表示するかを決定します。
これまで見てきたように、ViewModel パターンの主な利点は、XAML コード ビハインドからコードを削除して、XAML 編集をより独立したタスクにすることです。アプリケーションの全体的なロジックを制御するために、必要に応じてコントローラーを作成します (しゃれではありません)。
私たちが従う基本的な MVCVM ガイドラインは次のとおりです。
- ビューには特定の形式のデータが表示されます。データがどこから来ているのかはわかりません。
- ViewModel は特定の形式のデータとコマンドを保持しますが、データまたはコードがどこから来るのか、どのように表示されるのかは認識しません。
- モデルは実際のデータ(さまざまなコンテキスト、ストア、またはその他の方法)を保持します
- コントローラーはイベントをリッスンし、公開します。コントローラーは、表示されるデータとその場所を制御するロジックを提供します。コントローラーは、ViewModel が実際に再利用できるように、ViewModel にコマンド コードを提供します。
また、彫刻コード生成フレームワークMVVM と Prism に似たパターンを実装し、さらにコントローラーを広範に使用してすべてのユースケース ロジックを分離します。
コントローラーがビューモデルによって廃止されると想定しないでください。
私はこのトピックに関するブログを始めました。できるときに追加していきます(ホスティングが失われたため、アーカイブのみ)ほとんどのナビゲーション システムはビューと VM のみを使用するため、MVCVM を一般的なナビゲーション システムと組み合わせる場合には問題がありますが、これについては後の記事で説明します。
MVCVM モデルを使用するもう 1 つの利点は、アプリケーションの存続期間中はコントローラ オブジェクトのみがメモリ内に存在する必要があり、コントローラには主にコードとわずかな状態データ (つまり、わずかなメモリ オーバーヘッド) が含まれることです。これにより、ビュー モデルを保持する必要があるソリューションよりもメモリを大量に消費するアプリが大幅に少なくなり、特定の種類のモバイル開発 (Silverlight/Prism/MEF を使用する Windows Mobile など) に最適です。もちろん、応答性のためにキャッシュされた VM を時々保持する必要があるため、これはアプリケーションの種類によって異なります。
注: この投稿は何度も編集されており、特に質問の対象となるものではなかったため、最初の部分を更新してその部分もカバーするようにしました。以下のコメントでの議論の多くは、ASP.Net にのみ関連しており、より広い範囲には関係していません。この投稿は、Silverlight、WPF、ASP.Net での MVVM のより広い使用法をカバーし、コントローラーを ViewModel に置き換えることを思いとどまらせることを目的としています。