跳至內容

MVC

出自Taiwan Tongues 台語維基
這是此頁批准,以及是最近的修訂。

MVC 模式(Model–view–controller)是軟體工程中的一種軟體架構模式,共軟體系統分做三个基本的部份:模型(Model)、 視圖(View)佮控制器(Controller)。

MVC 模式上早由 Trygve Reenskaug 佇一九七八年提出,是全錄帕羅奧加研究中心(Xerox PARC)佇二十世紀八空年代為程式語言 Smalltalk 發明的一種軟體架構。MVC 模式的目的是實現一種動態的程式設計,使後續對程式的修改佮擴充簡化,並且使程式某一部份的重複利用成做可能。除了這以外,現此模式經過對複雜度的簡化,使程式結構閣較直覺。軟體系統透過對家己的基本部份離開的同時嘛予各個基本部份會當有的功能。專業人員會當做照家己的專長分組:

  • 模型(Model)-程式設計師編寫程式應該有的功能(實現演算法等等)、 資料庫專家進行資料管理佮資料庫設計 ( 會當實現具體的功能 )。
  • 視圖(View)-介面設計人員進行圖形介面設計。
  • 控制器(Controller)-負責轉發請求,嘿請求進行處理。

組件的彼號互動

共應用程式劃分做三種組件,模型-視圖-控制器(MVC)設計定義𪜶之間的互相來作用。

  • 模型(Model)用佇咧封裝佮應用程式的業務邏輯相關的資料佮對資料的處理方法。「Model」有對資料直接存取的權力,譬如講對資料庫的存取。「Model」無依賴「View」和「Controller」,也就是講,Model 袂關心伊會予人按怎顯示抑是按怎予人操作。猶毋過 Model 中資料的變化一般會通過一種重新整理機制去予人公佈。為著欲實現這種機制,彼用佇咧監視此 Model 的 View 你著愛事先佇遮 Model 上註冊,對而且,View 會當了解佇資料 Model 最發生的改變。(比如講:觀察者模式)
  • 視圖(View)會當實現資料有目的顯示(理論上,這毋是必需的)。 佇咧 View 一般無程式的邏輯。為著實現 View 最重新整理功能,View 需要存取伊監視的資料模型(Model), 此應該事先佇予伊監視的資料遐註冊。
  • 控制器(Controller)起去無仝層面間的組織作用,用佇咧控制應用程式的流程。伊處理事件閣做出回應。「事件」包括使用者的行為佮資料 Model 最的改變。

優點

佇咧上早的 JSP 網頁內底,像資料庫查詢語句 ( SQL query ) 按呢的資料層代碼佮像 HTML 按呢的表示層代碼是濫做伙。雖然有經驗較豐富的開發者會共資料對表示層分離開來,毋過這款的良好設計通常並毋是真簡單做會到的,實現伊需要精心咧計畫佮不斷的試驗。MVC 會當對根本上強制性地將伊分開。雖然構造 MVC 應用程式需要一寡加額的工課,但是伊帶予咱的好處是不庸置疑的。

首先,濟个 View 會當共享一个 Model。現此時,仝一个 Web 應用程式會提供真濟種使用者介面,比如講使用者希望會當通過瀏覽器來收發電子批件,閣希望通過手機仔來存取電子信箱,這就要求 Web 網站同時會用提供 Internet 介面佮 WAP 介面。佇咧 MVC 設計模式內底,Model 回應使用者請求並轉迴響應資料,View 負責格式化資料並且共呈現予使用者,業務邏輯佮表示層分離,仝一个 Model 會當予人無仝款的 View 重用,所以大大提懸了代碼的會當重用性。

其次,Controller 是自包括(self-contained , 指懸獨立內聚)的東西,佮 Model 和 View 保持相對獨立,所以會用得方便的改變應用程式的資料層佮業務規則。比如講,共資料庫對 MySQL 徙栽到 Oracle,抑是講共 RDBMS 資料來源改變做 LDAP 資料來源,只需要改變 Controller 即可。一旦正確地實現矣控制器,不管資料來自資料庫抑是 LDAP 侍服器,View 攏會正確來顯示𪜶。因為 MVC 模式的三个模組互相獨立,改變其中一个袂影響其他兩个,所以根據這種設計思想能構造良好的少互擾性的構件。

