一刷 2000 本(2003/02/22)  

C++ 設計新思維

Modern C++ Design 繁體中文版

侯捷 / 於春景 譯

mcd-c.jpg (46651 bytes)

全圖

繁體版 勘誤

侯捷推薦相關書籍:《C++ Templates》,《C++ Template Metaprogramming


□中譯書名(暫名): C++ 設計新思維
□適合對象:高階 C++ 程式員
□製作特色:與原文本頁頁對譯,含 index,網片輸出,平裝
□內容特色:本書開創編程新視野、新領域(Generic Programming + Design Pattenrs)

以下開放之 PDF file,含全書完整書籤(亦即目錄連結),但正文只開放1~4章,因此你若按下其他章節之目錄連結,將不起效用。

檔名 內容 大小 bytes
mcd-c-chap1-4.pdf 譯序(兩篇)
目錄
原序(兩篇)
前言
致謝
1~4章

參考書目
索引
1,676,869
Loki 源碼

Loki 當然以其創造者 Andrei Alexandrescu 的
《Modern C++ Design》書籍支援網站為主:
http://www.moderncppdesign.com/book/main.html
不過後來整個Loki發展已經移到 SouceForge上,成為一個 open source計畫,網址:
http://sourceforge.net/projects/loki-lib/
其中可下載最新版本的 Loki,比書上介紹的多一些改良,也多一些新成員,例如 AssocVector, DataGenerators,以及一些小型 template 如MakeTypelist。

   

不需密碼即可開啟。檔案含書籤(目錄連結)

如欲下載,請將滑鼠移至上述 hyperlink,按右鍵,再選【另存目標...】即可。


前衛的意義  侯捷譯序

一般人對C++ templates的粗淺印象,大約停留在「容器(containers)」製作上。稍有研究則會發現,templates衍生出來的C++ Generic Programming(泛型編程)技術,在C++ 標準程式庫中已經遍地開花結果。以STL為重要骨幹的C++標準程式庫,將templates廣泛運用於容器(containers)、演算法(algorithms)、仿函式(functors)、配接器(adapters)、配置器(allocators)、迭代器(iterators)上頭,無處不在,無役不與,乃至於原有的class-based iostream都被改寫為 template-based iostream

徹底研究過STL源碼(SGI版本)的我,原以為從此所有C++ templates技法都將不出我的理解與經驗之外。但是《Modern C++ Design》在在打破了我的想法與自信。這本書所談的template技巧,以及據以實作出來的Loki程式庫,讓我瞠目結舌,陷入沉思…與…呃…恍惚J

本書分為兩大部分。首先(第一篇)是基礎技術的討論,包括 template template parameters(請別懷疑,我並沒有多寫一個字)、policies-based designcompile-time programmingrecursive templates, typelists。每一項技術都讓人聞所未聞,見所未見。

第二部分(第二篇)是Loki程式庫的產品設計與實作,包括Small-Object Allocation(註1), Generalization Functors, Singleton, Smart Pointers, Object Factories, Abstract Factory, Visitor, Multimethods。對設計範式(design patterns註2)稍有涉獵的讀者馬上可以看出,這一部分主題都是知名的範式。換言之,作者Andrei嘗試以templates-based, policies-based手法,運用第一篇完成的基礎建設,將上述範式具體實現出來,使任何人能夠輕鬆地在Loki程式庫的基礎上,享受設計範式所帶來的優雅架構。

註1:Small-Object Allocation屬於底層服務的「無名英雄」,故而在章節組織上仍被劃入第一篇。

註2patterns一詞,臺灣大陸兩地共出現三種譯法:(1) 範式 (2) 樣式 (3) 模式。我個人最喜歡「範式」,足以說明patterns的「典範」意味。因此本書以「範式」稱patterns。顧及大陸術語習慣,簡體版以「模式」稱patterns。本書所有patterns都保留英文名稱並以特殊字型標示,例如Object Factories, Visitors

設計範式(Design Patterns)究竟能不能被做成「易開罐」讓人隨時隨地喝上一口,增強體力?顯然範式社群(patterns community)中有些人不這麼認為 見稍後Scott Meyers序文描述。我以為,論斷事物不由本質,儘好口舌之辯的人,不足取也。Andrei所拓展的天地,Loki所達到的高度,不會因為它叫什麼名字而有差異,也不會因為任何人加諸它身上的什麼文字包裝或批評或解釋或討好,而有不同。它,已經在那兒了。

本書涉足無人履踏之境,不但將 C++ templates generics programming技術做了史無前例的推進,又與 design patterns達成巧妙的結合。本書所談的技術,所完成的實際產品,究竟是狂熱激進的象牙塔鑽研?抑或高度實用的嶄新設計思維?做為一個技術先鋒,Loki的現實價值與未來,唯賴你的判斷,和時間的篩選。

然而我一定要多說一句,算是對「唯實用論」的朋友們一些忠告。由來技術的推演,並不只是問一句「它有用嗎」或「它現在有用嗎」可以論斷價值的。牛頓發表萬有引力公式,並不知道三百年後人們用來計算軌道、登陸月球。即使在講述「STL運用」的課堂上,都還有人覺得太前衛,期盼卻焦躁不安,遑論「STL設計思維和內部實作」這種課,遑論Loki這般前衛技術。很多人的焦慮是:我這麼學這麼做這麼寫這麼用,同儕大概看不懂吧,大概跟不上吧。此固值得關注,但個人的成長千萬別被群體的慣性絆住腳步註3。我們曾經鄙夷的別人的「無謂」超前,可能只因我們故步自封,陷自己於一成不變的行為模式;或因為我們只看到自家井口的天空。當然,也可能某些前衛思想和技術,確實超越了龐大笨重遲緩的現實世界的接受度。你有選擇。做為一位理性思考者,身在單純可愛的技術圈內,請不要妄評先鋒,因為他實在站在遠比你(我)高得太多的山巔上。不當的言語和文字並不能為你(我)推砌樓台使與同高。

