C++代码设计与重用
本书名称为《C++代码设计与重用》,作者为Martin D.Carroll和Margaret A.Ellis;陈伟柱译。中文译版,为2012年人民邮电出版社出版的新版。全书分为12章。介绍C++编程的代码编写规范和易用性设计。比较实用。内提本书全面展示如何使用C+编写可重用的代码,从而提高程序员的开发效率。全书分为12章。包括重用性基本概念、类设计、扩展性、效率、错误、冲突、兼容性、继承、移植性、程序库等和重用相关的诸多话题。每一章的最后,通过总结和练习帮助你巩固概念、加深理解,参考文献和相关资料为你指明了深入学习的方向。本书适合有一定C++经验的程序员阅读,也可供以提高代码重用性为专门学习方向的读者参考。作介Martin Carroll是AT&T贝尔实验室的技术人员,他曾经用好几年的时间致力于设计和实现可重用的C艹程序库,包括AT&T标准组件库( Standard Components Library)。他在 Rutgers大学获得计算机科学博士学位。Margaret Ellis是 The annotated o+ Reference Manual的合著者(另一个作者是大名鼎鼎的C++之父 Bjarne Stroustrup),她主要致力于AT&T贝尔实验室、UNX系统实验室和美国 novell公司的编译器开发。她曾获得加州大学计算机专业的硕士学位。中文版序最早知道这本书,是在 Scott Meyers著名的 More effective C书籍推荐列表里。在谈到这本书的时候, Meyers说:“有意撰写程序库的人,若没有读过此书,那只能是匹夫之勇。”而 Francis Glassborow则说,大多数程序库设计者应该搬过小板凳来,像小学生那样学习这本书。用C++的人,历来以能撰写出重用性好的程序库而引以为傲。然而,撰写可用的程序库已属不易,撰写可重用的程序库更是专家级任务,以至于有人感叹道,重用是C++程序员们的“圣杯”——总在嚷嚷着,却始终得不到。其实何止C艹如此,在其他语言中,重用又何尝不是令人胆怯的挑战!只不过C++编译语言的本质与人们对C++程序性能的严苛要求,使得用C艹编写可重用组件更为困难。这样一个艰难的主题,敢于涉足已经是非常有勇气了,而能得到 Meyers等人如此高的评价,则非C+中的顶尖人物倾力而为不可。事实上,作者Martin Carr和 Margaret Ellis正是这样的顶尖人物。他们是AT&T实验室的研究人员,从20世纪80年代中期开始就处于C+演化和发展的中心,长期从事编译器和基础库的开发工作积累了普通程序员无法比拟的经验。特别值得一提的是, Margaret Ellis曾与 Bjarme Stroustrup合作撲写了C艹早期的经典著作ARM( The annotated c+ Reference Manual),是C++社群里最受尊敬的巾帼英雄之一。在这本书中,两位作者把自己多年来撰写可重用库的经验和教训高浓度地总结起来,给出了很多具有深刻洞察力的建议。虽然从此书英文版出版至今已有几年的时间,但是书中的真知灼见仍然值得我们一再学习体会。我甚至认为,即使你不打算撰写程序库,甚至不是C++程序员,认真阅读这本书都是很有好处的。毕竟这本书来自具有丰富实战经验的顶尖专家之手,而这样的书实在是太少了译者陈伟柱是我的好朋友,在C艹、Java、模式和重用等方面都有比较深刻的理解。他对待此书翻译工作的态度极为认真,正是这一点令我对这本书的翻译质量很有信心。原书作者是以技术扎实而谦恭简和著称的,他们的文字也是平实简练而深富内涵的,我认为伟柱的为人和他的文字也具有这样的特点。因此,我衷心希望读者也能以平实谦和的心态认真、扎实地阅读和学习此书,并祝愿大家能有满意的收获。孟岩2002年10月于北京译者的话这是一本令我受益匪浅的书,我相信很多读者也会有相同的感受。重用——可以说是一个永恒的话题,只要有软件工程的继续存在,重用就必定会有一席之地,也会成为软件工程师或者程序员们关注的话题。重用的历史和重要性毋庸多言,几乎每本软件工程的书都会叙述重用的概念和大体内容;但是,现今关于重用的中文书,大多对重用的理论和优点介绍得非常详细,而很少涉及到如何设计与编写可重用代码的内容,给人一种隔靴搔痒、不着痛处的感觉。所以说,对于这本书,看完之后,我想说的一句话就是:“它终于来了。”重用有3个基本的问题,一是必须有可以重用的对象,二是所重用的对象必须是有用的,三是重用者需要知道如何去使用被重用的对象。解决好这3个方面的问题才能实现真正成功的软件重用。本书的大体内容就是依据前面这两个问题,从类的层次体系设计、护展性、效率、兼容性、移植性等万面详细叙述了可重用代码的设计原则,深入浅出地讨论了当重用性和上述的诸多特性发生冲突的时候,应该如何取舍,从而达到程序员或者程序库设计者预期的目的:而且,本书的第11章还针对上面的第3个问题给出了编写可重用代码文档的要求,为成功的重用代码设计加上了不可或缺的一环。书中的具体内容第1章已经详细给出,这里我就不再赘述。本书的写作风格很有特色,它并不会教你要如何做,也不会给你叙述哪种设计与编码才是最佳的途径金无足赤,永远为最佳的选择本来就是子虚乌有。作者凭借多年的编译器开发和可重用代码设计的经验,详细地阐述了在编写可重用代码的过程中一定会碰到的许多抉择,在阐述中还重点指出了许多会被普通开发者忽略的考虑因素;然后在不同的上下文中详尽地比较各种设计选择的优劣,让读者知其然更知其所以然,给致力于设计和编码的程序员点亮了一盏通向成功重用的明灯。对于此书,我不敢说它弥补了国内重用书籍的空缺,但就程序库设计方面而言,它确实有着不可替代的作用,衷心希望每个致力于程序库设计的读者,都可以从此书获益。翻译过程中,我尽量以平实无华的语言来对待这本技术书籍;在力求技术准确的同时,更加注重上下文的连贯性,希望我的努力能给你带来一个顺畅的阅读过程。译者2002年10月一切事物都将得到检验并因此被称为问题。Edith hamilton这本书的主要目的在于:展示如何以C++编程语言编写可重用代码一就是说,根据不同的需要,在不经过修改,或者经过很少修改的前提下,可重用代码可以很容易地应用到5个、50个甚至500个程序当中,而且这些程序往往是不同程序员编写的,可能运行在不同的系统上。在整个阐述的过程中,我们的目的并不在于争论是否所有的代码都是可重用的,也不在于说明可重用代码能够解决所有的程序问题。显然,不论是对程序员而言,还是对可重用代码本身而言,提高代码的重用性都是需要代价的:通常只有当我们有理由相信所给代码在将来有可能会被重用时,我们才会付出这些重用的代价。因此,本书的目的在于详细分析重用性的这些代价,于是当你面对是否编写可重用代码的选择时,可以从容地做出明智的决定。关于本书本书主要面向的读者是:那些希望从书中包含的许多深层C艹编程见解中受益的读者,或者是那些需要或希望学习如何编写可重用代码的读者。在论述过程中,我们假设读者已经知道如何编写正确的C艹代码。C++语言至今还没有经过标准化(译注:本书写作于1995年,C+于1997年标准化),任意两个不同的编译器实现支持的语言几乎都是不同(稍微不同或者相差很大)的。当我编写这本书的时候,并没有一个编译器实现可以完全支持 ANSI/ISO C++标准中最终定义的整个语言特性;而且,就算对同类型的编译器而言,前后版本实现的语言特性也不尽相同。于是,编写一本对所有编译器都适用的书是很困难的,或者是不可能的。因此,当我们讨论或使用C++代码设计与重用些不能被主流C+编译器所实现的特性时,我们将会另加说明。当声明本书中的代码例子被认为合法时,我们所指的合法性是以1994年9月份 ANSI/ISOC++的工作文件(有时候也称为“标准草案”)[ANS94]为依据的。而且,在我们的代码例子里,我们将尽量避免使用那些我们认为在最终 ANSUISO C+标准公布之前,很有可能会被删除或者进行重大修改的语言特性。要跟踪C++语言的演化,有几个资源是可以利用的。 Internet讨论组comp.lang.c和compstdc++主要致力于C++的讨论。互联网中还有一个关于C++的主页:http://info.desyde/user/projects/c++.html而由纽约SGs出版社定期发行的C+ Repor,也经常会刊登许多C++程序员感兴趣的文章。至于学习C++的书籍, Lippman的ip9和 Stroustrup的Sr9.最佳的学习教材任何关于重用性的完整讨论都会涉及软件开发的一些其他主题,如接口的设计、实现的效率、可移植性、冲突等。在书中的论述中,我们假设读者对软件开发已经有所了解:因此,我们只注重于那些应用于可重用代码的主题,而不是那些应用于一般软件开发的主题。“每本教材都会撒谎”,这是我们老师非常喜欢的一句谚语。在这里,她实际要表达的意思是:每本教材为了教学的简化性和明确性,都必须简化书中的内容,从而都会歪曲所要表达的信息。显然,即使在需要简化的前提下,我们还是应该用抓住众多细节间的本质信息的方法来表述每个主题,这本书也不例外。于是,对于某些主题,即使有些读者已经对这个主题的方方面面都有所了解,我们还是希望他们能够和我们一起共同探讨该主题的内容。而且,对于一些主题内容的省略,我们也希望能够得到这些读者的谅解。选择与建议设计和编写可重用代码将会涉及许多选择(即在多种实现方案中选定某种方案),而某些选择的决定又是左右为难的。通常,对于这些选择,并没有完全确定或者正确的答案—无论你做出哪个选择,每个选择都是有代价的。我们将讨论各种不同选择方案的优点和缺点从而让将来可重用代码的编写者可以从容地做出明智的决定。有时,对于某个给定的决定,我们会认为某种风格或者方法要优于其他所有的风格或者方法。于是,当遇到这种情况时,我们会明确地建议用这种风格或者方法,并给出支持这种风格或者方法的详细理由。然而,在大多数情况下,只有C++程序库的设计者,才能决定哪种方法对程序库用户而言是最好的这本书的一个目的在于:详细并且清楚地给出编写可重用代码的大多数重要选择。如果我们忽略了某些重要的选择,那么我们愿闻其详。书中大多数关于选择的讨论都会提到效率。虽然我们并不认为效率是所有可重用C++代前言码最重要的设计目标,因为对于许多程序库设计而言,譬如扩展性、灵活性等其他特性将会比效率更加重要;但我们在文章中又处处提到效率,这是因为效率将会和可重用C++代码的其他每个可取的特性都相互制约。既然对效率已经花费了这么多笔墨,我们也希望可以给出所有和效率相互制约的因素。代码例子我们希望这本书的价值在于:与刚开始读这本书之前相比,当你读完这本书的时候,你将知道更多关于如何编写可重用代码的知识。因此,我们使用了大量的例子,而且许多例子的代码是来自于现实中已经存在的代码,因为,那些不是取材于真实代码的例子,不足以阐明实际编程中会出现的问题,也不足以说明实际编程中使用的各种技术。在这里,我们只是为了阐明重用性的目的而利用这些代码。为了节省篇幅,成员函数的主体通常都是在类的声明中给出;即使在重用性的代码设计中,这些函数也不会被实现为内联函数。例如,读者不应该从下面的类定义语句中得出:函数f是内联函数(就是说实际上f不是内联函数)的结论。class Z fvoid f() t(关于如何决定某个函数是否应该实现为内联函数,我们将在44.1节讨论这个问题)当提到模板成员函数的时候,在不致引起混淆的前提下,我们通常都会省略模板参数例如,我们将把下面代码中的成员函数ftemplateclass x Ivoid f()};表示为X:f,而不是X>(istream& i, T& t)(对于某个给定的类型T)提供了T类型的流插入和流输出操作符。为了和通常的使用习惯保持一致,我们把它们分别叫做T的输入操作符和输出操作符。关于模板和模板实例化的术语,C++社区仍然有许多不一致的意见。不同的人可能会使用术语模板类、类模板、实例化、实例、特化等中的一个,来描述不同(或者相似)的事物。这些术语准确而且标准的定义最后将由 ANSIISO C+委员会来决定。下面说明了我们在此书中如何使用这些概念:类模板:形如 template<…>X的模板,其中X为类的定义。函数模板:形如 template<…>的模板,其中f为函数的定义。类模板特化:当类模板的参数被实际参数替代时,而得到的类
用户评论
看起来十分好,我要认真看看