Dot-Net

始終在 WPF 應用程序中使用 MVVM,還是替代模式仍然實用/有用?

  • March 2, 2011

在Microsoft .NET Architecting Applications for the Enterprise一書的第 374 頁上,有一張關於表示層模式的演變及其對平台的影響的圖表(圖 7-14)。

除了顯示從原始 MVC 模式到更現代的變體的演變之外,該圖表還顯示以下現代模式可以應用於以下技術:

  1. 模型 2 (MVC)
  • 僅限網路
  1. 被動視圖(MVP)
  • 網路
  • WinForms
  • WPF
  1. 監督控制器(MVP)
  • 網路
  • WinForms
  • WPF
  1. MVVM(展示模型)
  • 僅 WPF

**注意:**最近不在該圖表中的另一種最近感興趣的模式是Presenter First (MVP),它被設想為更適應 TDD。


據我了解,如果使用 WPF 進行開發,那麼MVVM模式是事實上的選擇(有點像Model2用於 Web 開發)。也就是說,似乎沒有什麼能阻止人們在 WPF 應用程序中使用Passive ViewSupervising Controller或*Presenter First 。*這種方法會導致應用程序並不真正關心前端是 WPF、WinForms 還是 Web。這些 MVP 變體似乎允許更大的靈活性。

但是,以與 UI 平台無關的靈活性(可能不需要)為目標是否會以使 WPF 開發更加困難並失去 WPF 提供的部分功能/功能為代價?如此之多以至於成本大於收益?

換句話說,MVVM 是否如此出色以至於不應該考慮 WPF 應用程序中的其他替代方案?

@RS Conley 的回答是對該主題進行了非常廣泛的介紹,我同意大多數人的看法。我認為唯一不同的是底線。

MVVM 是 WPF 中 95% 的應用程序的架構。

選擇任何其他架構都意味著要滿足於不如你能得到的最好的東西。在 RS Conley 的情況下,被動視圖可能是最好的方法,但這遠非正常情況。

作為了解 MVVM 如何更好的一種方式,讓我們看看他在採用 PassiveView 方法時失去了什麼。

可維護性

在 Passive View 中,ViewModel 知道 IView,這意味著不保留 SRP(單一責任原則)。PassiveView 中的 Controller 直接與 Model 和 View 互動,因此做了兩件完全不同的事情!.

在 MVVM 下,作為應用程序核心的 ViewModel 只有一個關注點,即包含應用程序的狀態和邏輯。此類程式碼的可維護性確實大大優於 PassiveView、MVP 或 MVC。

的確,PassiveView 在自動化測試覆蓋方面更好,但恕我直言,良好的程式碼可維護性更為重要。可測試性幫助你確保你不會破壞你的程式碼,而可維護性幫助你不要從一開始就建構有問題的程式碼。

在可維護性方面,MVVM 和 PresentationModel 是以前 UI 架構的演變,這是因為 SRP 原則保持得非常嚴格。在 MVVM 中編寫足夠的程式碼,你就會明白我的意思了。

可混合性

MVVM 真正強大的另一個特性是可混合性。由於所有應用程序狀態都保存在 ViewModel 中,因此很容易在設計時偽造數據,從而極大地提高了生產力。這是不可能在 PassiveView、MVP 或 MVC 中創建的,因為在所有這些架構中,控制器必須主動將數據放入視圖中。在 MVVM 中,數據只是“跳轉”到視圖,因此可以被模擬。

可測試性

這確實是 PassiveView 優於 MVVM 的地方。如果 UI 的 100% 單元測試覆蓋率對您來說至關重要,那麼這很重要。然而,在大多數情況下,MVVM 允許您的覆蓋範圍綽綽有餘,您通常會使用正常 UI 測試添加另一層測試(順便說一句,您最終也會在 PassiveView 中進行)。

我認為可測試性是三個特性中不太重要的。按重要性排序,它是可維護性、可混合性和可測試性。

MVVM 哪裡不是正確的選擇?

去年我參與了 ~ 15 個 WPF 和 Silverlight 項目,所有這些項目都非常適合 MVVM。我認為在表現邏輯非常龐大的地方,比如在遊戲中,MVVM 可能不是正確的選擇。除了遊戲之外,我真的想不出哪個應用程序類別不適合 MVVM,除了 RS Conley 提到的特殊情況。

根據 MVVM for WPF 中包含的文件(一般介紹的第 2 頁)

這種模式的起源是模糊的,但它可能源自 Smalltalk ApplicationModel 模式,就像 Martin Fowler 描述的 PresentationModel 模式一樣。Expression 團隊在開發 Blend 的版本 1 時將其改編為 WPF 使用。如果沒有 WPF 特定的方面,Model-View-ViewModel 模式與 PresentationModel 相同。

去 Martin 的 Fowler 的網站並查找Presentation Model我們有這個

與被動視圖和監督控制器相比,Presentation Model 允許您編寫完全獨立於用於顯示的視圖的邏輯。您也不需要依賴視圖來儲存狀態。缺點是您需要在表示模型和視圖之間建立同步機制。這種同步可能非常簡單,但它是必需的。分離展示需要更少的同步,而被動視圖根本不需要任何同步。

對於我自己的金屬切削 CAD-CAM 應用程序,我使用Passive View。原因是

  1. 通過讓模擬對象實現視圖來使測試更容易,因此允許自動測試我的軟體的絕大多數功能
  2. 不僅要重用核心模型,還要重用相關類型金屬切削軟體的不同視圖。
  3. 清楚地記錄視圖和模型之間的互動。
  4. 消除對 GUI 工具包的任何依賴,因為該軟體自 1985 年以來一直在持續開發,並且在底層工具、API 甚至語言本身方面都發生了幾次重大變化。

前三個問題可以通過 MVVM、Presentation Model、Supervising Controller 模式來處理。但只有被動視圖解決了#4。

正如 Martin Fowler 所說,只有被動視圖不需要任何同步方法。MVVM 是 WPF 的表示模型的實現。您依賴於 XAML 介面將位於視圖模型中的視圖狀態與視圖本身聯繫起來。因此,如果稍後您更改 UI 或它的 API,那麼您的視圖模型也會更改。

相比之下,被動視圖只需要新的 UI 元素實現視圖介面。它們實際連接到什麼並不重要,因為實現的表單或控制項會正確響應。

但代價是在實現視圖的新元素時需要多走一步。您必須決定如何將它們呈現給展示者以及在什麼抽象級別。對於某些項目或某些類型的 UI(如對話框)來說,它就足夠了。

關於 MVVM 是 WPF 的方式的問題的簡短回答,答案是否定的。它是一個需要根據圍繞應用程序開發的其他問題來考慮的工具。

引用自:https://stackoverflow.com/questions/5170633