說實(shí)話,我個(gè)人覺得HJ老師的確翻譯了很多優(yōu)秀的作品,質(zhì)量也不錯(cuò)。。但是看他的札記文章,還是有一種王婆賣瓜的味道。。。看到了侯捷的一篇評(píng)論。。轉(zhuǎn)了吧。。有些術(shù)語與大陸的叫法不同。。
Modern C++ Design: Generic Programming and Design Patterns Applied
Andrei Alexandrescu
andrewalex@hotmail.com
譯者 孟巖
侯捷注:本文承譯者孟巖先生應(yīng)允,
轉(zhuǎn)載於此以饗臺(tái)灣讀者,非常感謝。
未得孟巖先生之同意,任何人請(qǐng)勿將此文再做轉(zhuǎn)載。
以下紅色為譯注,紫色為侯捷個(gè)人認(rèn)為宜再斟酌之處。
淺藍(lán)色是侯捷個(gè)人閱讀時(shí)的神秘標(biāo)記。
本繁體文系直接轉(zhuǎn)碼,并未將大陸慣用術(shù)語轉(zhuǎn)換為臺(tái)灣慣用術(shù)語。
前言
你現(xiàn)在大概正站在書店里捧著這本書,問你自己為什麼要買下它。或者也可能你現(xiàn)在正在你公司的圖書館里,猶豫著是否應(yīng)該把時(shí)間花在這本書上。我知道你的時(shí)間很寶貴,所以我會(huì)簡(jiǎn)短截說。你是否有過這樣的情形,比如問自己,如何能用C++寫出更高層的程序?又比如即使你的設(shè)計(jì)已經(jīng)非常乾凈了,但是那些不相關(guān)的細(xì)節(jié)還是像雪崩一樣發(fā)生,這個(gè)時(shí)候應(yīng)當(dāng)如何應(yīng)付?再或者你怎麼樣才能作出一些真正可重用的組件,而不必每次要用的時(shí)候就不得不重新鉆到底層 hack一番?假使你有過這樣的疑問,這本書正是為你而寫的。
想象一下下面的情形:你剛剛從設(shè)計(jì)方案討論會(huì)上回來,手里拿著兩張打印圖表,上面還有你自己的一些潦草記號(hào)。OK,現(xiàn)在這些對(duì)象之間轉(zhuǎn)遞的事件類型不再用char表示了,改成 int 型了,於是你改了一行代碼。哦,指向 Widget 的 smart pointers 太慢了,得取消一些檢查措施,讓它們快點(diǎn),於是你又改了一行代碼。剛才另外一個(gè)部門提出了一個(gè)小的新類,你的 object factory 得對(duì)它提供支持,好,再改一行代碼。行了,你的設(shè)計(jì)改完了,編譯,連接,搞定
且慢,這情形好像有點(diǎn)不對(duì)頭,不是嗎?現(xiàn)實(shí)的情形是這樣的才對(duì):你喪魂落魄地從會(huì)上趕回來,因?yàn)橛幸淮蠖咽虑橐觯喝乃阉鳎o代碼動(dòng)大手術(shù),增加新代碼,當(dāng)然也就飛進(jìn)來新臭蟲,然後再忙不迭地捉臭蟲... 這才是程序員這種人的生活方式,是不是?
雖然這本書不可能承諾使你進(jìn)化到第一種情形,但是卻是向那個(gè)方向邁出的堅(jiān)實(shí)一步。這本書試圖把C++作為一種新的語言展現(xiàn)在軟件設(shè)計(jì)師面前。傳統(tǒng)上,代碼是軟件系統(tǒng)里最細(xì)節(jié)最錯(cuò)綜復(fù)雜的一面。雖然歷史上出現(xiàn)了各種不同層次的程序設(shè)計(jì)語言,支持不同的設(shè)計(jì)方法學(xué)(例如面向?qū)ο蠓椒ǎ谝粋€(gè)程序設(shè)計(jì)藍(lán)圖與最後的實(shí)現(xiàn)代碼之間始終橫亙著一條巨大的鴻溝,因?yàn)榇a必須仔細(xì)關(guān)照到具體實(shí)現(xiàn)和某些輔助性任務(wù)中極其細(xì)節(jié)的問題。設(shè)計(jì)的目標(biāo)很少能夠不被茫茫的細(xì)節(jié)所埋沒。
這本書介紹了一組可復(fù)用的設(shè)計(jì)“珍寶”,稱為“泛型組件”(Generic Components), 同時(shí)還介紹了構(gòu)造這些組件所使用的技術(shù)。這些范型組件能夠在各種軟件系統(tǒng)體系中向用戶提供類似庫的功能。編碼和實(shí)現(xiàn)的技術(shù)將重點(diǎn)置于那些傳統(tǒng)上是屬於設(shè)計(jì)階段的任
務(wù)和問題之上,而設(shè)計(jì)階段的工作通常是在編碼之前就完成了。由於是高層次的組件,范型組件使得我們有可能將復(fù)雜的軟件體系以非常富有表現(xiàn)力 簡(jiǎn)潔和易于維護(hù)的代碼表達(dá)出來。泛型程序設(shè)計(jì) 設(shè)計(jì)模式與C++這三個(gè)要素在這里被組合起來,達(dá)成在縱向和橫向上的高度可復(fù)用性。在橫向上,使用一個(gè)很小的代碼庫就實(shí)現(xiàn)了一個(gè)可組合的 數(shù)量不限的結(jié)構(gòu)和行為集合。在縱向上,這些組件的通用性使得它們能夠被應(yīng)用于廣泛的應(yīng)用程序中。
設(shè)計(jì)模式是對(duì)於在面向?qū)ο箝_發(fā)過程中反復(fù)出現(xiàn)的問題所給出的高效解決方案,本書從其中獲益匪淺。對(duì)那些出現(xiàn)在各種背景下的問題有一些有效的 可復(fù)用的解決方案,而設(shè)計(jì)模式正是從這些優(yōu)秀的設(shè)計(jì)方案中萃取出來的精華片段。設(shè)計(jì)模式的重點(diǎn)在
于提出一個(gè)匯集建議性設(shè)計(jì)方案的詞典,它們描述問題,給出經(jīng)過時(shí)間驗(yàn)證的解決方案及其變體,描述應(yīng)用各種變體會(huì)產(chǎn)生的效果。設(shè)計(jì)模式超越了程序設(shè)計(jì)語言所能表達(dá)的范疇,不管一種語言多麼先進(jìn),它本身也很難表達(dá)設(shè)計(jì)模式。在這本書中展現(xiàn)的組件通過使用和組合使用某些設(shè)計(jì)模式,能夠應(yīng)用于一大批具體問題。
泛型程序設(shè)計(jì)是一種范型(paradigm),它致力于將各種類型按照一小組功能性的需求加以抽象,然後以這些需求為條件實(shí)現(xiàn)算法。由於算法在其操作的數(shù)據(jù)類型上定義了一個(gè)嚴(yán)格的窄接口,同一個(gè)算法便可以應(yīng)用于各種類型之上。本書中的實(shí)現(xiàn)方案使用了泛型程序設(shè)計(jì)技術(shù),從而具有了普遍性,非常簡(jiǎn)潔,而且效率上可與手寫代碼相匹敵。
在這本書里C++是唯一的實(shí)現(xiàn)工具。你不會(huì)在這本書里找到出色的窗口系統(tǒng)實(shí)現(xiàn)方案,也不會(huì)有復(fù)雜的網(wǎng)絡(luò)組件庫和精致的日志機(jī)制。相反的,您能發(fā)現(xiàn)的是一些基礎(chǔ)的組件,這些組件能夠幫助你更容易地實(shí)現(xiàn)上面的那些目標(biāo),以及更多其他的目標(biāo)。C++具有使這一切成為可能的能力。它底層的C內(nèi)存模型保證了不打折扣的運(yùn)行性能,對(duì)於多態(tài)性的支持確保了面向?qū)ο蠹夹g(shù)的發(fā)揮,而其模板機(jī)制實(shí)現(xiàn)了一個(gè)難以置信的代碼產(chǎn)生機(jī)。模板遍布在本書的代碼中,因?yàn)檫@一機(jī)制使得用戶和庫之間形成密切的合作關(guān)系。庫的使用者按照庫的字面意義來控制代碼的生成方式,也就受到庫的限制。泛型組件庫的角色則是允許用戶將自定義
的類型和行為與泛型組件組合起來以形成合理的設(shè)計(jì)。由於這些技術(shù)是在靜態(tài)的背景下使用的,在將各種相應(yīng)的片段組合匹配的過程中所產(chǎn)生的錯(cuò)誤通常都能夠在編譯時(shí)被發(fā)現(xiàn)。
很明顯的,這本書的意圖是建立泛型組件 預(yù)先實(shí)現(xiàn)的設(shè)計(jì)片段,其主要特性是靈活 多能和易用。泛型組件并沒有構(gòu)成一個(gè)framework。事實(shí)上,它們的作用是補(bǔ)充性的 一個(gè) framework針對(duì)一個(gè)特定對(duì)象模型定義了一些相互依賴的類,而泛型組件是一些輕量級(jí)的(lightweight)設(shè)計(jì)作品,彼此之間相互獨(dú)立,同時(shí)又能夠自由地組合與匹配,在實(shí)現(xiàn)framework 過程中會(huì)很有助益。
本書的主要讀者對(duì)象是兩類人。第一類是有經(jīng)驗(yàn)的C++程序員,他們希望掌握最新的庫編寫技術(shù)。本書展示了新的 強(qiáng)有力的C++慣用法(idiom),其能力令人驚訝,有些甚至是人們從來就不敢想的。這些慣用法在寫高級(jí)庫的時(shí)候非常有用。想更上一層樓的中級(jí)程序員當(dāng)然也會(huì)發(fā)現(xiàn)本書很有用,特別是如果他們能夠投入一定毅力的話。盡管某些地方的代碼確實(shí)很艱澀,不過我也做了很詳盡的解釋。第二類是那些忙碌的程序員,他們得完成工作,又不可能在學(xué)習(xí)上付出太大的代價(jià)。他們可以略過那些最復(fù)雜的實(shí)現(xiàn)細(xì)節(jié),將精力集中到對(duì)這個(gè)庫用法的掌握上。每一章都有介紹性的解釋,以“Quick Facts”結(jié)束。程序員們會(huì)發(fā)現(xiàn)在理解和使用組件方面,這些部份是非常有用的叁考資料。組件可以單獨(dú)的去理解,同樣可以很有力 安全和出色地使用。你得有扎實(shí)的C++使用經(jīng)驗(yàn),最重要的是有強(qiáng)烈學(xué)習(xí)欲望。希望讀者對(duì)於模板機(jī)制和STL能夠比較熟悉,也建議大家了解一些設(shè)計(jì)模式方面的知識(shí)(Gamma et al.1995),不過不必強(qiáng)求。本書所運(yùn)用到的模式和慣用法都會(huì)被詳細(xì)的解釋。但是,這本書不是一本模式技術(shù)書籍 沒有打算全面論述模式技術(shù)。因?yàn)樵谶@本書里,模式是從一個(gè)庫編寫者的實(shí)用主義觀點(diǎn)來展現(xiàn)的,所以即使是對(duì)模式技術(shù)更感興趣的讀者也會(huì)發(fā)現(xiàn)這個(gè)觀點(diǎn)很有新意。