可以說,在未來幾年中,web form的使用會(huì)逐漸減少,而取而代之的就是mvc。可能你不會(huì)同意我的觀點(diǎn),那么我就試著闡述一下我的觀點(diǎn),如果你還是不能接受,那么請(qǐng)你反駁我。
學(xué)習(xí)一個(gè)新語言或者是新架構(gòu)是需要時(shí)間的,我們需要摒棄原來學(xué)習(xí)的很深入并且用的很熟練的架構(gòu)來迎合新架構(gòu)嘛?是的,如果讓我說,我的回答是否,但是我需要看清這個(gè)新架構(gòu)究竟和原來的架構(gòu)有哪些改進(jìn),是否真的需要我們投入大量的時(shí)間去學(xué)習(xí)?mvc 是一種架構(gòu)模式,它帶來了全新的和asp時(shí)代同樣的開發(fā)體驗(yàn)(注:我不是說這是倒退)。
下面我就來闡述一下對(duì)于web form,mvc是否值得我們?nèi)W(xué)習(xí)。
1.view state
相信大家對(duì)于這個(gè)視圖狀態(tài)都很熟悉,它是用來保存我們在頁面中輸入的數(shù)據(jù)狀態(tài),以便我們可以在刷新頁面或者回發(fā)時(shí)使頁面回到我們原來的輸入數(shù)據(jù)時(shí)的狀態(tài),這個(gè)效果很好的實(shí)現(xiàn)了我們的需求。但是同時(shí),我們要問自己一下,是否我們就真的需要這些,需要頁面刷新時(shí)顯示原來的數(shù)據(jù),這是否是有意義的?
還有就是view state在web form時(shí)代大行其道,在每個(gè)頁面都會(huì)存在,甚至在復(fù)雜的頁面中他的大小甚至很大,在每次 頁面回發(fā)時(shí)都會(huì)傳遞view state狀態(tài),我們不說服務(wù)器解析這些view state需要時(shí)間,就是每次頁面?zhèn)鬏敹家獋鬟f這些view state就會(huì)使帶寬增加,顯示網(wǎng)頁的時(shí)間變長。這在2.0時(shí)代,最起碼是我所不允許的。
2.page life cycle 頁面生命周期
在web form中存在著復(fù)雜的生命周期,我甚至清楚的記得在我學(xué)習(xí)web form的時(shí)候,都是拿著筆在紙上畫著這些周期圖,在每個(gè)周期頁面會(huì)執(zhí)行什么動(dòng)作。這就像我在學(xué)習(xí)c#連接數(shù)據(jù)庫的時(shí)候?qū)憇ql helper,讓我很頭疼。例如在page_render()中不應(yīng)該訪問具體的控件,因?yàn)檫@時(shí)控件還沒有生成(有園友提出錯(cuò)誤,我查閱了資料也認(rèn)為這是錯(cuò)誤的,因?yàn)檫@時(shí)已經(jīng)把控件渲染要輸出,特此聲明。感謝園友提出錯(cuò)誤,我會(huì)積極改正),如果要訪問請(qǐng)?jiān)趐age_load()中,我們每天都要和page_load()事件打交道,至少我很經(jīng)常。ispostback是經(jīng)常可以見到的方法。
如果你覺得你可以完全掌握這些生命周期,那么至少你是一名大牛。如果你可以很隨意的就控制頁面的生命周期,并且控制控件的生成,那么我會(huì)很敬仰你。
3.false sense of concerns 失敗的關(guān)注點(diǎn)分離
現(xiàn)在我們做軟件,講究的都是可維護(hù)性、可重用性以及關(guān)注點(diǎn)分離。何為關(guān)注點(diǎn)分離,我的理解就是每層結(jié)構(gòu)只負(fù)責(zé)他自己的事情,不屬于他的不能控制,也不要試圖控制。例如,我們在code behind中寫了訪問數(shù)據(jù)庫的代碼,調(diào)用了sql helper中的類,但是現(xiàn)在是數(shù)據(jù)庫服務(wù)器的服務(wù)沒有開啟,那么這次調(diào)用肯定會(huì)拋出異常。難道讓我們在code behind中處理這些異常,那么我們程序員會(huì)累死的,異常應(yīng)該是sql helper中處理,而不是code behind。這應(yīng)該就是所謂的關(guān)注點(diǎn)分離。還有就是關(guān)注點(diǎn)分離應(yīng)該是每個(gè)類只負(fù)責(zé)他自己的工作,而不要在一個(gè)類sql helper中有著返回html的語句出現(xiàn)。
4.limited control over html 對(duì)于html的控制極差
我在頁面生命周期中說了,如果你可以隨意的更改生成的控件,那么我會(huì)崇拜你。如果說對(duì)于一個(gè)服務(wù)器端控件可以控制生成html的樣式,或者生成html的id、name,以便可以讓js使用,這是很困難的。當(dāng)然在.net 4.0中添加了一個(gè)屬性,那就是clientidmode,如果把這個(gè)屬性值設(shè)置為static,就可以生成和定義的id一樣的html的id值。默認(rèn)情況下這是不被啟用的,會(huì)生成復(fù)雜的、嵌套的id值。這對(duì)于我們在客戶端操作html標(biāo)簽是很困難的。
當(dāng)然了,這不是你可以轉(zhuǎn)向mvc的原因,但是是原因之一,雖然這個(gè)原因可能會(huì)有點(diǎn)牽強(qiáng)。
5.leaky abstraction 脆弱的抽象
web form試圖隱藏所有的http狀態(tài)(http的無記憶性或者是無狀態(tài)性)。我們在拖入一個(gè)服務(wù)器控件的時(shí)候從來需要考慮他會(huì)在什么時(shí)候顯示?因?yàn)榉?wù)器控件已經(jīng)實(shí)現(xiàn)了這些,例如,ispostback 方法為什么可以用來判斷頁面是否回發(fā),它的實(shí)現(xiàn)原理是什么?我們不會(huì)關(guān)心,我們只關(guān)心這個(gè)方法能夠完成什么,這就夠了?真的夠了嗎?
我認(rèn)為沒有,只是會(huì)使用,我想任何一個(gè)只要認(rèn)識(shí)英文的人都可以完成,但是會(huì)使用就夠了嗎?性能問題達(dá)到了嗎?會(huì)出現(xiàn)哪些問題?我們都不知道,我們只是用了一個(gè)黑盒子,但是里面是什么東西我們不知道?如果是陷阱我們也會(huì)毫不猶豫的跳進(jìn)去?對(duì)嗎?
偶爾的熟悉一下源碼,對(duì)于提升我們自己的開發(fā)水平有幫助之外,我們也可以發(fā)現(xiàn)很多我們可以控制的問題,避免他們發(fā)生?所以,親愛的朋友們,不要僅僅限于使用,有時(shí)候大牛和小牛的根本區(qū)別就是小牛不知道為什么要這樣?而大牛指導(dǎo)如何更好的這樣。
6.low testability 極差的可測試性
我在以前開發(fā)web form的時(shí)候,采用服務(wù)器控件可以大大的提高開發(fā)速度。但是,我從來不知道如何去測試我開發(fā)的代碼是否運(yùn)行正常。唯一的方式就是自己一個(gè)人沒事的時(shí)候點(diǎn)擊、點(diǎn)擊、再點(diǎn)擊。還有就是設(shè)置斷點(diǎn),按住f11,不斷的點(diǎn)擊鍵盤,直到看到這些代碼都想吐的地步?
但是在mvc中,這些問題都不再存在,因?yàn)槲覀兛梢允褂胣unit等可以進(jìn)行單元測試的工具,我們可以把測試精確到每一行代碼,我們可以實(shí)現(xiàn)測試的自動(dòng)化,避免了手動(dòng)點(diǎn)擊浪費(fèi)的大量時(shí)間。這是一件好事,不是嗎?
還有我個(gè)人認(rèn)為最重要的一個(gè)原因就是,你如果有web form的開發(fā)基礎(chǔ),那么學(xué)習(xí)mvc可以說就是很簡單的事情,因?yàn)閙vc中沒有了服務(wù)器控件,有的只是html標(biāo)簽以及一些可以生成html標(biāo)簽的helper類。我個(gè)人感覺做美工的如果想轉(zhuǎn)開發(fā),這倒是不錯(cuò)的時(shí)機(jī),因?yàn)閔tml對(duì)于美工來說筆程序員更熟悉。
在mvc中沒有view state,可以對(duì)html進(jìn)行完全的控制,可以不再使用原來的url rewriter,而是采用mvc中自帶的route(url路由系統(tǒng)),良好的關(guān)注點(diǎn)分離框架(model、view、controller),每一層都是負(fù)責(zé)自己的任務(wù)。
在mvc中不是每一個(gè)地址都會(huì)對(duì)一個(gè)一個(gè)具體的頁面,你可以定義多個(gè)action,返回同一個(gè)頁面。在mvc中因?yàn)橛辛藦?qiáng)大的路由系統(tǒng),所以我們不會(huì)再見到www.cnblogs.com/default.aspx,這樣的地址了,而是取而代之的www.cnblogs.com/home/index ,這是一個(gè)巨大的突破。可以讓特定的頁面具有具體的含義。這是url友好,你認(rèn)為呢?
我并不是說mvc會(huì)取代web form,而是他們之間的對(duì)比性,當(dāng)然如果可以避免一些問題的存在,那么讓mvc和web from共存在同一個(gè)項(xiàng)目中,或許是不一個(gè)不錯(cuò)的選擇。但是前提還是需要你學(xué)習(xí)mvc,我個(gè)人認(rèn)為在未來幾年中,web form和mvc會(huì)共存。
好了,說了這么多,我只是有一句話,就是如果你想在未來的web開發(fā)中不落后,那么就在業(yè)余時(shí)間學(xué)習(xí)一下mvc吧。
如果你想你的網(wǎng)站具有更好的可維護(hù)性,那么采用mvc是你的明智之舉。
以上只是我的個(gè)人所言,請(qǐng)各位參考??!
2025國考·省考課程試聽報(bào)名