1. ホーム
  2. model-view-controller

[解決済み] MVCとMVVMの違いは何ですか?[クローズド]

2022-03-17 14:25:44

質問

標準の "Model View Controller" パターンと Microsoft の Model/View/ViewModel パターンの間に違いはありますか?

どのように解決するのですか?

MVC/MVVMは どちらか一方 を選択します。

この2つのパターンは、ASP.NetとSilverlight/WPFの両方の開発で、異なる方法で登場します。

ASP.Netの場合、MVVMは次のような用途に使われます。 双方向バインド ビュー内のデータ。これは通常、クライアントサイドの実装です(例:Knockout.jsを使用)。一方、MVCは、懸念事項を分離する方法です。 サーバーサイドで .

SilverlightやWPFの場合、MVVMパターンはより包括的で、以下のようなことが可能です。 現れる は、MVC(またはソフトウェアを個別の責任に組織化する他のパターン)の代わりとして機能します。このパターンからよく出てくる前提の1つが ViewModel のコントローラを単純に置き換えたものです。 MVC (を代用すればいいかのように)。 VM に対して C の頭文字を取れば、すべてが許される)...。

ViewModelが行うのは ない は、必ずしも個別のコントローラの必要性を置き換えるものではありません。

問題は、独立してテスト可能*であり、特に必要なときに再利用可能であるために、ビューモデルはどのビューがそれを表示しているのか分からないこと、そしてより重要なのは、そのビューがどのように表示されているのか分からないことです。 データがどこから来ているのかわからない .

*注:実際には、コントローラは、ユニットテストを必要とするロジックのほとんどを、ViewModelから取り除きます。そして、VM は、ほとんどテストを必要としない、ダムコンテナになります。これは、VMがデザイナーとコーダーの間の橋渡しであり、シンプルであるべきであるため、良いことなのです。

MVVMの場合でも、一般的にコントローラはすべての処理ロジックを含み、どのビューモデルを使用してどのビューにどのデータを表示するかを決定します。

これまで見てきたように、ViewModel パターンの主な利点は XAML のコードビハインドからコードを削除することです。 XAML編集をより独立したタスクにするために . それでも、必要に応じてコントローラーを作成し、アプリケーションの全体的なロジックを制御します(シャレではありません)。

私たちが守っているMVCVMの基本的なガイドラインは、以下の通りです。

  • 表示 ある形のデータを表示する . データがどこから来るのか、まったくわからないのです。
  • ビューモデル ある形のデータやコマンドを保持する しかし、データまたはコードがどこから来るのか、どのように表示されるのかは知らない。
  • モデル 実際のデータを保持する (様々なコンテキスト、ストア、その他のメソッド)
  • コントローラは、イベントをリッスンし、パブリッシュする。コントローラは、どのデータがどこで見られるかを制御するロジックを提供します。コントローラは ViewModel にコマンドコードを提供し、ViewModel が実際に再利用可能になるようにします。

また、我々は Sculpture コードジェネレーションフレームワーク MVVMとPrismに似たパターンを実装し、さらにコントローラを多用してすべてのユースケースロジックを分離しています。

コントローラがビューモデルに取って代わられるとは思わないでください。

このトピックについてブログを始めましたので、随時追加していきます。 . ほとんどのナビゲーションシステムはViewsとVMを使用するだけなので、MVCVMを一般的なナビゲーションシステムと組み合わせることには問題がありますが、それについては後日説明します。

MVCVMモデルを使用するもう一つの利点は、以下の通りです。 アプリケーションの実行中、コントローラオブジェクトだけがメモリ上に存在する必要があります。 また、コントローラには主にコードとわずかなステートデータが含まれます(つまり、メモリのオーバーヘッドはごくわずかです)。これは、ビューモデルを保持しなければならないソリューションよりも、はるかにメモリ負荷の低いアプリになり、ある種のモバイル開発(Silverlight/Prism/MEFを使用したWindows Mobileなど)には理想的な方法です。もちろん、アプリケーションの種類にもよりますが、レスポンスのためにキャッシュされたVMを保持する必要がある場合もあります。

注:この投稿は何度も編集され、特に質問された狭い範囲を対象としていなかったので、最初の部分を更新し、現在その部分もカバーしています。以下のコメントでは、多くの議論がASP.Netにのみ関係し、より広い視野に立ったものではありません。この投稿は、Silverlight、WPF、ASP.NetにおけるMVVMの幅広い使い方をカバーし、コントローラをViewModelsに置き換えることを阻止しようとするものでした。