MVVMず他のMV *パタヌンの違い







翻蚳者から 

MVCずその掟生パタヌンに関する倚くの資料を既に公開しおいたすが、誰もが独自の方法でそれらを理解しおいたす。 これに基づいお、意芋の盞違や意芋の盞違が生じたす。 経隓豊富な開発者でさえ、MVP、MVVM、およびプレれンテヌションモデルの違いず、各パタヌンでコンポヌネントが䜕をすべきかに぀いお議論したす。 状況は、倚くの人がMVCのクラシックバヌゞョンでのコントロヌラヌの真の圹割を知らないずいう事実によっお悪化したす。 良いレビュヌ蚘事の翻蚳をあなたの泚意に持っおいきたす 。

Model-View-ViewModelMVVMパタヌンの詳现を詳しく説明する前に、MVVMずモデルずプレれンテヌションを分離する他のデザむンパタヌンMV *パタヌンの類䌌点ず盞違点を説明しおおくず圹立぀ず思いたす。







MV *パタヌンにはかなりの数がありたす。Model-View-Controller、Model-View-Presenter、Presentation Model、Passive View、Supervising Controller、Model-View-ViewModelなどです。







mv_patterns_img







もちろん、図を芋るず、矢印がコンポヌネント間の関係を瀺しおいるこずがわかりたす。 しかし、これが唯䞀の違いですか コントロヌラヌはPresenterたたはPresentationModelず同じですか Model-View-PresenterずModel-View-ViewModelをどのように比范したすか この蚘事では、最も䞀般的なMV *パタヌンの類䌌点ず盞違点に぀いお説明したす。







MV *パタヌンを䜿甚せずにUIを構築する



䞊蚘のパタヌンを䜿甚せずに、どのようにナヌザヌむンタヌフェむスUIを構築したすか 圌らはフォヌムを取り、それにりィゞェットを远加し、コヌドでロゞックを蚘述したす。 Viewのロゞックを蚘述するこのようなコヌドは、画面䞊の芁玠ず盎接やり取りするため、ナヌザヌむンタヌフェむスず密接に接続されおいたす。 これは良いが、簡単なアプロヌチです。 非垞にシンプルなむンタヌフェむスにのみ適甚できたす。 ロゞックがより耇雑になるず、そのようなUIのサポヌトは悪倢に倉わる可胜性がありたす







問題の根本は、この方法でUIを構築するず、「 クラスには倉曎の理由が1぀だけあるはずです」ずいう単䞀の責任原則に違反するこずです。 UIコンポヌネントに衚瀺、ロゞック、およびデヌタのコヌドが含たれおいる堎合、倉曎する理由がいく぀かありたす。 たずえば、デヌタの衚瀺に䜿甚されるナヌザヌ芁玠のタむプを倉曎する堎合、倉曎はロゞックに圱響を䞎えたせん。 ただし、ロゞックはコントロヌルず非垞に密接に関連しおいるため、倉曎する必芁もありたす。 これはいわゆる「コヌド臭 」であり、唯䞀の責任の原則に違反しおいるこずを瀺しおいたす。







したがっお、フォヌムにコントロヌルを衚瀺するためのコヌド、むンタヌフェヌスのロゞックボタンが抌されたずきの動䜜、および画面に衚瀺するためのデヌタが含たれおいる堎合、次の問題が発生したす。









MV *パタヌンの目的



各パタヌンにはかなりの違いがありたすが、それらの目暙は䌌おいたす。UIコヌドViewをロゞックコヌドPresenter、Controller、ViewModelなどおよびデヌタ凊理コヌドModelから分離するこずです。 これにより、それぞれが独立しお開発できたす。 たずえば、ロゞックずデヌタに圱響を䞎えるこずなく、アプリケヌションの倖芳ずスタむルを倉曎できたす。







さらに、ロゞックずデヌタはディスプレむずは別なので、別々にテストできたす。 単玔なアプリケヌションの堎合、これはそれほど重芁ではありたせん。 たずえば、アプリケヌションが単玔なデヌタ゚ディタヌである堎合。 ただし、より耇雑なむンタヌフェむスロゞックがある堎合、正しく動䜜するこずを自動的に確認する機胜は非垞に䟡倀がありたす。







モデルビュヌコントロヌラヌ



ビュヌをロゞックずモデルから分離する最初のパタヌンの1぀は、 Model-View-Controller MVCです。 この抂念はTrygve Reenskaugomによっお説明されたした 。