此外,Controller 提懸著應用程式的靈活性佮可組態性。Controller 會當用來連接無仝的 Model 和 View 去完成使用者的需求,嘛會當構造應用程式提供強有力的手段。予定一寡會當重用的 Model、View 和 Controller 會當根據使用者的需求選擇適當的 Model 來進行處理,然後選擇適當的 View 共處理結果顯示予使用者。

評價、閣誤解有適用的範圍

MVC 模式佇咧概念上強調 Model , View , Controller 的分離,各个模組嘛遵循著由於 Controller 來處理訊息,Model 掌管資料來源,View 負責資料顯示的職責分離原則,所以佇實作上,MVC 模式的 Framework 通常會將這 MVC 三个部份離實際作:

  • Model 負責資料的存取,較現代的 Framework 攏會建議使用獨立的資料物件 ( DTO , POCO , POJO 等 ) 來替代弱型別的集合物件。資料存取的程式碼可以用 Data Access 的程式碼抑是 ORM-based Framework,嘛會當進一步來使用 Repository Pattern 佮 Unit of Works Pattern 來切割資料來源的相依性。
  • Controller 負責處理訊息,較高階的 Framework 會有一个預設的實作來做 Controller 的基礎,比如講 Spring 的 DispatcherServlet 抑是講 ASP . NET MVC 的 Controller 等,佇咧職責分離原則的基礎頂懸,彼每一个 Controller 負責的部份無仝,因此會將每一个 Controller 切做無仝款的檔案以利維護。
  • View 負責顯示資料,這个部份外為前捀應用,而且 Controller 會有一个機制共處理的結果 ( 可能是 Model , 集合抑是狀態等等 ) 交予 View,然後由 View 來決定欲按怎顯示。比如講 Spring Framework 使用 JSP 抑是相應技術,ASP . NET MVC 著使用 Razor 處理資料的顯示。

嘛因為 MVC 模式強調職責分離,所以咧發展 MVC 應用的時陣會產生誠濟檔案,佇咧 IDE ( 整合開發環境 ) 無夠成熟的時陣伊會佇一个問題,毋過佇現代主流 IDE 攏會當使用類別物件的資訊來組織程式碼編輯的情況下,檔案早就毋是問題,而且 MVC 模式會要求開發者進一步來思考應用程式的架構 ( Application Architecture ),非用大雜燴的方式開發應用程式,對應用程式的性命週期以及後續的會當擴充佮會當維護性來講有誠正面的幫助。另外咧,MVC 職責分離嘛帶來一个現代軟體工程要求的重要特性:可測試性 ( Testability ),MVC-based 的應用程式佇咧良好的職責分離開的設計之下,各部份會當獨立行使單元測試,對企業內家己的特別愈來愈試、繼續整合 ( Continuous Integration ) 佮繼續交付 ( Continuous Delivery ) 流程整合,減少應用程式改版部署所需要的時間。

MVC 模式的應用程式的目的就是希望拍破往過應用程式使用的大雜燴程式編寫方式,並間接設使開發人員以閣較懸的架構導向思維來思考用程式的設計,所以對一个今仔入門的初學者來講,結構導向的思考會有一定的戶橂,需要較濟的實作佮練習才會當有範圍的能力,大多數的初學者猶是較慣勢佇大雜燴式的程式編寫,所以可能會著 MVC 模式抱持著排斥抑是厭惡的心態,毋過 MVC(抑是其他的設計模式)攏是對應用程式有幫贊的發展,雖然大雜燴的程式嘛會當用來發展長性命週期的應用程式,但是佮招於做伙 MVC,大雜燴式的程式咧會當擴充性佮可維護性 ( 尤其是有試性 ) 頂會遠比 MVC 複雜誠濟,顛倒反的,MVC 模式的應用程式是佇初初開發時期就愛先想而且使用軟體架構,予伊開發時期會需要開較濟心力,但是一旦應用程式共完成了,有擴充性、有維護性佮可測試性顛倒會因為 MVC 的特性就按呢變做簡單。

