2013-07-19 59 views
0

在MVC模式中,我看到了組成數據模型的類和驅動系統的這些類的實例之間的區別。我的團隊恭敬地不同意我的意見,我想澄清一下。模型對象是否應通過MVC模式中的視圖創建?

我有一個Employee類,它是模型中唯一的類。控制器有一個類的實例,並且該實例驅動視圖。

我會打電話給控制器「模型」所擁有的Employee類的一個實例,並且我會調用Employee類的其他任何實例,但不驅動系統「不是模型」。

爲什麼我這樣做是因爲我的團隊認爲視圖不應該創建模型。我同意,但我認爲該視圖應該能夠創建Employee類的實例傳遞給控制器​​。

例如,如果我在控制器中有一個方法setCoworker(employee : Employee),我認爲視圖創建一個Employee的新實例並將其傳遞給控制器​​是完全可以的。

MVC模式最佳實踐指令是什麼?我不應該從視圖創建實例嗎?

回答

3

這取決於一點哪個你正在關注的MVC模式(有很多口味)。但是,一般來說,視圖的唯一職責應該是將人的輸入轉化爲對控制器的調用,以及將模型保存到輸出中的任何數據狀態。

所以我必須同意你的團隊。您可能在視圖中有一個按鈕OnClick處理程序或類似的東西,然後調用controller.BuildANewModel(),但是您不會讓視圖自己實例化新模型。

這就是說,上次我查了一下,四人幫把他們的棒球棒和輪胎鐵桿掛起來了,並沒有把那些不遵循圖案的人扔下去,所以無論你爲什麼工作。 。 。 :)

+0

我很欣賞你的看法。但是如果BuildANewModel()需要很多直接來自人類輸入(即視圖)的參數呢?我們可以將所有的參數傳遞給函數,但是這會變得很難管理,而且如果我們創建一個包含所有參數的單獨對象,我們基本上會重複已經存在於模型中的類。您怎麼看? – Samuel

+0

這通常在控制器的界面中定義,無論是作爲參數還是作爲某種數據對象。就像我說的那樣,沒有人會爲了使用該數據對象的Model而打破僵局,但它不符合模式,這就是您的問題所在。 – Paul

+0

我有點像控制器暴露的數據對象的想法。像'EmployeeCreationArgs'。如果視圖沒有或不應該關注的「員工」類的某些部分,這可能很有價值。感謝您的輸入:) – Samuel

2

我想與您的團隊一致認爲:

限制依賴性的觀點甚至不應該知道的控制器和它的內部實現的,所以它不能夠創建員工傳遞給控制器。
應該有隻是一個通知機制 - 授權或某種其他鬆散聯接機構 - 其中所述視圖通知控制器,它應該創建一個新的僱員,或差分表述:視圖將通知一定的輸入或事件的控制器和控制者會決定創建一個新員工。
在您的溶液視圖和控制器將被緊密地耦合在一起,它實際上可以被看作是對組成:MVC模式將被破壞。


MVC總之:型號保存數據,控制器具有邏輯,考慮到與用戶進行交互。唯一知道兩者的組件是控制器。模型一無所知視圖或控制器,視圖一無所知模型,並只與控制器加上非常鬆散。只是通知它有關輸入和類似。你當然可以創建其他結構,但那不是MVC。你的問題是關於MVC。

這說明在可可MVC模式,詞彙可能不熟悉,但或多或​​少MVC應該是這樣的。綠色表示關於模型和視圖的控制器知識,而黃色表示不同的鬆耦合機制。這在不同的語言和框架中可能會有所不同。

MVC

這裏找到:What should own the model in an MVC pattern?

+0

方法調用並不意味着視圖耦合到控制器的內部實現。您可以使用一個接口來提取暴露給視圖的控制器的行爲。該視圖不與接口的任何特定實現耦合。這並沒有回答我關於模型的具體問題。 – Samuel

+0

當然,一個界面將是一個很好的解決方案。但是如果視圖會成爲新對象的創建者,它將完成屬於控制器的任務。所以它將包含控制器將依賴的代碼:控制器將分散在多個對象上。 – vikingosegundo

+0

你可以閱讀我對保羅的帖子關於傳遞參數的第一條評論嗎?你對此有何看法? – Samuel

2

意見不應該通過什麼控制器。控制器不應該將任何事情傳遞給視圖。模型層不應該返回任何東西給控制器。這裏是如何的信息流應該在MVC實現:

enter image description here

來源:wikipedia

此外,模型是一個層。不是課堂或對象。包含多個結構的圖層,每個結構都有不同的責任。你所稱的Employee不是模型(甚至是「模型」)。相反,它只是衆多的domain objects之一。

無論你的觀點和你的控制器應該對域對象的任何直接訪問。相反,他們應該通過服務層與模型層交互,該層包含模型層中的「應用程序邏輯」(域和存儲結構之間的交互)。

這些將是關於這個問題我的兩分錢,但我會被標記這是「過於寬泛」,因爲人們可以寫一本書(和一些 - 擁有)對MVC實現的主題。

+0

只需注意幫助人們避免混淆 - 這裏是_classical_ MVC。例如,Backbone.js在更廣泛的意義上使用「視圖」,其中這種「視圖」確實將所有用戶交互傳遞給其他組件。 –

+0

@DmitriZaitsev Backbone與主題相關的是怎樣的? –

+0

在迂腐的一面,我理解你。但人們通常認爲MVC有各種口味。骨幹只是一個例子來說明其他口味的觀點,這可能或可能不是一個困惑的讀者相關,但是另一個圖書館或框架可能會。 –

相關問題