設(shè)計(jì)模式最經(jīng)典的書(shū)籍自然是GOF的《設(shè)計(jì)模式》,但很多人的反應(yīng)是這本書(shū)太難理解了,并不適合初學(xué)者閱讀。這話說(shuō)得在理。一方面,本書(shū)使用的C++示例難倒了一大群Java和.NET的開(kāi)發(fā)人員;另一方面,這本書(shū)的風(fēng)格過(guò)于專業(yè)化,更偏向于學(xué)術(shù)論文的風(fēng)格(事實(shí)上,本書(shū)的雛形就是來(lái)源于GOF中Erich Gamma的博士論文),因此就顯得有些晦澀難懂了。
基本上,本書(shū)可以作為我們參考的標(biāo)準(zhǔn),是經(jīng)常查閱的文獻(xiàn)資料。如果你對(duì)某個(gè)設(shè)計(jì)模式還有困惑不解之處,閱讀本書(shū),然后細(xì)細(xì)品味,總會(huì)給你一些豁然開(kāi)朗的感覺(jué)??鋸堻c(diǎn)說(shuō),這本書(shū)可以說(shuō)是設(shè)計(jì)模式的紅寶書(shū),即使人手一冊(cè),也不為過(guò)。說(shuō)句題外話,我還是喜歡外版書(shū)的封面設(shè)計(jì),給人一種藝術(shù)的美感,讓人看著就有想買(mǎi)的沖動(dòng)。國(guó)內(nèi)專業(yè)書(shū)籍的裝幀與設(shè)計(jì),做得好的,真的很少。
對(duì)于設(shè)計(jì)模式,這幾年被人廣泛推崇的還是這本Head First DesignPatterns,中文版被譯作《設(shè)計(jì)模式深入淺出》。書(shū)名就代表了本書(shū)的性質(zhì)是面向初學(xué)者的。而它的著作風(fēng)格才是真正引人注目和稱道的。專業(yè)書(shū)籍的風(fēng)格通常會(huì)存在迥然不同的兩種風(fēng)格。一種風(fēng)格深入淺出,趣味盎然,閱讀過(guò)程輕松愉快,而給出的實(shí)例也多以生活中的例子進(jìn)行類比,幫助讀者對(duì)書(shū)內(nèi)容的理解。這本書(shū)就是這一類書(shū)籍的個(gè)中翹楚。
去年在國(guó)內(nèi)計(jì)算機(jī)圖書(shū)界,獨(dú)領(lǐng)風(fēng)騷的一本《大話設(shè)計(jì)模式》,同樣屬于這樣的風(fēng)格。程杰也因?yàn)樵摃?shū)在去年榮獲了51cto的年度IT圖書(shū)的最佳原創(chuàng)作者獎(jiǎng)。該書(shū)的成功就在于它繼承了這樣一種集娛樂(lè)與技術(shù)為一體的獨(dú)特風(fēng)格,讓技術(shù)人員看到,原來(lái),技術(shù)書(shū)籍也可以這樣寫(xiě),讀起來(lái)也可以這樣有趣。至于另一種寫(xiě)作風(fēng)格則偏向于循規(guī)蹈矩,描述技術(shù)問(wèn)題勝在其條理清楚,如山澗流水,優(yōu)雅而從容,卻最終能夠融匯成一條大河。很難說(shuō)兩種風(fēng)格孰優(yōu)孰劣,前者勝在趣味,后者勝在嚴(yán)謹(jǐn)。我并不是說(shuō)有趣的書(shū)就一定不嚴(yán)謹(jǐn),只是相對(duì)而言,一本書(shū)若要有趣,就必須給出生動(dòng)的比喻或者隱喻,而這樣的修辭總會(huì)或多或少使其本質(zhì)發(fā)生小小的變形。然而這兩種風(fēng)格,若要成功,最關(guān)鍵的還是要看著者的技術(shù)功底和筆力。
雖然設(shè)計(jì)主要還是要看思想,但很多讀者還是比較在意每本書(shū)的代碼載體。Head First DesignPatterns一書(shū)給出的是Java示例,而《大話設(shè)計(jì)模式》則是C#。還有一本面向初學(xué)者的好書(shū)是閻宏先生所著的《Java與模式》。本書(shū)利用中國(guó)傳統(tǒng)文化來(lái)闡述設(shè)計(jì)之道,又引入了大量的Java實(shí)例,尤其是對(duì)Java的API或框架進(jìn)行了深入分析。所以讀來(lái)既有趣味,又有文化的底蘊(yùn),同時(shí)還不乏實(shí)際的例子給出標(biāo)準(zhǔn)的范本。我以為,對(duì)于初學(xué)者,本書(shū)是再合適不過(guò)的了。
若要理解UML,并將軟件開(kāi)發(fā)和設(shè)計(jì)有效地與UML結(jié)合起來(lái),那么最佳的選擇是閱讀Craig Larman的經(jīng)典著作Applying UMLandPatterns。本書(shū)已經(jīng)出版到第三版。一本書(shū)若是能夠再版、三版,絕對(duì)有其值得稱道之處。該書(shū)全面地介紹了RUP開(kāi)發(fā)模型,并將UML與開(kāi)發(fā)過(guò)程、設(shè)計(jì)模式等有效地結(jié)合起來(lái)。隨著本書(shū)章節(jié)的逐步演進(jìn),讀者的能力也將得到逐步的提高。本書(shū)的中文版名為《UML和模式應(yīng)用》,似乎現(xiàn)在僅出版了第二版的中文版本,不由不讓人感嘆我們總是在追著技術(shù)前進(jìn)的步伐在跑,甚至是優(yōu)秀書(shū)籍的出版,我們也是在后面追趕著,卻始終追趕不上。
將敏捷、面向?qū)ο笏枷搿⒃O(shè)計(jì)模式有機(jī)結(jié)合起來(lái),會(huì)是哪一本書(shū)?還用問(wèn)嗎,自然是Bob大叔的巔峰之作Agile SoftwareDevelopment: Principles, Patterns, andPractices了。本書(shū)中文版的譯者鄧輝先生功底扎實(shí),比較好地將原書(shū)的神韻傳達(dá)了出來(lái)。
若要問(wèn)哪些書(shū)(當(dāng)然是指技術(shù)書(shū)籍)可以讓我重讀不厭?那么這本書(shū)一定要排在前列。實(shí)際上,像這一類的書(shū)籍都是值得反復(fù)閱讀的,因?yàn)槊恳淮伍喿x,它都會(huì)給我們新的啟發(fā)與體會(huì)。所謂“讀書(shū)百遍,其義自現(xiàn)”。技術(shù)書(shū)籍本身存在一定的難度,不同水平的人閱讀同一本書(shū)的收獲是大不相同的。而在不同階段的同一個(gè)人,因?yàn)榧夹g(shù)水平的變化,自然每次都能夠讀出新意來(lái)。本書(shū)附帶的代碼是Java,同時(shí)還包含少量C++代碼。之后,Bob大叔又推出了該書(shū)的C#版,算是滿足了廣大的C#開(kāi)發(fā)者的強(qiáng)烈需求。
即使是最優(yōu)秀的設(shè)計(jì)師,也不可能總是在第一次就能將設(shè)計(jì)做好,因而我們需要重構(gòu)。講解重構(gòu)技術(shù)的書(shū)籍中,最聲名顯赫的無(wú)疑就是MartinFowler的Refactoring: Improving the Design of ExistingCode。正是本書(shū)開(kāi)創(chuàng)了重構(gòu)在軟件開(kāi)發(fā)中的光輝地位。這本書(shū)的優(yōu)秀自然不用我再來(lái)饒舌了。MartinFowler先生是全球知名的軟件大師,他的每一本著作都給業(yè)界帶來(lái)了深遠(yuǎn)的影響。我在一次和Fowler先生的面對(duì)面交談中,曾經(jīng)問(wèn)他至今最滿意的著作是哪一本。他沒(méi)有絲毫的猶豫,就回答是Refactoring。
本書(shū)的中文版名為《重構(gòu):改善既有代碼的設(shè)計(jì)》,譯者為侯捷和熊節(jié)。熊節(jié)是敝同鄉(xiāng),我和他有過(guò)一次面談,談起過(guò)這本書(shū)的翻譯。那些翻譯的往事也讓他感觸頗多吧。本書(shū)真正稱得上是軟件書(shū)籍中的名著名譯。熊節(jié)的中文和英文造詣都很厲害,所以閱讀本書(shū)的中文版,你幾乎感覺(jué)不到有“隔”了一層的晦澀。通篇閱讀下來(lái),就是那么流暢。順帶提及,本書(shū)是少有的中文版封面設(shè)計(jì)優(yōu)于原版設(shè)計(jì)的特例。

