有点失望
![](https://img3.doubanio.com/icon/u33584401-7.jpg)
(因為本評論的一些回覆沒有了,可能會做成一些誤會,原文請參考 http://www.douban.com/review/2963028/ )
看到这本书的题目,既猜疑又好奇,作者有什么好方法去写无错误的软件呢?
可是收到本书后,越看越觉得不对劲。本人才疏学浅,评论不对的地方希望作者不要介意。我第一次写这么长的书评。
首先,本书内容中有大量错误的地方需要纠正。因为错误(不是错别字等小错误)实在太多,阅读时也没有一一记下来,只随便找些例子:
- P.41 「CPU每个时钟周期,至少能通过总线访问到1个字节」是不对的。如果是这样,就不用L1、L2 Cache了。整个2.3.1是要说明为什么要使用锁,但这段说明是错误的。
- P.45 整页说明Windows 加锁有漏洞、不严谨。文中没说是那种"锁",估计是Mutex。 Windows的Mutex是recursive的, Linux 预设的是non-recursive,但也可以使用recursive mutex的。这应该不是Windows的错而是作者的错。
- P. 86 「由于C 和C++ 语言,标签在编译时一般都具有全局性,因此,一定不能重名......」标签只需要在一函数内不重名就可以,goto 也只可以使用同一函数里的标签。那种全域命名方式是没需要的。
- P.91, 127 说ternary operator (即a ? b : c) 没用,用if-else 可以原全取代。这是 expression 和 statement 的分别。例如你不可以用if-else 写一个MAX(a, b) 的宏。
- P.102 作者说类只使用public 和private,不知道为什么要有protected,说看不出protected和friend的用途,所以建议大家不要用。这两个关键词都在类的封装中有重要及无法替代的用途,建议作者看相关书籍。
- P.102 第2段「用聚合不用重载」,但从内文推理作者应该是指不要用承继(inheritance)。
- P.109-P.111 对C++物件模型的错误解释。那个物件的「函数指针表」是不存在的。有虚函数的类才需要每个物件多出一个虚函数表指针,指向一个类的虚函数表。另外为解决内存碎片问题,C++物件中应该用placement new、new operator重载或/和显式解构。
- P.118-119 对头文件依赖问题错误描述。 Forward declaration 只能声明一个型别的存在,所以只能使用其型别的pointer或reference,而在例子中用A a是不行的。一个header #inlclude 另一个header是很正常的做法。
- P.126 说不需要用 ++i 只需要用 i++。在C++ 里是建议相反的,因为物件的post increment/decrement operator是需要额外的copy construction。
- 书中很多string/buffer 长度、sizeof() 的结果等,都使用int 型别。正确的型别应该是size_t。
我还只读到第3章「C/C++无错化程序设计」,也不知道能否阅读下去,就先写一些读到这里的感想:
- 作者不断说自己有十多年C商用开发经验、十年C++开发经验,但好像对C/C++的知识有点不足,尤其是C++。
- 前三章举出很多笔者的经历。我看过颇多的技术性书籍,但比较少看到这种描述:「笔者一个月左右完成......仅仅查出1个bug。获得公司和同事的好评。笔者近期带领团队开发. .....bug只有7个。也获得了公司的肯定」、笔者怎样用两天解决了另一个同事做了两个月的事情。
- 书名比较言过其实。作者提到自己做的案例也不是0 bug......
- 书中的用字不够严谨,而有些是笔者惯用或创造的词语。建议用比较正规、并前后一致的词语。
- 书中很多内容都是作者的经验分享,并介绍作者开发/设计(文中经常用"发明")的一些工程库。但书中好像没有比较或参考相关的演算法(如lock-free algorithms)或程序库(如ACE、TBB等)。个人会怀疑这些是否「重发明轮子」,还是因为一些特殊的需求而订制的。
如果是要看如何可以减少编写(C/C++)代码的错误,我会比较建议看《代码大全》、Scott Meyers的Effective系列。
最后,我还是支持作者分享原创的心得。希望作者在续版及新作能更进步。
看到这本书的题目,既猜疑又好奇,作者有什么好方法去写无错误的软件呢?
可是收到本书后,越看越觉得不对劲。本人才疏学浅,评论不对的地方希望作者不要介意。我第一次写这么长的书评。
首先,本书内容中有大量错误的地方需要纠正。因为错误(不是错别字等小错误)实在太多,阅读时也没有一一记下来,只随便找些例子:
- P.41 「CPU每个时钟周期,至少能通过总线访问到1个字节」是不对的。如果是这样,就不用L1、L2 Cache了。整个2.3.1是要说明为什么要使用锁,但这段说明是错误的。
- P.45 整页说明Windows 加锁有漏洞、不严谨。文中没说是那种"锁",估计是Mutex。 Windows的Mutex是recursive的, Linux 预设的是non-recursive,但也可以使用recursive mutex的。这应该不是Windows的错而是作者的错。
- P. 86 「由于C 和C++ 语言,标签在编译时一般都具有全局性,因此,一定不能重名......」标签只需要在一函数内不重名就可以,goto 也只可以使用同一函数里的标签。那种全域命名方式是没需要的。
- P.91, 127 说ternary operator (即a ? b : c) 没用,用if-else 可以原全取代。这是 expression 和 statement 的分别。例如你不可以用if-else 写一个MAX(a, b) 的宏。
- P.102 作者说类只使用public 和private,不知道为什么要有protected,说看不出protected和friend的用途,所以建议大家不要用。这两个关键词都在类的封装中有重要及无法替代的用途,建议作者看相关书籍。
- P.102 第2段「用聚合不用重载」,但从内文推理作者应该是指不要用承继(inheritance)。
- P.109-P.111 对C++物件模型的错误解释。那个物件的「函数指针表」是不存在的。有虚函数的类才需要每个物件多出一个虚函数表指针,指向一个类的虚函数表。另外为解决内存碎片问题,C++物件中应该用placement new、new operator重载或/和显式解构。
- P.118-119 对头文件依赖问题错误描述。 Forward declaration 只能声明一个型别的存在,所以只能使用其型别的pointer或reference,而在例子中用A a是不行的。一个header #inlclude 另一个header是很正常的做法。
- P.126 说不需要用 ++i 只需要用 i++。在C++ 里是建议相反的,因为物件的post increment/decrement operator是需要额外的copy construction。
- 书中很多string/buffer 长度、sizeof() 的结果等,都使用int 型别。正确的型别应该是size_t。
我还只读到第3章「C/C++无错化程序设计」,也不知道能否阅读下去,就先写一些读到这里的感想:
- 作者不断说自己有十多年C商用开发经验、十年C++开发经验,但好像对C/C++的知识有点不足,尤其是C++。
- 前三章举出很多笔者的经历。我看过颇多的技术性书籍,但比较少看到这种描述:「笔者一个月左右完成......仅仅查出1个bug。获得公司和同事的好评。笔者近期带领团队开发. .....bug只有7个。也获得了公司的肯定」、笔者怎样用两天解决了另一个同事做了两个月的事情。
- 书名比较言过其实。作者提到自己做的案例也不是0 bug......
- 书中的用字不够严谨,而有些是笔者惯用或创造的词语。建议用比较正规、并前后一致的词语。
- 书中很多内容都是作者的经验分享,并介绍作者开发/设计(文中经常用"发明")的一些工程库。但书中好像没有比较或参考相关的演算法(如lock-free algorithms)或程序库(如ACE、TBB等)。个人会怀疑这些是否「重发明轮子」,还是因为一些特殊的需求而订制的。
如果是要看如何可以减少编写(C/C++)代码的错误,我会比较建议看《代码大全》、Scott Meyers的Effective系列。
最后,我还是支持作者分享原创的心得。希望作者在续版及新作能更进步。
有关键情节透露