由於出版人的水平和視野的侷限,以及讀者的浮動,雖然許多經典已經出版,現在大夥兒(出版人和讀者)卻一勁兒注視新書,很大程度可說是捨近求遠。在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)观念,在软体设计阶段便创造出一个有弹性、易修改、适用未来时态的架构。
对於物件导向领域的生手,这三本书可以给你一个震憾教育,让你知道过去的写作是多麽地不严谨、观念是多麽地不成熟。或许这套书会促使很多自以为是的读者谦卑地认知自我的不足,并谦卑地终於知道什麽是井蛙、河鱼和燕雀。
至於物件导向个中老手,是的,这三本书为你整理出多年打滚所获的宝贵心得,佐以深度的学理探讨,必然让你有相见恨晚之叹。
---------------------------------------------------------------------------------------
拿破仑虽然是个矮个子,一生叱吒却俨然历史巨人。今天我要介绍的三本书,虽然轻薄短小有如拿破仑的身材,在 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)观念,在软体设计阶段便创造出一个有弹性、易修改、适用未来时态的架构。
对於物件导向领域的生手,这三本书可以给你一个震憾教育,让你知道过去的写作是多麽地不严谨、观念是多麽地不成熟。或许这套书会促使很多自以为是的读者谦卑地认知自我的不足,并谦卑地终於知道什麽是井蛙、河鱼和燕雀。
至於物件导向个中老手,是的,这三本书为你整理出多年打滚所获的宝贵心得,佐以深度的学理探讨,必然让你有相见恨晚之叹。