Miles' Blog

天涯何處無幹話,何必要講實務話

MVC

在專案開發的時候,可能會遇到以下問題:

  • 視覺美觀和程式混雜在一起,難以分辨
  • 程式碼除錯因包含視覺美觀,所以更難找到關鍵有問題的程式碼
  • 擴充功能時,常常會因為動到一個變數,導致整個系統需要大變動
  • 多人開發專案常常會因為程式碼的連帶關係,變成必須等待關鍵程式碼完成,才能進行下一階段開發。

有以上問題,先說聲恭喜。因為代表 Coding 技術可以再前進了一大步。

以上問題首選的解決方法就是--使用 MVC Design Pattern。MVC的目的是要實作一個低耦合的框架基底,使得擴充功能或是後續修改的問題都能夠有效降低。

以下以 PHP 語言說明 Web MVC 的觀念

Basic Concept

MVC 是一種軟體設計的模式,它裡面有三種主要元件:

  • Model (資料讀取)
  • View (視覺美觀)
  • Controller (流程控制)

此三種主要元件的互動如下:

PlantUML code

@startuml
class Browser
class Model
class View
class Controller

Browser -> Controller
Controller <-> Model
Controller --> View
View --> Browser
@enduml
  1. Browser 對 Controller 提出 Request。
  2. Controller 依 Request 去提取 Model。
  3. Controller 依 Request選擇適合的 View,並傳送 Model 的資料給 View 準備做顯示。
  4. View 將資料放入樣版中,並輸出給 Browser。

Model

Model 是負責處理資料相關和存取的元件。

Model 設計要注意以下重點:

  • Model 不會有任何 HTML 或任何輸出,因為它不管資料如何呈現
  • 同理,Model 不會出現 echo、print、header、exit 等輸出內容的方法
  • 只有 Model 才能存取資料庫、檔案或其他資料媒介
  • 不可直接存取 GET/POST/COOKIE… 等全域變數
  • 只有 Model 會出現資料結構與演算法

Model & Table

Model 與 Table 的關係如下,都是合理的:

  • 一個 Model 對應一張 Table,這也是最常見的狀況
  • 一個 Model 會從許多 Table 取得資料並組合
  • Model 沒有對應的 Table

畢竟,Model 是一個 Layer,跟 Database 並沒有絕對要直接一對一的關係

Library

多個 Model 常做同一件事的話,可以改使用 Library。

View

View 決定了資料該用什麼方式呈現,如:可以用 HTML/XML/RSS/JSON 不同的格式輸出;也可以做不同版面設計的輸出,像手機版、電腦版和列印版等。

View 設計要注意以下重點:

  • 唯一可以出現 HTML/XML…. 的檔案
  • 不可直接存取 GET/POST/COOKIE… 等全域變數
  • 依輸出方式不同,可能會有 if/else/switch/for 等
  • View 會用 Model 取得的資料做輸出,但實際上它不需要理會 Model 是如何設計的

Controller

Controller 是唯一會直接接受 client 的要求,並會依 client 要求去取得需要的 Model,並選擇 View 做輸出。

Controller 設計要注意以下重點:

  • Controller 不會有任何 HTML,因為它不管資料如何呈現
  • Controller 不會有任何 SQL 或是 fopen 等存取資料的方法
  • 理論上會用到流程控制只會有 if/else/switch,而不會有for

Helper

Helper 通常處理的都只是單純資料格式轉換,或是產生 HTML 等。所以通常都是 View 和 Controller 會出現。

Else

其他相關名詞:

  • Service - 從 DAO / Model 取出資料後,整理出對 Service 有意義的資料
  • DAO - Data access object - 存取資料的物件
  • DTO - Data transfer object - Controller / View / Service 共用的傳輸資料媒介

References

0%