星期二, 1月 15, 2008

Web 程式開發之 MVC 架構心得分享

從1994年 internet 開使風行 , 網站的開發經過了不少演化過程 , 從最早的純HTML -> CGI , javascript , java applet -> PHP/FI -> ASP -> JSP -> ASP.net , Java 6 ,PHP5 , 這段期間IT人不斷的學習新版本語言,嘗試新的架構,而軟體領域也被區分成web-baesd與Desktop application 2大陣營 , web-based application 通常透過Web browser 啟動 , 可以提供給多人同時使用  , 有著版本更新容易 , 不用擔心使用者硬體環境的優勢 , 但也有著執行效能不佳 , 無法有Desktop程式那麼多powerful 及底層的運算的問題 ,  在軟體開發流程上 , 散亂的web-based程式 , 總是把UI(HTML + CSS  + javascript)與Server side script (ASP PHP JSP)混在一起開發 , 因此常出現Art designer 與 UI designer 和 programmer 共同存取修改同一個檔案造成衝突 , 並加深了溝通的Cost ,  因此大家又開始推廣MVC的架構 , 想讓系統擺脫HTTP導向的開發模式 , 轉向較佳的軟體工程架構,以下是MVC的示意圖

MVC-Applied-Servlet

簡單的說

View : 就是Html 或 JSP檔  , 要呈現給user的結果頁 .

Model : 就是 java bean  , 通常直接存取資料庫

Control : 決定view 的action 要取用那一個Model 

這樣的架構其實在ASP當紅時期也有玩過 , 但當時會把大量的html 包在 DCOM(Model)裡 , Control 可以用ISAPI來實現 , 而View就是ASP或HTML , 但對中小型網站及小團隊這樣的架構反而讓開發及維護變複雜 , 並讓新進人員無法很快上手, 或許對大型的系統 , 如開發企業應用軟體、ERP、金融系統.....等需要穩定及嚴謹的架構應該比較適合.

但MVC的擁護者當然不會輕言放棄,最近在JAVA平台最常被使用的首推Stutus framework了 , 目前已經演進到2.0 ,似乎有越來越受歡迎的趨勢,其架構如下 :

mvc2_struts

before_after

其特色為:

1.在View 用Tag libary 取代傳統的JSP語法 , 讓前端的code更為乾淨簡潔

2.提共多種Control可以實做 , 僅需將結果集或資料填入View , 讓View去處理呈現的部分即可, 可針對純邏輯層寫Action 或 針對前端表單寫ActionForm , 另外還有ActionForward , ActiomMaping

image1

由此圖可看出Struts 不碰Model端 ,為極輕量的framework , 背後有Apache 組織的支持 , 目前加入全球化及AJAX的支援, 相信會越來越普及。

  最近Microsoft 陣營也不甘示弱 , 在ASP.Net 3.5 Extensions 開始支援MVC架構, 結合VS .Net 2005 看起來蠻容易上手的,並可直接做test.

TddDI-Project-Tree_3

看來MVC又變成Web programmer 一定要了解的架構 , 但有點值得玩味的 , 這波Web2.0 的網站有多少網站用到這樣的架構, 相信大多數靠創意為生的web2.0網站一開始決不會用此架構來開發,因為該類型網站的架構及功能一直處於變動演進的狀態, 前後端都有變動的需求,很難一開始就拆解得很好,對於這類長期在beta version的網站 , 應該是在功能及流量趨於穩定成長且開發人員增加到一定數量時再考慮改版導入,我最擔心的是IT人的自負通常會認為完美的架構可以解決一切,而花大把的時間投入開發及鑽研技術,這樣容易痛失市場的先機,說句難聽的, 你的code多爛用戶看不到 , 不友善的界面和流程 , 不好用的功能才會讓用戶退卻,技術架構 、介面流程、 開發效率 一定要取的均衡才能面對這快速變動的市場 。

資料參考來源

http://www.jcorporate.com/expresso/doc/edg/edg_WhatIsMVC.html

http://www.ibm.com/developerworks/cn/java/j-struts/

http://www.ibm.com/developerworks/cn/websphere/techjournal/0302_fung/fung.html

http://haacked.com/archive/2007/12/07/tdd-and-dependency-injection-with-asp.net-mvc.aspx

沒有留言: