好语言,就该善用它——《C++语言的设计与演化》读书笔记

   C++真是让人又爱又恨的语言之一。很多人都说C++功能强大,其实很多时候他们都是足够幸运的,没有遇到太多需要用代码杂技解决的需求,或者没有亲身维护太多充满“高技巧”的代码的项目。我都遇到过,所以最后终于决定把Java当作自己的第一语言。C++作为以爱好为主的研究语言了。



  从2004年开始,我就陆续看了一些C++语言的书。学完C语言后,觉得它在某写领域过于中级语言化了,我需要一种更高层的抽象方式,所以决定初探C++。那时也未有学习Java或动态语言的想法。一开始看得是入门级别的《C++ Primer Plus》,流水帐似的把语言的基本功能罗列了一遍,看后没有学到什么思路。其次看了较为全面的《C++ Primer》,这本书又不失深度,讲了一些例如虚函数表,模板参数推导等高级话题。看完觉得挺有用的,自己试着写了一个四则运算表达式解析器,挺满意的。当时尚未有面向对象思想的建立,仍然将C++看待为一个增强版的C工具箱。最后看了两本重量级的知名书,《Effective C++》和《More Effective C++》,讲了很多关于STL的内容,当时的水平接受起来确实有困难,只能说读完了文字,但是没有深入的研究。


  直到最近,同事要写一个游戏编辑器,用到了QT,所以我又重温C++了。这次有了Java语言和面向对象编程的经验,看起来就觉得C++值得深入研究的地方太多了。幸好C++的创始人Bjarne Stroustrup曾经写过一本《C++语言的设计与演化》,正好拿来当我的复习教材。这本1995年的书,16年后的今天读来,仍是让人受益匪浅,尤其是那些和我一样,

  1.仅仅将C++作为一个增强的C语言工具包的人。

  2.将C++作为代码杂技试练场的人。

  3.对C++语言各种功能不能系统掌握的人。


  书中讲到的基本是关于如何设计语言、如何给语言增加新功能、如何标准化一门语言之类的问题。那么,对于我们这些暂时不会设计一门语言,至多设计类库、框架乃至终端应用的人来说,可以学到什么呢?我就择要的列出几个有启发性的章节,与大家探讨。


  第三章谈新功能的采用。作者认为任何人都能找到增加一个新功能的理由,然而这么做是不健康的,因为很难保证和既有功能的连贯性。所以,决定增加新功能时,不能单纯靠貌似合理的理由,而是要建立在深入实验的基础上。


  第六章谈到工程质量与语言是否功能多,无必然联系。工程质量的提升主要应着眼于设计,而不是众多花哨的新功能。


  该章还谈到是否接受一个新功能的标准:1.是否表述精确,大家是否能够理解这个功能;2.这个扩展的道理是什么,我们为什么需要它;3.它是否已经被实现过;4.对既有代码的影响;5.对效率和兼容性带来的影响;6.这个改变如何用文档描述,如何教给大家;7.有没有不引入这个扩展的理由;8.有没有其它去实现这个功能。这些标准对库、框架、应用程序设计者都有参考价值。引入新功能而不破坏既有工程结构的一致性、连贯性,是个很值得下工夫的任务。作者在第九章又重新强调了这一点。


  第八章谈到了尽量避免使用强制类型转换。除了一些系统底层接口,过多的强制类型转换必然会破坏类型系统。


  第九章还谈到C++程序员应该将程序看待为类型、函数、语句的信息集合,而非字符和文件的集合。


  第十四章至第十七章应该细读,这四章分别讲了C++四个重要的语言功能。运行时信息识别(RTTI),模板,异常,命名空间。每一个功能都有一些使用时候的注意事项。例如RTTI不可误用,只有当设计从外部信息源(例如文本文件)中制造对象时,才可以合理的使用。模板可以解决一些对继承的误用。如何在C++的终止式异常处理方式下处理需要重试型的异常情况(例如IO错误)。如何合理利用命名空间减少各种库中名称的冲突,避免污染全局命名空间。这些都是C++程序员经常容易出错的领域,同时也可以给例如博主这种从Java语言出身的人一个通过比较法来学习语言的机会。


  第十八章也即最后一章,讲了宏(macro)的害处。除了#include之外,应尽量避免用宏,因为其可以扰乱开发人员对源代码的理解和维护。尤其是慎用和编译器的实现相关的#pragma。


  综观全书,可以体会到:

  1.C++是一个能非常得体得将功能、设计、运行效率、空间占用等因素平衡的语言。我们这些类库、框架、应用设计者,也要在实际代码中学习这种平衡的技艺。

  2.对于新功能的加入要十分的谨慎和清醒。切忌破坏既有代码、工程、设计的一致性、连贯性、内聚性和可用性。好的工程还是要注重设计。只有功能与设计不脱节,才不会使得过多的新功能难以维护。

  3.对于每一个语言功能的运用,都必须建立在充分理解其设计意图的基础上。RTTI,模板,异常都是非常容易被误用的领域。同理,Java语言的反射,RMI亦然。


  作者用近似编年史的方法回顾了C++主要功能的萌发、构思、实验、实现、应用这一连贯流程,希望大家和我一样,在读这本书的过程中,能够对C++语言本身,C++和其它语言的比较,以及如何接受与设计新功能,新扩展这些问题有一个更深入的了解。有很多类似C++这样的全面、高效、功能丰富的语言,如何善用它,如何用这种语言设计出符合其设计哲学的库、框架、应用来,这是我们始终应该思考的话题。


(本文为作者原创,如需转载请联系[email protected]或http://weibo.com/eastarlee)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章