天天看點

三本 OOP 絕佳小書(by 侯捷)

    由於出版人的水準和視野的侷限,以及讀者的浮動,雖然許多經典已經出版,現在大夥兒(出版人和讀者)卻一勁兒注視新書,很大程度可說是捨近求遠。在C++/OOP 世界中,EC,MEC,TCSL,Primer,TCPL,ObjectModel,Design Patterns 幾乎可以說是必讀的,但很快地這些經典(中譯)將消失於大陸讀者眼中,而且永遠消失了(因為不能再有人去做它,除非有英文新版),非常可惜,非常可惜。能在DearBook中長久儲存一些經典推薦文,有助於後學。

---------------------------------------------------------------------------------------

拿破侖雖然是個矮個子,一生叱吒卻俨然曆史巨人。今天我要介紹的三本書,雖然輕薄短小有如拿破侖的身材,在 C++/OOP 領域裡,其份量與影響卻也有着拿破侖般的輝煌燦爛。

說它們輕薄短小,是的,讓數字說話:三本書合起來才256+318+208=782 頁,隻比 C++ 語言知名教本 《  C++ Primer 中文版(第三版) 》一半篇幅再多一些而已,比起 C++ 語言權威着作《  C++程式設計語言(特别版) 》也才達到三分之二的頁數份量。逛書店時一個不留神,隻怕你便遺漏了這些小書的存在。但如果你真遺漏了它們的存在,實在是你的莫大損失。

就我個人的程式設計經驗,以及我的教學經驗(對象為業界工程師或大學生),隻要是 C++/OOP 設計思維與語言運用本身的問題,非關 problem domain,百分之九十以上皆可在這三本書籍中找到直接或間接的答案。這三本書是:

●《  Effective C++中文版 》: 50 Specific Ways to Improve Your Programs and Designs

●《  More Effective C++中文版 》 : 35 New Ways to Improve Your Programs and Designs

●《  Exceptional C++中文版 》 : 47 Engineering Puzzles, Programming Problems, and Solutions

(《  More Exceptional C++ 中文版 》也已出版)

(注:前兩本書亦有 CD 産品(HTML 格式),以兩書合一的方式出售,交叉索引甚為友善)

書名副标清楚告訴我們,這些書籍的特色就是以一個個的條款來說明一些值得奉行或是必須避免的動作。以條款的方式進行,一方面因為它們都不是 C++ 語言教本,而是更高層次的書籍,是給有語言基礎(最好還有實際工作經驗)的人看的書,是以可以集中火力在特定主題上,另一方面實乃因為條款型式可以強化主題,加深印象,提升查閱檢索的友善性與價值。

書中某些條款在 C++ 語言書籍裡或多或少也都有提到 ─ 雖然解釋的深度可能不足。我舉個例子,《  Effective C++中文版 》 的條款13說「Initialization list 中的 members 初始化排列次序應該和其在 class 内的宣告次序相同」,《  C++ Primer 中文版(第三版) 》 的 p721~p722 對此有相同意義的描述。再舉個例子,《  Effective C++中文版 》 的條款14說「總是讓 base class 擁有 virtual destructor」,這在《  C++ Primer 中文版(第三版) 》的 p933 亦有相同意義的描述。諸如此類,不勝枚舉。但你是不是感覺,那些金科玉律被淹沒在語言百科型書籍的細節叢林之中!

每一條準則都簡短、明确、容易記憶,可以确實提升你的軟體效能。每一條準則都是經驗豐富的 C++ 程式員的心血結晶,告訴你哪些是幾乎總是需要奉行的動作,哪些是幾乎肯定要避免的事情。某些條款甚至到達 patterns 的水準(注)。

注:所謂 patterns,在指程式設計過程中,開發人員常需面對并解決的某些問題,被有系統地整理出解法,謂之 patterns(或譯為「樣式」)。《  設計模式--可複用面向對象軟體的基礎 》是此域中的經典書籍,系統化地将可應用於衆多領域之 23 個基本 patterns 加以分類整理。書中所提的 patterns 名稱,幾乎成為物件導向設計領域的标準辭彙。

以上三本小書的功用不僅在提綱契領地點出重點,也在於對每個主題有深刻的讨論。在這些書籍中,你會發現一些忠告,告訴你應該做些什麽,為什麽如此;也告訴你不應該做些什麽,又為什麽如此。基本而言當然 whys 比 whats 更重要,這便是這些書籍最有價值的地方。至於從速食的角度來看,檢閱一系列準則,也比強記一或二本龐雜的教科書更輕松友善得多。

以上三本小書的功用不僅在提綱契領地點出重點,也在於對每個主題有深刻的讨論。在這些書籍中,你會發現一些忠告,告訴你應該做些什麽,為什麽如此;也告訴你不應該做些什麽,又為什麽如此。基本而言當然 whys 比 whats 更重要,這便是這些書籍最有價值的地方。至於從速食的角度來看,檢閱一系列準則,也比強記一或二本龐雜的教科書更輕松友善得多。

1.Effective C++ 2/e

《  Effective C++中文版 》

