這篇文章最早是用來回應 Python 社群對於 MVC 的討論內容,同時把它記錄在自己的部落格上。

其原文探討的是為什麼每套 Framework 對於 MVC 設計上都有一套自己的見解,即使設計和實作上不一樣,卻都說自家的 Framework 包含(支援) MVC。

在討論這個問題之前,我們首先要認識一下 MVC 的由來,至於有關 MVC 設計的細節將不是本篇的重點,對細節有興趣的人可以從我文內分享的文章或是從書本中得到更完整的說明。

什麼是 MVC

MVC-Process.svg
圖片 "MVC-Process" 由 RegisFrey - 自己的作品。 使用來自 维基共享資源 的 公共領域 條款授權。

MVC 最早是 smalltalk 設計的一個 Pattern,其定義目的模擬實作的方法在 Design Pattern 一書中都描述的相當清楚,有興趣可以去書店翻一下。

網路上可以參照: http://www.tutorialspoint.com/design_pattern/mvc_pattern.htm

目的與 MVC

這邊要著重的點在於,Design Pattern 書中不是要強迫你實作的內容百分百一樣,而是要求你的實作要達到 Pattern 目的,我在這邊列出中文書上對於其目的的說明:

MVC 的目的在於增加彈性再利用性,同一個 model 可以搭配好幾個 view,也可以做出不會改變 model 內容的 view,同時更嚴苛的要求,view 不應該包含運算的邏輯。

因此不是去追究每套 Framework 在設計上的差異去與定義比較,然後要說它的設計到底要不要叫做 MVC,而是要去看設計之後是否能達到 MVC 目的。

MVC 是 Architecture Pattern

後來有人在社群裡提到 Architecture Pattern 之後,我才想到 MVC 是在 Design Pattern 一書中開頭章節就列出來的,並沒有包含在後續主要章節所描述的23個 Design Pattern 之中,其介紹上也顯示 MVC 更像是一個 Architecture Pattern。

那 Design Pattern 和所謂的 Architecture Pattern 又有什麼不同呢?

根據 Stackoverflow 所描述的回答,我覺得兩種 Pattern 還是從目的實作兩個層面來看最容易區分。

Stackoverflow 的回答可以參照: http://stackoverflow.com/questions/1866821/is-mvc-a-design-pattern-or-architectural-pattern

節錄其中 vrluckyin 的回答,針對目的和實作上的差別都有很清楚的描述:

Design patterns say how to write code effectively.

A few benefits:

  - Easily Maintainable
  - High Re-usability
  - Readable because of abstractions

Architectural patterns say how to utilize resources effectively.

  - Parallel tasks execution like programmers and graphic designers can work parallel.
  - Multiple technologies can be utilized to build a software.

In MVC, a). Views can be created using javascript templates and also html can be used b). Controllers can be written .NET framework and c). Models can be written in Java - a java service may be used that returns only json data.

While in design pattern, a pattern can't be implemented in which code can be written in multiple technologies like AdminUser class in Java, Customer class in C#, Partners class in Php and a factory pattern in Ruby :); hmmm..so easy?:)

除了目的就不同, Design Pattern 在實作上會存在需要使用同一種技術語言完成的先天條件,而 Architectural Pattern 則沒有這樣的限制,所以每套 Framework 只要實作出來的結果符合 MVC Pattern 的目的,並且保證使用者擁有 MVC Pattern 的優點,就算實作的方式不盡相同,也代表其包含(支援) MVC。