プレゼンター、プレゼンテーション モデル、ビューモデル、コントローラーの違いは何ですか?
-
14-10-2019 - |
質問
これらの各パターンがどのように機能するかについてはかなりよく理解していますし、それらの間のいくつかの小さな違いについても知っていますが、実際にはそれぞれがそれほど異なるものなのでしょうか?
Presenter、Presentation Model、ViewModel、Controller は本質的に同じ概念であるように思えます。
なぜこれらすべての概念をコントローラーとして分類できなかったのでしょうか?そうすることでアイデア全体が大幅に簡素化されるのではないかと思います。
両者の違いを明確に説明できる人はいますか?
パターンがどのように機能するかを理解しており、パターンのほとんどを何らかのテクノロジーで実装していることを明確にしたいと思います。私が本当に探しているのは、これらのパターンの 1 つに関する誰かの経験と、たとえば ViewModel をコントローラーとみなさない理由です。
これについては評判のポイントをいくつか挙げますが、本当に良い答えを探しています。
解決
すでに述べた素晴らしい読み物(Fowler&Miller)に加えて、コントローラー/プレゼンター/ ... 開発者の観点から:
MVCのコントローラー:
コントローラーは、ユーザーインタラクションの結果として呼び出される実際のコンポーネントです。 (開発者は、コントラをコントローラーに委任するためにコードを書く必要はありません。)
コントローラーは、ビュー/コンテキスト/バッグ/何でも何らかの形で現在の値を取得しますが、あなたはそれを実際に言うことはありません 相互作用します ビューで。
- コントローラーは、ユーザーに戻る見解を最終的に決定します。その中で、コントローラーはアプリケーションナビゲーションワークフローの明示的な概念も示しています。
MVPのプレゼンター:
プレゼンターには、ユーザーインタラクション時に制御を受信する実際のコンポーネントであるビューで呼ばれる方法があります。 (開発者は、プレゼンターに電話するためにビューにコードを書く必要があります。)
プレゼンターは、何らかの形で現在の値をビューから取得するか、電話をかけてビューからそれらを受け取ります。プレゼンターは、状態を設定するためにビューでメソッドを呼び出します(それを入力します ジョシュ・スミスは言います)。プレゼンターが呼び出すビューメソッド そうかもしれない 体内でいくつかの小さな設定を実行します。
プレゼンターは、アプリケーションワークフローの概念を明示的に示していません。通常、呼び出しビューにコントロールを返すと考えられています。
PMのプレゼンテーションモデル:
PresentationModelには、ユーザーインタラクション時に制御を受信する実際のコンポーネントであるビューで呼ばれるメソッドがあります。 (開発者は、プレゼンテーションモデルを呼び出すために、ビューにいくつかのコードを書く必要があります。)
プレゼンテーションモデルにはさらに多くのものがあります おしゃべり プレゼンターと比較したビューとのコミュニケーション。また、ビューに適用するすべての設定の値を把握し、実際にビューに設定するために、より多くのロジックが含まれています。 (これらのビューメソッドには、ほとんど論理がありません。)
PresentationModelは、アプリケーションワークフローの概念を明示的に示していません。通常、呼び出しビューにコントロールを返すと考えられています。
MVVMのViewModel:
ViewModelには、ビューによって呼び出されたメソッド(&プロパティセット)があります。これは、ユーザーインタラクション時に制御を受信する実際のコンポーネントです。 (開発者は、ViewModelを呼び出すために、ビューにいくつかの(宣言的)コードを記述する必要があります。)
ViewModelは、PresentionModelと比較して、ビューとの明示的にチャット的なコミュニケーションを持っていません(つまり、ビューをあまり呼び出しません、フレームワークはそれを行います)。ただし、ビュー設定を1対1にマッピングする多くのプロパティがあります。これらすべての設定の値を把握するために、同じロジックが含まれています。
ViewModelは、アプリケーションワークフローの概念を明示的に示していません。通常、呼び出しビューにコントロールを返すと考えられています。
どういうわけかジョシュ・スミスが言うことをコピーする(http://msdn.microsoft.com/en-us/magazine/dd419663.aspx):MVVMパターンは、より少ないコードを書くためにフレームワーク(WPF/SLなど)を利用するPMの特別なケースです。
他のヒント
Martin Fowler には UI デザイン パターンに関するページがあり、そこで MVC、MVP、その他のパターンを定義し、説明しています。
http://martinfowler.com/eaaDev/uiArchs.html
あ コントローラ UI の制御にアクティブです。たとえば、UI によってトリガーされたあらゆるイベントを処理し、適切に処理します。
あ プレゼンター 一方、より受動的で、UI を通じてデータを表示するだけで、独自のイベントなどを処理したり、プレゼンターを通じてサービスやコマンドにイベントを委任したりします。
あ ビューモデル は、WPF/Silverlight バインディングで使用するために設計された Presenter の具体的な例です。
あ プレゼンテーションモデル はビューによって直接表示できるモデルであるため、たとえば、モデルがデータ バインディング用に INotifyPropertyChanged を実装している場合、それらはプレゼンテーション モデルになります。
少なくとも.NETでは、MVPは設計パターンとして使用されます。これは通常、Windowsフォームアプリケーション、またはクラシックASP.NETで使用されます。 MVCおよびMVVCでは、通常、ASP MVCで使用されます。これは、通常のASP.NETとはかなり異なるアーキテクチャを使用します。
私の意見では、MVP、MVVC、MVC、およびプレゼンテーションモデルの間に実際の概念的な違いはありません。いくつかの詳細な違いがありますが、最終的には、すべてモデルビューコントローラーのセットアップと考えられ続けることができます。余分な命名は混乱を引き起こすだけであり、コントローラーを説明する際に一定量の緯度を可能にする用語を採用する方が良いと思います。
MVPとMVVMの間だけの重要な区別の1つは、ビューが中間層の更新に積極的な役割を持たない方法であり、ビューは動作ではなく表示のための「愚かな」アクターです。プレゼンターは、「複雑」のビューに推奨されます。
- アクティビティ(「ナビゲーション」)を変更してクリックを処理すると、プレゼンターが簡単になります
- データレイヤーアップデート(Asynch)に従ってビューの変更を変更することは、ViewModelで最適に実装されます
参照:
https://developer.android.com/topic/libraries/architecture/lifecycle#lc-bp
https://android.jlelse.eu/why-to-choose-mvvm-over-mvp-android-architecture-33c0f2de5516