侯捷观点

●开

 

《程序志邀我开一个专栏。我向来期待一本程序打造、以程序员为主体象的刊物,因此这样的邀推却。再加上蒋涛先生与我的私交,我於是要求自己,尽可能时间《程序》写稿。专栏可以开,能不能全无不敢保

 

陆读我肯定陌生,容我介自己。我是一名资讯教育工作者,写译书籍,培训业界人,主持网站回应读者与学,并於大学开入教育域之前,我分担任台湾工研究院机械所和通所的副研究和特研究,分 CAD/CAM 体和 Windows 多媒体系。有人称工研院少林寺 位在山上,男多女少,高手如云,成下山闯荡江湖者不其数。

 

篇稿子的此刻,我投入教育域正好十年。是一条科技人很少想的路子,於我也是生命中一个不意的弯。不种迥异於体研也迥异於象牙塔教学的生涯,在是多彩多姿,与者的互尤其曼妙无比。

 

我的域,前七年都在 Windows 程方法和作原理,近三年放在更基的、与平台无关的面。

 

 

籍是永的良益友

 

去十年中,有一件事最是奇特有趣:我於 1993 开始《无书评专栏,介我所能掌握的技内的一些世界名着。这样材与文体,吸引了很多目光,也开了某种先河。《无书评夹杂对台湾电脑出版点与评论,由於当台湾电脑书的良窳程度极端不均(在也是),初 而高阶贫血(在也是),我以程序的角度所评论显得尖不群。

 

1998 年网网路盛,我把所有电脑散文都移到网路上表,范围扩及学方向与学习态度(但不涉及细节)。去的书评文章也重新整理了起来。各位可从侯捷网站上看到所有些文章。

 

书评之所以受人迎,一方面在它的知性,一方面在它的辛辣味。通常我的原是只该说是「荐」而不是「」了),所以辛辣味只藏在旁徵博引的明之中,或偶忍不住的一把火。一般而言,只要有丰富的知含量,而不是单纯地将章一遍,书评专栏吸引人了,辛辣味只是附带红利。君如想尝尝真正的川辣子,看看国外期刊的书评,肯定叫温良恭俭让的中国人频频抚胸,大惊失色。

 

之於学(尤其是自修),重要性自不待言,所以书评迎。好是一支杆,好书评则让认识这杆并告你到哪儿去书评固然好,如果能系列化、系化、根据技的演次,铺陈一条学地毯,就更有价去我曾分篇台湾者介绍过 C++/OOP 方面的多好。做专栏的第一篇,我决定将它们汇总结集,你一次看饱买足。

 

 

阅读之前

 

往下阅读之前,我想先一些打底的

 

第一,以下介的全都是外来。各位购买这籍或经济压力,但竟它都是成名已久的世界名着,我想,为读者开扇窗绝对是很重要的。

 

购买这籍其很方便,只要你有信用卡,亚马逊网 路店(www.amazon.com怎麽就怎 麽的困可能在於信用卡和价。唔,加上运真的很  

第二,在我少不更事的候,了一本好并不会回别记下作者姓名。是个绝对错误度。茫茫海中如何选书?第一次当然是到店去乱,浪一点子。但是你不能老停留在少不更事的段,你的子弹还有你的架空都很宝,你的时间更宝。牢记优秀作家的名字,是找好的捷径。也是写阅环境的一个步表徵:好作家有自己的品牌。

 

第三,OOObject-Oriented,物件向)域,从 程到设计,可概 分 OOPProgrmming)、OOAAnalysis)、OODDesign)。目前国外十分成熟的 UMLUnified Modeling Language)属 於OO 域里用来 将 设计概 念表出来 的一种 notation(符号 表法)。本篇文章只介 OOP 次(唯 [Gamma95]稍属 例外),具体,也比较贴近大部份 程序愈往上去愈抽象,愈接近体工程或方法

 

第四,以下介 C++/OOP 籍,几乎成我初步判断一个人在方面水平的基准。一个具数年经验 C++ 程序,或自己能摸索出「 base class virtual destructor这样的准,但初出茅的程序,恐怕 virtual destructor 是什麽都不甚有概念,更别说该如何正确运用它。如果他他看 [Meyers98],我会比放心他的水平。

 

有趣的是,我曾在自己班上(学生从大二到研究生都有)做了一个调查籍的学生人数并不多,而且老是同几位。这让我感者恒弱者恒弱,悲夫。就我和界的广泛接触经验,我也发现多程序离开学校後就不太看了,或者因忙碌,或者因安於况。案做了不少,技却没有精太多。三两下招数一再用老,人特容易空乏你打开扇窗,你会发现巨着之所以巨着,经验之所以为专经验,是有道理的。愈是看了,你愈会发现这的价,并去的一些愚蠢行

 

第五,下面开出来的书单都是我熟读过的,其中甚且不少繁体中文版是我翻的,所以我放心推荐并接受质询。然而海浩瀚,免。

 

第六,求方便,以下以学习惯示法,籍代名。文中即使用些代名。凡有中文版者,我会特加注。

 

[Ellis90]: The Annotated C++ Reference Manual, by Margaret A. Ellis and Bjarne Stroustrup, Addison-Wesley, 1990. 447 pages.

 

 

[Gamma95]: Design Patterns: Elements of Reusable Object-Oriented Software,

by Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides, Addison-Wesley, 1995. 395 pages

体中文版:《设计模式》,李英,机械工出版社,2000. 254

 

 

[Lippman98]: C++ Primer, 3rd Editoin, by Stanley Lippman and Josee Lajoie,

Addison Wesley Longman, 1998. 1237 pages.

繁体中文版:《C++ Primer 中文版》,侯捷 1999. 1237

 

 

[Lippman96]: Inside the C++ Object Model, by Stanley Lippman, Addison Wesley Longman, 1996. 280 pages

繁体中文版:《深度探索 C++ 物件模型》,侯捷 1998. 320

 

 

[Meyers96]: More Effective C++, by Scott Meyers, Addison-Wesley, 1996. 318 pages

繁体中文版:《More Effective C++ 中文版》,侯捷,培生 2000. 318

 

 

[Meyers98]: Effective C++, Second Edition, by Scott Meyers. Addison Wesley Longman, 1998. 256 pages

繁体中文版:《Effective C++ 2/e 中文版》侯捷,培生 2000. 256

 

[Struostrup97]: The C++ Programming Language, 3rd Editoin, by Bjarne Stroustrup, Addison Wesley Longman, 1997. 910 pages

繁体中文版:《C++ 程式典本》,叶秉哲,儒林 1999.(未录总页数)

 

 

[Sutter99]: Exceptional C++, by Herb Sutter, Addison Wesley Longman, 2000. 208 pages

繁体中文版:《Exceptional C++ 中文版》侯捷,培生 2000. 248

 

 

 

层级一:/意(C++

 

习语言,当然首先从法开始。初学者究竟要从松小品出,或一开始就接触巨着,殊无定,因初学者有很多种,「初学者」一却无法反映他的真。我的学生群中有 13 的,也有 31 的(年更大的当然也有),有人连电脑基本概念都尚未建立,有人已是经验丰富的体工程。不同背景、不同年、不同悟力、不同学速度的人,需要不同层级的教材来足他。同一个人在不同段,也需要不同面的教材来提升其功力与野。

 

但,不新生或老手(新生有一天会成老手),任何一位C++ 程序,我都烈建你的架上要有 [Lippman98] [Struostrup97] 两本。它 C++ /面的百科全;所有相关问题两本都是最後仲裁,了算!它不适合连电脑基本概念都缺乏的人,但颇为适合已有经验的人。

 

两本都已 C++ 逞十年。最新版本都是第三版,印映 1998 定案的 C++ 格。由於 C++ 入一个十分大的准程式,所以两本也都比其前一版有巨幅的改。如果要拿两本做特性比,我的个人感是,[Lippman98] 适合做教本,教学自修考皆宜,[Struostrup97]涩难读,学味重,考性厚,威性最高( Struostrup 造了 C++)。

 

两本的每一版寿命大是五年。C++ 格定案後,国际标组织ISO)每五年开会覆一次,所以第三版至少也是五年寿命。也有人以,做问辩论的最裁判,是以 C++ 书为准(1998/09/01 出版, ISO/IEC 14882),而且网路下只需 18 美元,PDF 格式,索引极方便。当然是很好的一份工具,但是份文件不适合做材料,太硬了。

 

 