1979幎に 私は生たれもしたせんでした。

このパタヌンは、Smalltalkでアプリケヌションを䜜成するために開発されたした。 しかし、圓時は、プログラミングは今日のようではありたせんでした。 窓はありたせんでした。 グラフィカルナヌザヌむンタヌフェむスはありたせんでした。 りィゞェットラむブラリはありたせんでした。 ナヌザヌむンタヌフェむスが必芁な堎合は、自分で䜜成する必芁がありたす。 たたは、キヌボヌドなどの入力デバむスずやり取りする堎合。







しかし、Trygveが行ったこずは非垞に革新的でした。 党員が衚瀺コヌド、ロゞック、およびデヌタを混圚させた堎合、圌はパタヌンを適甚しお、これらの責任を別々のクラス間で共有したした。







MVCパタヌンの問題は、おそらく䞖界で最も誀解されおいるパタヌンの1぀であるこずです。 そしお、これは名前のおかげだず思いたす。 Trygveは最初にModel-View-Editorパタヌンを呌び出したしたが、埌にModel-View-Controllerに萜ち着きたした。 モデルデヌタずビュヌ画面に衚瀺されるものが明確です。 しかし、コントロヌラヌずは䜕ですか アプリケヌションコントロヌラヌはMVCパタヌンず同じですか  いいえ、しかし、混乱の原因はわかりたす 。







mvc_img







これらのモデル、ビュヌ、コントロヌラヌは䜕ですか









翻蚳者からのメモ

Controllerは、Viewではなく入力むベントを盎接受信するこずに泚意しおください。 コントロヌラヌはキヌボヌドたたはマりスからのナヌザヌ入力を解釈し、モデルたたはビュヌにコマンドを送信しお適切な倉曎を加えたす。

コントロヌラヌが「クリヌンな」MVC実装でどのように芋えるかを瀺す簡単な䟋を䜜成したした。 通垞のasp.netasp.net MVCではないに実装したしたが、ナヌザヌコントロヌルは䜿甚したせん。 したがっお、これはより䌝統的なASPスタむルです。  はい、これはあたり良い䟋ではありたせんが、コントロヌラヌの本圓の圹割を理解するための出発点になるこずを願っおいたす 。







public class Controller { private readonly IView _view; public Controller(IView view) { _view = view; HttpRequest request = HttpContext.Current.Request; if (request.Form["ShowPerson"] == "1") { if (string.IsNullOrEmpty(request.Form["Id"])) { ShowError("The ID was missing"); return; } ShowPerson(Convert.ToInt32(request.Form["Id"])); } } private void ShowError(string s) { _view.ShowError(s); } private void ShowPerson(int Id) { var model = new Repository().GetModel(Id); _view.ShowPerson(model); } }
      
      





長幎埌、プログラミングのパラダむムは少し倉わりたした-ナヌザヌコントロヌル りィゞェット がありたす。 りィゞェットは、自身をレンダリングし、ナヌザヌ入力を解釈したす。 ボタンは、クリックしたずきに䜕をすべきかを知っおいたす。 入力フィヌルドは、テキストを入力した堎合の凊理​​を認識しおいたす。 これにより、コントロヌラヌの必芁性が枛り、MVCパタヌンの関連性が䜎くなりたした。 ただし、アプリケヌションロゞックをプレれンテヌションずデヌタから分離する必芁があるため、Model-View-PresenterMVPず呌ばれる別のパタヌンが人気を集めおいたす。







MVCパタヌンのほずんどの䟋は、テキストボックス実装やボタン実装などの非垞に小さなコンポヌネントに焊点を圓おおいたす。 最新のナヌザヌむンタヌフェむステクノロゞVisual Basic 3はSmalltalk 1979ず比范しお最新ですを䜿甚する堎合、通垞、このパタヌンは必芁ありたせん。 ただし、非垞に䜎レベルのAPIDirect Xなどを䜿甚しおりィゞェットを蚭蚈しおいる堎合に圹立ちたす。







過去数幎にわたっお、MVCパタヌンは再び重芁になりたしたが、 ASP.NET MVCの出珟に関連しお、別の理由で。 ASP.NET MVCフレヌムワヌクは、ASP.NETずは異なり、りィゞェットの抂念を䜿甚したせん。 ASP.NETでは、MVCビュヌはHTMLをレンダリングするASPXコントロヌルです。 たた、コントロヌラヌはHTTP芁求を受け入れるため、ナヌザヌアクションを再床凊理したす。 httpリク゚ストに基づいお、䜕をするかを決定したすモデルを曎新するか、特定のビュヌを衚瀺したす。







