怎么樣學(xué)習(xí)一個Web框架

我12月4日晚上寫了個文章朝氓,談怎么成為一個牛逼的Web開發(fā)魔市,只是我自己對于成長路徑的一個思考,并非說我很牛逼赵哲,希望大家不要誤解哈待德,希望借此跟大家去交流,沒有教導(dǎo)人的意思枫夺。

有個朋友評論說磅网,說得不是很清楚,想了解到底怎么去學(xué)習(xí)一個框架筷屡。我就展開說一下涧偷,我是怎么學(xué)習(xí)Yii框架的。

我從2010年開始用這個框架的毙死,也是工作的原因燎潮。我也是普通人,并沒有什么內(nèi)在驅(qū)動力去學(xué)一個全新的東西扼倘。那時候領(lǐng)導(dǎo)說确封,開發(fā)PHP不能再刀耕火種了除呵,應(yīng)該引入框架,選型他做完了爪喘,讓我了解并學(xué)習(xí)下用法颜曾。

然后,我就開始學(xué)秉剑,主要方法泛豪,首先看一下這個框架的文檔,然后用新手指南侦鹏,把范例App照著指南做一遍诡曙。如此這般,就會形成一個感性的認(rèn)識略水。當(dāng)時的Yii框架范例价卤,是開發(fā)一個Blog,步驟講解很詳細(xì)的渊涝,做下來以后慎璧,感覺相當(dāng)良好。

當(dāng)然跨释,馬上胸私,就沒有時間學(xué)了,因為項目壓力迫在眉睫煤傍,必須在使用中學(xué)習(xí)了盖文。如果僅僅用框架把項目給完成了嘱蛋,我覺得遠(yuǎn)算不上掌握了框架蚯姆。因為我在跟同事合作的時候發(fā)現(xiàn),很多同事一邊開發(fā)洒敏,一邊抱怨龄恋,說這個框架這么奇怪,這個沒有凶伙,那個沒有郭毕,從沒見過設(shè)計這么奇怪的框架,他在這么抱怨的時候函荣,就用自己的方式把問題解決了显押。

我舉個例子,比如傻挂,Yii框架有提供一個UserIdentity的組件乘碑,還有一個WebUser的組件,兩個東西組合起來金拒,用于用戶身份識別和用戶登錄兽肤。這兩個東西,里面又糾纏了HttpRequest,HttpCookie资铡,StatePersister等等等等一大堆東西电禀,框架源碼也寫得彎彎繞,看得頭昏腦脹笤休。

這時候尖飞,我同事的解決辦法是,給Controller構(gòu)造一個基類宛官,然后在基類構(gòu)造函數(shù)里葫松,進(jìn)行用戶的身份驗證,讀取Cookie并判定底洗。簡單腋么、直接、有效亥揖。如果珊擂,我是一個軟件團(tuán)隊的領(lǐng)導(dǎo),我也喜歡這種員工费变,能解決問題摧扇,所以他的做法也沒什么不好,但是其實(shí)他根本沒有掌握到這個框架挚歧。有個成語叫削足適履扛稽,我想用在這個場景不算特合適,但是微微改改滑负,叫削履適足在张。

我們再換個比喻,就好像你去走迷宮矮慕,然后很暈帮匾,有個簡單法子,就是把墻拆了痴鳄。路徑變成直線了瘟斜,也可以到達(dá)終點(diǎn)。

再舉個例子痪寻,Yii框架有一套Log機(jī)制螺句,里面有好多類,拼起來橡类,LogRouter蛇尚,LogRoute,Logger猫态,配置好長佣蓉,用法奇怪披摄,打了log怎么不顯示,各種問題勇凭,破東西疚膊。于是有個同事,馬上寫了一個全局函數(shù)虾标,里面封裝了一個PHP的error_log寓盗,所有地方都用這個打log,問題完美璧函,優(yōu)雅地解決了傀蚌。

