2015-09-15 106 views
2

關於模型 - 視圖 - 控制器(MVC)的文獻通常指出,模型和視圖是相互獨立的實體,而控制器介導它們的相互作用,因此強烈依賴於這兩者。在模型 - 視圖 - 控制器中,視圖依賴於模型可以嗎?

在理論層面上,最後一條陳述看起來像是一種強制模塊化的合理方法。

但是假設你已經編寫了一個允許用戶創建,編輯和保存文檔的應用程序。這些文檔比簡單的文本文檔更復雜,由多個字段組成,而不是全部屬於同一類型。然後,爲了多態地支持同一文檔的多個可視化表示,您可以定義一個DocumentView接口,任何具體的視圖子類可以採用它來表示它能夠顯示文檔。

現在,假設您已經編寫了使用DocumentView接口的SomeDocumentView類。要創建文檔視圖,您的應用程序代碼必須類似下面的一行:

DocumentView documentView = SomeDocumentView(document) 

現在,在未來的假設,你寫的UpdatedDocumentView類,它也採用了DocumentView接口。要做出這樣的改變,您只需要將上面的行替換爲:

DocumentView documentView = UpdatedDocumentView(document) 

瞧!您的應用程序代碼通過DocumentView界面自動支持您的UpdatedDocumentView。

但是這樣的設計是否違反了MVC,因爲視圖的實現現在明確依賴於模型?爲什麼這一定是件壞事?如果您的模型將來發生更改,則無論您採用何種方法,都必須更改代碼。

回答

1

「模型視圖控制器」在不同的時間意味着不同的事物。在最初的MVC中,在Smalltalk中,控制器代表用戶輸入,是的,視圖使用模型對象並直接表示它們。

Apple's MVC更多的是MVP的別名,正如您所說,演示者/控制器充當模型和視圖之間的中間人。

此模式允許獨立開發視圖。可能在你的DocuentView的情況下,它實際上是其他幾個視圖的組合和控制器,因此模糊了視圖和控制器之間的區別。

UIViewController被調用的原因之一是因爲它處理許多視圖職責,即用戶輸入手勢。儘管如此,在現代代碼中使用這些功能通常是不被接受的。 Apple現在提供更多離散機制。

+0

當你說視圖「實際上是其他視圖的組合和控制器,從而模糊了視圖和控制器之間的區別時,你完全正確。」這是我將它的功能分解成兩個類的主要動機:負責模型的邏輯/操作的簡單控制器和封裝整個視圖層次結構並在一個乾淨的界面下處理手勢的視圖,以使其語義類似於一個觀點。該架構感覺更清潔,並更好地堅持SRP。這是一個可接受的方法嗎? – robertl

+0

您的想法與MVVM具有相同的動機,但您的責任與此相反。在MVVM中,ViewController封裝了他的視圖層次結構,而ModelView則負責模型對象的邏輯/操作。每個ViewController包含一個ViewModel並且沒有其他模型對象,ViewModel包含所有的模型對象。所以是的,我認爲你的想法是合理的,但是與MVVM相比,這種分離比你的方法更簡潔,因爲ViewController具有一些View類似的行爲。 –

+0

可能有所幫助的鏈接:http://programmers.stackexchange.com/questions/264081/usage-of-mvvm-in-ios –