モデルビュヌプレれンタヌ



ビゞュアルプログラミング環境の開発ず、ナヌザヌ入力の描画ず凊理をカプセル化するりィゞェットの導入により、個別のコントロヌラヌクラスを䜜成する必芁がなくなりたした。 しかし、開発者はロゞックをプレれンテヌションから分離する必芁がありたすが、それは今やより高い抜象化レベルでのみです。 耇数のナヌザヌ芁玠からフォヌムを䜜成するず、むンタヌフェむスずデヌタロゞックも含たれるこずが刀明したためです。 MVPパタヌンは、UIをむンタヌフェヌスロゞックりィゞェットず察話するずきに起こるこずずデヌタ画面に衚瀺するデヌタから分離する方法を説明したす。







mvp_img









プレれンタヌがプレれンテヌションず盎接通信しないこずは重芁なこずです。 代わりに、むンタヌフェむスを介しお通信したす。 これにより、プレれンタヌずモデルを個別にテストできたす。







このパタヌンには、パッシブビュヌず監芖コントロヌラヌの2぀のバリ゚ヌションがありたす。







パッシブビュヌ



このバリアントでは、MVPビュヌはモデルに぀いお䜕も認識したせんが、代わりに画面に衚瀺する必芁があるすべおの情報の単玔なプロパティを提䟛したす。 プレれンタヌはモデルから情報を読み取り、ビュヌのプロパティを曎新したす。







これはPassiveViewの䟋です。







  public PersonalDataView : UserControl, IPersonalDataView { TextBox _firstNameTextBox; public string FirstName { get { return _firstNameTextBox.Value; } set { _firstNameTextBox.Value = value; } } }
      
      





ご芧のずおり、ビュヌずプレれンタヌの䞡方で非垞に倚くのコヌドを蚘述する必芁がありたす。 ただし、これにより、それらの間の盞互䜜甚がよりテスト可胜になりたす。







スヌパヌバむザヌコントロヌラヌ



この実斜圢態では、はモデルを認識しおおり 、デヌタをマッピングに関連付ける圹割を果たす。 これにより、プレれンタヌずViewの間の通信がより簡朔になりたすが、View-Presenter察話のテスト容易性が損なわれたす。 個人的には、このパタヌンに「Controller」ずいう名前が含たれおいるずいう事実は嫌いです。 コントロヌラヌはMVCず同じではなく、アプリケヌションコントロヌラヌずも同じではないためです。







これは、監督コントロヌラヌパタヌンの衚珟の䟋です。







  public class PersonalDataView : UserControl, IPersonalDataView { protected TextBox _firstNameTextBox; public void SetPersonalData(PersonalData data) { _firstNameTextBox.Value = data.FirstName; } public void UpdatePersonalData(PersonalData data) { data.FirstName = _firstNameTextBox.Value; } }
      
      





ご芧のずおり、このむンタヌフェヌスはあたり詳现ではなく、Viewにより倚くの責任を負っおいたす。







プレれンテヌションモデル



Martin Fowlerは、Webサむトで、 プレれンテヌションモデルず呌ばれる責任の分離を達成するための別のアプロヌチに぀いお説明しおいたす。 PresentationModelは、芖芚芁玠に䟝存しない、ナヌザヌむンタヌフェむスの論理的なプレれンテヌションです 。







presentation_model_img







PresentationModelにはいく぀かの責任がありたす。







  1. ナヌザヌむンタヌフェむスロゞックが含たれたす。

    プレれンタヌず同様に、PresentationModelにはナヌザヌむンタヌフェむスロゞックが含たれおいたす。 ボタンをクリックするず、このむベントはPresentationModelにルヌティングされ、PresentationModelはそれをどう凊理するかを決定したす。







  2. 画面に衚瀺するためのモデルからのデヌタを提䟛したす

    PresentationModelは、モデルからのデヌタを倉換しお、画面に簡単に衚瀺できるようにしたす。 倚くの堎合、モデルに含たれる情報を画面で盎接䜿甚するこずはできたせん。 最初にデヌタの倉換、補足、たたはいく぀かの゜ヌスからの収集が必芁になる堎合がありたす。 これは、モデルを完党に制埡できない堎合に最もよく起こりたす。 たずえば、サヌドパヌティのWebサヌビスたたは既存のアプリケヌションのデヌタベヌスからデヌタを受け取った堎合。







  3. UIの状態を保存したす

    倚くの堎合、ナヌザヌむンタヌフェむスには、モデルずは関係のない远加情報を保存する必芁がありたす。 たずえば、画面で珟圚遞択されおいるアむテムはどれですか どの怜蚌゚ラヌが発生したしたか PresentationModelは、この情報をプロパティに保存できたす。


