記得2004年剛接觸設(shè)計(jì)模式,買了經(jīng)典的<<設(shè)計(jì)模式>>一書,細(xì)細(xì)地閱讀,然后在開(kāi)發(fā)中模仿。一兩年時(shí)間過(guò)去,對(duì)23種設(shè)計(jì)模式弄得還算比較熟悉,也在軟件設(shè)計(jì)中能用則用,比如Singleton, template method, proxy, facade等等。但總感覺(jué)用的不爽,當(dāng)時(shí)也說(shuō)不出原因;就是感覺(jué)在使用的過(guò)程中,是一種為了使用設(shè)計(jì)模式而使用上他們,有時(shí)候是生搬硬套??傊?,自己當(dāng)時(shí)是搞不清楚為什么要使用設(shè)計(jì)模式,停留在別人說(shuō)它牛,我就學(xué)著用而不落人之后。
我不是一個(gè)天質(zhì)聰穎的人,對(duì)軟件設(shè)計(jì)的理解,基本上無(wú)法評(píng)自己能力單獨(dú)領(lǐng)悟出來(lái)。只有常常督促自己多買國(guó)內(nèi)外軟件專家寫的好書,來(lái)學(xué)習(xí)他們?cè)谶@些方面的發(fā)現(xiàn)和總結(jié)??亢筇鞂W(xué)習(xí)來(lái)彌補(bǔ)先天不足,也是沒(méi)有辦法中的辦法。
終于在2007年看到了<<java與模式>>, 書中對(duì)設(shè)計(jì)模式的討論,并沒(méi)有特別吸引我的地方,不過(guò)是用java語(yǔ)言來(lái)詳細(xì)講解23種模式而已,最多增加一些變體。深深吸引我的是"第二部分 面向?qū)ο蟮脑O(shè)計(jì)原則", 這一部分雖然篇幅不多,但清晰地說(shuō)明了我們?yōu)槭裁匆迷O(shè)計(jì)模式,使用設(shè)計(jì)模式是來(lái)解決什么問(wèn)題的,使用之后我們要達(dá)到什么效果。軟件的生命周期讓我們認(rèn)識(shí)到,面向?qū)ο蟮脑O(shè)計(jì)要解決的核心問(wèn)題是可維護(hù)性和可復(fù)用性,特別是可維護(hù)性,一個(gè)好軟件的維護(hù)成本遠(yuǎn)遠(yuǎn)大于初期開(kāi)發(fā)成本。
一個(gè)軟件設(shè)計(jì)的可維護(hù)性很差,原因在于:過(guò)于僵硬、過(guò)于脆弱、復(fù)用率低、黏度過(guò)高。相反,一個(gè)好的系統(tǒng)設(shè)計(jì)應(yīng)該是可擴(kuò)展的、靈活的、可插入的。在軟件發(fā)達(dá)國(guó)家如美國(guó),一些軟件界的高手,在20世紀(jì)80~90年代,就陸續(xù)提出一些設(shè)計(jì)原則,這些設(shè)計(jì)原則是在提高一個(gè)系統(tǒng)的可維護(hù)性的同時(shí),提高系統(tǒng)的可復(fù)用性的指導(dǎo)原則:
1、開(kāi)閉原則:軟件架構(gòu)應(yīng)該是對(duì)擴(kuò)展開(kāi)發(fā),對(duì)修改關(guān)閉
2、Liskov替換原則:任何基類可以出現(xiàn)的地方,子類一定可以出現(xiàn)
3、依賴倒轉(zhuǎn)原則:要依賴于抽象,不要依賴于實(shí)現(xiàn)
4、接口隔離原則:應(yīng)當(dāng)為客戶提供盡可能小的接口,而不是提供大的接口。
5、組合、聚合復(fù)用原則:要盡量使用組合、聚合,而不是繼承關(guān)系以達(dá)到復(fù)用的目的。
6、Demeter法則:一個(gè)軟件實(shí)體應(yīng)該與盡可能少的其他實(shí)體發(fā)生互相作用。
可以說(shuō),<<java與模式>>里很好的解決了我心中兩三年來(lái)的不快,讓我真正理解了為什么要使用設(shè)計(jì)模式。軟件開(kāi)發(fā)、設(shè)計(jì)原則與設(shè)計(jì)模式的關(guān)系,我不恰當(dāng)?shù)谋扔鳛閼?zhàn)爭(zhēng)、戰(zhàn)略與戰(zhàn)術(shù)的關(guān)系;要取得戰(zhàn)爭(zhēng)的全面勝利,你首先要在戰(zhàn)略上把握好,然后才是戰(zhàn)術(shù)上指揮好;同樣,要開(kāi)發(fā)出好的軟件,我們首先要遵循一定的設(shè)計(jì)原則,為了達(dá)到我們的目的,在開(kāi)發(fā)中我們就恰當(dāng)?shù)氖褂孟鄳?yīng)的設(shè)計(jì)模式。
<<java與模式>>寫的好,而且是中國(guó)人寫的,但它缺少了一個(gè)方面的描述:我們?cè)鯓釉趯?shí)際的設(shè)計(jì)開(kāi)發(fā)中做到這些呢?是不是一開(kāi)始就要遵循這些設(shè)計(jì)原則,就要使用設(shè)計(jì)模式?還是有一個(gè)什么樣的過(guò)程?
終于今年初看到了英文版<<敏捷軟件開(kāi)發(fā):原則、模式與實(shí)踐>>, 國(guó)外這些大牛就是大牛,在這方面就是理解深刻,實(shí)踐經(jīng)驗(yàn)豐富。作者的觀點(diǎn)很有點(diǎn)唯物辨證法,就是軟件設(shè)計(jì)開(kāi)始時(shí),我們?nèi)绻麤](méi)有看出抽象的必要,可以先實(shí)現(xiàn)一個(gè)簡(jiǎn)單的,當(dāng)?shù)谝淮伪恍枨笥|發(fā)而顯現(xiàn)出抽象的必要時(shí),我們這時(shí)機(jī)會(huì)就來(lái)了,需要很快提取抽象接口,遵循以上設(shè)計(jì)原則。當(dāng)然,作者還有很多其它好的思想,這里不一一列舉。
認(rèn)識(shí)和理解都需要一個(gè)過(guò)程,沒(méi)有理論,我們這些智商一般的人是很難僅僅在項(xiàng)目開(kāi)發(fā)中盡快提高的;同樣,光看書不實(shí)踐,我們也很難真正理解這些別人總結(jié)的經(jīng)驗(yàn),那將是霧里看花。
豐富經(jīng)驗(yàn)和軟件設(shè)計(jì)思想以及軟件工程思想,對(duì)軟件開(kāi)發(fā)的重要性真的是如此重要,怪不得我們國(guó)家無(wú)法開(kāi)發(fā)出大型的高質(zhì)量的軟件來(lái)。