雖然說(shuō)Martin Fowler是重構(gòu)技術(shù)的集大成者,書(shū)中提到的重構(gòu)方法也多數(shù)用到了設(shè)計(jì)模式,但真正將重構(gòu)與模式結(jié)合起來(lái)的,還是JoshuaKerievsky,他的著作Refactoring to Patterns也曾經(jīng)榮獲了第15屆Jolt大獎(jiǎng)。書(shū)中強(qiáng)調(diào):“‘通過(guò)重構(gòu)實(shí)現(xiàn)模式、趨向模式和去除模式’,而不再是在預(yù)先設(shè)計(jì)中使用模式,也不再過(guò)早地在代碼中加入模式。”實(shí)際上,這樣的論調(diào)恰恰迎合了敏捷社區(qū)的需要。極限編程的實(shí)踐就要求簡(jiǎn)單設(shè)計(jì)和設(shè)計(jì)改善,改善的方法就是利用重構(gòu)合理地引入設(shè)計(jì)模式,以期改善程序的結(jié)構(gòu),使其具有更佳的可復(fù)用性和可擴(kuò)展性。此外,本書(shū)還是Refactoring: Improving the Design ofExisting Code一書(shū)的補(bǔ)充,增加了諸如用Factory Method引入多態(tài)創(chuàng)建、將聚集操作搬移到CollectingParameter等重構(gòu)方法,明確地把設(shè)計(jì)模式作為重構(gòu)技術(shù)的一等公民。本書(shū)在大陸的中文版為《重構(gòu)與模式》,而在臺(tái)灣則被候捷和陳裕城譯作《重構(gòu)-向范式前進(jìn)》。雖然名字不夠精簡(jiǎn),但卻真正地代表了作者創(chuàng)作本書(shū)的含義,就是從Refactoring到Patterns。

