官术网_书友最值得收藏!

推薦序

最近一年,我電話面試了數十位C++應聘者,慣用的暖場問題是“您在工作中使用過STL的哪些組件?用過Boost的哪些組件?”,我得到的答案大多為vector、map和shared_ptr。如果對方是在校學生,我一般會問他vector或map的內部實現、各種操作的復雜度,以及迭代器失效的可能場景。如果對方是有經驗的程序員,我會追問shared_ptr的線程安全性、循環引用的后果及如何避免、weak_ptr的作用等。如果對方回答得不錯,還可以進一步問問他如何實現線程安全的引用計數,如何定制刪除動作等。這些問題能讓我迅速判別對方的C++水平。

我之所以在面試時問到Boost,是因為其中的許多組件確實可以用于編寫可維護的產品代碼。Boost包含近百個程序庫,其中不乏具有工程實用價值的佳品。每個人的習慣與技術背景不一樣,對Boost的取舍也不一樣。就我個人的經驗而言,首先,可以使用絕對無害的庫,如noncopyable、scoped_ptr、static_assert等,學習和使用這些庫比較簡單。其次,有些功能很容易自己實現,正好Boost里提供了現成的代碼,那就不妨一用,如date_time和circular_buffer等。然后,在新項目中,進行消息傳遞和資源管理可以考慮采用更加現代的方式,如在某些情況下用function/bind代替虛函數作為庫的回調接口、借助shared_ptr實現線程安全的對象回調等,這二者會影響整個程序的設計思路與風格,需要通盤考慮,如果能正確使用智能指針,那么在現代C++程序里一般不需要出現delete語句。最后,應對某些性能不佳的庫保持警惕,如lexical_cast。總之,在每個項目組成員都能理解并運用的基礎上,適當引入現成的Boost組件,可以減少重復勞動,提高生產力。

Boost是一個寶庫,其中既有可以直接拿來用的代碼,也有值得借鑒的設計思路。試舉一例:正則表達式庫regex對線程安全的處理。

早期的RegEx類不是線程安全的,它把正則表達式和匹配動作放到了一個類里邊。由于有可變數據,所以RegEx類的對象不能跨線程使用。如今的RegEx類明確地區分了不可變(immutable)數據與可變(mutable)數據,前者可以安全地跨線程共享,后者則不行。例如,正則表達式本身(basic_regex)與一次匹配的結果(match_results)是不可變的;而匹配動作本身(match_regex)涉及狀態更新,它是可變的,于是要用可重入的函數將其封裝起來,避免這些數據泄露給別的線程。正是由于做了這樣合理的區分,所以在正常使用RegEx類時就不必加鎖。

Donald Knuth在Coders at Work一書里表達了這樣一個觀點:如果程序員的工作就是擺弄參數去調用現成的庫,而程序員不知道這些庫是如何實現的,那么這份職業就沒啥樂趣可言。換句話說,固然我們強調在工作中不要重新發明輪子,但是作為一個合格的程序員,應該具備自制輪子的能力,非不能也,是不為也。

C/C++語言的一大特點是其標準庫可以用語言自身實現。C標準庫的strlen、strcpy、strcmp系列函數是教學與練習的好題材,C++標準庫的complex、string、vector則是類、資源管理、模板編程的絕佳示范。在深入了解STL的實現之后,運用STL自然手到擒來,并能自動避免一些錯誤和低效的用法。

為了消除使用Boost時的疑慮,用得更順手,有時我們需要適當了解其內部實現,甚至編寫簡化版Boost以進行對比驗證。但是由于Boost代碼用到了日常應用程序開發中不常見的高級語法和技巧,并且為了跨多個平臺和編譯器大量使用了預處理宏,所以閱讀Boost源碼并不輕松,需要使用者下一番功夫。如果使用者沉迷于這些有趣的底層細節而忘了原本要解決什么問題,恐怕就舍本逐末了。

Boost中的很多庫是按泛型編程的范式來設計的,對于熟悉面向對象編程的人而言,或許面臨一個思路的轉變。例如,你需要熟悉泛型編程的那套術語,如concept、model、refinement,才容易讀懂Boost.Threads文檔中關于各種鎖的描述。我想,對于熟悉STL設計理念的人而言,這不是什么大問題。

在某些領域,Boost不是唯一的選擇,也不一定是最好的選擇。例如,要生成公式化的源代碼,我會首選用腳本語言寫一小段代碼生成程序,而不用Boost.Preprocessor;要在C++程序中嵌入領域特定語言,我會首選Lua或其他語言解釋器,而不用Boost.Proto;要用C++程序解析上下文無關文法,我會首選用ANTLR來定義詞法與語法規則并生成解析器(parser),而不用Boost.Spirit。總之,使用Boost時心態要平和,別較勁去改造C++語言,把Boost有助于提高生產力的那部分功能充分發揮出來,讓項目從中受益才是關鍵。

要學習Boost,除了閱讀其官方網站的文檔、示例與源碼,最好能在手邊放一本比較全面的中文書,以隨時翻閱。對不諳英文的開發者而言,這更是可幸之至。您手上這本《Boost程序庫完全開發指南》就是很好的使用指南與參考手冊,在這本書中,作者由淺入深地介紹了Boost的大部分常用內容,能讓讀者迅速了解Boost,并從中找到自己需要的部分。拿到這本書之后,我有粗有細地閱讀了一遍,總體來看,作者水平很高,也相當務實,作者對C++和Boost的理解與運用很到位,我從這本書中學到了不少新知識。為此,我樂于向希望學習Boost程序庫的開發者推薦這本靠譜的書。

須知“功不唐捐”,作為一名現代C++程序員,在Boost上投入的精力定能獲得回報。

陳碩

《代碼大全》譯者之一

中國香港

主站蜘蛛池模板: 兴海县| 光山县| 青川县| 麻栗坡县| 杭州市| 蕲春县| 万荣县| 阜南县| 武邑县| 江山市| 大悟县| 阳江市| 佛坪县| 兰州市| 白城市| 宝兴县| 邢台县| 泰州市| 枣阳市| 禹城市| 巴彦淖尔市| 云阳县| 宜春市| 商河县| 林甸县| 盱眙县| 玛纳斯县| 苗栗县| 桂平市| 寻乌县| 长治县| 密云县| 漳平市| 九台市| 汽车| 金寨县| 临汾市| 日喀则市| 彭泽县| 张掖市| 观塘区|