Viewは、PresentationModelからデヌタを簡単に取埗し、画面に衚瀺するために必芁なすべおの情報を取埗できたす。 このアプロヌチの利点の1぀は、芖芚芁玠のテストに䟝存するこずなく、UIの論理的で完党にテスト可胜な衚珟を䜜成できるこずです。







プレれンテヌションモデルは、ViewがモデルPresentationModelからのデヌタをどのように䜿甚するかを説明したせん。







Model-View-ViewModel



最埌に、MVVMたたは単にViewModelパタヌンずも呌ばれるModel-View-ViewModelパタヌン。 これは、プレれンテヌションモデルパタヌンに非垞に䌌おいたす。







mvvm_img







実際、おそらく唯䞀の違いは、WPFずSilverlightのデヌタバむンディング機胜の明瀺的な䜿甚です。 驚くこずではないが、 ゞョン・ゎスマンは圌のブログでこのパタヌンに蚀及した最初の人の䞀人だったからだ。







ViewModelはViewず盎接通信できたせん。 代わりに、 コマンドの圢匏で簡単にバむンドできるプロパティずメ゜ッドを提䟛したす 。 Viewはこれらのプロパティにバむンドしお、ViewModelから情報を取埗し、その䞊でコマンドメ゜ッドを呌び出すこずができたす。 これには、ViewがViewModelに぀いお知る必芁はありたせん。 XAML Databindingは、リフレクションを䜿甚しおViewずViewModelをバむンドしたす。 したがっお、ビュヌに任意のViewModelを䜿甚しお、目的のプロパティを提䟛できたす。







このパタヌンがSilverlightたたはWPFに適甚されるずき、私が本圓に気に入っおいるものは次のずおりです。









おわりに



最も䞀般的なMV *パタヌンのこの説明が、それらの違いを理解するのに圹立぀こずを願っおいたす。







翻蚳者コメント



著者ず同様に、この説明がMV *パタヌンの類䌌点ず盞違点の理解に圹立぀こずを願っおいたす。 それらを理解するず、アプリケヌションにどのパタヌンを適甚するかを簡単に決定できるようになりたす。



この蚘事から匕き出せる䞻な結論

  • すべおのパタヌンのモデルは同じように芋え、同じ目暙を持っおいたす-デヌタの取埗、凊理、および保存。
  • 埓来のMVCでは、ナヌザヌ入力はViewではなくControllerによっお凊理されたす。
  • 最新のオペレヌティングシステムずりィゞェットラむブラリはナヌザヌ入力凊理を凊理するため、MVCパタヌンのコントロヌラヌは䞍芁になりたす。
  • MV *パタヌンの目暙は、UIマッピング、むンタヌフェヌスロゞック、およびデヌタそれらを受信および凊理を互いに分離するこずです。
  • アプリケヌションでMV *パタヌンを䜿甚するず、サポヌトずテストを簡玠化し、デヌタを芖芚化された方法から分離できたす。
  • MVPはかなり普遍的なパタヌンであり、倚くの堎合に適しおいたすこれは私の個人的な意芋です。 䜿甚するオプションは、パッシブビュヌたたは監芖コントロヌラヌです。 必芁なもの、぀たりコヌドの制埡性ずテスト容易性、たたは簡朔さず簡朔さによっお導かれたす。 タスク間を移動し、1぀たたは別のアプロヌチを適甚したす。
  • システムに自動デヌタバむンディングデヌタバむンディングが適切に実装されおいる堎合、MVVMが遞択されたす。
  • プレれンテヌションモデルはMVVMの優れた代替手段であり、自動リンクがない堎合に圹立ちたす。 ただし、自分でバむンディングコヌドを蚘述する必芁がありたすこれは単玔ですが、日垞的なコヌドです。 これを゚レガントに実装する方法に぀いおのアむデアがありたすが、これに぀いおは次の蚘事で説明したす。




PS翻蚳の準備に協力しおくれた同僚のJeevuzにも感謝したす 。



All Articles