所以,MVC 模式已經有足濟優秀的 Framework 的現代,早就已經無適合小型應用的問題,小型的應用嘛是會當由 MVC Framework 的應用來取 MVC 的優點,同時伊嘛會當做為未來小型應用擴充到大型應用時的基礎佮入門磚。若一開始就想欲做大型應用,遐爾 MVC 模式的職責分離佮要求開發的架構思考會閣較適合大型應用的開發。

實際的範例

遮有一个通過 JavaScript 所以這个基於 MVC 模型,需要注意的是:MVC 毋是一个技術,是一種理念。

這个簡短的程式中就是一个完整的 MVC 模式。

實現

MFC

軟勢所推出的 MFC Document / View 架構是較早的對 MVC 模式的實現,MFC 將程式分做 CView 以及 CDocument 兩大類別,內底的 Document 對應 MVC 中的 Model,View 相當於是 MVC 中的 View+Controller,閣加上 CWinApp 類別,敆做三大項。但是基本上 MFC 是一个失敗 MVC 模式作品。

因為 MFC 之下的 Document / View 定義傷過霧,未將 Controller(MessageMap)部份會提出,所以 Controller 會使入去 View 抑是 Document,但是不管置入佗一方面,攏會佮 View 抑是 Document 縛死,無彈性。

Java

Java 平台企業版 ( J 二 EE )

佮其他的各種框殼無仝款,J 二 EE 為模型東西(Model Objects)定義一个規範。

視圖 ( View )

佇咧 J 二 EE 應用程式內底,視圖(View)可能由 Java Server Page ( JSP ) 擔任。生成 View 的代碼則可能是一个 servlet 的一部份,特別是佇咧客戶捀服器捀互動的時陣。

控制器(Controller)

J 二 EE 應用中,Controller 可能是一个 servlet。


除了會當直接 J 二 EE 來編寫外口,抑若利用其他的框殼來編寫,捷看的有 Struts 二、Spring Framework…… 等咧。

模型(Model)

Model 則是由一個實體 Bean 來實現。

Java Swing

Swing 是一個標準的 MVC 結構。ComponentUI 代表 View,負責描畫組件。組件尤其 Model 層,比如講 JTextField 的 Document、JTable 的 TableModel、JTree 的 TreeModel 等咧。Control 有可能毋是足明顯的,咱會當將 Event 機制看作 Swing 團隊為開發者設計的 Controller。

做為 Java 開發者,若想欲理解講 MVC 的結構,學習 Swing 確實是一个袂䆀的選擇。

. NET

ASP . NET

佇咧 ASP . NET 中,針對視圖(View)佮控制器(Controller)的模式無予真好的定義。而模型(Model)著留予開發者去設計。

視圖(View)

ASPX 和 ASCX 檔案被用來處理 View 的職責。佇這設計中 View 實際上是對 Controller 繼承來。這个和 Smalltalk 的實施有無仝款,佇咧 Smalltalk 著無仝的類攏有指標互相指向對方。

控制器(Controllers)

Controller 的職責被分割兩部份。事件(Event)的產生佮傳輸是框殼的一部份,閣較明確的講是 Page 和 Control 兩類。代誌這件的處理是咧分離的代碼內底實現。一般來講,控制器是部件,用來處理使用者互動、著 model 施加工作、最終選擇 view 來畫。對於 MVC 應用程式,view 干焦顯式資訊;控制器處理佮回應使用者的輸入佮互動。

模型(Model)

ASP . NET 無嚴格需要一个 Model。開發者會使家己選擇建立一个 Model 類,但是真濟人選擇放棄這步,直接共事件處理囥佇咧 Controller 里處理任何計算、資料儲存等等。猶毋過用 Model 來包含商業邏輯佮資料的存取是會當實現的。一般來講,MVC 應用程中的 Model 表示應用程式的狀態、應用程式會當執行的任何業務邏輯抑是操作。強型別的 views 典型使用 ViewModel 類型來包括顯示佇該 view 中的資料。控制器對 model 建立並保有遮的 ViewModel 實例。

