C++设计新思维泛型编程与设计模式之应用

所需积分/C币:7 2015-03-24 16:06:44 13.82MB PDF
21
收藏 收藏
举报

主要是用C++的风格讲述了设计模式的应用,通过泛型编程实现了一些设计模式,很利于只会C++的同学用来学习设计模式。
序言 by Scott Meyers by Scott meyers 1991年,我写下《 effective C++》第一版。那本书几乎没有讨论 template,因为它刚刚才被加入 语言之中,我对它几乎一无所知。为了书中包含的一点点 template代码,我曾通过电子邮件请 别人验证,因为我手上的编译器都没有提供对 template的支持 1995年,我写下《 More Efective C+》。又一次,我几乎没有讲述 template。这一次阻止我的 既不是对 template知识的缺乏(在那本书的初稿中,我曾打算以一整章讲述 template),也不是 我的编译器在这方面有所缺陷。真正的理由是我担心,C++社群对 template的理解即将经历 次巨大的变化,我对它所说的任何事情,也许很快就会被认为是陈旧的、肤浅的,甚至完全错 误的 我的担心出于两个原因。第一个原因和 John barton及 Lee nackman在C++ Report1995年1月 的一篇专栏文章有关。这篇文章讨论的是:如何经由 template执行型别安全的维度分析,同时 做到运行期零成本。我自已也曾在这个问题上花了不少时间,而且我知道很多人也在寻找解答, 但没有人成功。 Barton和 Nackman的创新解法让我认识到, template在太多的地方有用,不只 是用来生成“T容器 以下是他们的设计示例。这段代码对两个物理量作乘法运算,而这两个物理量具有任意维数的 型别 template<int m1, int ll, int tl, int m2, int int t2> Physical<ml+m2, 11+12, tl+t2> operator*(Physical<ml, ll,tl> Ih Physical<m2, 12, t2>rhs return Physical<m1+m2, 11+12, tl+t2> unit*ihs value()*rhs value() 即使我没有说明这段代码,但有一点很清楚:这个 function template有6个参数,可没有一个是 型别! template的这种用法对我来说是头-次见到,我确实有点目眩 不久之后,我开始阅读STL。在 Alexander Stepanov精巧的程序库设计中,容器( containers) 对算法( algorithms)一无所知,算法亦对容器一无所知:迭代器( terator)的行为像指针(但 Modern C++ Design X11 序言 by Scott Meyers 却有可能是对象):容器和算法像接受函数指针一样地接受函数对象( function object);用户 可以扩充程序库,但不必继承其中任何 base class,也不必重新定义任何 virtual function。这一切 都让我觉得—就像当初我看到Baon和 Nackman成果那样一我对 template几乎一无所知 所以,在《 More Efective C++》中,我几乎没有提到 template。我还能怎样?我对 template的认 识还停留在“T容器”阶段,而 Barton、 Nackman、 Stepanov,还有其他人都已证明,那种用法 只不过刚刚触到 template的皮毛而已。 998年, Andrei alexandrescu和我开始了电子邮件交流:不久之后我意识到,我得再次修正我 对 template的认识。 Barton、 Nackman、 Stepanov让我感到震惊的是: template可以“做什么”; 而 Andrei的成果最初给我的印象是: template“如何”完成它所做的事情。 在 Andrei协助推广的很多工具中,有这样一个最简单的东西;当我向人们介绍 Andrei的工作时, 我也-直将这当做一个例子。这就是 CTassert template,作用和 assert宏类似,但施行于“可 在编译期间被核定( evaluated)”的条件句中。以下便是 cTAssert template template<bool> struct cfTAssert template<> struct cTAssert<true> tFi 仅此而已。请注意,这个 CTAssert从来没被定义。请注意,它有一个针对true(而非 false) 的特化体。在这个设计中,“缺少”的东西至少和提供的东西一样重要。它让你以一种新的方 式看待 template,因为大部分“源码”被刻意遗漏了。和我们大多数人以往的想法相比,这是 种极为不同的思维方式。(本书之中 Andrei讨论了一个更为复杂的 Compl1 eTimechecker template,而不是 CTAssert) 后来, andrei将注意力转移到 idioms(惯用手法)和 design patterns(设计模式,尤其是GoF模 式)的开发上,提供了 template-based实作品。这导致他和模式社群的一场短暂冲突,因为后者 信奉-条基本原则:模式( patterns)无法以代码表述。一旦弄清 Andrei是在致力于使模式的实 现得以自动化,而非试图将模式木身以代码来表述,反对声音也就消失了。我很高兴看到 和GoF之- John vlissides达成了合作;在C++ Report上,他们就 andrei的研究成果推出了两 个专栏。 在开发 templates以产生 idioms(惯用手法)和 design patterns(设计模式)实作品时,所有实 作者需要面对的各种设计抉择, Andrei也都必须面对。代码应该做到多线程安全吗?辅助存储 器应当来自heap或是 stack抑或 static pool?提领 smart pointe之前是否应该针对null进行检 查?程序关闭时如果 Singleton的析构函数试图使用另一个已被摧毁的 Singleton,会发生什么 事? Andrei I的目标是:为用户提供所有可能的设计选择,但不强制任何东西。 4“GoF"意味着" Gang of Four'",指的是 Erich gamma、 Richard Helm、 Ralph Johnson和 John vlissides, 他们四人是模式( patterns)权威书籍《 Design Patten: Elements of Reusable Object-Oriented Softuare》 ( Addison- Wesley,1995)的作者 Moden C++ Design 序言 by Scott Meyers XIlI Andrei的方案是:将这种选择以 policy classes的形式封装起来,允许客户将 policy classes当做 template参数传递,同时为这种 classes提供合理的缺省值,使大多数客户可以忽略这些参数 其结果令人瞠目结舌。例如本书的 SmartPointer template只有4个 policy参数,但它可以生成 300多个不同的 smart pointer型别,每一个都具有不同的行为特征!满足于 smart pointer缺省行 为的程序员可以忽略 policy参数,只需指定" smart pointer所指对象”之型别,从而获得精心制 作的 smart pointer class所带来的好处。嗯,不费吹灰之力。 最后要说的是,本书叙述了三个不同的技术故事,每一个都引人入胜。首先,它就C++ template 的能力和灵活性提供了新的见解—如果第三章的 typelists没有让你感到振奋,定是因为你 暮气沉沉)。第二,它标示了一个正交维度( orthogonal dimensions),告诉我们 idioms和 patterns 的实现可以不同。对 templates设计者和 patterns实作者而言,这是十分重要的资讯,但是在大 多数讲述 idioms或 patterns的文献中你都找不到这方面的研究第三,Loki(本书介绍的 template library)源码可以免费下载,所以你可以研究 andrei讨论的 idioms和 patterns所对应的 template 实际作品。这些代码可以严格检测你的编译器对 templates的支持程度,此外当你开始自己的 template设计时,它还是无价的起点。当然,直接使用Lok也是完全可以的(而且完全合法) 我知道 Andrei也愿意你运用他的成果。 就我所知, template的世界还在变化,速度之快就像1995年我回避写它的时候一样。从发展的 速度来看,我可能永远不会写有关 template的技术书籍。幸运的是一些人比我勇敢, Andrei就 是这样一位先锋。我想你会从此书得到很多收获。我自己就得到了很多。 Scott Meyers September 2000 Modern C++ design 译序by侯捷 前卫的意义 侯捷译序 般人对C++ templates的粗浅印象,大约停留在“容器( containers)”的制作上。稍有研究则 会发现, templates衍生出来的C++ Generic Programming(泛型编程)技术,在C艹标准程序 库中已经遍地开花结果。以STL为重要骨干的C十+标准程序库,将 templates广泛运用于容器 ( containers)、算法( algorithms)、仿函数( functors)、配接器( adapters)、分配器( allocators) 迭代器( iterators)上,无处不在,无役不与,乃至于原有的 class-based iostream都被改写为 template-based iostream 彻底研究过STL源码(SG版本)的我,原以为从此所有C++ templates技法都将不出我的理解 与经验。但是《 Moden c++ Design》在在打破了我的想法与自信。这本书所谈的 template技巧, 以及捃以实作出来的Loki程序库,让我瞠目结舌,陷入沉思…与…呃…恍惚⊙。 本书分为两大部分。首先(第篇)是基础技术的讨论,包括 template template parameters(请 別怀疑,我并没有多写一个字)、 policies- based design、 compile-time programming、 recursive templates, ypelists。每一项技术都让人闻所未闻,见所末见。 第二部分(第二篇)是Loki程序库的产品设计与实现,包括 Small-object Allocation1, Generalization Functors, Singleton, Smart Pointers, Object Factories, Abstract Factory, Visitor, Multimethods。对设计模式2( design patterns)稍有涉猎的读者马上可以看出,这一部分主题 都是知名的模式。换言之,作者 Andrei尝试以 templates- based, policies- based手法,运用第一篇 成的基础建设,将上述模式具体实现出来,使任何人能够轻松地在Loki程序库的基础上,享 受设计模式所带来的优雅架构。 1 Small-Object Allocation属于底层服务的“无名英雄”,故而在章节组织上仍被划入第一篇。 2 patterns一词,台湾大陆两地共出现三种译法:(l)范式,(2)样式,(3)模式。我个人最喜欢“范 式”,足以说明 patterns的“典范”意味。因此,繁体版以“范式”称 patterns。为尊重大陆术语习 惯,简体版以“模式”称 patterns本书所有 patterns都保留英文名称并以特殊字型标示,例如obet Factores Visitors Modern C++ design 译序by侯捷 设计模式( Design Patterns)究竟能不能被做成“易拉罐”让人随时随地喝上一口,增强体力? 显然模式社群( patterns community)中有些人不这么认为——见稍后 Scott Meyers序文描述。 我以为,论断事物不由本质,尽好口舌之辩的人,不足取也。 Andrei所拓展的天地,Loki所达 到的高度,不会因为它叫什么名字而有差异,也不会因为任何人加诸它身上的什么文字包装或 批评或解释或讨好,而有不同。它,已经在那儿了。 本书涉足无人履踏之境,不但将C++ templates和 generics programming技术做了史无前例的推 进,又与 design patterns达成巧妙的结合。本书所谈的技术,所完成的实际产品,究竟是狂热 激进的象牙塔钻研?抑或高度实用的崭新设计思维?作为一个技术先锋,Loki的现实价值与未 来,唯赖你的判断,和时间的筛选。 然而我一定要多说一句,算是对“唯实用论”的朋友们一些忠告。由来技术的推演,并不只是 问一句“它有用吗”或“它现在有用吗”可以论断价值的。牛顿发表万有引力公式,并不知道 三百年后人们用来计算轨道、登陆月球。即使在讲述“STL运用”的课堂上,都还有人觉得太 前卫,期盼却焦躁不安,遑论“STL设计思维和内部实作”这种课,遑论Loki这般前卫技术 很多人的焦虑是:我这么学这么做这么写这么用,同侪大概看不懂吧,大概跟不上吧。此固值 得关注,但个人的成长千万别被群体的惯性绊住脚步3。我们曾经鄙夷的别人的“无谓”前卫, 可能只因我们故步自封,陷自己于一成不变的行为模式;或因为我们只看到自家井口的天空。 当然,也可能某些前卫思想和技术,确实超越了庞大笨重迟缓的现实世界的接受度。你有选择。 作为一位理性思考者,身在单纯可爱的技术圈内,请不要妄评先锋,因为他实在站在远比你(我) 高得太多的山巅上。不当的言语和文字并不能为你(我)堆砌楼台使与同高。 深度+广度,古典+前卫,理论+应用,实验室+工厂,才能构筑一个不断进步的世界。 侯捷2003/01/08于台湾·新竹 Jjhoudccca. nctu. edu. tw http://www.jjhou.com(#) http://jjhou.csdnnet(an) PS.本书译稿由我和於春景先生共同完成。春景负责初译,我负责其余一切。春景技术到位,译笔 极好,初译稿便冇极佳品质,减轻我的许多负担。循此以往必成为第一流I技术译家。我很高兴和 他共同完成这部作品。本书由我定稿,责任在我身上,勘误表由我负责。本书同步发行繁体版和简 体版:基于两岸计算机术语的差异,简体版由春景负责必要转换。 P.S.本书初译稿前三章,邱铭彰先生出力甚多,特此致谢 P.S.STL,Boos,Loki,ACE!等程序库的发展,为C++领域挹注了极大活力和竞争力,也使泛型技术 在C+领域有极耀眼的发展。这是C艹←社群近年来最令人兴奋的事。如果你在C艹+环境下工作, 也许这值得你密切关注 3从万有引力观之,微小粒子难逃巨大质量团的吸滞(除非小粒子拥有高能量)。映照人生,这或 许是一种悲哀。不过总会有那么一些高能粒子逸脱出来—值得我们转悲为喜,怀抱希望。 Modern C++ design 译序by於春景 译序 by於春景 三年前,当我第一次接触 template的时候,我认为那只不过是一位“戴上了新帽子”的旧朋友 在熟悉的cass或 function的头顶上,你只需扣上那顶古怪的尖角帽—添上一句temp1ate < class T1,.>—然后将熟悉的数据型别替换为T1,m2..,一个 template就摇身而至!嗯, 我得承认,戴上了帽子的 template的确是个出色的代码生成器,好似具有滋生代码“魇法”的 macro,但毕竟还不能成其为“戴上了帽子的魔术师”。 后来,我开始学习GP( generic programming)和STL( standard template library)。我不禁哑然。 在GP领域, template竟扮演着如此重要的角色,以至于成为C++GP的基石。在GP最重要的 商业实作品STL中, template向我们展示其无与伦比的功效。回想起自己当初对 template的比 喻,哑然失笑之余,我惊叹 template在GP和STL中将自己的能力发挥到了“极致”。 然而,这一次,《 Modern c++ Design》又让我默然。我不得不承认, Andrei alexandrescu的这 部著作(及其 Loki library)带给我的,是对 template和GP技术又一次震撼般的认识! 这种震撼感受,源于技术层面,触及设计范畴。 template的技术核心在于编译期动态机制。与 运行期多态( runtime polymorphism)相比,这种动态机制提供的编译期多态特性,给了程序运 行期无可比拟的效率优势。本书中, Andrei对 template编译期动态机制的运用可谓淋漓尽致。 以 template打造而成的 typelist、 small-object allocator、 smart pointer不仅具有强大功能,而且体 现了无限的扩充性:将 template技术大胆地运用到 design patterns中,更为 design pattern的实 现提供了灵活、可复用的泛型组件 在这些令人目眩的实作技术之后,蕴涵着 andrei倡导并使用的 policy- based设计技术。利用这 耳目一新的设计思想,用户代码不再仅仅是技术实作上的细节,你甚至可以让代码在编译期 作出设计方案的选择!这种将“设计概念”和“ template编译期多态”结合起来的设计思维, 将C++程序设计技术提升到了新的高度,足以振聋发聩。 Modem C++ design 译序by於春景 也许只有时间才能证实, Andrei为我们展示的,或许是C++程序设计技术的一次革命;在C++ 的历史上,《 Modern c+ Design》将是一部重要的著作 Andrei对 template、 generic programming 技术,以及 template在 design patterns中的运用等课题所做的深入阐释和大胆实践,可谓前无古 人 遗憾的是,在当今主流C艹+编译器上,Loki很难顺利通过编译。例如面对" template template parameter"的“难题”,很多编译器亳无招架之力。应该说,这并不是 andrei和Loki过于超 前,而是C++编译器应当迅速跟进。这意味着作为C++程序员的你我,也应当迅速跟进! 作为C++程序员的我,已从此书获益良多。这是一部让我在翻译过程中毫不感到倦怠的巨著 它时时引发我思索,给我以启迪,并让我重拾研习C++的快乐。这得感谢 Andrei。在这样一部 讲述高级技术的专著中, Andrei的讲解细致深入,条理得当,语言却又极为简明清晰。我期望 中文版能保留这一特色 除了作者之外,在翻译本书的过程中,给我更多教益的还有侯捷先生。我的初译稿便是在先生 不断的鼓励和指导下完成的。先生谦和的人品和技术上的深邃见解,令我钦佩和谨记。还要感 谢周筠(yeka)编辑,我的每木译作都离不开您的参与和悉心帮助,本书也不例外。最后 感谢所有关心我的朋友,愿你们也像我一样喜爱这本书。 於春景2002/1/15 深圳蛇口,海上世界 billyu@lostmouse.net Modern C++ Design 序言 by John Vlissides 序言 by john Vlissides 关于C++,还有什么没有说到的?唔,很多,本书所谈的一切几乎都是。本书提供的是编程技 术 generic programming、 template metaprogramming、 oo programming、 design patterns- 的融合。这些技术分开来可以有良好的理解,但对于它们之间的协作关系,我们才刚刚开始认 识。这些协同作用为C++打开了全新视野,而且不仅仅在编程方面,还在于软件设计本身;对 软件分析和软件体系结构来说,它也具有丰富的内涵。 andrei的泛型组件将抽象层次提升到了新的高度,足以使C++在各方面看起来像是一种设计规 格( design specification)语言。但是,不同于专用的设计语言,你还保有C++全部的表达性和 对它的驾轻就熟。 Andrei向你展示如何根据设计思想— -singletons、 visitors、 proxies、 abstract factories 来编写程序。甚至你可以经由 template参数改变实作选择,而且几乎没有运行 期开销。你不必求助于新的开发工具,也不必学习晦涩难懂的方法学( methodology)。你需要 的只是一个可靠的、新型的C+编译器,以及本书 多年来,代码生成器( code generators)-直有类似承诺,但我自己的研究以及实践经验使我相 信,最终,代码生成器无法匹敌。你会有“往返旅程( round-trip)”问题,“缺乏值得生成的 代码”问题,“生成器不灵活”问题,“生出莫名其妙的代码”问题,当然还有“无法将自己 的代码和该死的生成出来的代码整合在一起”的问题。这些问题中的任何一个都有可能成为绊 脚石;而且,对大多数编程挑战而言,这些绊脚石都使得“代码自动生成”不可能成为一种解 决方案 如果能获得“代码自动生成”理论上的好处——一快速、易开发、冗氽降低、错误更少——一而又 没有它们的缺点,该有多好!这正是 Andrei的做法所承诺的。在易于使用、可相互混合和匹配 的 i templates中,泛型组件实现了出色的设计。它们完成的几乎就是代码生成器的功能:产生供 编译器使用的规范代码( boilerplate code)。差别在于它们是在C++之内(而非之外)完成这 些功能。成果是“与应用代码的无缝整合”。同时你还是可以运用C++语言的全部威力,对 设计进行扩充、收写或者调整,从而符合你的需要 C++ design

...展开详情
试读 127P C++设计新思维泛型编程与设计模式之应用
立即下载 身份认证后 购VIP低至7折
一个资源只可评论一次,评论内容不能少于5个字
您会向同学/朋友/同事推荐我们的CSDN下载吗?
谢谢参与!您的真实评价是我们改进的动力~
上传资源赚钱or赚积分
最新推荐
C++设计新思维泛型编程与设计模式之应用 7积分/C币 立即下载
1/127
C++设计新思维泛型编程与设计模式之应用第1页
C++设计新思维泛型编程与设计模式之应用第2页
C++设计新思维泛型编程与设计模式之应用第3页
C++设计新思维泛型编程与设计模式之应用第4页
C++设计新思维泛型编程与设计模式之应用第5页
C++设计新思维泛型编程与设计模式之应用第6页
C++设计新思维泛型编程与设计模式之应用第7页
C++设计新思维泛型编程与设计模式之应用第8页
C++设计新思维泛型编程与设计模式之应用第9页
C++设计新思维泛型编程与设计模式之应用第10页
C++设计新思维泛型编程与设计模式之应用第11页
C++设计新思维泛型编程与设计模式之应用第12页
C++设计新思维泛型编程与设计模式之应用第13页
C++设计新思维泛型编程与设计模式之应用第14页
C++设计新思维泛型编程与设计模式之应用第15页
C++设计新思维泛型编程与设计模式之应用第16页
C++设计新思维泛型编程与设计模式之应用第17页
C++设计新思维泛型编程与设计模式之应用第18页
C++设计新思维泛型编程与设计模式之应用第19页
C++设计新思维泛型编程与设计模式之应用第20页

试读结束, 可继续阅读

7积分/C币 立即下载