碼農(nóng)是怎么提高設(shè)計(jì)能力的?
“欣哥,你是怎么提高設(shè)計(jì)能力的? ”
這個(gè)問題最近被人問及, 我回想了下這10多年學(xué)習(xí)歷程,并沒有發(fā)現(xiàn)一個(gè)確切的東西能幫助提升設(shè)計(jì)能力,更具體點(diǎn)是“面向?qū)ο蟮脑O(shè)計(jì)能力”。
我大學(xué)的時(shí)候?qū)W了幾門語言,也勉強(qiáng)做了幾個(gè)項(xiàng)目,但是都停留在能使用的層面,根本沒有考慮到可擴(kuò)展性,重用性,靈活性,易讀,優(yōu)雅...... 等東西, 也不知道什么是設(shè)計(jì)模式, 估計(jì)大部分碼農(nóng)翻身的讀者都比我強(qiáng)得多。
剛工作的時(shí)候,一個(gè)搞Java的同學(xué)給我說,劉欣你知道嗎,現(xiàn)在模式很流行,我們都在搞模式。
模式? 正在抱微軟大腿的我是一臉懵逼。
回去趕緊搜,于是就發(fā)現(xiàn)了四人幫那本著名的《設(shè)計(jì)模式》,趕緊研讀,發(fā)現(xiàn)是霧里看花,水中望月,看不清楚。
這設(shè)計(jì)模式就如同一座高山,可望而不可及。 當(dāng)然用來吹牛還是可以的,吃飯時(shí)給組長說:我最近看到一本書,叫設(shè)計(jì)模式,里邊提出了兩條原則,實(shí)在是太好了。
“什么原則?”
“一條面向接口編程而不是面向?qū)崿F(xiàn)編程, 另外一條是優(yōu)先使用組合而不是繼承。”
雖然我洋洋得意,但是我心中明白,我也不知道這是啥意思。
后來看到閆宏寫的《Java與模式》一書 ,里邊舉了很多紅樓夢(mèng)的例子,有點(diǎn)意思,大概知道了一些模式的寫法。
照葫蘆畫瓢,寫了個(gè)Iterator, 激動(dòng)不已。沒成想到JDK中一看,人家早就寫好了。
轉(zhuǎn)入Java陣營以后,發(fā)現(xiàn)模式在這里確實(shí)比較提倡,不僅僅是標(biāo)準(zhǔn)的23種設(shè)計(jì)模式,還有J2EE開發(fā)中用到的各種模式。
那就老老實(shí)實(shí)地學(xué)吧,不僅僅看書,還開始看源碼,當(dāng)時(shí)流行的有一個(gè)叫做Jive論壇,純用servlet和JSP寫的,現(xiàn)在看來可能是比較幼稚,但是它里邊用了很多的設(shè)計(jì)模式,比如單例,模板方法,代理,迭代器等等。
之前學(xué)習(xí)設(shè)計(jì)模式,看到的都是小打小鬧的小例子,不知道怎么用到項(xiàng)目中來,現(xiàn)在看到Jive,一下子看到設(shè)計(jì)模式在實(shí)戰(zhàn)中的鮮活的應(yīng)用,實(shí)在是大開眼界。
(由于時(shí)間太過久遠(yuǎn),感興趣的可以再翻翻Jive,但是不太建議再花太多的時(shí)間學(xué)習(xí)了)
后來發(fā)現(xiàn)了一本神書《敏捷軟件開發(fā),原則,模式與實(shí)踐》,***次講了面向?qū)ο笤O(shè)計(jì)的原則,其中還有一個(gè)薪水支付的案例,真是讓我大開眼界,一下子明白了“優(yōu)先使用組合而不是繼承"的道理。
此后又看了JUnit的源碼,再次感慨大牛把設(shè)計(jì)模式玩得爐火純青。
看了不少書和源碼以后,就想在工作中想找機(jī)會(huì)實(shí)戰(zhàn),無奈工作中增刪改查居多,在框架下填代碼,渾身的OO內(nèi)力無處宣泄,真是不爽。 (其實(shí)也沒多少內(nèi)力,把自己高估了。)
終于逮到一次機(jī)會(huì),我負(fù)責(zé)的模塊業(yè)務(wù)邏輯非常復(fù)雜,我就想辦法把這一塊邏輯從增刪改查的框架中剝離處理,好好設(shè)計(jì)了一番,應(yīng)用了一些設(shè)計(jì)模式,效果還不錯(cuò),基本達(dá)到了OCP的原則:對(duì)修改封閉,對(duì)擴(kuò)展開放。
各位同學(xué)也可以想一想,自己的工作中有沒有一些復(fù)雜的業(yè)務(wù)邏輯?能不能把他們單獨(dú)拎出來做個(gè)設(shè)計(jì)?
再挑戰(zhàn)下有難度的源碼吧,大家把Spring“吹噓”得神乎其神,一定得看看, 于是開始進(jìn)入Spring源碼,這絕對(duì)是一次痛苦之旅,多如牛毛的class,深不可測的函數(shù)調(diào)用層次,把人搞得頭暈眼花,反復(fù)的調(diào)試,加上文檔的配合,總算走出了黑暗森林,也體會(huì)到了Spring設(shè)計(jì)的一些妙處,尤其是軟件開發(fā)最最重要的一點(diǎn): 抽象。
當(dāng)我在工作中再次遇到復(fù)雜的需求時(shí), 也努力地去做抽象,尋找本質(zhì)的東西,有一次竟然把業(yè)務(wù)操作抽象成二維坐標(biāo)系下點(diǎn)的移動(dòng),讓我喜不自勝,感受到了抽象的威力。
但是這樣“頓悟”時(shí)刻還是太少了。面向?qū)ο蟮脑瓌tS.O.L.I.D 聽起來很簡單,23種設(shè)計(jì)模式理解起來也不難,但是想把這些原則和模式在實(shí)踐中應(yīng)用好,那可就不容易了,很多時(shí)候我在面對(duì)復(fù)雜問題的時(shí)候也是非常犯愁,無法找到合適的接口和抽象,***做出的設(shè)計(jì)不盡如人意。
總結(jié)一下,想提升OO的設(shè)計(jì)能力,我的經(jīng)驗(yàn)就是: 閱讀書籍, 閱讀源碼,再加上不斷地思考和實(shí)踐。
謹(jǐn)以此和大家共勉。
【本文為51CTO專欄作者“劉欣”的原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)通過作者微信公眾號(hào)coderising獲取授權(quán)】