ASP . NET MVC

二空一三年十月十七號 ASP . NET MVC 發表了穩定版本五鋪零。

佇咧 ASP . NET MVC 中,一般情形下 Model 通常配搭 LINQ to SQL 類別(使用 O / R Designer 工具所製作來成的 DBML 檔)抑是 ADO . NET 實體資料模型(Entity Data Model,使用 ADO . NET Entity Framework 製作出的 EDMX 檔)來實作。

ASP . NET Core MVC

隨著 . NET Core 的發布,二空一六年五月十七發布矣 ASP . NET Core MVC 一垺零 . 零-rc 二。現在發展為 ASP . NET Core MVC 六。

Windows Forms

佇咧 WinForms 中,這个針對視圖(View)佮控制器(Controller)的模式已經誠好的定義。而模型(Model)著留予開發者去設計。

視圖(View)

由 Form 抑是講 Control 類繼承來的一个類的處理 View 的職責。佇咧 WinForm 這个例中 View 和 Controller 予人編譯佇仝一个類當中,這个和 ASP . NET 無仝。

控制器(Controller)

Controller 的職責被分割做三部份。事件(Event)的產生佮傳輸是作業系統的一部份。佇咧 . Net 框架中 Form 和 Control 類將無仝的事件轉發予相應的事件處理器。代誌這件的處理是咧分離的代碼內底實現。

模型(Model)

就親像 ASP . NET 仝款,WinForm 無嚴格需要一个 Model。開發者會使家己選擇建立一个 Model 類,但是真濟人選擇放棄這步,直接共事件處理囥佇咧 Controller 里處理任何計算、資料儲存等等。也就是講用 Model 來包含商業邏輯佮資料的存取。

Perl

Catalyst 和 Jifty 是透過 Perl 語言所開發出來的 Web Framework,攏採用 Model-View-Controller 架構。Catalyst 本身干焦做 Controller,View 和 Model 予開發者自由選用 CPAN 上的模組開發,比如講 Template 和 Template Declare 攏通用來產生視圖。Jifty 將 MVC 完全實做完成,View 的部份佇早期版本使用 Mason 實在做,較新版本使用 Template Declare。

Ruby on Rails

Ruby on Rails 是透過 Ruby 語言所開發出來的 Web Framework,嘛是採用 Model-View-Controller 架構。Model 部份咧用 Active Record 概念實在做,加上 Migration 機制,會當予伊做 Model 結構足簡單的控制。

Python

Python 有真濟的 MVC 架構。上捷用的有 Django 和 TurboGears。

JavaScript

  • Backbone . js
  • Angular . js
  • Ember . js
  • JavaScriptMVC
  • Model-View-Controller ( MVC ) with JavaScript

PHP

  • CakePHP
  • CodeIgniter
  • prado
  • symfony
  • Yii Framework
  • Zend Framework
  • Phalcon
  • Laravel
  • ThinkPHP

ActionScript 三

  • PureMVC Standard for ActionScript 三

參考

  • JSP model 二 architecture

參考文獻

外部連結

  • An overview of the MVC pattern in Java from the Sun website
  • Model View Presenter with ASP . NET CodeProject article .
  • History of the evolution of MVC and derivatives by Martin Fowler .
  • ASP . NET MVC Framework Microsoft's Scott Guthrie on . NET MVC
  • Introduction to the ASP . NET Model View Controller ( MVC ) Framework Scott Hanselman builds an application step-by-step using the first CTP of the ASP . NET MVC Framework in this Introductory Video
  • Holub , Allen . Building user interfaces for object-oriented systems . Java World . 一千九百九十九 [二千空九四淋七十九] .(原始內容存檔佇兩千空五鋪十一鋪二).
  • Greer , Derek . " Interactive Application Architecture Patterns " , Ctrl-Shift-B , 兩千空七 .
  • Building Graphical User Interfaces with the MVC Pattern in Java