MVC 是什麼?
就 design pattern 來說,MVC 最近是常常被提起的。原因在於 web application 的流行。
web application 的設計上,基本的方式是採 server-client,將資料放在 server 上,
靠 transaction 傳遞資料。
因為 client 端要與 user 互動,都會設計一個介面接收使用者的指令或是顯示工作的結果。
目前最受歡迎的介面是圖形化介面(GUI),工作原理就是處理 user 所給予的事件 (event)。
說是 event 可能對某些人來說太籠統。簡而言之,程式設計師會在 GUI 所能接收的動作
(例如 user 用滑鼠點東西、在鍵盤打字等等),安排對應的程式碼來處理,
這就是基本的 event-driven 的程式設計。按照這方式的 web application,常見的形式就是
一個 database 在 server 上存資料,一個 server 程式接收 client 的 request,一個 client 程式
接收 user 的動作發出 request 給 server、接收來自 server 的 response、以及顯示工作的結果。
這樣的設計不是 MVC,優點是很直覺,以前的 web app 多是這樣設計,目前也很多是這樣。
然而,MVC 的設計對 web app 可以更好,原因等會再說,先解釋 MVC 是什麼。

MVC 三個字母,分別代表 Model, View, Controller。
Model 是儲放資料的方式,對應之前 database 的 table 部分並包含存取 datebase 的 method。
View 負責資料的呈現,對應之前 GUI 的功能。
Control 負責接收 user 的反應,對 Model 的操作,對應之前 server 及不包含GUI部份的 client。
這種設計,畫起圖來就長像下圖:



在傳統 procedure 程式設計的想法來說,MVC 設計實在佔不到便宜。
因為本來分工好好的 server-client 架構,client 就放在 user 的電腦,server 就放在服務提供者的電腦,
而改在 MVC 之後,就變得有點複雜了。
還記得以前為什麼要 client 放在 user 的電腦上嗎?因為它要負責 GUI,要負責與使用者互動,
因為以前的 browser 的技術與規格,沒有辦法做到互動,而現在都可以了。
也因此,除非有特殊需求,能不放 client 到 user 那裡,就不要放,省去安裝升級的麻煩。
那 View 的部份,就是指 browser 與對應的描述語言(jsp, asp, html),能表現資料就好了,透過 http,就等於把 GUI 丟到 user 那裡,
簡單的互動,由 browser 來應付,browser 應付不來的,傳回 server 來應付。
View 操作的是資料,用物件的方式來呈現,為了避免 View 直接操作 Model,所以需要 Controller。
View 直接操作 Model 的問題在於,要直接操作 Model,許多程式碼需要放在 View 裡面,
每一次 request ,View 都要全部送到 user 那裡,traffic loading 不小,
每一次 View 要改變表示方式,要重寫很多部份,
每一次 Model 改變儲存方式,View 也要重寫,
所以 controller 就當做它們的中介層,把操作跟儲存分開來,
設計得好,View 可以很小,要換 View 不用動到 Model 跟 Controller,更動 Model 不用動到 Controller 及 View。
甚至,寫好了一個 Controller 之後跟 View 之後,可以重複用,不同的 Model 可以有同一格式的顯示,
或是,一個 Model 套用不同的 Controller 及 View,就可以有不同的顯示。
我在說夢話嗎?
不是,如果你看看 Java, C++, GTK+ 的 TreeView 及 ListView,你會發現,
他們的 Model 可以長得一樣,就可以有兩種不同的表示方式。
如果你嫌麻煩的話,打開 windows 的檔案總管,他就是一個標準的 MVC 設計方法。
TreeView-TreeViewController-Model(file system)-ListViewController-ListView
左邊是 TreeView,右邊是 ListView,而且 ListView 還可以有大圖示,小圖示,列表式及詳細模式。
只要你把 Model 的 Method,按照 Controller 的需求做好,不用擔心其他的事,把 Controller 的 Model 設成你剛做好的,
顯示上的問題就不用擔心了。這就是 MVC 的魔力。
好像講太多話了,下一次我們來看看 VB6 的 TreeView 及 Java 的 TreeView 有什麼不同,
來體會一下,MVC 及非 MVC 的差別。

 

Ref:

創作者介紹
創作者 betaparticle的部落格 的頭像
betaparticle

betaparticle的部落格

betaparticle 發表在 痞客邦 留言(0) 人氣( 4043 )