以下是 MVC 解釋得很清楚 , 但我程度差還是看不太懂 , 有人可以白話說明嗎 ?
MVC 架構包括下列元件:
模型。 模型物件屬於實作應用程式資料網域邏輯之應用程式的一部分。 通常,模型物件會擷取和儲存資料庫中的模型狀態。 例如,Product 物件可能從資料庫擷取資訊、操作該資訊,然後將更新的資訊寫回 SQL Server 資料庫的 Products 資料表。
在小型應用程式中,模型通常是概念上的分隔而不是實體分隔。 例如,如果應用程式僅讀取資料集並將它傳送到檢視,則應用程式沒有實體模型層和相關聯的類別。 在這種情況下,資料集會接替模型物件的角色。
檢視。 檢視是顯示應用程式中使用者介面 (UI) 的元件。 通常此 UI 是從模型資料建立。 例如 Products 資料表的編輯檢視,它會根據 Product 物件目前的狀態顯示文字方塊、下拉式清單和核取方塊。
控制器。 控制器就是元件,可以處理使用者互動、使用模型並且在最後選擇可以轉譯要顯示 UI 的檢視。 在 MVC 應用程式中,檢視只會顯示資訊;控制器則會處理和回應使用者輸入和互動。 例如,控制器會處理查詢字串值,並且將這些值傳遞至模型,接著模型可能會使用這些值查詢資料庫。
一言以蔽之,MVC 就是要你把程式裡面關於 UI 的部份給獨立出來,不要把執行工作的程式與顯示畫面的程式碼都混在一起寫。
獨立出來的 UI 部份稱為 View,剩下那部份執行工作的程式就叫做 Model。由於 View 與 Model 應該是要完全獨立不互相依賴的,因此增加一個 Controller 來作為兩者的橋樑。
用個很簡陋的計算加法的例子:
// 取得輸入值
$num1 = $_POST['num1'];
$num2 = $_POST['num2'];
// 計算結果
$result = $num1 + $num2;
// 輸出畫面
echo '<div class="result">', $result, '</div>';
如上,一段程式裡面有負責輸入資料,處理資料,顯示畫面。一般新手入門大概也都是這麼寫的。這麼做有什麼問題網路上已經很多論述了,所以就不再補充。
接著把程式拆分成 View 與 Model,拆分之後看是要變成函式,類別,還是獨立的檔案都行,MVC 本身沒有規定那麼多(但是 MVC Framework 通常會有規範)。
這是 View:
// 取得輸入值
function get_input() {
return [$_POST['num1'], $_POST['num2']];
}
// 輸出畫面
function display_result($result) {
echo '<div class="result">', $result, '</div>';
}
Model:
function sum($a, $b) {
return $a + $b;
}
好了,拆分完了以後誰也不認識誰,不管你是要變更 View 還是變更 Model 都不會影響到另一方。但是你需要一個中間人來整合兩邊的功能,也就是 Controller:
require "view.php"
require "model.php"
$input = get_input();
$result = sum($input[0], $input[1]);
display_result($result);
寫成符合 MVC 模式以後的好處也是網路上一大堆了,所以我只舉一個比較有用的例子。有時我們做網站會有些功能希望以網頁以外的形式執行,例如修改使用者帳號的功能可以從網頁做,也希望可以由終端機執行命令來修改。那如果我們要把上面這個例子的 UI 輸入/輸出改成從終端機呢?
ConsoleView:
// 從終端機取得輸入值
function get_input() {
global $argv;
return [$argv[1], $argv[2]];
}
// 輸出畫面
function display_result($result) {
echo "result is $result\n";
}
Controller 只有更換了 View 的檔案名稱而已,載入不同的 View 就達成了切換使用者界面的需求了。
Controller:
require "consoleview.php"
require "model.php"
$input = get_input();
$result = sum($input[0], $input[1]);
display_result($result);
這就是我個人能最簡化的 MVC 形式。事實上 Controller 與 View 或 Model 之間的溝通方式可以有很多不同的形式,因此有時更換 View 也要一併修改 Controller,同樣更換 Model 也可能要修改 Controller。但是更換 View 絕對不會需要改 Model,反之亦然。
最後提一下,遵照 MVC 的規則設計出來的叫做 MVC Framework。 asp.net MVC 是一種,另外還有各種不同的語言都有各自不同的 MVC Framework。然而並不是用了 MVC Framework 你的程式就符合 MVC 了,用 MVC Framework 寫成一團漿糊的人也不是沒有。
還有,對於 MVC 的 Model 其實有很多的爭議,到底什麼東西該放在 Model 裡面,已經快變成宗教戰爭了。我寫的是其中一種形式而已,你可能還會看到各種各樣不同的論述,不要感到奇怪。
Model:資料結構,通常我們會把相關聯的資料放在一起,然後透過簡單的連結去處理一些資料集的一對一、一對多、或多對多的關係。基本上都是資料庫的表格、欄位定義。
View:處理資料呈現,也就是使用者看到的網頁,包含UI/UX、一些需要使用者輸入的資料及驗證工作。通常使用html、javascript、CSS
Controller:負責處理前端瀏覽器輸入的資料,運算後存入資料庫中,各種語言都可以用,看你習慣那種。
為什麼要分成這樣,一方面中、大型專案通常需要分工,這樣可以讓前端和後端同時作業,兩方只要溝通好該呈現的資料就行了。另一方面,這樣可以把不同的程式語言分開,增加可讀性。
PS.這是在web開發這塊的大致劃分。