文章出http://www.diybl.com/course/3_program/c++/cppsl/2008618/126430.html

目前全世界没有任何一个 C++ 编译器支援完整的 C++ 格,互有短,所以晚近新增的言特性,不得能在你手上的编译器演。关於 Visual C++, Borland C++, CYGNUS C++ 三套工具在C++ 格上的表,我个人有一些经验,整理於http://www.jjhou.com/qa-cpp-primer-27.txt什麽迟迟未有完全支援格的 C++ 编译世呢?因为这不成场竞争重点;C++ 工具市经转对视介面的支援以及的完整解决方案。

 

两本深具工具考价,因此索引格外重要。两本繁体版本皆用心地制作了索引(仍以英文术语来排列),此可。中文电脑书带有索引,在台湾亦不常,两本本皆因者的特用心才得如此。索引采用英文术语出一个问题:如果内文本没有保留英文术语,怎麽?索引的制作与配套法,是科技翻亟需深思的一个问题。我的作法是,把多科技术语保留原文不,并努力持中英页页对照,麽一来原索引就可以完整而松地保留下来。保留原文术语,不完全是了索引的制作,而是因某些字眼强译为中文,不但与习惯,也与世界脱。我所采行的种作法受到很多者的喜,但是哪些原文术语要保留,哪些要中,又是智。大凡如果者真正是内人士,他的选择不会脱离习惯

 

 

层级二:经验C++/OOP

 

在学习语法并开始练习编程的同,就接触家的经验,最是理想,但实际上很如此。一方面,每一条经过规则,其来去脉可能涉到多方面的知,甚至可能涉及底这对新手的重。另一方面,初学者往往只眼前半田,眼光没太高。不,如果有良师带引,依葫芦不失一种初期的宜学方式。

 

如何,了提升自己的 OOP 功力,经验是一条南捷径,你一次吸取高手十数年功力。[Meyers96] [Meyers98] 是我极推荐的两本经验书。以下中条款数例,君可掂掂自己的斤两,看看自己平时实践了多少,从各条款中又想了多少。

 

以下摘自 [Meyers98]

 

条 款1:尽量以 const inline 取代 #define

条 款2:尽量以 <iostream> 取代 <stdio.h>

条 款3:尽量以 new delete 取代 malloc() free()

条 款5:使用相同型式的 new delete

条 款6得在 destructors 中以 delete pointer member

条款7为记忆体不足的状况做准

条 款8:撰写 operator new operator delete 奉行常行

条 款9:避免遮掩了 new 的正型式

条 款10:如果你写了 operator new请对应写一个 operator delete

条 款11classes 内如果动态配置记忆体,请为它宣告一个 copy constructor 和一个 assignment 运算子

条 款12:在 constructor 中尽量以 initialization 作取代 assignment

条 款13initialization list 中的 members 初始化排列次序应该和其在 class 内的宣告次序相同

条 款14 base class virtual destructor

条 款15:令 operator= *this reference

条 款16:在 operator= 所有的 data members 赋值

条 款17:在 operator= 检查是否「自己赋值给自己」

条 款19:区分 member functions, non-member functions friend functions 三者

条 款20:避免将 data members 放在公开介面中

条 款21:尽可能使用 const

条 款22:尽量使用 pass-by-reference址),少用 pass-by-value传值

条 款23:当你必须传回一个 object ,不要尝试传回一个 reference

条 款29:避免回内部料的 handles

条 款30:避免写出「 non-const pointers references 并以之指向低存取层级 members」的 member functions

条 款31:千万不要回「函式内的 local 物件的 reference」,或是「函式中以 new 得的指的所指物件」。