最后,他們還是優(yōu)秀的Web工程師蘸吓,有著高超的生產(chǎn)率善炫。但是,Yii框架的用法库继,離他們還是那么遙遠(yuǎn)箩艺。

然后,我說說我自己是怎么做這些的宪萄。

每當(dāng)我碰到類似的問題艺谆,我就去翻源代碼“萦ⅲ看源碼沒什么好炫耀的静汤,是被逼的,因為Yii框架是一群開發(fā)設(shè)計的居凶。正所謂虫给,framework of programmers, by programmers, for programmers,這些家伙把你能考慮的都盡可能考慮了排监,很好狰右,但是他們的缺點(diǎn)杰捂,作為開發(fā)你懂的舆床,根本不喜歡寫文檔。

繼續(xù)說嫁佳,當(dāng)我碰到別扭和不能理解的時候挨队,我要做的事情是去找到WHY。為什么別扭蒿往,為什么該有的沒有盛垦,為什么不該有的有了,為什么做沒必要的事情瓤漏,我盡可能去挖掘設(shè)計者的思想腾夯。

在這么做的時候颊埃,我領(lǐng)悟到一個事情,其實(shí)框架這個詞蝶俱,本身有誤導(dǎo)性班利。大家理解的時候,總覺得榨呆,你幫我搭個骨架罗标,然后我改造成我要的東西。于是积蜻,拆墻之類的事情理所應(yīng)當(dāng)闯割。

上篇文章給我留言的朋友說了個詞,DSL竿拆。我特喜歡宙拉,跟我的想法不謀而合。我覺得丙笋,框架是語言層面上的抽象鼓黔,也就是說,二階語言不见,抽象層次更高的語言澳化,表達(dá)力跟強(qiáng)的語言。這么去理解框架稳吮,學(xué)習(xí)框架缎谷。

Yii框架是被設(shè)計出來實(shí)現(xiàn)各種類型網(wǎng)站的通用領(lǐng)域語言,假設(shè)這群設(shè)計者是靠譜的灶似,那么Yii這個語言列林,一定可以被用來描述網(wǎng)站開發(fā)過程中的方方面面。使用Yii框架酪惭,其實(shí)是個表達(dá)問題希痴。

于是乎,我要做的事情春感,就是用這個語言砌创,怎么描述和解決我的問題。針對上面的兩個例子鲫懒,Identity嫩实,本意是身份、特征窥岩,所以它封裝了身份識別甲献,身份特征,WebUser颂翼,就是網(wǎng)絡(luò)用戶晃洒,是用戶的抽象慨灭,登錄過程應(yīng)該用身份特征對象來轉(zhuǎn)換成用戶對象。網(wǎng)站的身份認(rèn)證怎么實(shí)現(xiàn)呢球及?應(yīng)該在打開每個網(wǎng)頁前缘挑,先校驗身份,怎么做呢桶略,有個東西叫前置過濾器语淘,應(yīng)該用Filter攔截。

另一個例子际歼,Logger惶翻,抽象了log生成器,LogRouter抽象了log分發(fā)器鹅心,LogRoute抽象了log落地裝置吕粗,可以落地到文件,網(wǎng)絡(luò)旭愧,頁面颅筋,郵件。為什么log打了顯示不了输枯,因為Logger里有設(shè)計緩沖機(jī)制议泵,默認(rèn)每個請求只打一次,或者每一萬條log打一次桃熄,是一種性能上的考慮先口。

謎底都揭開了。

所以瞳收,朋友留言問我說碉京,我沒說清怎么去學(xué)習(xí)和積累一個框架,我想螟深,我的做法是谐宙,學(xué)習(xí)和揣摩框架設(shè)計者的思路,框架是領(lǐng)域語言界弧,設(shè)計者希望用者凡蜻,用怎樣的方法解決問題呢,領(lǐng)悟了這個夹纫,就是學(xué)習(xí)了框架咽瓷。所謂设凹,學(xué)習(xí)舰讹,就是每個場景都盡可能用框架本身預(yù)制的方法去表達(dá)。

