- Live軟件開發面面談
- 潘俊編著
- 994字
- 2019-07-30 17:55:04
第3章 MVC
假如問一群程序員,誰是最有價值廚師?他們大概會在短暫的茫然后給出五花八門的答案,男朋友、老婆、老媽或者某家快餐連鎖店的幕后大廚。顯然他們對這個概念還不太熟悉,但是如果把它翻譯成英文Most Valuable Cook,有些人或許就明白了。假如還不知道,說出它的簡稱,他們就一定很熟悉——MVC。
MVC可謂是圖形用戶界面軟件設計的標準模式。無論采用哪種編程語言,設計的是桌面端、Web還是移動端應用程序,采用的是流行的或冷門的開發框架,遵行MVC都幾乎是必然的。然而另一方面,就像一千個人眼中有一千個哈姆雷特,當人們談論MVC時,也像談論愛情一樣,所指千變萬化。
視圖沒有直接從模型獲得更新,而是由控制器修改視圖,這違背了MVC的設計原則。控制器應該對視圖的細節一無所知。事件響應程序可以直接寫在視圖內。控制器負責系統的業務邏輯。諸如此類都是關于MVC的斷言。但在其他地方,又可以看到截然相反的論斷。這些被我當成反面教材列出來的話語可不是初學者的臆想,它們都是來自Google相關關鍵字搜索的結果前列,有的是Oracle官方網站上對MVC的介紹文章,有的是俄亥俄州立大學計算機科學與工程系的主題講義,有的是編程社區網站的熱門和高票文章。代碼樣例是程序員學習的重要來源。不幸的是,同樣來自Google搜索結果排名前列的MVC的樣例代碼卻良莠不齊。很難相信這些代碼的作者會以他們對MVC那樣的理解和代碼風格在實際項目開發中應用MVC模式。
【注:上述部分論斷和代碼樣例的出處www.oracle.com/technetwork/articles/javase/index-142890.html
http://web.cse.ohio-state.edu/~rountev/421/lectures/lecture23.pdf
http://www.austintek.com/mvc/
http://www.codeproject.com/Articles/613682/Your-first-program-using-MVC-pattern-with-Csharp-W
http://www.codeproject.com/Articles/383153/The-Model-View-Controller-MVC-Pattern-with-Csharp】
平心而論,會有這樣的現象,部分原因是MVC不像Singleton之類的設計模式那樣具體,沒有精確的代碼對應形式,而且在廣泛的應用中,根據環境要求和不同編程語言的特點也產生了不少變體,如MVP(Model-View-Presenter),從而令得不同情況下三個組件所負責的功能和實現方式有所出入。這樣的彈性和變化進一步讓MVC在傳播過程中,像故事的流傳一樣衍變出形形色色的版本,又像娛樂節目上經常出現的接力猜謎,每一個人從上一個人的動作中猜出在模擬什么東西,再以自己的方式表演給下一個人看,到最后一個人猜出的結果往往和最初風馬牛不相及。要應對這樣的困境,最好的方法是不僅知其然,還要知其所以然。本章將從簡單程序的結構入手,逐步分析一個自然合理的架構隨著程序的演變,如何發展成MVC。從分析MVC架構體現的設計理念辨清它的真相,理解在它的種種變體中哪些不變的部分是邏輯要求的必然結果,又有哪些部分可以適應需求、環境和實現技術做出靈活的選擇。這之后再討論桌面、移動和Web環境下MVC的具體實現。