雖然Martin Fowler最看重Refactoring: Improving the Design of ExistingCode一書(shū),但我個(gè)人認(rèn)為,他的Patterns of Enterprise ApplicationArchitecture一書(shū)(中文版名為《企業(yè)應(yīng)用架構(gòu)模式》)價(jià)值更高,因?yàn)樗鼮槲覀冊(cè)O(shè)計(jì)人員給出了全面、深入、權(quán)威的企業(yè)級(jí)設(shè)計(jì)指引。
在所有的軟件大師中,或許MartinFowler是最善于總結(jié)的一位。他雖然沒(méi)有提出具有獨(dú)創(chuàng)性的方法與思想,但很多獨(dú)創(chuàng)性的方法與思想到了他的筆下,都能化腐朽為神奇。本書(shū)最好地印證了這樣的奇跡。在本書(shū)誕生之前,實(shí)際上關(guān)于分層設(shè)計(jì)、并發(fā)處理、對(duì)象關(guān)系映射、表現(xiàn)模式以及分布式處理,已經(jīng)有了許多非常優(yōu)秀的實(shí)踐。但只有MartinFowler憑借自己豐富的技術(shù)經(jīng)驗(yàn)與無(wú)與倫比的創(chuàng)作能力,將這些散落的珍珠串聯(lián)在了一起,最后形成了一串璀璨奪目的項(xiàng)鏈。透過(guò)本書(shū),F(xiàn)owler將自己善于總結(jié)的能力發(fā)揮得淋漓盡致,真可以說(shuō)是“筆落驚風(fēng)雨,書(shū)成泣鬼神。”
Martin Fowler的早期著作中,AnalysisPatterns提出了領(lǐng)域邏輯的諸多建模原則和模式,不過(guò)真正對(duì)領(lǐng)域建模、分析和設(shè)計(jì)產(chǎn)生奠基作用和推動(dòng)作用的,還是EricEvans的大作Domain-DrivenDesign,中文版名為《領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)》。本書(shū)的誕生推動(dòng)了一種設(shè)計(jì)方法,改變了傳統(tǒng)通過(guò)數(shù)據(jù)設(shè)計(jì)驅(qū)動(dòng)開(kāi)發(fā)的模式,而是將核心關(guān)注點(diǎn)放在了領(lǐng)域邏輯上,而這應(yīng)該說(shuō)才是真正的軟件設(shè)計(jì)的正道。
MartinFowler在本書(shū)的序中,這樣寫(xiě)道:“控制復(fù)雜問(wèn)題的關(guān)鍵是建立一個(gè)好的領(lǐng)域模型,它越過(guò)問(wèn)題域的表象介紹其底層的結(jié)構(gòu),給軟件開(kāi)發(fā)人員提供所需要的方法。”毋庸置疑,當(dāng)我們面對(duì)復(fù)雜多變的領(lǐng)域邏輯時(shí),領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)已經(jīng)成為了我們手中的利器。掌握領(lǐng)域驅(qū)動(dòng)設(shè)計(jì),并不能保證所有復(fù)雜的設(shè)計(jì)問(wèn)題都能夠迎刃而解,但這種思想?yún)s能夠幫助我們像庖丁解牛一般,即使面對(duì)紛繁復(fù)雜的領(lǐng)域邏輯,也能夠做到“以神遇而不以目視,官知止而神欲行”。
本書(shū)堪稱經(jīng)典,正如Kent Beck的推薦:“每個(gè)有思想的軟件開(kāi)發(fā)人員,其書(shū)架上都應(yīng)該珍藏這樣一本書(shū)。”說(shuō)起來(lái),我也是Kent Beck提到的“有思想的軟件開(kāi)發(fā)人員”了。