表達(dá)不了怎么辦闪朱?使勁找月匣。知名框架都是久經(jīng)考驗的钻洒,一般不會出現(xiàn)這種情況,所以要么就是需求太奇怪锄开,要么就是找得不徹底素标。當(dāng)然事無絕對,框架不可能應(yīng)有盡有萍悴,這個時候头遭,我要想的,仍然不是拆墻癣诱,而是想计维,我如果是框架設(shè)計者,我應(yīng)該提供怎樣的方式撕予,讓別人去解決他的問題鲫惶,所以我應(yīng)該怎么擴(kuò)展框架,我往框架里添加工具組件实抡,走不出的迷宮我建個梯子爬過去欠母。千萬別想著改框架,這比拆墻危害還大吆寨。

這樣子赏淌,我堅持了幾年,我就領(lǐng)悟了框架本身很多設(shè)計理念啄清,別人問我猜敢,在Yii框架里,什么什么能不能實(shí)現(xiàn)盒延,我憑直覺一般都能答出來缩擂,因為我的思維跟設(shè)計者已經(jīng)合拍了,我會說添寺,這框架不可能這個都沒考慮到胯盯。如果不確定,我就再去源碼里看计露,繼續(xù)領(lǐng)悟博脑。這么一來,我就成長了票罐。

這個過程比較漫長叉趣,但是很有收獲,很多設(shè)計思想该押,就成了一個信手拈來的過程疗杉。

這么去理解和學(xué)習(xí),還有一個好處蚕礼。我都說了DSL是個語言了烟具。如果別人用相同的語言說話梢什,你就會有個體會,叫“秒懂”朝聋∥宋纾看別人的代碼如看自己的代碼,那感覺特爽冀痕,好像掌握了全世界荔睹。

最后,還有一個經(jīng)驗言蛇,就是把你學(xué)會的東西講給你的同事聽应媚,幫他們也學(xué)會。

以上猜极,就是我學(xué)習(xí)一個框架的方法中姜。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市跟伏,隨后出現(xiàn)的幾起案子丢胚,更是在濱河造成了極大的恐慌,老刑警劉巖受扳,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件携龟,死亡現(xiàn)場離奇詭異,居然都是意外死亡勘高,警方通過查閱死者的電腦和手機(jī)峡蟋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來华望,“玉大人蕊蝗,你說我怎么就攤上這事±抵郏” “怎么了蓬戚?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長宾抓。 經(jīng)常有香客問我子漩,道長,這世上最難降的妖魔是什么石洗? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任幢泼,我火速辦了婚禮,結(jié)果婚禮上讲衫,老公的妹妹穿的比我還像新娘缕棵。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布挥吵。 她就那樣靜靜地躺著重父,像睡著了一般花椭。 火紅的嫁衣襯著肌膚如雪忽匈。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天矿辽,我揣著相機(jī)與錄音丹允,去河邊找鬼。 笑死袋倔,一個胖子當(dāng)著我的面吹牛雕蔽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播宾娜,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼批狐,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了前塔?” 一聲冷哼從身側(cè)響起嚣艇,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎华弓,沒想到半個月后食零,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡寂屏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年贰谣,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片迁霎。...
    茶點(diǎn)故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡吱抚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出考廉,到底是詐尸還是另有隱情频伤,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布芝此,位于F島的核電站憋肖,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏婚苹。R本人自食惡果不足惜岸更,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望膊升。 院中可真熱鬧怎炊,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至瓜挽,卻和暖如春盹廷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背久橙。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工俄占, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人淆衷。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓缸榄,卻偏偏與公主長得像,于是被迫代替她去往敵國和親祝拯。 傳聞我的和親對象是個殘疾皇子甚带,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容