第221期 / March 4, 2016

分享到臉書!分享到維特!分享到噗浪!分享到Google+!分享到微博!轉寄友人友善列印

論MVC設計模式

作者/沈慧翰

[發表日期:2016/3/4]

什麼是 MVC?

MVC軟體設計模式最早在1974年由Trygve Reenskaug提出的概念,在20世紀80年代,施樂帕羅奧多研究中心為程序語言Smalltalk發明的一種軟體設計模式。也就是說將網站應用程式分為三個基本部分:模組(Model)、檢視(View)、邏輯控制器(Controller)。簡單來說,組成整個應用程式的互動介面的是負責展現資訊給使用者的檢視(View)和負責處理使用者互動的邏輯控制器(Controller),因此若想要做初步一樣的回應,只需使用不同的Controller即可。最後,應用程式中的資料以及修改資訊的邏輯即是模組(Model)。


《圖一》VC資料流程圖


模型-Model

在應用程式中Model大多代表了系統狀態以及資料和商業規則的執行元件。在資料顯示的方式,View和Model之間若使用了”Push MVC”方式,當Model狀態改變時,Model不應只要通知資料以及狀態的改變,而是應該主動產生新的View的內容。而另一種”Pull MVC”的方式的話,Model只需要送出更動通知,不需要知道View的需求。這兩種的方式各有優缺,”Push MVC”會使Model具有更多責任而失去再利用的優點,而使用”Pull MVC”的應用程式效率會有所下降。

Model 層擁有最多的處理任務,封裝了應用程式中對資料的存取並提供可重複使用的函式庫,像是資料庫存取的抽象化、郵件的遞送、資料的驗證與稽核都會發生在此。模型與資料格式無關,因為模型返回的資料是不具相依性,即是一個模型能為多個檢視提供資料。由於應用於模型的程式碼可以被多個檢視重用,於是減少了程式碼的重複性。
  • 保存應用程式狀態


  • 執行應用程式商務邏輯(Business logic):用來描述應用程式功能性的演算法以及資料庫與使用者介面之間資料的交換。


檢視-View

View負責接受使用者的要求與顯示資料,即是與使用者溝通的界面。對以往傳統的 Web 應用程式來說,都是由HTML元素組成的介面,在新式的 Web應用程式中,HTML依舊在檢視中扮演著重要的角色,但一些新的技術包括XHTML,XML/XSL,WML等一些標籤語言和Web services。在檢視中其實沒有真正的處理事件,它只是作為一種輸出資料並允許使用者操縱。
  • 提取模型狀態

  • 執行呈現邏輯(Presentation logic)組織回應畫面


控制器-Controller

Controller除了負責接受和處理使用者的互動外,更包含了應用程式該如何回應使用者的邏輯。Controller的角色從以往處理點擊 Web 網頁中的超連結和發送 HTML 表單等,改為處理在HTTP協定下的以GET或POST方法所提出的Request,處理的過程Controller根據應用程式或使用者的狀態將Request分配給正確的Model元件進行運算,運算結束後以適當的View回應給使用者,控制器本身不輸出任何東西和做任何處理。除了作為Model和View之間的溝通角色外,Controller所扮演的角色也決定了應用程式的運作方式是否具有延展性及維護彈性。
  • 接受請求:接受使用者的輸入並調用模型和檢視去完成使用者的需求。


  • 驗證請求。


  • 判斷要轉發請求給哪個Model。


  • 判斷要轉發請求給哪個View。


為何要使用 MVC

MVC 模式透過對複雜度的簡化使程式架構更加直覺並且使程式的某一部分的重複利用成為可能,而其目的就是要實作動態的程式設計,使後續對擴充功能與程式的修改更加簡單,Model負責欄位與欄位間處理的方式,而controller負責對資料的存取,因此,當有欄位變更發生時就可以不需要去考慮欄位間的關係,只要對Controller做名稱的修改,同理當View的呈現方式有更改時,我們只要美工設計和排列方式並不需要知道後面Model中的欄位做了什麼運算。藉由專業人員透過本身的專長,達成分工合作的效果,減少維護的時間降低人力成本:
  • 模型 Model:程式設計師編寫程式功能、資料庫專家進行資料管理和資料庫設計。


  • 檢視 View:UI設計人員進行圖形介面設計。


  • 控制器 Controller:負責轉發Request,對Request進行處理。


優點、缺點與適用範圍

一、優點:
  • 透過將應用程式細分成模型、檢視和控制器的方式,讓管理複雜性更為容易。


  • 程式碼的重複使用性: MVC將我們的商業邏輯部份分離出來,簡化程式設計,多個檢視能共享一個模型、同一個模型可以被不同的檢視重用,可以提高程式碼的再利用性,並簡化我們設計上的難度。


  • 模組之間保持相互獨立的關係,控制器是自包含(self-contained)指高獨立內聚的物件,與模型和檢視保持相對獨立,所以可以方便的改變應用程式的資料層和業務規則。


  • 利於團隊開發:當系統愈來越大時,相對來說就會投入越多的人力去開發,這時候每個人的分工角色就會是一個重點,若團隊的每個人可以遵循一個標準的方式,不管是彼此間的溝通或是功能之間的整合,都會有一套標準的方式來運行,也能為測試為導向的開發工作 (Test-Driven Development,TDD) 提供更佳的支援。


二、缺點:
  • 使用 MVC 需要精心的計劃,由於它的內部原理比較複雜,所以需要花費一些時間去思考。由於Model和View要嚴格的分離,這樣在使用測試應用程式上有一定的難度。


  • 另外由於 MVC 模式將一個應用程式分成了三個部件,所以使用 MVC 同時也意味著將要管理比以前更多的文件。


三、適用範圍:

過去 MVC 模式並不適合小型甚至中等規模的應用程式,這樣會帶來額外的工作量,增加應用的複雜性。對於開發存在大量使用者介面,並且邏輯複雜的大型應用程式,MVC 將會使軟體在健壯性、代碼重用和結構方面上一個新的台階。

結論

MVC的概念是為了能夠讓問題變得更小更細,程式的設計原則以及開發框架,其目的都是為了讓撰寫程式的人能更專注於要解決的問題,或是增加未來修改的彈性,程式的穩定性。雖然可能要花費較多的時間進行前置規劃,但是一個好的架構設計時需妥善規劃,未來才可以讓程式變得很容易維護。

參考資料

http://lms.tzuchi.com.tw/epaper/artical/index.php?id=file/28/foot_1
http://zh.wikipedia.org/wiki/MVC
http://expect7.pixnet.net/blog/post/36446413-%5B%E8%B3%87%E8%A8%8A%5D-%E4%BB%80%E9%BA%BC%E6%98%AFmvc%EF%BC%9Fwhat's-model-view-controller%EF%BC%9F
http://ir.csu.edu.tw/bitstream/987654321/3054/2/735.pdf
http://www.code-club.idv.tw/index.php?action=index&run=article_read&ClassID=55&ArticleID=1597
http://eportfolio.lib.ksu.edu.tw/~T097000085/blog?node=000000682