条款32:尽可能延缓变数定式的出

条 款33:明智地运用 inlining

条 款34:将档案之编译相依关系(compilation dependencies)降至最低

条 款35:确定你的 public inheritance 模塑出 "isa" 的关系

条 款36:区分「介面承(interface inheritance)」和「承(implementation inheritance)」

条 款37绝对不要重新定一个承而来的非虚函式

条款38绝对不要重新定一个承而来的预设叁

条 款39:避免在承体系中做 cast down(向下型)

条 款40:透 layering(分)来模塑 has-a is-implemented-in-terms-of 的关系

条 款41:区分 inheritance templates

条 款42:明智地运用 private inheritance(私有承)

条 款43:明智地运用多重承(multiple inheritanceMI

条款45:知道 C++编译器)默默完成和呼叫哪些函式

条 款47:使用 non-local static objects 之前,确定它已有初

条 款49:尽量自己熟悉 C++ 准程式

 

以下摘自 [Meyers96]

 

条 款1:仔 pointers references

条 款2:最好使用 C++ 型运算子

条 款3绝对不要以 polymorphically(多型)方式来

条 款4:非必要不使用 default constructor

条款5自定的型别转换函式保持警

条 款6:区 increment/decrement 运算子的前序(prefix)和後序(postfix)型式

条 款7:千万不要多 &&, ||, , 运算子

条 款8:了解各种不同意 new delete

条 款9:利用 destructors 避免

条 款10:在 constructors 内阻止失(resource leaks

条 款11:禁止异常息(exceptions)流出 destructors 之外

条款12:了解「出一个 exception」与「传递一个数」或「呼叫一个虚函式」之的差异

条 款13:以 by reference 方式捕捉 exceptions

条 款15:了解异常理(exception handling)的成本

条 款17:考使用 lazy evaluation

条款18:分期摊还预期的算成本

条款19:了解暂时物件的来源

条款20助完成「最佳化(RVO)」

条款21:利用多化技overload)避免式型别转换

条款22:考以运算子的复合型式(op=)取代其独身型式(op

条 款24:了解 virtual functionsmultiple inheritancevirtual base classes

runtime type identification 所需的成本

条 款25:将 constructor non-member functions

条款26:限制某个 class 所能生的物件数量

条 款27:要求(或禁止)物件生於 heap 之中

条 款28Smart Pointers(精灵指

条 款29Reference counting数)

条款30Proxy classes(替身类别、代理人类别

条款31函式根据一个以上的物件型来决定如何虚

条 款33:将非尾端类别non-leaf classes设计为抽象类别abstract classes

 

 

其中条 款25~31次甚高,用来 解决 C++ 体开 发过程中一再出问题,作者把这类问题及其解法称 idioms用法)或 patterns式),与 着名的23个 精典 patterns [Gamma95])相呼里所模格局部都比小,但正因如此,作者得以完成比具体的实现,反而比 [Gamma95] 容易阅读

 

[Meyers96] [Meyers98] 两本成名已久,得极大的声誉。以下的美可以使你更了解两本的性和价

 

◆在你开始着手第一个真正的 C++ 案之前,你应该阅读;在你得一些实务经验之後,你应该一遍。-- comp.lang.c++

 

◆作者不只提供你撰写 C++ 码时应该遵循的明白规则,也提供了深入的解与范例。-- Sun Expert

 

◆每一位 C++ 程式不只应该拥,而且应该运用中文字极易拿来实际运用,交叉考与索引的功夫做得很好。-- Computer Language

 

妙好提供的招数,帮助我 C++ 运用得更好。每一位 C++ 程式桌上都应该。在提升 C++ 程式设计的整体品上, Scott Meyers 份珍的礼物或内任何人士的献都大。-- Jesse Liberty, C++ Report

 

 

[Sutter99] 是另一本经验谈。作者是 C++ Report 期刊主,并主持网路上一个名每周之星(a Guru of the WeekGotW)的 C++ 别节目。以他的背景和经历,接触的疑难杂症自然是又多又猛。整理了 47 个条款,由於条款名称无法表某种具体准,所以我不条列於此。本主要分八大

 