深度 + 廣度,古典 + 前衛,理論 + 應用,實驗室 + 工廠,才能構築一個不斷進步的世界。

侯捷 2003/01/08 於臺灣新竹

jjhou@ccca.nctu.edu.tw
http://www.jjhou.com
(繁)
http://jjhou.csdn.net(簡)

P.S. 本書譯稿由我和於春景先生共同完成。春景負責初譯,我負責其餘一切。春景技術到位,譯筆極好,初譯稿便有極佳品質,減輕我的許多負擔。循此以往必成為第一流IT技術譯家。我很高興和他共同完成這部作品。本書由我定稿,責任在我身上,勘誤表由我負責。本書同步發行繁體版和簡體版;基於兩岸計算機術語的差異,簡體版由春景負責必要轉換。

P.S. 本書初譯稿前三章,邱銘彰先生出力甚多,特此致謝。

P.S. STL, Boost, Loki, ACE...等程式庫的發展,為C++ 領域挹注了極大活力和競爭力,也使泛型技術在C++ 領域有極耀眼的發展。這是C++ 社群近年來最令人興奮的事。如果你在C++ 環境下工作,也許這值得你密切關注。

註3:從萬有引力觀之,微小粒子難逃巨大質量團的吸滯(除非小粒子擁有高能量)。映照人生,這或許是一種悲哀。不過總會有那麼一些高能粒子逸脫出來值得我們轉悲為喜,懷抱希望

 


Loki  "侯捷調整版" 

不論是《C++設計新思維》(Modern C++ Design)的讀者,或單純只是 Loki library 的潛在用戶或技術觀察者,都苦於一個事實:這套 library 的技術和想法太先進(前衛)了,以至於很難找到編譯器能夠全數吃下它們(當然,這不是 Loki 的問題,是編譯器廠商的腳步問題)。雖然本書前言之中作者曾經列出兩個可用的編譯器:Metrowerks CodeWarrior Pro 6.0 和 Comeau C++ 4.2.38,但它們都不是主流編譯器,大部份人手上都沒有它們。

如果你到 SouceForge http://sourceforge.net/projects/loki-lib/ 下載一份 Loki implementation,你可以看到有許多人在不同的(主流)編譯器上對 Loki 做出調整版本。這是一份好資源。

我自己,看到那麼多 CVS 版本,想到得將自己融入不同版本的(不知哪個地方的修改)之中,頭都大了。為了做自己更有興趣做的事,也為了提昇自己的技術,我決定親手調一份「侯捷版本」,同時也為每一章寫下一些測試程式。

這裡開放我的成果。這些成果一方面堅實我自己對《C++設計新思維》和 Loki library 的掌握,一方面算是給《C++設計新思維》讀者的一份 bonus :) 唯請注意,這份版本主要還是基於我個人修練的目的而完成,所以並沒有很正式而嚴謹的風貌,有些焦點以外的 Loki source code 甚至暫時被我 remark 起來。

所謂「侯捷調整版」是以當初(精確日期已忘)從 Andrei 網站下載的版本(Last update: February 19, 2001)為根據,就我自己感興趣的主題(佔 Loki 面積大部份,但非全部)略加修改,使能通過至少一個主流編譯器(我的最終選擇是 GNU C++)。為方便將來更多可能的調整和測試,我保留了調整過程中的一些測試碼(但可能 remark 起來)。我把所有檔案名稱都後綴以 "-jj",以便與正宗 Loki 有所區別,避免誤用。namespace 仍沿用 "Loki"。

開放檔案如下:

檔名 內容 大小 bytes
loki-jj-20030402.zip

這份版本(含各章測試程式)可通過
GNU-C++ 2.95.3-5 (Cygwin special,20010316) 和 GNU-C++ 3.2 (MinGW-2.0.0-3,special 20020817-1)

程式註釋使用繁體中文。大陸讀者請自行轉碼。

解壓縮後,可得(按書上出場次序排列):

TypeInfo-jj.h
TypeList-jj.h
TypeManip-jj.h
TypeTraits-jj.h
EmptyType-jj.h
NullType-jj.h
SmallObj-jj.h
SmallObj-jj.cpp
Functor-jj.h
Singleton-jj.cpp
Singleton-jj.h
SmartPtr-jj.h
Factory-jj.h
AbstractFactory-jj.h
Visitor-jj.h(暫時從缺)
MultiMethods-jj.h
Threads-jj.h

ch01test.cpp
ch02test.cpp
ch03test.cpp
ch04test.cpp
ch05test.cpp
ch06test.cpp
ch07test.cpp
ch08test.cpp
ch09test.cpp
ch10test.cpp(暫時從缺)
ch11test.cpp

(1) Loki-jj
侯捷調整版

(2) 《C++設計新思維》各章測試程式

 

 

 

 

 

 

 

 

 

 

 

 

 

 

55807
bytes

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

如欲下載,請將滑鼠移至上述 hyperlink,按右鍵,再選【另存目標...】即可。

-- the end