一刷 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