---
# System prepended metadata

title: 'MVC (Model,View,Controller)'
tags: [正一]

---

# MVC (Model,View,Controller)

MVC 是一種==軟體架構模式==，把系統分為 Model, View, Controller。它的設計概念是以關注點分離（seperation of concerns, SOC)為基礎，將應用程式拆解成不同的功能面向，各自處理負責事項；強調團隊分工的概念。

這三個套用在 Web 分別為前端 HTML+CSS (View)，後端 API 資料庫(Model)，控制後端資料庫的接口 JavaScript (Controller)。


> 網站的開發過程中，如果沒有設立架構，需求要什麼就寫什麼，到最後，會留下一堆所謂的技術債，讓之後每次的更動，都得花較久的時間統整，或是有很多隱藏的Bug。  



+ View：前端畫面與邏輯顯示
+ Controller：處理控制流程和回應
+ Model：後端資料庫進行運作

</br>

## 流程

當 Controller 收到請求後，Controller 會通知 Model 調度資料，接著再把資料傳遞給 View 來產生樣板，在回傳給Controller進行回復，最終將呈現資料的 HTML 頁面回傳到客戶端的瀏覽器。
</br>

![image](https://hackmd.io/_uploads/Hybd9rqS6.png)


## View
+ View 常譯為「視圖」，View 所管理的功能層叫作「表現層 (presentation layer)」，顧名思義是負責管理畫面的呈現，也就是 HTML 樣板 (template)，但實際回復使用者的還是得透過Controller。

+ 在開發框架裡，因為 HTML template 會有需要以動態顯示資料的情況 (也就是由 Model 取出的資料內容)，所以 View 會再進一步運用樣板引擎 (template engine) 將資料帶入 template。
</br>

![image](https://hackmd.io/_uploads/SkgaF3HS6.png)
> notifications是一個陣列。陣列內裝有所有的 notification 資料，這是以迴圈的方式一筆一筆撈出 notifications 裡面所有的資料。
文法像是 {% 、{{ 則會根據不同語言的 HTML 產生引擎會有所不同。


## Controller
+ Controller，是整個運作過程中的核心，負責收發 Request 與 Response ； 在Controller 會設置不同的事件(ation)，觸發了不同的 action，Controller 就會啟動後續一系列的行為。

+ Controller決定了應用程式的工作流程 (workflow)，並且蒐集不同元件的工作結果，統一回傳給使用者。

### 常見事件(ation)設計問題:
+ 使用者是否需要先登入 (認證) 才可以看到網頁內容？
+ 使用者是否只能閱讀資料，但不能修改或刪除？
+ 使用者新增了資料之後，會重新導向至哪個頁面？


## Model
+ Model，代表資料模型，主要負責==資料的操作與邏輯==，若使用者想要對資料進行「新增、修改、刪除、瀏覽」的動作，Model會跟軟體的資料庫進行溝通(例如:到資料庫提取該使用者的資料)。

+ Model 幫忙去資料庫裡取出必要的資料，把資料放進應用程式裡的某個程式物件，然後才能用 JavaScript 去操作該物件。
> 不一定都使用JS，有些開發者會使用Java、Python、Ruby 或 .NET 等，處理商業邏輯和數據存取，以提供更為豐富和互動的用戶界面。

> 如今JS的發展日新月異，也能做到上述語言的擁有的邏輯操作，所以能考慮統合一種語言，來提升開發效率及便利性。

### 範例
電商網站：

+ 會員購物有九折、訂單超過一定的金額免運費
+ 檢查登入帳號的類型，並依此開放不同權限

社交網站：
+ 判斷使用者彼此之間的友好程度

To-do List：
+ 過了期但沒被執行的 to-dos 不能被刪除

這些邏輯出自於產品本身的需求或是規則。它們是==獨立於網頁介面的商業邏輯==，因此之後改變載體，如手機 App 等相關應用程式，這些商業邏輯在大部分情況是通用的。這些邏輯相關的程式碼應該被分類到對應的 Model 檔案裡。


## MVC 架構的優劣
### 優點:
+ 重複使用：由於 MVC 三塊獨立，同一套 Model，針對使用場景不一樣，透過不同的 View 來呈現，能最大化程式碼的使用效率。

+ 容易維護：三塊獨立，可以讓你在不破壞現有架構下，進行擴充或修改，大幅提升開發效率。

+ 明確分工：在實際工作時，能大致分兩塊 功能設計 與 網頁設計，以加快開發速度。

### 缺點:
+ 不適合小型項目：對於小型或非常簡單的項目，MVC架構可能會引入不必要的複雜性和開發成本。

+ 性能問題：在某些情況下，MVC架構可能會導致性能問題，例如，過多的數據綁定和模型更新可能影響用戶界面的響應速度。

## 參考資料
[MVC架構是什麼？認識 Model-View-Controller 軟體設計模式][1]

[「筆記」- 何謂 MVC 軟體設計模式][2]

[1]: https://tw.alphacamp.co/blog/mvc-model-view-controller

[2]: https://medium.com/pierceshih/%E7%AD%86%E8%A8%98-%E4%BD%95%E8%AC%82-mvc-%E8%BB%9F%E9%AB%94%E8%A8%AD%E8%A8%88%E6%A8%A1%E5%BC%8F-af1ff10901e6