1. 泛型程式设计 C++ 准程式

2. Exception-Safety(异常仍安全)的主与相关技

3. Class 设计

4. 编译器防火Firewalls)及 Pimpl 用手法

5. 名称查询、命名空、介面原

6. 记忆体管理

7. 陷阱、易犯错误与有害作法

8. 杂项

 

Scott Meyers 所写的序,点出了的特

 

『从言的特性到准程式内的件,再到程式写技,本在不同的主是使你稍稍失去平衡,是使你必付出全然的注意力。...我把 GotW "Gotcha"(意思是「下可逮到你了」),或很适当。当我把测验的(我的)答案拿来和 Sutter 的答案比,我掉他(和 C++铺设的陷阱中 然我在不想承认这点。我几乎可以看 Herb 微笑并温柔地我所犯的每一个错误说 "Gotcha!"...当你选择 C++ 工具,你必小心地思考你正在做些什麽。C++ 是一个威力大的言,用来助解决吃力的问题,其重要性使你必尽可能面对语言本身、程式、程式用手法来磨你的知。』

 

就我的英文程度而言,[Sutter99] 起来不若 [Meyers96] [Meyers98] 那般平,原因是其中用了很多厘、口、典故。个例子,Morphy law 是什麽,大家知道?(莫菲定律:会出的,一定会出。)Machiavelli 又代表了什麽意思?(意大利政治家,以诈术闻名。)

 

这类专经验谈,多半薄而,但得有价。好消息是,[Meyers96] [Meyers98] 结为电,以光碟呈,采用 HTML 格式,可使用任何支援 Java(以便行全文索)的浏览阅读。多少片?亚马逊瞧瞧。

 

 

 

文章出http://www.diybl.com/course/3_program/c++/cppsl/2008618/126430_2.html

层级三:底机制(C++ Object Model

 

如果於迥异传统编程方式的 C++ 特性, virtual functionsconstructorsdestructors等特异功能一直无法心神会,可能有必要到内 部机制去深度游一番。不要以为钻麽深的技,会愈搞愈糊涂,愈搞愈恍忽。很多人,包括我自己,是在游历过机制一遍之後,才悟并接受了 C++

 

机制主要是指 (1) object 记忆体布局:data members 分布在哪 里?加了 static 又如何?member functions 分布在哪 里?加了 virtual 又如何?有了承又如何?(2) constructors destructors什麽会 自起?(3) template 模板机制是怎麽回事?(4) this 是怎 麽回事?(5) runtime type identificationRTTI)是怎 麽作出来的?

 

知道了些底机制,你便能够对自己在 C++ 程式中的每一个作所引的影响,了如指掌。学习这些底,不是了自行开一套编译器,而是底掌握 C++ 言;底的学,只是程,不是目种情况和《深入浅出 MFC》(侯捷着,松 1997)的情况很像,数万名者不是了自行开 framework 阅读该书对 MFC 的剖析,是底掌握自己在撰写 MFC 用程式的一言一行。

 

机制方面的专论书籍非常稀少。我所仅见的两本,一是 [Ellis90],一是 [Lippman96]。前者被昵称 ARM注解的考手册),是早期 C++ 编译器的作依循准,但因年代过远,我宁愿更推荐後者。[Lippman96] 非常多,我翻程中至少修正了100 个以上的笔

 

了解事的本,到底有没有必要?问题简单了:如果你必走那麽一遭,才能接受事的表徵,那麽於你就有必要。如果你天生是个 OO 奇才,或你一开始接触的第一个言就是OO 言,以至於有可能认为其中的一切都是理所当然,可以完全受各种特性的运用,那麽底机制於你就不需要。

 

我个人是如此地真正第一线大量的学者,就我的教学经验(乃至於我个人的学习经验),我要,了解事的本对绝大多数人都有极正面的帮助。关於一点,我最喜引用林堂先生在《朱》一的一句:『只用一样东西,不明白它的道理,在不高明。』

 

 

