【軟體設計模式】Model,View,Controller 架構 (MVC )
Published:
by .Model,View,Controller 架構 (MVC )
在應用程式開發的領域裡,相當重視「關注點分離 (separation of concerns, SOC) 」的設計原則,從字面上的意思,就是把整個應用程式分拆成不同功能層 (layer) 或程式碼模組 (module),每個區塊有各自的關注點,彼此分工合作。
什麼是MVC?
Model、View、Controller的區分,是希望能把應用程式的內部運作歸納成不同的部門,讓每個部門各自負責不同的關注點。
換句話說,就是把「不同意義的程式碼放在不同的檔案裡」
MVC架構程式有以下幾點優點:
- 擴充性高
- 方便管理
- 使程式結構更直覺
- 有利於團隊分工
Model
Model 常被翻譯成「模型」,負責和資料庫溝通。
這裡我們要先注意:
- 應用程式和資料庫是兩個不同東西。
- 要做「增刪改查(CRUD)」的動作就先需有Model層幫忙去資料庫裡取出必要的資料,把資料放進應用程式的某個程式物件。
Model 這種放資料、與資料庫連動的物件,會被稱為Model物件,由Model層來統一管理。
Model 管理的功能層被稱做「邏輯層」,更明確一點說,是和「商業邏輯」有關的功能
Example
- 電商網站:
- 會員購物有九折、訂單超過一定的金2. 額免運費,檢查登入帳號的類型,並依此開放不同權限
-
社交網站:判斷使用者彼此之間的友好程度
-
To-do List:過了期但沒被執行的 to-dos 不能被刪除
這些邏輯出自於產品本身的需求或是規則。它們是獨立於網頁介面的商業邏輯,如果之後又另外開發了如手機 App 等相關應用程式,這些商業邏輯在大部分情況是通用的。和這些邏輯相關的程式碼應該被分類到對應的 Model 檔案裡。
View
也就是前端所呈現的程式碼部分
View 常譯為「視圖」,View 所管理的功能層叫作「表現層 (presentation layer)」,顧名思義是負責管理畫面的呈現,也就是 HTML 樣板 (template)。
View 在此則是擔任將 Model 視覺化的要角。 View 需要去執行 UI 相關的工作,或當 user 與 app 互動時與 Controller 溝通。 他不會參與到太多有關邏輯運算的工作,也不需知道 user 與 app 互動時的狀態為何。
Controller
透過GET/POST…等來接受所需處理所傳送的資料。
Controller 常譯為「控制器」,它掌握使用者互動邏輯,也是應用程式收發 request/response 的核心。來自路由的 request 會先被送到 Controller,再由 Controller 通知 Model 調度資料,並且把資料傳遞給 View 來產生樣板 (template),並將呈現資料的 HTML 頁面回傳給客戶端。
你可以把 Controller 想做是 MVC 架構的中間人,它決定了應用程式的工作流程 (workflow),並且蒐集不同元件的工作結果,統一回傳給使用者。以下常見的設計問題,會由 Controller 來控制:
- 用者是否需要先登入 (認證) 才可以看到網頁內容?
- 使用者是否只能閱讀資料,但不能修改或刪除?
- 使用者新增了資料之後,會重新導向至哪個頁面?