2016-01-13 60 views
0

我找不到我的問題的明確答案。誰負責初始化MVC中的單個模型組件

在MVC中,所有模型,視圖和控制器都相當分離。所以通常我會創建一個控制器對象來存放模型和視圖的實例。模型和視圖彼此之間不知道任何事情,因此他們必須通過控制器進行通信。例如,當我編寫遊戲模型的代碼時,有類似「GameBoard」的類,它通常爲類型爲「Tile」的對象保存對象容器...「Player」或「Brick」可以是一個繼承的「Tile」類。

例如一開始必須有一些磚塊用於第一級,所以我必須在某個地方初始化它,我通常在GameBoard的構造函數中這樣做。

通常告訴「GameBoard」 - 構造器應該保持哪個對象是一種很好的做法嗎?

我在問,因爲我讀了一些關於「單一責任原則」......所以模型應該只是模型(而不是別的),不關心自己的初始化?

或者這是「初始化」控制器的任務嗎?如果是,我應該將一個控制器分成多個控制器來處理其「單一責任」?或者是模型和視圖之間足夠的控制器?

感謝

回答

0

在MVC中,所有的模型,視圖和控制器是相當分歧。所以 通常我會創建一個控制器對象,其中包含 模型和視圖的實例。模型和視圖彼此不知道任何東西 ,以便它們必須通過控制器進行通信。

我不確定這是什麼意思。我不會說控制器的模型和視圖交互,他們實際上從來沒有在這裏見過。模型和視圖在視圖內部進行通信。

例如當我寫我的代碼的一個遊戲的模型中,有 類像「遊戲鍵盤」通常保持對象容器 爲類型「瓷磚」的對象...「播放器」或「磚塊「可以是繼承的」瓷磚「類別 。

例如一開始必須有一些磚塊用於第一級,所以 我必須在某個地方初始化它,我通常在GameBoard的 構造函數中這樣做。

通常是一個很好的做法,告訴「GameBoard」 - 構造者 它應該保持哪個對象?

是的,就是這樣。 只有允許非模型對象接收構造函數內的值。如果您想認真對待這種做法,您應該添加:

private set; 

在類屬性上使它們不可變。這將限制您僅將該對象修改爲構造函數和構造函數的能力。

我問,因爲我看了一些關於「單一職責原則 」 ...所以應該模型只是模型(並沒有什麼別的 ),並不在乎其本身初始化?

該模型應該有關於如何存儲數據的嚴格規則。爲了便於閱讀,您可以添加不同的構造函數以允許您在一行上填充模型,但這不是必需的。

或者這是「初始化」控制器的任務嗎?如果是, 我應該將一個控制器劃分爲多個控制器,其中關注其「單一責任」需要 ?或者是模型和視圖之間足夠的一個控制器 ?

是的,控制器的唯一工作就是與視圖進行通信。該視圖需要數據,因此控制器將填充該模型,並將其與視圖進行通信。這應該是它正在做的一切。

控制器應該只有一個責任,但這並不一定意味着它只做一兩件事情。程序員可以自行決定其控制器的範圍。

我希望這對你有幫助。

+0

謝謝,這非常有幫助! –