读书札记之 —— 《Exceptional C++》

萨特是 ISO C++标准委员会主席, C++/CLI首席架构师,久负盛名之人,书的质量自然不 用怀疑。这本书是Exceptional系列书籍的第一本,很多人觉得这个系列可以和梅耶的 Effective系列相媲美,虽然名气上它似乎不如后者。梅耶的书读起来很有趣,像一个逗 比给你讲故事,萨特的书读起来相对沉重一些,更像一个老教授在你身边耳提面命。

对比 Effective C++

在《Effective STL》的参考数目中,梅耶提到了 Exceptional 系列的书籍,他说这本 书是对于 Effective 系列的模范补充。起初我看到这个评论的时候,小人之心的认为梅 耶吹牛,弦外之意是这套书只是Effective系列的注脚,没他的书好。

看完这本书之后我理解梅耶想要表达的意思是这本书的很多内容对于Effective系列中的 内容进行更深层次的讨论,所以说是一个模范补充。这本书中提到的很多东西在 Effective系列中都有涉及,但是通常都更加的详细。比如《ESTL》中提到如何编写大小 写不敏感字符串比较函数,这本书中讨论了使用函数和使用类之间的区别以及如何选择。 在Effective C++中提到了异常安全问题,但是没有这本书中讨论的这么详细。这样的例 子还有很多,看过这些书自己就会慢慢的发现。

当然这并不是说Effective系列的书没有这个系列的书好。梅耶最让人佩服的地方在于他 可以从浩瀚的C++特性中找出那些新手最容易出错的地方,他的书相对来说面向的是初级学 者(目标就是成为C++程序员的第二本书)。萨特的书是面向中级水平的C++程序员的,所 以讨论的力度也相对会深一些。

用你熟悉的特性,理解你自己写的代码

萨特在这本书中不断的提到的一点是使用你熟悉的特性去编写代码,同时要理解你自己编 写的代码。千万不要为了炫技去写一些华而不实的代码。

这种思想让我想起《程序员修炼之道》中的名言:关心你的技艺,在你的作品上签名。编 写C++代码不是一个想当然的过程,它需要你足够的细心和耐性,特别是在编写异常安全代 码的时候。我们应该很用心的思考我们自己的写的代码,对自己写的代码负责。

永远都走在精通C++的路上

我看完effective系列的几本书之后觉得自己的C++的小学生水平,看完这本我觉得自己 是幼儿园的水平。这本书不仅仅讨论了C++语言的特性,同时也讨论这些特性怎样的影响着 软件的开发过程。这本书的很多内容都涉及到软件工程方面的问题,比如书中不断提到的 解耦问题在任何一种编程语言中都是需要考虑的。

对我来说获益最大的内容是:异常安全、类关系的讨论、编译防火墙、接口规则。

异常安全性

关于异常安全性的讨论,估计没有哪一本书有这本书这么完整而透侧。C++的异常饱受诟病 ,很多人甚至直接建议不用,比如Google公司的C++编码规范中就直接禁用异常。其中很 大一个原因是异常安全代码很难完成,特别是对于范型编码来说更是如此。Tom Cargill 的文章让很多人对于异常敬而远之,以至于很多书籍中对于异常给出的建议都不是很乐观 ,比如《深度探索C++对象模型》、《More Effective C++》。

Tom Cargill的那篇文章在梅耶的书中也有提到过,借着看这本书的机会我也就认认真真 的把这篇文章好好的读了一读。看完这篇文章之后明白,很多人不用异常是有它的道理的 ,异常的出现对于代码安全的破坏可以说防不胜防,尤其是在编写范型程序的时候更是如 此。

这本书贡献了一章十二个条款专门讨论异常安全的问题,萨特无非想要告诉我们异常安全 代码没有想象中那么难写。你需要记住的是:

  1. 异常安全不是风格问题,他会严重的影响到你的代码,你应该在设计的时候就考虑这个 问题。

  2. 不要让一个函数完成两个完全不相关的功能,因为它很难做到异常安全要求的原子性。

  3. 千万不要在析构、operator delete() 和 operator delete 中抛出异常。

  4. 使用 RAII 单独管理资源。

  5. 把会抛出异常的代码单独放置在一块儿,确保没有问题之后在调用那些不会有异常抛出 的代码。

编译防火墙

其实编译防火期不仅仅是防止编译依赖的一种方式,它同样也是实现和接口分离的一种方 式,因为它把私有的东西全部隐藏在pimpl_之后。在effective c++一书中提到两种降 低编译依赖的方式纯虚接口类pimpl。之前我一直比较倾向于使用纯虚接口类的方 式,因为它的代码更加漂亮一些(原谅我的代码洁癖),但是按照我现在的理解,我更倾 向于使用pimpl的方式,因为它使用的是组合而前者使用的是继承,组合的灵活性要远高 于继承,耦合度也要小很多。

类关系

这部分内容给我最大的感触就是,继承不是OO的基础。并不是说没有继承就算不上OOOO 的强大在于使用类关系降低依赖,而关系不仅仅只有继承一种(这是一种很强的关 系,组合是一种相对弱的关系)。

接口规则

Effective C++中提到一个反直觉的建议,尽量使用非成员函数而不是成员函数。这本书 提到的接口规则告诉我们,并不是只有成员函数才能算的上是类的一部分,非成员函数同 样也是。而非成员函数和类之间的依赖要小于成员函数,扩展性要强于成员函数,这也是 优先使用它的原因。

其他内容

当然书中还有许多其他的内容,同样值得大家认真的思考,包括临时变量,模板构造函数 ,STL组件的用法等等。