一本超越期待的 C++ 書——簡評《Boost程式庫完全開發指南:深入C++“準”標準庫》
阿新 • • 發佈:2019-01-01
賴勇浩(http://laiyonghao.com)
作為一個時不時要用一點 C++ 的程式設計師,我常常自嘲為斯德哥爾摩綜合症患者,用 Python 寫著懶散的程式碼時,會懷念以前編寫 C++ 程式碼的那種被虐感。但當真正要寫一些 C++ 程式碼的時候,又會懷念 Python 帶給我的自在,這也許就是所謂的由奢入儉難了。幸好有 Boost,有時候它甚至讓我覺得其實 C++ 也可以寫得如同 Python 般雅緻。大概是因為 Boost 的組委們一直以來的高要求,好庫,好文件,所以長期都是閱讀線上文件作為學習的途徑。後來也有國人翻譯了一本 Boost 的書,書很棒,但對應的 Boost 的版本就比較過時了,而且語言轉換過程中也有不可避免的資訊流失,令人扼腕。這幾年,alai 等人自發組織起來,翻譯了 Boost 的全部文件和一些相關書籍,而且對版本的跟進也是比較及時的,是不可多得的好材料。儘管有如此方便的資源,我還是比較期待有一本國人寫的,Boost 相關的書,我相信國人對我們使用的 C++ 風格和水平有更好的理解,能夠寫出更適合我們真實需求的書。所以後來手上才有這本《Boost程式庫完全開發指南:深入C++"準"標準庫》(以下簡稱《Boost 指南》)。
雖然我期待一本國人寫的 Boost 相關的書,但是當我看到這本書的目錄時,我不由地鄙視起來:太多東西了,像流水賬,甚至可能是直接抄襲官方文件。
當書到手後,我發現它超越了我的期待,作者的苦心孤詣不說,至少抄襲完全是不存在的。第 0、1 兩章把讀者引入 Boost 的新新世界,講述了本書的基本結構和閱讀指南,然後是 Boost 的安裝與編譯,給了初手一條向上的梯子。本書可以說是詳略得當,作為一作定位為手冊+介紹的書,做到這一點不太容易。編排由淺入深,而又曲徑通幽,比如以“時間與日期”作為 hello boost 之例,與當前市面上的 Boost 大有不同(通常是以 shared_ptr 為始),因為“時間與日期”是大家天天接觸的概念,接受起來容易不少,讓人感覺 Boost 真的有用,解決實際問題,這樣讀者對 Boost 的興趣就被勾了起來,再往下讀,也不那邊怕艱難了。其實按我的設想,我覺得接下來就講一下字串和各種容器,比如 tuple、unordered、bimap、circular_buffer 之類的,應該更好一些;可惜這本書還是接下來馬上就開始講記憶體管理,介紹 shared_ptr 了,不能免俗啊。
這本書的另一個特色就是例子都是作者專心構造的,盡顯作者給足了心想做本好書。比如講 date_time 庫的那一章,構造了一個信用卡的免息期的計算例子,例在身邊,感受新鮮,我當時讀到這個例子覺得作者真可算得上匠心獨運了。雖然如此,但仍然要指出一下因為作者可能不太喜歡參考他人的一些例子(太怕被人說抄襲而刻意避嫌?),也有一些我覺得不太好的例子,比如講 operators 時,那個 class point,居然支援大小比較和加減操作,多少有點算概念沒理清。如果實在要用這個例子,我覺得也許叫 class vector3d(三維向量)更好一些。
最後,講一下這本書我覺得比較不喜歡的地方。在我看來,既然讀者都已經開始學習、使用 Boost 了,想必基礎較好、自我學習能力較強,《Boost 指南》仍然定位在介紹和手冊這一層次,我覺得多少讓人覺得這本書寫得囉嗦、寫得不夠深入。雖然全書都是作者自己的經驗和學習成果,例子也是精心構建,但讀來仍然不會有勝於官方文件的感覺。關於 Boost 的書,我更期待的也許是如何以 Boost 來解決一些經典的問題,向讀者展示 Boost 的強大與實用的《Boost Cookbook》。從全書來看,作者 C++ 經驗相當豐富,這本書完全沒有展示出作者的實際水平,很期望作者能夠加加油,換換思路,帶給我們一本《Boost Cookbook》。
最後兩章,Boost 和設計模式、結束語,是畫龍點睛之筆。前者對 GoF 的 23 個設計模式和後來總結的 3 個設計模式與 Boost 結合起來,點破 Boost 中的哪些庫使用了哪個設計模式,可以說是點破了 Boost 庫精巧靈活之謎,也讓設計模式的學習者、愛好者有一個可觀摩的模式的應用與實現的典範。這是在其它書中不曾見的。而在結束語中,作者直言 C++ 和 Boost 仍然有很多不足,但我們也不必拘泥於此,我們要有開闊的眼界,用好工具解決好問題,程式設計,功夫在詩外。作者最後講到一句話,因為我也曾說過類似的言論,使我頓生慼慼,所以借來作為我的書評的結束吧:……生活中不只有 C++、程式碼和程式設計,還有更多的東西值得我們去體味,朋友、親人、愛人更值得花時間與他們在一起。走出辦公室,離開計算機,去親近大自然,享受美餐,散散步,打打球……擁有美好的生活才能夠創造出完美的程式。