Effective C++:改善程式與設計的55個具體做法:第3版 評註者序
Effective C++:改善程式與設計的55個具體做法:第3版 評註者序
評註者序
2010年秋,電子社編輯俠少寄給我一本Effective C++(第三版)英文原版書,並託我為這本書寫一些評註,希望做成評註版在國內出版。經慎重考慮後我受領了這一任務。
與Effective C++的淵源
回想起來,透過更深入地理解C++而獲得一種喜悅感,已是十多年前的事情了。2000 年前後我剛剛從C語言遷移到C++來做實際的專案,同一時期國內湧現出一大批C++語言相關著作。我讀了一本便一發不可收拾,幾乎閱遍當時可以找到的相關書籍。從純粹學習語言的角度來講,Effective C++是相當重要的一本書,也是作為過來人的我最想推薦給大家的。閱讀其時(當時是第二版),我已經用C++編寫過一個開源的遊戲引擎,有了數萬行程式碼的經驗,書中總結的條款讀來心有慼慼焉。猶記得當年是在書店駐足讀完大半本書,才想起來買下來帶回去讀。
時光堆積的反思
之後的幾年裡,我用C++編寫了數十萬行程式碼。寫得越多,對之前的作品越不滿意,程式碼風格也隨之變化,而且慢慢產生懷疑,到底是否存在一種普遍合理、高效的C++使用方法——它可以讓其他程式設計師,或是將來的自己審閱程式碼後,表示一致讚賞,而不需要用無休止的重構來滿足自己的完美主義傾向。其實也就是本書作者Scott Meyers這些年來探討的主題。C++伴隨軟體工業發展這些年,修修補補。由於工程需要,它必須保持向前相容,並儘量滿足每個時期的工程需求。這注定它不可能是一門完美的語言,也註定它是一門備受爭議的語言。
盡管對C++的批評和質疑從未間斷,但毋庸置疑,它絕不會銷聲匿跡。而且,C++到底是不是一門高效語言,並不是本書探討的重點。本書的著眼點在於,如果你選擇了C++,如何使它變得更高效,也即如何有效使用C++。其實,一開始我是有些好奇,大牛Scott Meyers這個主題寫了十多年,就沒有什麼可抱怨的?當這次為點評而重新讀到Item 25——由std::swap的擴充套件問題(本書第117頁)引申到特例化std名字空間裡的方法時,一 句“Alas, the form. of the prohibition may dismay you”惹我會心一笑,從此釋然。
再讀經典的別樣感觸
再讀這本書的新版,速度很慢,有時還會和第二版對照一下,體會作者思想的變遷。作為參考,還重溫了《C++語言的設計和演化》的幾個章節。畢竟文字最終要印成鉛字,不由得慎重起來,似乎從來沒有如此耐心地逐字讀英文句子。讀到細節處,發現作者把每個問題講得都很透,表達流暢,前後反覆呼應,即使無太多英文閱讀經驗的人,也可以輕鬆讀懂,不愧是寫了十年的精品。十分欽佩之餘,卻也為無從下筆而犯難,似乎能任意發揮之處,只剩對C++的爭議。初稿發給出版社後,經編輯提醒又增加一些“幫助初學者解惑和提速”的內容,希望不致誤導C++初學者放棄學習這門有趣的語言。
不安的評註者
評註這個工作比翻譯難做,尤其是評Effective C++這樣的經典。寫得太多有狗尾續貂之嫌,太少又愧對讀者的期望。而且,無論怎樣寫,都會帶有特定時期個人觀點的侷限性。要特別提醒的是,不要把某些評註看作是對C++的批評。作為用了多年C++並一度沉迷其中的程式設計師,那只是愛之深後的責之切。
本書除了少部分評註是針對個別程式碼段或關鍵詞外,尚有不少篇幅為對原書篇章、段落主題的擴充思考,可拋開原文獨立閱讀。限於水平,有很多地方,想表達的東西沒能講透,是一種遺憾。相對於Scott Meyers積累了十數年的精華章句,我這個後學晚輩倉促成文忝列其間,實在誠惶誠恐。評註中錯誤之處,望方家或不吝賜教,或一笑了之。
祝各位讀者擁有和我一樣愉快的閱讀體驗。
雲風 2011 年春 於 杭州
序 言
1991年我寫下Effective C++第一版。1997年撰寫第二版時我更新了許多重要內容,但為了不讓熟悉第一版的讀者感到困惑,我竭盡所能保留原始結構:原先50個條款中的48個標題基本沒變。如果把書籍視為一棟房屋,第二版只是更換地毯、燈飾,重新粉刷一遍而已。
到了第三版,修繕工作進一步深入壁骨牆筋(好幾次我甚至希望能夠翻新地基)。1991年起C++世界經歷了巨大變革,而本書目標——在一本小而有趣的書中確認最重要的一些C++程式設計準則——卻已不再能夠由15年前建立的那些條款體現出來。“C++程式設計師擁有C背景”這句話在1991年是個合理假設,如今C++程式設計師卻很可能來自Java或C#陣營。繼承(inheritance)和麵向物件程式設計(object-oriented programming)在1991年對大多數程式設計師都很新鮮,如今程式設計師已經建立良好概念,異常(exceptions)、模板(templates)和泛型程式設計(generic programming)才是需要更多引導的領域。1991年沒人聽過所謂設計模式(design patterns),如今少了它很難討論軟體系統。1991年C++正式標準才剛要上路,如今C++標準規範已經8歲,新版規範蓄勢待發†。
為了對付這些改變,我把所有條款抹得一乾二淨,然後問自己“2005年什麼是對C++ 程式設計師最重要的忠告?”答案便是第三版中的這些條款。本書有兩個新章,一個是資源管理(resource management),一個是模板程式設計(programming with templates)。實際上template這東西遍佈全書,因為它們幾乎影響了C++的每個角落。本書新素材還包括在exceptions概念下程式設計、套用設計模式,以及運用新的TR1程式庫設施(TR1於條款54描述)。本書也告訴大家在單執行緒系統(single-threaded systems)中執行良好但可能不適用於多執行緒系統(multithreaded systems)的某些技術和做法。本書半數以上內容是新的。在此同時第二版大部分基礎資訊仍然很重要,所以我找出一個保留它們的辦法:你可以在附錄B找到第二、第三兩版的條款對應表。
我努力讓本書達到我所能夠達到的最佳狀態,但這並不表示它已臻完美。如果你認為某些條款不適合作為一般性忠告,或你有更好的辦法完成本書所談的某件工作,或書中某些技術討論不夠清楚不夠完全,甚或有所誤導,請告訴我。如果你找出任何錯誤——技術上的、文法上的、排版印刷上的,不論哪一種——也請告訴我。我很樂意將第一位提出問題並吸引我注意的朋友加入下次印刷的致謝名單中。
即使本書條款個數擴充為55,這一整組程式設計準則還談不上完備。然而畢竟整理出優良準則——幾乎任何時間適用於任何應用程式的準則——比想象中困難得多。如果你有其他程式設計準則的想法或建議,我將樂以與聞。
我手上維護本書第一印以來的變化清單,其中包括錯誤修訂、進一步說明和技術更新。這份清單放在網址為的"Effective C++ Errata"網頁上。如果你希望在這份清單更新時獲得通知,請加入我的郵件列表。這份列表用來發布訊息給可能對我的專業工作感興趣的人士,詳情請見 MailingList/。
Scott Douglas Meyers Stafford.Oregon
2005年4月
侯捷 譯
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/13164110/viewspace-702858/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 重構:改善既有程式碼的設計(評註版) 評註者序
- 程式設計實踐(評註版) 評註者序程式設計
- 《Effective C++》第4章 設計與宣告(2)-讀書筆記C++筆記
- 《Effective C++》第4章 設計與宣告(1)-讀書筆記C++筆記
- Effective C++ 4.設計與宣告C++
- Effective C++:類與函式的設計和申明C++函式
- kingofark的第1個五評計劃 - 五評C++(1) (轉)GoC++
- observejs改善元件程式設計體驗JS元件程式設計
- 編寫高質量程式碼:改善Java程式的151個建議(第4章:字串___建議52~55)Java字串
- 好書妙評之《重構:改善既有程式碼的設計》
- 前端週刊第 55 期:10X 程式設計師?前端程式設計師
- 《Effective C++》閱讀總結(四): 設計、宣告與實現C++
- 《程式設計師必讀之軟體架構》譯者序程式設計師架構
- nlp基礎之-詞彙表構建的具體做法
- 《C++程式與設計》(第 3 版)課堂作業 Work 12C++
- 《程式設計之道》譯者序(轉載) (轉)程式設計
- Effective c++(筆記)之繼承關係與物件導向設計C++筆記繼承物件
- 《C++程式設計教程(第3版)》——第1章,第2節從C到C++C++程式設計
- Effective c++(筆記) 之 類與函式的設計宣告中常遇到的問題C++筆記函式
- Google C++ 程式設計風格指南:註釋GoC++程式設計
- 重構:改善既有程式碼的設計
- 重構-改善既有程式碼的設計
- 改善使用者體驗的 3 個 AngularJS 指令AngularJS
- 改善網站使用者體驗的20個方法網站
- 《Effective C++》第三版-4. 設計與宣告(Design and Declarations)C++
- 三維偏序的優秀做法
- C++程式設計批評系列 繼承的本質(轉)C++程式設計繼承
- Google C++程式設計風格指南(六):程式碼註釋GoC++程式設計
- 《重構——改善既有程式碼的設計》感想
- 一個優秀windows C++程式設計師的知識體系WindowsC++程式設計師
- Effective C++ 第六章--繼承與物件導向設計筆記C++繼承物件筆記
- 軟體結構設計,具體分為幾個步驟?
- 漫談 C++:良好的程式設計習慣與程式設計要點C++程式設計
- 漫談C++:良好的程式設計習慣與程式設計要點C++程式設計
- C++與物件導向程式設計C++物件程式設計
- 《Effective C++》第5章 實現-讀書筆記C++筆記
- C++原子操作與記憶體序 1C++記憶體
- C++語言程式設計筆記 - 第6章 - 陣列、指標與字串C++程式設計筆記陣列指標字串