说实话,我个人觉得HJ老师的确翻译了很多优秀的作品,质量也不错。。但是看他的札记文章,还是有一种王婆卖瓜的味道。。。看到了侯捷的一篇评论。。转了吧。。有些术语与大陆的叫法不同。。
Modern C++ Design: Generic Programming and Design Patterns Applied
Andrei Alexandrescu
andrewalex@hotmail.com
译者 孟岩
侯捷注:本文承译者孟岩先生应允,
转载於此以飨台湾读者,非常感谢。
未得孟岩先生之同意,任何人请勿将此文再做转载。
以下红色为译注,紫色为侯捷个人认为宜再斟酌之处。
浅蓝色是侯捷个人阅读时的神秘标记。
本繁体文系直接转码,并未将大陆惯用术语转换为台湾惯用术语。
前言
你现在大概正站在书店里捧着这本书,问你自己为什麽要买下它。或者也可能你现在正在你公司的图书馆里,犹豫着是否应该把时间花在这本书上。我知道你的时间很宝贵,所以我会简短截说。你是否有过这样的情形,比如问自己,如何能用C++写出更高层的程序?又比如即使你的设计已经非常乾净了,但是那些不相关的细节还是像雪崩一样发生,这个时候应当如何应付?再或者你怎麽样才能作出一些真正可重用的组件,而不必每次要用的时候就不得不重新钻到底层 hack一番?假使你有过这样的疑问,这本书正是为你而写的。
想象一下下面的情形:你刚刚从设计方案讨论会上回来,手里拿着两张打印图表,上面还有你自己的一些潦草记号。OK,现在这些对象之间转递的事件类型不再用char表示了,改成 int 型了,於是你改了一行代码。哦,指向 Widget 的 smart pointers 太慢了,得取消一些检查措施,让它们快点,於是你又改了一行代码。刚才另外一个部门提出了一个小的新类,你的 object factory 得对它提供支持,好,再改一行代码。行了,你的设计改完了,编译,连接,搞定
且慢,这情形好像有点不对头,不是吗?现实的情形是这样的才对:你丧魂落魄地从会上赶回来,因为有一大堆事情要做:全文搜索,给代码动大手术,增加新代码,当然也就飞进来新臭虫,然後再忙不迭地捉臭虫... 这才是程序员这种人的生活方式,是不是?
虽然这本书不可能承诺使你进化到第一种情形,但是却是向那个方向迈出的坚实一步。这本书试图把C++作为一种新的语言展现在软件设计师面前。传统上,代码是软件系统里最细节最错综复杂的一面。虽然历史上出现了各种不同层次的程序设计语言,支持不同的设计方法学(例如面向对象方法),但在一个程序设计蓝图与最後的实现代码之间始终横亘着一条巨大的鸿沟,因为代码必须仔细关照到具体实现和某些辅助性任务中极其细节的问题。设计的目标很少能够不被茫茫的细节所埋没。
这本书介绍了一组可复用的设计“珍宝”,称为“泛型组件”(Generic Components), 同时还介绍了构造这些组件所使用的技术。这些范型组件能够在各种软件系统体系中向用户提供类似库的功能。编码和实现的技术将重点置于那些传统上是属於设计阶段的任
务和问题之上,而设计阶段的工作通常是在编码之前就完成了。由於是高层次的组件,范型组件使得我们有可能将复杂的软件体系以非常富有表现力 简洁和易于维护的代码表达出来。泛型程序设计 设计模式与C++这三个要素在这里被组合起来,达成在纵向和横向上的高度可复用性。在横向上,使用一个很小的代码库就实现了一个可组合的 数量不限的结构和行为集合。在纵向上,这些组件的通用性使得它们能够被应用于广泛的应用程序中。
设计模式是对於在面向对象开发过程中反复出现的问题所给出的高效解决方案,本书从其中获益匪浅。对那些出现在各种背景下的问题有一些有效的 可复用的解决方案,而设计模式正是从这些优秀的设计方案中萃取出来的精华片段。设计模式的重点在
于提出一个汇集建议性设计方案的词典,它们描述问题,给出经过时间验证的解决方案及其变体,描述应用各种变体会产生的效果。设计模式超越了程序设计语言所能表达的范畴,不管一种语言多麽先进,它本身也很难表达设计模式。在这本书中展现的组件通过使用和组合使用某些设计模式,能够应用于一大批具体问题。
泛型程序设计是一种范型(paradigm),它致力于将各种类型按照一小组功能性的需求加以抽象,然後以这些需求为条件实现算法。由於算法在其操作的数据类型上定义了一个严格的窄接口,同一个算法便可以应用于各种类型之上。本书中的实现方案使用了泛型程序设计技术,从而具有了普遍性,非常简洁,而且效率上可与手写代码相匹敌。
在这本书里C++是唯一的实现工具。你不会在这本书里找到出色的窗口系统实现方案,也不会有复杂的网络组件库和精致的日志机制。相反的,您能发现的是一些基础的组件,这些组件能够帮助你更容易地实现上面的那些目标,以及更多其他的目标。C++具有使这一切成为可能的能力。它底层的C内存模型保证了不打折扣的运行性能,对於多态性的支持确保了面向对象技术的发挥,而其模板机制实现了一个难以置信的代码产生机。模板遍布在本书的代码中,因为这一机制使得用户和库之间形成密切的合作关系。库的使用者按照库的字面意义来控制代码的生成方式,也就受到库的限制。泛型组件库的角色则是允许用户将自定义
的类型和行为与泛型组件组合起来以形成合理的设计。由於这些技术是在静态的背景下使用的,在将各种相应的片段组合匹配的过程中所产生的错误通常都能够在编译时被发现。
很明显的,这本书的意图是建立泛型组件 预先实现的设计片段,其主要特性是灵活 多能和易用。泛型组件并没有构成一个framework。事实上,它们的作用是补充性的 一个 framework针对一个特定对象模型定义了一些相互依赖的类,而泛型组件是一些轻量级的(lightweight)设计作品,彼此之间相互独立,同时又能够自由地组合与匹配,在实现framework 过程中会很有助益。
本书的主要读者对象是两类人。第一类是有经验的C++程序员,他们希望掌握最新的库编写技术。本书展示了新的 强有力的C++惯用法(idiom),其能力令人惊讶,有些甚至是人们从来就不敢想的。这些惯用法在写高级库的时候非常有用。想更上一层楼的中级程序员当然也会发现本书很有用,特别是如果他们能够投入一定毅力的话。尽管某些地方的代码确实很艰涩,不过我也做了很详尽的解释。第二类是那些忙碌的程序员,他们得完成工作,又不可能在学习上付出太大的代价。他们可以略过那些最复杂的实现细节,将精力集中到对这个库用法的掌握上。每一章都有介绍性的解释,以“Quick Facts”结束。程序员们会发现在理解和使用组件方面,这些部份是非常有用的叁考资料。组件可以单独的去理解,同样可以很有力 安全和出色地使用。你得有扎实的C++使用经验,最重要的是有强烈学习欲望。希望读者对於模板机制和STL能够比较熟悉,也建议大家了解一些设计模式方面的知识(Gamma et al.1995),不过不必强求。本书所运用到的模式和惯用法都会被详细的解释。但是,这本书不是一本模式技术书籍 没有打算全面论述模式技术。因为在这本书里,模式是从一个库编写者的实用主义观点来展现的,所以即使是对模式技术更感兴趣的读者也会发现这个观点很有新意。