1

我剛開始學習模型視圖控制器模式。我現在理解MVC的基本用法,但是當我嘗試在簡單測試中實現MVC時,遇到了一個問題。 Ofcoarse我可以很容易地調整代碼的工作,但我希望學習如何正確實現MVC模式。基本MVC模式通信

測試: 我用actionscript 3來製作一個簡單的程序。它由一個炮塔和一個鼠標點擊組成。炮塔位於屏幕中間。當我點擊任何地方的炮塔旋轉向我點擊的點。鼠標和炮塔都有自己的模型,視圖和控制器。當我點擊時,MouseModel正確更改。但是對於實際的TurretView來說,TurretModel必須改變它的旋轉變量併發出一個事件。

問題是誰迴應了MouseModel事件?

我想它最好不要有MouseModel直接影響TurretModel或TurretControl,因爲這需要他們成爲一個事件監聽。讓TurretView監聽MouseModel,然後告訴TurretControl調整TurretModel,在TurretView可以更新後通過TurretModel事件看起來像是一個簡單任務的許多額外代碼。此外,我寧願沒有MouseControl影響TurretModel,這將打破鼠標作爲未來類的輸入的靈活性。

哎,還有我在哪一類中加入了角度計算的代碼?

在此先感謝

回答

3

請記住,MVC的目標主要是模型和視圖的分離,而控制器可以充當兩者之間的通信者。除非您打算存儲每個發生的動作(點擊,旋轉等),否則不需要執行(在這種情況下)將數據發送到模型的操作。所有你想做的事情都應該可以通過Controller輕鬆處理。因此,流量爲:

  • 鼠標點擊
  • 後觸發事件來觸發命令(控制器),沿鼠標位置
  • 的命令計算炮塔的旋轉傳遞
  • 的命令告訴查看旋轉炮塔

這當然,我的建議是基於你的例子。事實上,根據項目的不同,上述流程很容易發生變化(例如,在這種情況下,在命令中進行輪換計算似乎很好,但在其他情況下可能沒有多大意義)。以MVC爲目標 - 你試圖儘可能地分離這些元素,但是沒有100%的「每次都有工作」的方式來做到這一點。

Robotlegs的,流行的MVC框架,已經在其網站上展示他們如何解決大圖MVC:

http://www.robotlegs.org/diagram/

我不是說你需要使用Robotlegs的(這是很好的,但是有廣告很多其他的選擇),但他們絕對做了一個漂亮的圖表:)

0

你應該有一個模型,然後在它的一部分,你正在打電話MouseModel和TurretModel。您可以保留這些名稱和故障信息,或者在您需要更好地「處理」需要完成的工作時執行其他操作。

跟蹤鼠標點擊的視圖應該派發Controller組件捕獲的更新TurretModel的事件(此時可能不需要MouseModel)。然後TurretView可以基於TurretModel更新自己,或者Controller可以根據新值更新TurretView。這將取決於你如何連線。

使用Robotlegs等框架可以幫助您找出這個過程的所有細節,並且我聽說這本書http://shop.oreilly.com/product/0636920021216.do對MVC提供了一個很好的解釋,即使您不選擇使用Robotlegs讀完之後。