Scott Meyers 的這本書籍,成名已久,同時也是此類書籍的濫觞。這本書在 1992 年便有了第一版,我手上的第一版是 1996/12 的第 12 刷。刷次原不能代表什麽,不過我在第二版的封底看到,出版公司宣稱第一版銷售超過十萬本(不含各種譯本)。銷售量能否代表什麽呢?銷售量低或許不一定能代表什麽,銷售量高則相當程度地表示受到讀者的肯定。以此書訴求之技術層面而言,這個銷售量是驚人的。(當然要是比起大陸某 C 語言書籍銷售270 萬本,以及某 Visual Basic 書籍銷售破千萬本,那是小巫見大巫了)

隻要是在 C++ 領域裡打滾的程式員,馬上便可以從 Meyers 整理出來的 50 個條款看出此書的價值。如果你拿 C++ 來讨生活,稍稍閱讀幾個條款的深度後,不掏腰包者幾稀。有些條款涉及的語意層面較低,用以對容易出錯或混淆的數種程式寫法提出警告。另有一些條款涉及的層次比較高,如第六章中對於各種繼承型式的讨論、以及 classes 之間除了繼承以外的其他關系的讨論。至於條款E45「知道 C++ 編譯器默默為我們完成和呼叫哪些函式」,以及條款M24「了解 virtual functions、multiple inheritance、virtual base classes、RTTI 所需的成本」,下涉物件模型與編譯器層面,相當深入。套用我在「C++ 的沉迷與愛戀」一文中的用辭,此書在高熱和驟冷之間,在高階和低階之間 煉、循環、震蕩。

2.More Effective C++

《  More Effective C++中文版 》

繼 《  Effective C++中文版 》  之後,Scott Meyers 於 1996 推出這本「續集」。條款變得比較少,頁數倒是多了一些,原因是這次選材比「第一集」更高階,尤其是第五章。Meyers 将此章命名為技術(Techniques),并明白告訴你,其中都是一些 patterns,例如 virtual ctors、smart pointers、reference counting、proxy classes,double dispatching┅等等。這一章的每個條款篇幅都在 15~30 頁之譜,實在讓人有「山窮水盡疑無路,柳暗花明又一村」之歎。

雖然出版年代稍嫌久遠,本書并沒有第二版,原因是當其出版之時(1996),C++ Standard 已經幾乎定案,本書即依當時的标準草案而寫。其間與現今之 C++ 标準規格幾乎相同。可能變化的幾個彈性之處,Meyers 也都有所說明與提示。讀者可以連結作者提供的網址,看看上下兩集的勘誤與讨論(數量之多,令人驚恐。幸好多是技術讨論或文字斟酌,并沒有什麽重大誤失)。

3.Exceptional C++

《  Exceptional C++中文版 》,《  More Exceptional C++ 中文版 》

相較於前兩本威名遠播的老大哥,這本小書不但資曆淺,作者也似乎不是那麽有名。真的不那麽有名嗎?未必,這要看你熟悉哪個領域,在哪個領域活動而定。本書内容源自極受歡迎的 C++ 網際網路節目 Guru of the Week,作者Herb Sutter 正是這個網路節目的創辦者,同時也是C++ Report 的專欄作家,以及網際網路讨論群 comp.lang.c++.moderated 的創始主持人。

本書的一個最大特色是,以執行個體進行的方式,告訴你如何以标準 C++ 進行軟體工程。書中所列的執行個體,有些是棘手的 C++/OOP 疑難雜症,有些展示穩健強固且具擴充性的程式碼。隻需數分鐘時間,你便可以拿書中一些 C++ 設計問題和實作問題來挑戰自己并且獲得樂趣(是的,每個問題都有一個難度評分)。

每一個執行個體,都可以測驗你的觀念正确與否。書中許多主題與《  Effective C++中文版 》 和 《  More Effective C++中文版 》 的條款互相輝映,一個執行個體之中可能隐含了 Meyers 兩本書的數個條款的運用。順帶一提,這本書有老大哥 Scott Meyers 寫序推薦。

●結語

理論與實務的結合,是每一位資訊從業人員希望達到的目标。過多的照本宣科,過少的實務經驗(真正有價值的實務經驗),卻是目前資訊相關書籍的普遍寫照。

《  Effective C++中文版 》,《  More Effective C++中文版 》 , 和《  Exceptional C++中文版 》(以及《  More Exceptional C++ 中文版 》)

,這三本書不僅在實務面上提出極為寶貴的準則,并以豐富而紮實的理論基礎,深入解釋每一條準則背後的來龍去脈。可以相當程度地提升你的 C++ 程式技術與 OO 設計思維。

着名的語言專家 Benjamin Whorf 曾說:『語言可以塑造人類思考的方式,并決定人類思考的内容』。使用 C++ 語言,絕不僅隻於使用 C++ 編譯器(很多人确是如此 ─ 雖然他們不自覺);重要的是運用隐含於語意之中的物件導向(Object Oriented)觀念與泛型(Genericity)觀念,在軟體設計階段便創造出一個有彈性、易修改、适用未來時态的架構。

對於物件導向領域的生手,這三本書可以給你一個震憾教育,讓你知道過去的寫作是多麽地不嚴謹、觀念是多麽地不成熟。或許這套書會促使很多自以為是的讀者謙卑地認知自我的不足,并謙卑地終於知道什麽是井蛙、河魚和燕雀。

至於物件導向個中老手,是的,這三本書為你整理出多年打滾所獲的寶貴心得,佐以深度的學理探讨,必然讓你有相見恨晚之歎。

繼續閱讀