關於mvc的理解?

其實我的困惑最主要是在model和controller.

我認為的model應當是把大部分關於數據層的邏輯都實現了,controller呢只做跟view相關的業務邏輯。也就是說這個事情一定是跟view緊密相連的才會用controller來隔離。

打個比方,一個簡單的用戶登錄界面。model應當提供出登錄的方法,登錄結果的callback;當view層的登錄事件觸發時應當通知controller,這時候controller來調用model的登錄方法,登錄結果由callback返回。這樣的話三層只有一個數據結構體銜接。而controller是實實在在的為了解耦model和view而存在了。

以上是我的個人理解,是否正確?希望得到更多的指導和討論。


MVC 寫成 View &<---&> Controller &<---&> Model 就好理解了。MVC並非誰創造的理論,它只是被賦予一個世界通用的名字,任何有經驗有追求的程序員即使完全不知道MVC這個東西,都會走向MVC。

你的理解和我的理解基本一致。

View是登錄界面。Model是登錄功能模型,提供實現登錄功能的所有介面,比如網路請求,數據校驗等。Controller是View和Model的橋接,將View的輸入傳遞到Model,並將Model的結果反饋到View。

舉個栗子,登錄時:

1、用戶在View的Input上輸入手機號後,點擊View上的Button,觸發Controller調用Model的verifyMobile(mobile)介面。

2、Model.verifyMobile(mobile) 校驗後不符合手機號格式,返回出錯提示msg: {passed: false, message:"長度不對"}。

3、Controller將msg顯示在View上Input上。你就看到 Duang! 在手機輸入框後邊出現一個紅色提示框提示長度不對。

4、用戶修改成正確的手機號後,重複1、2,校驗通過。Controller再調用login(mobile, password)方法來請求登錄。

所以,MVC就是這麼個東西。


MVC 有不少變種,我只相信 stateless view 能很好的減少複雜度:

C 是 MVC 的 C

你覺得 controller 太 thin 是因為你的 controller 確實做得不多。大多數時候 controller 就是幾個函數,夠不到 class 的級別。做 mouse drag 或者複雜的 multi-finger gesture 就要有單獨的 controller。


主要在於分層的時候,C層擔負什麼樣的任務。

你是想要C只負責單純的路由,還是負責V層的邏輯部分。

如果按照上面的不同的思路來按最佳實踐來做,

最後就變成了細分化的MVC和MVP。

當然還可以變為了MVVM。

你比較一下這三個的區別。


你在瀏覽器輸入好用戶名和密碼之後,點擊登錄,瀏覽器會給伺服器發個請求。

伺服器接到請求之後,按照預先設定的路由規則把參數傳給相應的controller。

controller判斷參數合法性之後,從model那邊拿數據。

model通過orm從資料庫裡面把數據取出來、封裝成對象給controller。

之後,controller根據結果進行判斷,然後載入相應的view(模板)。

最後controller把模板渲染出來的html列印到網路流中。


總統在舞台上演講,總統口渴了需要水;秘書負責傳喚幕後人員送上水來;後台人員負責送水。總統以及舞台是view,秘書是controller,後台人員是model。總統的要求都是由model實際來完成的,controller只是個傳話的。世界中很多實際場景都是按這個步驟來運行的,只是我們沒有發覺。


題主說的是那種MVC是充血模型:大部分業務邏輯和持久化放在model里。而貧血模型是相反的,model里只有get和set。


更多的時候是 :

View ——前置Controller(spring的dispatchServlet,前端中的路由)—— Domain級別的 Controller—— Domain Service ——Domain級別的Model Service

上面沒有出現model,其實model作為數據的載體,出現上面的任意位置,當然了,形態主要是json,xml,valueObject。

當然了,前端也可以再次MVC,這點可以參考一個典型的angularJS單頁應用。

這裡其實也涉及到對model內容的不同理解:是一種簡單的數據聚合和呢,還是要在數據的基礎上添加更多的行為(更新刪除修改校驗等)。


現在哪有純MVC,大型架構都是網狀的SOA…MVC不過就是客戶端開發提出來並發揚光大,web開發中的MVC無非是哪塊代碼貧血設計,哪塊組件豐滿點或者代碼噁心點…如果你再站在高處想想,任何一種通信協議,從鏈路層到傳輸層到應用層也是MVC好吧,比如TCP IP …也是哪塊代碼少但是效率高,哪塊容易引發阻塞跑的慢或者業務種類多要統籌處理。


推薦閱讀:

前端 MVC 和伺服器端有哪些差別?

TAG:軟體架構 | MVC | 設計模式 |