层级四:设计观念的复用(C++/Patterns

 

体工程的所有努力,无非是了美好的复用性(reusibility)。从早期的subroutines, procedures, functions, 到後来的 classes, templates。在在了相同的目。如今我将「料,以及料的作」封装得很好,甚至能料型都抽取出来成为叁数,甚至更一步将料本体和料的各种演算法独立开来,各自展而又能藉着某种「黏胶」彼此作用(注)。

 

注:便是所泛型程(generic programming)的精神。下个月我大家介绍这个主

 

很好,很好。但是久以来我却无法将设计概念以格化的方式承下去。面对资构(data structures),我只要 stack, queue, list, 不必多言,上就知道stack 是先後出,queue 是先先出,list 向或双向串。面演算法(algorithms),我只要 quick-sort binary-search,不必多言,上就知道其复度分 O(N log N) O(log N),其行模式如何如何。但是当我希望保某个 class 在整个系中只有一份 object 如何设计?当我希望某个 object 架构出一个替身(或代理人)以控制本尊的存取(而达成lazy-evaluation如何设计?当我希望以某种方法走某个聚合物件内某一范的所有元素,而不需曝露物件的底层结如何设计?当我希望以共享方式来理系中的基本元素(例如大文档内数量相极少的基本字符)如何设计

 

如果些一再被反覆大量运用、并且早众人淬出极佳作法的设计(一整解决方案),能化地分整理,准名称、定、效果、作法、甚至示例代,我就不必每次都从子造起(造得不比呢)。如果程序只要Singleton, Proxy, Iterator, Flyweight上知道其背後代表的是某种特定设计,有着特定的逻辑,用以解决某种特定问题,可多好。正是将设计观念及其逻辑的宝贵经验,以简洁而可复用的形式表达出来。

 

[Gamma95] 内含精心整理的 23 design patterns。四位作者的主要献不在於 patterns 建,而在於 patterns 的整理形式与发扬光大。中所提的 patterns 名称,几乎已 OO 设计领域里准辞《程序》去年 11 月份有一份蒋涛先生针对 [Gamma95] 评论,其中 patterns 的比,令人激:『patterns 需要反复练习体会,才能用自如。有点像棋中的定式,棋定式是百年来高手下法的总结,但不能简单用,要看选择合适的定式,要按棋理通下法。』

 

幸运,真幸运,[Gamma95] 也有出版,以光碟呈,采用 HTML 格式,可使用任何支援 Java(以便行全文索)的浏览阅读

 

 

 

程式设计究竟是一工匠技艺还是一门艺术?都可以是!看你从哪个角度出。有人说连设计概念都可以以 patterns 格化地承,还谈什麽艺术?如果你是这样想,我三件事你听。建筑是一术还艺术?很多人都认为建筑是一门艺术。然而 patterns 的概念正是滥觞於建筑设计领域。目前体界所使用的 pattern 源自建筑理 Christopher Alexander 的着作,他的然都是建筑设计与都市划的课题,但其精神与本却适用其它域,包括体开。另一件事是,体界开始流行 framework 工具,也有人认为程式主框架都被限死了,什麽设计性?我:只要馒头好吃,我从不在乎是机器馒头还手工精制。你的设计精力应该放在专业领域如绘图、影像理、统计、数学分析┅,而不是放在共通的基框架上。如果你真的共通的事趣,你不体开之路,应该设计天份用来研究更新更好的构,更新更好的演算法,更新更好的框架。

 

 

线性学?没的事!

 

然我把 C++/OOP 的学习阶段分,但除了第四得万事俱才能水到渠成,其他三的学并不是那麽渭分明。通常你要你的C++ 坚轫锋利,你得历经多次回火,在高冷之 ,在学用之。我无法你画出一条行道,你必得走些回路,而品味一下曾忽略的小花,而啜一口被你忘的甘泉,填了某种隙之後,才能神清气爽充地再出

 

-- the end

 

 

文章出http://www.diybl.com/course/3_program/c++/cppsl/2008618/126430_3.html

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值