2009-11-06 58 views
10

我在使用winform時正在使用MVP。但是當我開始使用WPF或Silverlight時,我轉向了MVVM。MVP VS MVVM - 爲什麼

我唯一注意到的是,我們不需要在MVVM模式中的View和ViewModel之間同步數據,因爲它具有強大的綁定。

我的問題是〜

1)綁定(幫助我們不要手動同步查看和視圖模型)是使用MVVM唯一的優勢。

2)有沒有其他MVVM優於MVP?有什麼區別?

3)下面的代碼是MVVP模式還是MVVM或兩者兼而有之?

interface IView{ 

    void ShowMessage(string message); 

} 

class View : IView { 
    public void ShowMessage(string message){ 
       MessageBox.Show(this, message); 
    } 
} 

class ViewModel{ 

private IView view; 

public ViewModel(IVew view){ 

    this.view = view; 

} 

........ 

view.ShowMessage("This is a msg"); 

} 

謝謝。

+1

關於SO的相關文章:[http://stackoverflow.com/questions/839118/composite-guidance-for-wpf-mvvm-vs-mvp] – Marc 2009-11-06 07:34:47

+0

這是VM不應該意識到View的角色嗎?關於View的界面? – Mark 2009-11-06 07:49:36

+0

如果我喜歡在保存後將焦點設置到控件上,那麼該怎麼辦?我應該創建一個附加屬性來設置焦點嗎? – Mark 2009-11-06 07:53:10

回答

5

實施例是MVP,通過這條線明確規定:

view.showMessage("This is a msg"); 

雖然從MVP和MVVM產生的代碼可能看起來微不足道在類似的例子,這些模式是顯著不同。如果你懷疑MVVM只是微軟MVP的名字,那不是。

這是微軟的一個不太知名的PM(演示模型)模式的名稱 - 您可能需要閱讀其描述。

+1

是的。感謝您回答問題#3。問題1和問題3呢? 我已閱讀關於演示模型,但我不是很清楚。你能回答我的問題1和2嗎?謝謝。 – Mark 2009-11-06 07:48:00

+0

不,是的。我真的沒有看到在這裏複製粘貼MSDN的點 – ima 2009-11-06 08:41:03

11

我意識到你的問題已在兩年前提出過,但我想在使用MVVM超過一年之後給出我的意見。

-1-我不確定你在問什麼,但我想你問的是:綁定MVVM的唯一好處是什麼?答案是不。分離關注點,綁定和高效測試是MVVM的主要優勢。有許多次要的好處,但我不會進入這些。綁定絕對精彩,因爲所有同步都是自動化的,這意味着您的工作量減少。此外,關注點的分離意味着視圖模型不依賴於視圖的類型,因此您可以使用相同的視圖模型擁有多個視圖。比方說,您創建一個名爲ErrorDataViewModel的視圖模型。這個類的目的是保存將顯示給用戶的ErrorType類的列表。 ErrorType基本顯示錯誤信息。 ErrorDataViewModel也有一個名爲AllErrorsFixed的布爾屬性,讓用戶知道列表中的所有錯誤是否已被修復。 AllErrorsFixed是一個簡單的屬性,它使用linq來查詢ErrorTypes.Fixed屬性的列表。如果All是固定的,則AllErrorsFixed將返回true。

在Application1中,您的客戶希望以簡單的網格狀方式顯示錯誤。您所做的只是將網格綁定到該視圖模型的錯誤列表。在Application2中,客戶希望以更多的導航格式顯示錯誤,他們可以通過表單查看每個錯誤表單。然後,您所做的就是將表單控件綁定到列表中的每個錯誤,並將導航設置爲從一個記錄移動到另一個記錄。但是等等,如果我們想要App1同時使用網格和逐個窗體的導航,我們可以做到這一點。更好的是,現在您希望使用Silverlight實現Web界面來替換Application1/Application2或者作爲另一種產品,您不必更改視圖模型。工作已經完成。

我提到了ErrorsFixed布爾值,好吧,我們忘了在我們的應用程序中實現它。我所要做的就是進入我的視圖,添加一個控件或一個列或一個屬性測試器,並將其綁定到布爾屬性,並完成。

關於測試,測試可以更高效,因爲您可以編寫測試代碼來驗證視圖模型中的更改,而不會浪費時間運行應用程序並打開視圖。這並不能解決所有測試問題,但它消除了許多耗時的步驟。

-2-對MVVM或MVP有沒有什麼好處。是。一個海報錯誤地表示一個視圖可以在MVVM中擁有多個虛擬機。實際上,一個虛擬機可以有多個視圖,因爲它不受視圖限制。或者換句話說,多個視圖可以使用一個VM。因此,在您調用view.ShowMessage()的示例中,MVVM中不會發生這種情況,因爲您無法保證視圖(WPF或Silverlight或測試類)具有ShowMessage方法。相反,你發起了一個事件。事實上,Prism對此非常棒,因爲它具有事件聚合器,所以當您觸發事件時,事件聚合器會處理將事件發送到分配給該事件的視圖。因此,每個應用的視圖都可以處理該事件的合理性。使用MVP,您必須爲每個視圖創建一個Presenter。這非常耗時。

-3-您的示例代碼是MVP。

+1

他可能意味着一個視圖和它的子視圖可以有不同的視圖模型。從技術上講,您可以根據用戶輸入或後端事件交換視圖模型。 – 2013-11-11 23:20:38

2

我之前已經回答了一些類似的問題,但你可能對您有用太:

兩者的主要特點在Android電子環境中使用。

MVP模式:模型,視圖和演示層

  • 於彼;
  • 查看代表用戶對Presenter的輸入;兩層應該有 ,1對1的關係;

  • 查看和模型沒有緊密耦合,用於明確區分
    的問題;

  • 視圖通過數據綁定直接連接到模型;

  • 簡單的單元測試,作爲Presenter第一層的接口,可能會很快模擬出 ;

MVVM模式:

包括三個關鍵部分:

  • 模型(業務規則,數據訪問類),

  • 視圖(用戶界面)

  • ViewModel(作爲視圖之間的代理和模型);
  • 偉大的解決方案來處理與Windows相關的任務 基金會系統(WPF)和Silverlight應用程序框架;
  • 提供更清晰的UI和應用程序邏輯分離;
  • 單元測試更容易,因爲有上查看

功能比較不依賴

讓我們放在一起MVP的要領VS MVVM比較。我們也應該強調,我們不是在倡導一種或一種模式。

代碼度量: MVP可能會產生更多的類和Java代碼。在MVVM中,有更多的Java類,但每類的代碼更少。

可維護性: MVP很容易學習,修改,添加功能。使用MVVM添加新功能可能需要庫的一些經驗。

邏輯:在MVP中,View實際上是您的應用程序,而Presenter處理應用程序流。在MVVM中,代碼類(ViewModel)是應用程序,而View則是允許用戶與應用程序交互的界面。

數據輸入:從MVP開始,而不是主持人。 MVVM中的輸入始於View,而不是ViewModel。

映射和參考: MVP中視圖和演示者之間的一對一映射,它們之間沒有引用。 MVVM中View和ViewModel之間的一對多映射,沒有參考。

最後的話

顯然,架構模式演變。 MVVM傾向於成爲一個非常整潔和令人擔憂的工具。同時,MVP模式已經足夠靈活,已經從各種圖書館中受益。

還有一點很清楚的是,您不必嚴格遵守MVP或MVVM。在大多數情況下,我們無法純粹以單一模式構建應用程序,這很好。主要的事情是將視圖,模型和它們之間的邏輯分開。

何時使用MVP以及何時使用MVVM,您可能會問?建議隱藏在數據綁定中。在無法綁定datacontext的情況下,大多數開發人員更喜歡MVP(Windows Forms就是一個很好的例子)。由於接口較少,維護代碼較少,所以在可能綁定datacontext的情況下,MVVM是首選。

通過的blog

1

兩個MVP和MVVM是MVC的衍生物的材料(見時間表和這些是如何演變)。它們之間的關鍵區別在於每個圖層對其他圖層的依賴關係以及它們彼此間的綁定程度。

MVC:框架庫

客戶端 Backbone.js的,knockback.js,Spine.js,angular.js。

服務器端 ASP.NET MVC,Spring MVC的,的Ruby-on-Rails的

MVP:框架庫

客戶端 Riot.js,GWT

服務器端 ASP.NET ,JSP Servlets

MVVM:Framework Library

客戶端 Knockout.js,劍道(MVVM)

服務器端 WPF(臺式機)或Silverlight,Windows Phone的應用程序(XAML),Adobe Flex的

爲了回答這些具體問題:是的,除了MVVM中的雙向綁定,ViewModel公開了一個Observable,它是綁定雙向數據的MVVM的主要優勢。