Recca Chao 的 gitHub page

推廣網站開發,包含 Laravel 和 Kotlin 後端撰寫、自動化測試、讀書心得等。Taiwan Kotlin User Group 管理員。

View on GitHub

台灣網頁開發常常在吵這個問題,看得有點心煩,來碎唸幾句。

什麼是 MVC 架構

維基百科上面的說法是:「MVC模式(Model–view–controller)是軟體工程中的一種軟體架構模式,把軟體系統分為三個基本部分:模型(Model)、視圖(View)和控制器(Controller)。」

實際情況是怎麼樣呢?這個架構是用在軟體開發上面的架構。軟體開發上有時會有外觀(比方說軟體操作介面)的部分和邏輯的部分。MVC架構就是在這種狀況下所提出的。這個模式適合所有的軟體開發嗎?當然不會,舉例來說,linux 的指令列工具開發就不可能這麼多的外觀修改,所以不是所有的軟體開發都會使用 MVC 結構。

但是對多數網頁開發來說,這個結構卻很合適,因為網頁開發的傳統上習慣搭配前端處理外觀,搭配資料庫處理資料。因此就可以用「MVC」的概念:Model 處理資料庫的邏輯,View 處理前端的邏輯,最後用 Controller 處理商業邏輯。這也是為什麼多數網頁開發,如果使用「MVC框架」的話,最後變複雜的會是 Controller 而不是一般 MVC 開發常見的 Model。

model 為什麼變成資料庫結構的替身?

因為在網頁開發的習慣上,多數需要較長期的資料都會使用資料庫(p.s. 當然這會有例外,比方說使用文件儲存),所以 Model 首先會接觸資料庫的邏輯。

之後開發過程中又會發現,資料之間常常會有各種對應關係。所以各框架會建立起 model 的 relation。這樣分工之下,自然地就會將商業邏輯儲存在 Controller 裡面。也就導致了多數 PHP 框架的設計裡面,model 經常搭配了許多 relation 的函式,可以指定 model 之間的關係。

爭論造成的損失

對開發上的影響

因為這些爭論,最明顯的損失是,許多框架為了避免糾紛,特意閃避「MVC 模式」這個稱呼,反而造成開發上的麻煩。

比方說 laravel,不將存取資料庫的物件稱為 Model 了,變成放在 App/ 底下,需要移動到 Model 裡面的人自己去動。

l5-repository 這個套件則選擇了 entity 這個稱呼,存取資料庫所使用的類別改放在 App\Entities 裡面,雖然很聰明的繞過了 MVC 模式的爭論,但是也導致這個套件架構的特殊性。畢竟不是所有人都會將 Model 改稱為 Entity。

但是如果去看一些其他的框架,比方說 Yii,過去根本就不需要避諱這個稱呼,可以很大方地宣稱自己是「MVC framework」。

對新人學習的影響

對剛踏入這個領域的人來說,爭論「MVC」原始概念和現在概念的不同,其實是大可不必的一個過程。他們可以先學習多數人所說的「Model - 資料庫;Controller - 邏輯;View - 前端」這個觀念,之後再來補強其他產業的「MVC」定義為何,然後弄清整個歷史的前後關係。

結果現在卻變成了當有人要討論這個結構時,就有人跳出來爭論「這不是真正的 MVC 結構!」,然後新人的觀念就被搞亂了。

接著,後面所可以延伸討論的,比方說 model 之間的 relation 該怎麼設計,或者「repository-service-presenter」結構,或者「repository-criteria」結構,或者 validator,都無法討論下去了。因為要討論這些,都必須建立在「model 大多數情況下,會對應資料庫存取」的概念之下。

吵吵鬧鬧之後,沒有人得到什麼,但是新人的學習心力卻被犧牲了 。