從專案工程化的角度,談一下 MVC 與 MVVM
對於很多程式設計的初學者來說,MVC 的設計理念和 MVVM 的設計理念總是難以掌握,其實這種現象也屬正常,因為很多在初學階段的人,沒有經歷大型專案開發的經驗,更沒有對程式設計的工程化體系的發展及歷史進行過研究,更是少有人提及程式設計工程化的概念;其實,對於目前的各種設計理念,都是程式設計工程化發展的產物;
大家可以先看一下圖,這基本是我對程式設計工程化發展的一個瞭解,以一個大家最習以為常的網站作為工程專案的代表來展示,圖中的內容雖然可能並不完善,也不可能完全說明白工程發展的整個歷史,這僅僅是一個簡易的圖示:
正如上圖所示,在工程發展的第一個階段,工程師並沒有一個相對明確的分工,基本是出於一種 “啥活都幹” 的階段,在這個階段中,出現了一種程式語言,他讓工程師可以在程式碼中直接嵌入HTML、CSS、JS等前端程式碼,可以直接連線資料進行CURD操作,不需要關心資料庫的讀寫壓力,可以與現有成熟的HTTP伺服器合作,不需要關心客戶端的 HTTP 請求壓力(不管是資料庫還是http伺服器,當時的實際壓力也沒有現今那麼大);
WordPress 將這種開發模式推向了極致,成為混合嵌入式程式設計的典型代表; Discuz基本算是國內最為典型的代表了;
而隨著專案工程量的加大,專案程式碼的複雜度隨之加大,一個人甚至5-10人的小型團隊,再也無法適應這種開發模式,於是出現了適應團隊協作開發的 MVC 模式,如下圖:
MVC設計模式的出現,在一定程度上依賴於另外一項關鍵技術的成熟,就是模板引擎;
其實模板引擎技術並不複雜,而是繁瑣,基本原理就是前端HTML中寫關鍵字元以期承載資料,然後再交由後臺將前端HTML程式碼中的關鍵字元進行正則匹配,替換為真實資料;
模板引擎的關鍵點並不是技術,而是在一定程度上解脫了後臺程式員,他們不再寫頁面和JS指令碼了,這些工作大部分交給專業的前端工程師來完成,後臺只需要在頁面完成後讀取並交由模板引擎進行二次處理即可;這基本就實現了程式碼工程的分離;
而MVC的設計模式也是相對靈活的,對於小型技術團隊來說,C層與M層的分離其實並不徹底,邏輯與資料之間的處理大部分情況下依然交與後臺完成,邏輯層與資料層僅僅實現了程式碼邏輯上的分離,並沒有實現工程上的分離;
但大型技術團隊中已經實現了邏輯與資料操作的分離,DBA(資料庫工程師)一般會提供資料操作中介軟體,以供C層根據業務邏輯呼叫處理資料;
而此時,PHP的優勢就顯得不是很明顯了,大量程式語言出現了同質化的現象,說好聽點應該是 百花齊放 ;
目前依然有大量專案在使用MVC的設計模式進行專案開發,而隨著移動網際網路的發展,MVC 設計模式的最大BUG也凸顯出來,它沒有從正真意義上實現前後端的分離,而是淺層次的實現了前後端工程上的分離,也就是後臺程式設計師不寫頁面程式碼而已;
這種模式,對於移動端裝置,完全失去了意義,相同的業務邏輯和資料處理,網站需要一套程式碼,針對移動裝置又需要另外一套程式碼,工程量翻倍不止;但在MVC的發展道路上,也有人試圖突破這種模式已期解決MVC的BUG,但歷史證明是不成熟的,就是不使用模板引擎,從伺服器獲取靜態頁面後,使用大量的ajax獲取資料並更新到頁面,這種做法,確實實現了前後端工程及資料的徹底分離,為前端工程化的發展提供了關鍵性思路設想,
而它最大的BUG就是需要前端程式設計師大量且繁瑣的操作DOM已向用戶展示資料,痛苦不堪,雖然 jQuery 從一定程度上減緩了這種痛苦,但這並不是MVVM,所以 jQuery 也不是終點,但這種設計是對前端工程化發展具有歷史性意義的……
且看下圖:
我在上面的圖示中展示了兩個伺服器,是想盡可能的為大家理清 MVVM 在整個專案開發中的作用和關鍵位置,真實專案開發中,可以是一臺或者多臺伺服器,不要被圖示誤導;
其實 MVVM的設計,本質上就是解決了前端程式設計師大量繁瑣的操作DOM的問題,資料的請求獲取依然依賴於Ajax技術,但是,資料獲取後的展示,不再是操作DOM,而是交由中間的VM層來處理;
前端有了MVVM的設計思想後,終於實現了前後端工程及資料的徹底分離,而這種設計思想,目前也大量應用於各種新專案的開發,於是各種前端框架如雨後春筍般拔地而起,前端的ARV三大框架就是典型代表;
前端有了資料處理及展示的獨立能力後,後臺就可以只針對資料邏輯進行處理了,而這樣的後臺資料服務設計,不僅適用為網站開發提供資料支援,更適用於為移動端提供資料支援,後臺不再需要關心資料展示的問題,也因此有更多的精力來處理併發請求及複雜的資料庫 I\O 等問題;,後臺也不再需要模板引擎技術,後臺 MVC 就變成了 MC ;
也因為有了對MVVM設計實現的這些框架,使前端工程師才有了應有的程式設計地位,不再是一個縮在角落裡聽從後臺程式設計師指揮的小角色,大量新專案的開發需要更多的前端工程師,而前端開發也走向了正規的工程化設計開發,目前各大公司對前端程式設計師的大量需求也得益於此,當然前端工程師的收入也是水漲船高;
另:有一次和一個程式設計師聊天,他竟然天真的認為MVVM是對MVC的替代升級,我竟無言以對……
當然,如果你看完了還不知道我在說什麼,那麼我就是在一本正經的胡說八道……
文章首發: https://note.youdao.com/share/?id=f56ff8335c86122ec1e6eaa4208d033a&type=notebook#/cab4cff7705cc2198ff358350e909813
關於作者: https://note.youdao.com/share/?id=f56ff8335c86122ec1e6eaa4208d033a&type=notebook#/A4C7FB8100E1406FA298E9278059D56B
歡迎關注 西嶺老溼 微信公眾號
歡迎關注西嶺老溼知乎專欄: https://zhuanlan.zhihu.com/xilinglaoshi