书籍详情
C++设计新思维:泛型编程与设计模式之应用
作者:(美)Andrei Alexandrescu著;侯捷,於春景译
出版社:华中科技大学出版社
出版时间:2003-03-01
ISBN:9787560929064
定价:¥59.80
购买这本书可以去
内容简介
ModernC++Design是一部重要的著作,它从根本上层示了genericpatterns(泛型模式)或patterntemplates(模式模板),并将它们视之为“在C++中创造可扩充设计”的一种功能强大的新方法,这种方法结合了template和patterns,你可能未曾想过,但的确存在。如果你的工作涉及C++设计和编程。那么你应该阅读本书。我极力推荐。——HerbSutter关于C++,还有什么没被说过的?很多,本书证明了这一点——节录自JohnVissides为本书所作的序在ModernC++Design中,Andrei,Alexandrescu为C++程序员开创了一个新天地。在展现非凡创造力和精湛编程技艺的同时,Alexandrescu提供了融合designpatterns(设计模式)、genericprogramming(泛型编程)、C++等在内的尖端设计技术。帮助程序员撰写清晰、灵活、高度可复用的代码。本书提出genericcomponents(泛型组件)的概念,这是一种可复用的设计模板(reusabledesigntemplates),用来产生规范的C++代码,供编译器使用。泛型组件提供了从design到code之间简易而无缝的过渡,产生出更能表达原始设计意图的代码,并支持设计结构的复用只需更动最少量的代码。作者阐释建造泛型组件所需的C++专门技巧和特性。而后针对现实世界中的应用,提供工业强度之泛型组件实现品。对于C++开发人员日常工作中反复遇到的问题,在此进行了深入的探讨,并通过泛型方式实现。内容包括:·高度灵活的policybaseddesign·Partialtemplatespecialization(模板偏特化)·Typelists,一个功能强大、用于型别操控的结构·Visitor、Singleton、Command、Factories等模式(patterns)·Multi-methodengine针对每一个泛型组件,本书都提出了基本问题和设计选择。最后实现其泛型解决方案、此外。本书相关网站http://www.awl.com/cseng/titles/0-201-70431-5提供书中泛型组件的所有实现品,并提供作者发展的一个免费、可下载的C++程序库Loki。Loki几乎可为任何C++项目提供借鉴。本书提供了一组可复用的设计产品─所谓“泛型组件”,以及设计这些组件所需要的技术。这些泛型组件为用户带来的明显好处,集中于程序库方面,而处于更广泛的系统体系结构空间中。本书提供的编程技术和实作品(implementation)所反映的任务和议题,传统上落于设计范畴之中,是编写代码之前必须完成的东西。由于身处较高层次,泛型组件就有可能以一种不同寻常但简洁。易于表达。易于维护的方式,将复杂的体系结构反映到代码中。这里结合了三个要素:设计模式(designpatterns)、泛型编程(genericprogramming)、C++。结合这些要素后,我们获得极高层次的可复用性,无论是横向或纵向。从横向空间来看,少量librarycode就可以实现组合性的、实质上具有无穷数量的结构和行为。从横向空间来看,由于这些组件的通用性,它们可广泛应用于各种程序中。本书极大归功于设计模式(designpatterns)—面临面向对象程序开发中的常见问题时,它是强有力的解决方案。设计模式是经过提炼的出色设计方法,对于很多情况下碰到的问题,它都是合理而可复用的解决方案。设计模式致力于提供深具启发、易于表达和传递的设计词汇。它们所描述的,除了问题(problem)之外,还有久经考验的解法及其变化形式,以及选择每一种方案所带来的后果。设计模式超越了任何一种设计语言所能表达的东西─无论那种语言多么高级。本书遵循并结合某些设计模式,提供的组件可以解决广泛的具体问题。泛型编程是一种典范(paradigm),专注于将型别(type)抽象化,形成功能需求方面的一个精细集合,并利用这些需求来实现算法。由于算法为其所操作的型别定义了严格、精细的接口,因此相同的算法可以运用于广泛的型别集(awidecollectionoftypes)。本书提供的实作品采取泛型编程技术,以最小代价获得足以和手工精心编写的代码相匹敌的专用性。高度简洁和效率。C++是本书使用的唯一工具。在本书中,你不会看到漂亮的窗口系统。复杂的网络程序库或灵巧的日志记录(logging)机制。相反的,你会发现很多基础组件,这些组件易于实现以上所有系统(甚至更多)。C++具有实现这一切所需要的广度,其底层的C内存模型保证了最原始效率(rawperformance),对多态(polymorphism)的支持成就了面向对象技术,templates则展现为一种令人难以置信的代码生成器。Templates遍及本书所有代码,因为它们可以令用户和程序库之间保持最密切的协作。在遵循程序库约束的基础上,程序库的用户可以完全控制代码的生成方式。泛型组件库的角色在于,它可以让用户指定的型别和行为,与泛型组件结合起来,形成合理的设计。由于所采技术之静态特性,在结合和匹配相应组件时,产生的错误通常在编译期便得以发现。本书最明显的意图在于创建泛型组件,这些组件预先实现了设计模块,主要特点是灵活、通用、易用、泛型组件并不构成framework。实际上它们采用的作法是互补性的,虽然framework定义了独立的classes,用来支持特定的对象模型,但泛型组件(s)是轻量级设计工具,互相独立,可自由组合和匹配。实现frameworks时泛型组件可带来很大帮助。
作者简介
暂缺《C++设计新思维:泛型编程与设计模式之应用》作者简介
目录
译序by 侯捷 i</font><br>译序by 於春景 iii</font><br>目录 v</font><br>序言by Scott Meyers xi</font><br>序言by John Vlissides xv</font><br>前言 xvii</font><br>致谢 xxi</font><br>第一篇 技术(Techniques) 1</font><br>第1章 基于Policy的Class设计(Policy-Based Class Design) 3</font><br>1.1 软件设计的多样性(Multiplicity) 3</font><br>1.2 全功能型(Do-It-All)接口的失败 4</font><br>1.3 多重继承(Multiple Inheritance)是救世主? 5</font><br>1.4 Templates带来曙光 6</font><br>1.5 Policies和Policy Classes 7</font><br>1.6 更丰富的Policies 12</font><br>1.7 Policy Classes的析构函数(Destructors) 12</font><br>1.8 通过不完全具现化(Incomplete Instantiation)</font><br>而获得的选择性机能(Optional Functionality) 13</font><br>1.9 结合Policy Classes 14</font><br>1.10 以Policy Classes定制结构 16</font><br>1.11 Policies的兼容性 17</font><br>1.12 将一个Class分解为一堆Policies 19</font><br>1.13 摘要 20</font><br></font><br>第2章 技术(Techniques) 23</font><br>2.1 编译期(Compile-Time)Assertions 23</font><br>2.2 Partial Template Specialization(模板偏特化) 26</font><br>2.3 局部类(Local Classes) 28 </font><br>2.4 常整数映射为型别(Mapping Integral Constants to Types) 29</font><br>2.5 型别对型别的映射(Type-to-Type Mapping) 31</font><br>2.6 型别选择(Type Selection) 33</font><br>2.7 编译期间侦测可转换性(Convertibility)和继承性(Inheritance) 34</font><br>2.8 type_info的一个外覆类(Wrapper) 37</font><br>2.9 NullType和EmptyType 39</font><br>2.10 Type Traits 40</font><br>2.11 摘要 46</font><br>第3章 Typelists 49</font><br>3.1 Typelists的必要性 49</font><br>3.2 定义Typelists 51</font><br>3.3 将Typelist的生成线性化(linearizing) 52</font><br>3.4 计算长度 53</font><br>3.5 间奏曲 54</font><br>3.6 索引式访问(Indexed Access) 55</font><br>3.7 查找Typelists 56</font><br>3.8 附加元素至Typelists 57</font><br>3.9 移除Typelist中的某个元素 58</font><br>3.10 移除重复元素(Erasing Duplicates) 59</font><br>3.11 取代Typelist中的某个元素 60</font><br>3.12 为Typelists局部更换次序(Partially Ordering) 61</font><br>3.13 运用Typelists自动产生Class es 64</font><br>3.14 摘要 74</font><br>3.15 Typelist要点概览 75</font><br>第4章 小型对象分配技术(Small-Object Allocation) 77</font><br>4.1 缺省的Free Store分配器 78</font><br>4.2 内存分配器的工作方式 78</font><br>4.3 小型对象分配器(Small-Object Allocator) 80</font><br>4.4 Chunks(大块内存) 81</font><br>4.5 大小一致(Fixed-Size)的分配器 84</font><br>4.6 SmallObjAllocator Class 87</font><br>4.7 帽子下的戏法 89</font><br>4.8 简单,复杂,终究还是简单 92</font><br>4.9 使用细节 93</font><br>4.10 摘要 94</font><br>4.11 小型对象分配器(Small-Object Allocator)要点概览 94</font><br>第二篇 组件(Components) 97</font><br>第5章 泛化仿函数(Generalized Functors) 99</font><br>5.1 Command设计模式 100</font><br>5.2 真实世界中的Command 102</font><br>5.3 C++ 中的可呼叫体(Callable Entities) 103</font><br>5.4 Functor Class Template骨干 104</font><br>5.5 实现“转发式”(Forwarding)Functor::operator() 108</font><br>5.6 处理仿函数 110</font><br>5.7 做一个,送一个 112</font><br>5.8 引数(Argument)和返回型别(Return Type)的转换 114</font><br>5.9 处理pointer to member function(成员函数指针) 115</font><br>5.10 绑定(Binding) 119</font><br>5.11 将请求串接起来(Chaining Requests) 122</font><br>5.12 现实世界中的问题之1:转发式函数的成本 122</font><br>5.13 现实世界中的问题之2:Heap分配 124</font><br>5.14 通过Functor实现Undo和Redo 125</font><br>5.15 摘要 126</font><br>5.16 Functor要点概览 126</font><br>第6章 Singletons(单件)实现技术 129</font><br>6.1 静态数据 + 静态函数 != Singleton 130</font><br>6.2 用以支持Singleton的一些C++ 基本手法 131</font><br>6.3 实施“Singleton的唯一性” 132</font><br>6.4 摧毁Singleton 133</font><br>6.5 Dead(失效的)Reference问题 135</font><br>6.6 解决Dead Reference问题(I):Phoenix Singleton 137</font><br>6.7 解决Dead Reference问题(II):带寿命的Singletons 139</font><br>6.8 实现“带寿命的Singletons” 142</font><br>6.9 生活在多线程世界 145</font><br>6.10 将一切组装起来 148</font><br>6.11 使用SingletonHolder 153</font><br>6.12 摘要 155</font><br>6.13 SingletonHolder Class Template要点概览 155</font><br></font><br>第7章 Smart Pointers(智能指针) 157</font><br>7.1 Smart Pointers基础 157</font><br>7.2 交易 158</font><br>7.3 Smart Pointers的存储 160</font><br>7.4 Smart Pointer的成员函数 161</font><br>7.5 拥有权(Ownership)管理策略 163</font><br>7.6 Address-of(取址)操作符 170</font><br>7.7 隐式转换(Implicit Conversion)至原始指针型别 171</font><br>7.8 相等性(Equality)和不等性(Inequality) 173</font><br>7.9 次序比较(Ordering Comparisons) 178</font><br>7.10 检测及错误报告(Checking and Error Reporting) 181</font><br>7.11 Smart Pointers to const和const Smart Pointers 182</font><br>7.12 Arrays 183</font><br>7.13 Smart Pointers和多线程(Multithreading) 184</font><br>7.14 将一切组装起来 187</font><br>7.15 摘要 194</font><br>7.16 SmartPtr要点概览 194</font><br>第8章 Object Factories(对象工厂) 197</font><br>8.1 为什么需要Object Factories 198</font><br>8.2 Object Factories in C++:Classes和Objects 200</font><br>8.3 实现一个Object Factory 201</font><br>8.4 型别标识符(Type Identifiers) 206</font><br>8.5 泛化(Generalization) 207</font><br>8.6 细节琐务 210</font><br>8.7 Clone Factories(克隆工厂、翻制工厂、复制工厂) 211</font><br>8.8 通过其他泛型组件来使用Object Factories 215</font><br>8.9 摘要 216</font><br>8.10 Factory Class Template要点概览 216</font><br>8.11 CloneFactory Class Template要点概览 217</font><br>第9章 Abstract Factory(抽象工厂) 219</font><br>9.1 Abstract Factory扮演的体系结构角色(Architectural role) 219</font><br>9.2 一个泛化的Abstract Factory接口 223</font><br>9.3 实作出AbstractFactory 226</font><br>9.4 一个Prototype-Based Abstract Factory实作品 228</font><br>9.5 摘要 233</font><br>9.6 AbstractFactory和ConcreteFactory要点概览 233</font><br></font><br>第10章 Visitor(访问者、视察者) 235</font><br>10.1 Visitor 基本原理 235</font><br>10.2 重载(Overloading):Catch-All函数 242</font><br>10.3 一份更加精炼的实作品:Acyclic Visitor 243</font><br>10.4 Visitor之泛型实作 248</font><br>10.5 再论 "Cyclic" Visitor 255</font><br>10.6 变化手段 258</font><br>10.7 摘要 260</font><br>10.8 Visitor泛型组件要点概览 261</font><br>第11章 Multimethods 263</font><br>11.1 什么是Multimethods? 264</font><br>11.2 何时需要Multimethods? 264</font><br>11.3 Double Switch-on-Type:暴力法 265</font><br>11.4 将暴力法自动化 268</font><br>11.5 暴力式Dispatcher 的对称性 273</font><br>11.6 对数型(Logarithmic)Double Dispatcher 276</font><br>11.7 FnDispatcher 和对称性 282</font><br>11.8 Double Dispatch(双重分派)至仿函数(Functors) 282</font><br>11.9 引数的转型:static_cast或dynamic_cast? 285</font><br>11.10 常数时间的Multimethods:原始速度(Raw Speed) 290</font><br>11.11 将BasicDispatcher 和BasicFastDispatcher当做Policies 293</font><br>11.12 展望 294</font><br>11.13 摘要 296</font><br>11.14 Double Dispatcher要点概览 297</font><br>附录 一个超迷你的多线程程序库(A Minimalist Multithreading Library) 301</font><br>A.1 多线程的反思 302</font><br>A.2 Loki的作法 303</font><br>A.3 整数型别上的原子操作(Atomic Operations) 303</font><br>A.4 Mutexes(互斥器) 305</font><br>A.5 面向对象编程中的锁定语意(Locking Semantics) 306</font><br>A.6 可有可无的(Optional)volatile标识符 308</font><br>A.7 Semaphores, Events和其他好东西 309</font><br>A.8 摘要 309</font><br>参考书目(Bibliography) 311</font><br>索引(Index)
猜您喜欢