📄 三本絕佳小書.htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0037)http://jjhou.csdn.net/article00-7.htm -->
<HTML><HEAD><TITLE>拳拳到肉 掷地铿锵的三本 OOP 绝佳小书</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<META content="MSHTML 6.00.2726.2500" name=GENERATOR>
<META content="construc 111, default" name="Microsoft Theme">
<META content="tl, default" name="Microsoft Border"></HEAD>
<BODY text=#330033 vLink=#996600 aLink=#ff0066 link=#009900 bgColor=#ff9900
background=三本絕佳小書.files/urbtextb.gif><!--mstheme--></FONT>
<TABLE cellSpacing=0 cellPadding=6 width=757 border=0>
<TBODY>
<TR>
<TD width=76><!--mstheme--></FONT></TD>
<TD width=571>
<P align=center>无责任书评<BR><BR><BIG><BIG>拳拳到肉
掷地铿锵</BIG></BIG><BR><BIG><BIG>的三本 OOP 绝佳小书</BIG></BIG><BR><BR>2000.06.12<!--mstheme--></FONT></P></TD>
<TD width=46><!--mstheme--></FONT></TD></TR>
<TR>
<TD vAlign=top width=76><FONT
size=3><BR><BR></FONT><!--mstheme--></FONT></TD>
<TD vAlign=top
width=571><BR>拿破仑虽然是个矮个子,一生叱吒却俨然历史的巨人。今天我要介绍的三本书,虽然轻薄短小有如拿破仑的身材,在 C++/OOP
领域里,其份量与影响却也有着拿破仑般的辉煌灿烂。<BR><BR>说它们轻薄短小,是的,让数字说话:三本书合起来才256+318+208=782
页,只比 C++ 语言知名教本 <FONT color=#0000ff>C++ Primer 3/e</FONT>一半篇幅再多一些而已,比起 C++
语言权威着作<FONT color=#0000ff> The C++ Programming Language 3/e</FONT>
也才达到三分之二的页数份量。逛书店时一个不留神,只怕你便遗漏了这些小书的存在。但如果你真遗漏了它们的存在,实在是你的莫大损失。<BR><BR>就我个人的编程经验,以及我的教学经验(对象为业界工程师或大学生),只要是
C++/OOP 设计思维与语言运用本身的问题,非关 problem
domain,百分之九十以上皆可在这三本书籍中找到直接或间接的答案。这三本书是:<BR><BR>●<FONT
color=#0000ff>Effective C++ 2/e</FONT> : 50 Specific Ways to Improve Your
Programs and Designs<BR>●<FONT color=#0000ff>More Effective C++</FONT> :
35 New Ways to Improve Your Programs and Designs<BR>●<FONT
color=#0000ff>Exceptional C++</FONT> : 47 Engineering Puzzles, Programming
Problems, and Solutions<BR><BR>(注:前两本书亦有 CD 产品(HTML
格式),以两书合一的方式出售,交叉索引甚为方便)
<P>书名副标清楚告诉我们,这些书籍的特色就是以一个个的条款来说明一些值得奉行或是必须避免的动作。以条款的方式进行,一方面因为它们都不是 C++
语言教本,而是更高层次的书籍,是给有语言基础(最好还有实际工作经验)的人看的书,所以可以集中火力在特定主题上,另一方面实乃因为条款型式可以强化主题,加深印象,提升查阅检索的方便性与价值。<BR><BR>书中某些条款在
C++ 语言书籍里或多或少也都有提到 ─ 虽然解释的深度可能不足。我举个例子,Effective C++ 的条款13说「Initialization
list 中的 members 初始化排列次序应该和其在 class 内的宣告次序相同」,<FONT color=#0000ff>C++
Primer 3/e</FONT> 的 p721~p722 对此有相同意义的描述。再举个例子,Effective C++ 的条款14说「总是让
base class 拥有 virtual destructor」,这在 <FONT color=#0000ff>C++ Primer
3/e</FONT>的 p933
亦有相同意义的描述。诸如此类,不胜枚举。但你是不是感觉,那些金科玉律被淹没在语言百科型书籍的细节丛林之中!<BR><BR>每一条准则都简短、明确、容易记忆,可以确实提升你的软体效能。每一条准则都是经验丰富的
C++ 程式员的心血结晶,告诉你哪些是几乎总是需要奉行的动作,哪些是几乎肯定要避免的事情。某些条款甚至到达 patterns 的水准(<FONT
color=#ff0000>注</FONT>)。<BR><BR><FONT color=#ff0000>注</FONT>:所谓
patterns,在指程式设计过程中,开发人员常需面对并解决的某些问题,被有系统地整理出解法,谓之 patterns(或译为「样式」)。<FONT
color=#0000ff>Design Patterns</FONT> 是此域中的经典书籍,系统化地将可应用於众多领域之 23 个基本
patterns 加以分类整理。书中所提的 patterns
名称,几乎成为物件导向设计领域的标准辞汇。<BR><BR>以上三本小书的功用不仅在提纲契领地点出重点,也在於对每个主题有深刻的讨论。在这些书籍中,你会发现一些忠告,告诉你应该做些什麽,为什麽如此;也告诉你不应该做些什麽,又为什麽如此。基本而言当然
whys 比 whats
更重要,这便是这些书籍最有价值的地方。至於从速食的角度来看,检阅一系列准则,也比强记一或二本庞杂的教科书更轻松方便得多。<BR><BR></P><!--msthemeseparator-->
<P align=left><IMG src="三本絕佳小書.files/urbhorsa.gif"></P>
<P><IMG height=257 alt="effective-cpp-2e.jpg (25375 bytes)"
src="三本絕佳小書.files/effective-cpp-2e.jpg" width=199
border=1><BR><BR>【基本资料】<BR>书名:Effective C++ 2/e : 50 Specific Ways to
Improve Your Programs and Designs<BR>作者:Scott Meyers<BR>出版:Addison Wesley,
0-201-92488-9, 1998<BR>定价:US$ 37.95<BR>页数:256<BR><BR>Scott Meyers
的这本书籍,成名已久,同时也是此类书籍的滥觞。这本书在 1992 年便有了第一版,我手上的第一版是 1996/12 的第 12
刷。刷次原不能代表什麽,不过我在第二版的封底看到,出版公司宣称第一版销售超过十万本(不含各种译本)。销售量能否代表什麽呢?销售量低或许不一定能代表什麽,销售量高则相当程度地表示受到读者的肯定。以此书诉求之技术层面而言,这个销售量是惊人的。(当然要是比起大陆某
C 语言书籍销售270 万本,以及某 Visual Basic 书籍销售破千万本,那是小巫见大巫了)<BR><BR>只要是在 C++
领域里打滚的程式员,马上便可以从 Meyers 整理出来的 50 个条款看出此书的价值。如果你拿 C++
来讨生活,稍稍阅读几个条款的深度後,不掏腰包者几稀。有些条款涉及的语意层面较低,用以对容易出错或混淆的数种程式写法提出警告。另有一些条款涉及的层次比较高,如第六章中对於各种继承型式的讨论、以及
classes 之间除了继承以外的其他关系的讨论。至於条款E45「知道 C++ 编译器默默为我们完成和呼叫哪些函式」,以及条款M24「了解
virtual functions、multiple inheritance、virtual base classes、RTTI
所需的成本」,下涉物件模型与编译器层面,相当深入。套用我在「<A
href="http://jjhou.csdn.net/article98-16.htm">C++
的沉迷与爱恋</A>」一文中的用辞,此书在高热和骤冷之间,在高阶和低阶之间
炼、循环、震荡。<BR><BR>本书第一页列有它所获得的赞誉。对於读者,这是一份值得叁考的资料,我试着把它们译为中文,条列於下:<BR><BR><FONT
color=#408080>※我必须真心地赞美 Meyers 的书,┅这本书在记忆体管理架构等主题上给予读者卓越的引导,并对不同型式之 C++
继承机制有极佳的解释。<BR>- New York Computerist<BR><BR>※在你开始着手第一个真正的 C++
专案之前,你应该阅读本书;在你获得一些实务经验之後,你应该再读一遍。<BR>-
comp.lang.c++<BR><BR>※本书有一个子标题「改善你的程式技术与设计思维的 50 个有效作法 」。作者不只提供你撰写 C++
码时应该遵循的明白规则,也提供了深入的解释与范例。<BR>- Sun Expert<BR><BR>※我慎重推荐 Effective C++
给任何渴望在中高阶层面精通C++ 的人。<BR>- The C User's Journal<BR><BR>※在各种写给中高阶程式员看的 C++
书籍中,这是我所见过最棒的一本。作者以一系列短文叙述 C++ 程式员遭遇的常见问题。┅本书既有趣又有用,在程式设计书籍中诚属罕见。<BR>-
comp.lang.c++<BR><BR>※本书在取材范围和风味上类似另一本由 William Strunk和 E.B. White 合着的小书
The Elements of Style;至少二者在我的书架上距离不远。┅这是一本十分谨慎而适度的小书,有着清楚的目标,并且完成了它们。<BR>-
C++ Report<BR><BR>※这本书内含对 C++ 开发工作的许多实用忠告。<BR>- DEC
Professional<BR><BR>※C++
程式员不只应该拥有这本书,而且应该确实运用这本书。书中的文字极易拿来实际运用。交叉叁考与索引的功夫做得很好。<BR>- Computer
Language<BR><BR>※这是一本 193 页的杰作。┅我保证 50
个条款中必定有某一些会攫取你的注意力并对你产生启蒙作用,你的谨慎投资将获得回报。┅这是一本文笔优越、真材实料的书籍,目标瞄准重视流畅与效率的所有
C++ 程式员。<BR>- Stan Kelley-Bootle, UNIX Review<BR><BR>※这本绝妙好书提供了 50
个招数,帮助我们把 C++ 运用得更好。每一位 C++ 程式员桌上都应该有这一本书。┅在提升 C++ 程式设计的整体品质上, Scott
Meyers 这份珍贵的礼物或许比业内任何人士的贡献都大。』<BR>-- Jesse Liberty, C++
Report</FONT><BR></P>
<P>下面列出 Effective C++ 2/e
的各个条款(我试着译为中文),一方面让这篇书评的实用性更高一些,一方面就让这些条款标题直接彰显它们的价值吧。<BR><BR>第一章:改变旧有的 C
习惯<BR>条款1:尽量以 const 和 inline 取代 #define<BR>条款2:尽量以 <iostream> 取代
<stdio.h><BR>条款3:尽量以 new 和 delete 取代 malloc() 和 free()<BR>条款4:尽量使用
C++ 风格的注解型式<BR><BR>第二章:记忆体管理(Memory Management)<BR>条款5:使用相同型式的 new 和
delete<BR>条款6:记得在 destructor 中以 delete 对付 pointer
members<BR>条款7:为记忆体不足的状况预做准备<BR>条款8:撰写 operator new 和 operator delete
时应遵行公约<BR>条款9:避免遮掩了 new 的正规型式<BR>条款10:如果你写了一个 operator new,请对应也写一个
operator delete<BR><BR>第三章:建构式,解构式,和 Assignment 运算子<BR>条款11:如果 classes
内动态配置有记忆体,请为此 class 宣告一个 copy constructor 和一个 assignment 运算子<BR>条款12:在
constructor 中尽量以 initialization 取代 assignment<BR>条款13:Initialization list
中的 members 初始化排列次序应该和其在 class 内的宣告次序相同<BR>条款14:总是让 base class 拥有 virtual
destructor<BR>条款15:令 operator= 传回「*this 的 reference」<BR>条款16:在 operator=
中为所有的 data members 指派内容<BR>条款17:在 operator=
中检查是否「自己派给自己」<BR><BR>第四章:类别与函式之设计和宣告<BR>条款18:努力让介面完满且最小化<BR>条款19:区分 member
functions, non-member functions 和 friend functions 三者<BR>条款20:避免将 data
members 放在公开介面中<BR>条款21:尽可能使用 const<BR>条款22:尽量使用 pass-by-reference(传址),少用
pass-by-value(传值)<BR>条款23:当你必须传回 object 时,不要尝试传回
reference<BR>条款24:在函式多载化(function overloading)和叁数预设化(parameter
defaulting)之间,谨慎抉择<BR>条款25:避免对指标型别和数值型别进行多载化<BR>条款26:防卫潜伏的
ambiguity(模棱两可)状态<BR>条款27:如果不想使用编译器暗自产生的 member
functions,就应该明白拒绝它<BR>条款28:尝试切割 global
namespace(全域命名空间)<BR><BR>第五章:类别与函式之实作<BR>条款29:避免传回内部资料的
handles<BR>条款30:避免写出 member function,传回一个 non-const pointer 或 reference
并以之指向较低存取层级的 members<BR>条款31:千万不要传回「函式内 local 物件的 reference」,或是「函式内以 new
获得的指标所指的物件」<BR>条款32:尽可能延缓变数定义式的出现<BR>条款33:明智地运用
inlining<BR>条款34:将档案之间的编译依存关系(compilation
dependencies)降至最低<BR><BR>第六章:继承机制与物件导向设计<BR>条款35:确定你的 public inheritance
模塑出 "isa" 的关系<BR>条款36:区分「介面继承(interface inheritance)」和「实作继承(implementation
inheritance)」<BR>条款37:绝对不要重新定义一个继承而来的非虚拟函式<BR>条款38:绝对不要重新定义一个继承而来的预设叁数值<BR>条款39:避免在继承体系中做
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -