2010-09-14 136 views
1

我有一個關於基於斯坦福iPhone講座的MVC設計的問題。MVC最佳實踐問題

我有3個班;

多邊形 - 這可以保存諸如邊數等信息。這是我的模型類

控制器 - 這種響應之類的東西在視圖按鈕按下,然後卡列斯在模型的方法來增加或減少邊數等,這是我的控制器(驚喜!)

視圖 - 對於這個問題,視圖將是一個代表單個視圖的類,它將多邊形繪製到屏幕上。

我的問題是View類獲取有關Polygon模型類的信息的最佳方法是什麼?雖然這個例子對於這個例子來說是微不足道的,但我希望在構建更復雜的應用程序時,答案能夠幫助我。我有的選擇;

1)將Polygon類的實例傳遞給View,以便視圖有一個指向它的指針。然後我可以隨時調用刷新,並且視圖會知道該怎麼做。這就是我通常會做的,但是很多人打破了MVC方法,因爲View和Model似乎繞過了控制器,這讓我覺得這可能不是最好的方法。

2)在視圖中有一個重繪(...)方法,該方法以接收到的新信息爲參數。這看起來很乾淨,但我認爲不會很好地擴展。

任何建議將是偉大的。正如我通常說的,我會做選擇一,但會愛一個人告訴我的東西,以改善我的想法這種方式....

謝謝!

回答

2

這裏最基本的是聯軸器。如果太緊,設計會受到影響,你會重複自己,代碼將難以維護。如果它太鬆,就會讓簡單的事情難以管理。如果你想根據某個模型繪製一個簡單的多邊形,你應該有這個模型,因爲把所有的頂點通過一個控制器是瘋狂的。畢竟,視圖是專門爲顯示多邊形而編寫的,因此擁有指向其表示的指針是非常自然的。

什麼意見不是關心的是上下文,顯示對象的「生活故事」。它可能來自網絡,它可能會很快發生變化,點擊它可能會變大一倍。該視圖不關心。如果點擊它,視圖可以將事件報告給控制器,而不再關心它。如果對象改變,控制器會告訴視圖更新。

我不認爲設計這種關係有一個硬性規則,但重點很簡單:保持鬆散耦合而不會過多地泄露細節。它經常幫助我思考測試和變化。我可以隔離模型進行測試嗎?我可以使用完全不同的視圖而不更改其他部分嗎?我可以根據相同的模型編寫不同的用戶界面嗎?如何處理不同的「皮膚」?我需要重寫多少?

0

你的看法應該只是展現視圖。所以如果你需要在視圖中顯示更新的信息,你可以從緩存中進行操作(這在這裏並不適用,但是我把它拋出去了,因爲它最近一直在用網頁來做很多事情),或者您重新使用控制器並讓控制器再次使用有關該模型的更新數據調用視圖。

所以在技術上,你的第二個選擇是更正確的。該視圖應該通過調用控制器並詢問更新的信息來重新繪製自己。

0

模型是數據。控制器是邏輯。顯示視圖。

因此,模型就像一個數據文員。管理員應該像辦公室的管理員或組長。這個觀點應該像是一個讀新聞記者的讀者。

控制器可以管理所有人,並控制輸入的數據和提詞器上的文本 - 並將實際工作外包給模型(用於數據)和查看(用於顯示)。

因此,要回答你的問題。該視圖應該只是做echo $this->view->myPentagon->someAttribute。控制器從模型中獲取myPentagon對象,並將其分配給視圖對象。該模型處理數據結構和數據庫API。該視圖處理顯示。控制器告訴視圖什麼時候顯示。