前輩看到我一臉茫然,馬上了然於心
開始熱心地一大串解釋,在我的螢幕上各種比畫比畫……
我這菜鳥只是保持尷尬又不失禮貌的微笑 ^_^
我很努力想理解,但能進到腦袋的真的不多)抱歉了前輩
總之我當下只能手邊猛抄關鍵字:
Modal(還寫錯 a!)
還有 V 什麼……喔!View!
跟 C……來不及啦!
前輩講完之後,我就默默打開我的程式助教 ^_^
……你們懂。
剛剛前輩說什麼 MVC?那是什麼?
MVC 是一種把程式分成不同責任的架構方式
分成:
Model
View
Controller
先用我目前菜鳥版的方式理解:
| 名稱 | 菜鳥版理解 |
|---|---|
| Model | 放資料,以及和資料有關的規則 |
| View | 顯示給使用者看的畫面 |
| Controller | 接收使用者的請求,決定接下來要做什麼,再把結果交給 View |
但老實說,我第一次整理完這張表格後,還是滿頭問號。
因為每一個字分開看都懂,放進專案裡就不知道它們到底怎麼合作。
所以我又繼續問:
可以用生活中的例子解釋嗎?
AI 給我的比喻是:
大概可以想成:
客人提出點餐需求
↓
服務生接收需求
↓
廚房準備資料和餐點
↓
服務生把完成的餐點送回客人面前
對應到 MVC 就是:
User 發出請求
↓
Controller 接收請求
↓
Model 提供或處理資料
↓
Controller 把資料交給 View
↓
View 顯示畫面給 User
菜鳥版流程可以先記成:
User
↓
Controller
↓
Model
↓
Controller
↓
View
↓
User
嗯……
看到這裡,我還是不禁懷疑:
用這樣學程式真的可以嗎?
各位大佬看到會不會吐血 XD
不過算了。
對現在的我來說,先知道它們大概各自在做什麼,比一開始就硬背一堆正式定義重要。
餐廳比喻很好懂,但我後來也發現,它只能幫忙建立初步概念,不能完全等同於真正的 MVC。
例如 Model 並不只是「廚房」。
Model 可能包含:
而 Controller 也不只是負責把東西送來送去。
它通常還會:
所以更精準一點的理解是:
MVC 是把接收請求、處理資料和顯示畫面的責任拆開。
這樣每一部分的工作比較清楚,也比較容易維護。
餐廳比喻只是讓我更容易理解,但還是要實際回到專案中對照
到 Visual Studio 的方案總管裡,真的去找:
Models
Views
Controllers
然後開始對照資料夾內容
我在 Views 裡看到很多:
.cshtml
這些檔案裡面有熟悉的 HTML,所以我先確認:
View 確實和畫面有關。
接著我在 Controllers 裡看到很多檔名以:
Controller.cs
結尾的檔案。
例如概念上可能會看到:
HomeController.cs
UserController.cs
ProductController.cs
打開後,裡面通常會出現一些方法:
public IActionResult Index()
{
return View();
}
雖然當時我還看不懂全部語法,但至少能先觀察到:
Controller 裡有一個 Index 方法
↓
方法最後 return View()
↓
程式會去找對應的 View 畫面
這時候,原本只存在於餐廳比喻裡的 MVC,才開始真的和專案結構連起來。
用最簡化的程式碼來看,Controller 可能長這樣:
public class HomeController : Controller
{
public IActionResult Index()
{
return View();
}
}
這段可以先理解成:
使用者進入首頁
↓
請求進到 HomeController
↓
執行 Index()
↓
return View()
↓
回傳首頁畫面
對應的 View 可能放在:
Views
└── Home
└── Index.cshtml
所以目前菜鳥版可以先記成:
HomeController 的 Index()
↓
對應 Views/Home/Index.cshtml
這不是所有情況都只能這樣配對,但它是 ASP.NET Core MVC 很常見的預設慣例。
這也讓我第一次理解:
Controller 和 View 並不是隨便放在兩個資料夾裡,它們之間其實有命名和路徑上的對應關係。
View 和 Controller 還算看得到。
但 Model 對我來說比較抽象。
例如 Controller 可能先建立一筆資料:
public IActionResult Index()
{
var user = new UserViewModel
{
Name = "Abbie"
};
return View(user);
}
接著 View 可以接收這筆資料:
@model UserViewModel
<h1>@Model.Name</h1>
最後瀏覽器看到的結果可能是:
<h1>Abbie</h1>
這段流程就是:
Controller 準備 Model
↓
Controller 把 Model 傳給 View
↓
View 使用 Model 裡的資料
↓
產生 HTML 畫面
這時候我才比較理解:
Model 不只是資料庫裡的一張表,也可能是專門提供畫面使用的資料物件。
我又繼續問 AI:
全部寫在同一個檔案不是比較快嗎?為什麼一定要拆成三個?
AI 回答了一堆「關注點分離」、「可維護性」、「可測試性」。
我還是一樣,每個字都看得懂,但很難有感覺。
後來我用自己的工作情境去想。
假設所有東西都寫在同一個檔案:
HTML
CSS
資料庫查詢
表單驗證
按鈕事件
商業規則
全部混在一起。
專案小的時候可能還勉強看得懂。
但企業專案檔案一多、功能一大,要修改一個畫面時,就很容易不知道:
MVC 拆開後,可以先大概判斷:
| 問題 | 優先查看 |
|---|---|
| 畫面排版、按鈕、文字 | View |
| 使用者操作後進到哪裡 | Controller |
| 顯示或接收哪些資料 | Model |
| 實際業務邏輯 | 可能在 Service 或其他類別 |
這裡也讓我發現:
真實的企業專案通常不會只有 Model、View、Controller 三種東西。
還可能有:
所以 MVC 是一個重要的起點,但不是整套企業專案的全部。
這次 AI 一開始先給我正式定義。
但我還是看不懂,所以我繼續追問:
可以用生活例子嗎?
Controller 是不是只負責傳資料?
Model 是不是就等於資料庫?
View 是不是就是 HTML?
為什麼要拆成三個?
我要怎麼在專案裡找到它們?
經過一來一回後,我才慢慢修正原本過度簡化的理解:
原本理解:
Model 就是資料庫
Controller 就是服務生
View 就是畫面
修正後:
Model 是畫面或程式需要使用的資料與規則
Controller 負責接收請求、協調處理流程並回傳結果
View 負責使用資料產生畫面
不過真正讓我懂一點的,還是回到專案裡確認:
Controllers 裡是不是真的有 ControllerViews 裡是不是有對應的 .cshtml
return View()
AI 幫我把第一層概念講簡單。
實際專案則幫我確認,這些東西不是只存在於課本裡。
目前我先記得:
Controller
接收使用者的請求,決定要執行什麼
Model
提供程式或畫面需要的資料與規則
View
使用資料產生使用者看到的畫面
最基本的流程是:
User 發出請求
↓
Controller 接收請求
↓
取得或準備 Model
↓
Controller 把 Model 交給 View
↓
View 產生 HTML
↓
回傳給 User
不過看到 View,我真的有一種莫名的親切感。
就是畫面啊~~
就是眼睛看得到的東西啊~~
好,這個我至少比較熟!
所以接下來,我決定先鎖定 View 這個東西去工作。
下一篇:
View 裡為什麼不是
.html,而是一堆.cshtml?