臃肿的C++ - 浅谈过度包装


几乎所有使用OO语言(C++, Java)的程序员都有过度包装的倾向.
不管什么都先用类包一层.代码的层次非常厚.很多C++源代码由于包装层次过多,有时候甚至为了包装而包装,读起来非常费劲. 因为很多东西都是经过原作者抽象过的,如果读者对作者的设计思想把握得不好,读起来有云里雾里的感觉.

我倾向于C++应该仅仅只是"带类的C", STL应该维持在一个最小的集合内 .

C语言是最接近程序设计本质的语言,自由,灵活, 纯言语言的东西很少. C的确是一个很小,很简洁的语言.
看高质量的C程序是一种享受,行云流水,是人类思维理解计算机世界的最直接的表述.
C的指针和数组是计算机世界里最直接的体现. 在内存里,数据就是这样存储的.CPU就是用指针(地址)来操作的.
相反,C++ 的 string 会让你和实际内存联系起来吗?

BOOST是一个非常大的库,功能非常丰富,很多BOOST库的确非常好,但是隐藏了太多细节.
人们常说BOOST是"准"标准库, 我倒是希望它永远都不成为标准库,只是一个功能丰富的库,需要的人用它,仅仅如此而已.

拿 share_ptr 作个例子,包装得非常全面,依靠 share_ptr 几乎可以忘记 new 和 delete. 依赖于 share_ptr 将不知资源的申请和释放为何物.然而,这正是理解计算机世界非常重要所必需的. 从操作系统的角度来看,所有资源都是需要申请,也是必须收回的.
C++的过度包装,使我们渐渐远离程序的本质 .

对于STL的 auto_ptr 我认为刚刚好,提供了几乎是最小功能要求的智能指针类型,一点多余的东西都没有,完全不会影响程序员对于指针,资源概念的理解.
用 auto_ptr 的时候,我心里很清楚, 我只是让 auto_ptr 在一个合适的时间合适的地点帮我把申请到的资源释放.
使用 share_ptr 完全代替 new, delete, 我认为是非常愚蠢的尝试,等同于尝试在C++里加入垃圾回收机制.
在C++这样自由的语言里,管理内存是一件非常愉悦的事. 内存泄漏? 那是程序员的问题吧.

为什么很多C程序员坚持只用C? 我敢说C++的过度包装是一个原因.
代码层次越多程序越复杂,也就越容易出错.
C程序员对计算机的理解绝对比C++/JAVA程序员对计算机理解来得深刻.

Linus Torvalds前不久针对为Linux内核开发而专门打造的版本控制软件Git时说:
"C++是一种糟糕的(horrible)语言. 而且因为有大量不够标准的程序员在使用而使情况更糟,以至于极容易产生彻头彻尾的垃圾(total and utter crap)"
"低效的抽象编程模型,可能在两年之后你会注意到有些抽象效果不怎么样,但是所有代码已经依赖于围绕它设计的‘漂亮’对象模型了,如果不重写应用程序,就无法改正."
"也就是说,使用优秀的,高效的,系统级的和可移植的C++的唯一方式,最终还是限于使用C本身具有的所有特性.项目限制只用C,意味着参与的人不会捣乱,也意味着会得到许多真正懂得底层问题,而不会折腾那些白痴‘对象模型’垃圾的程序员."

虽然我也是一个C++程序员,但是不得不承认Linus Torvalds说的是对的.
对对象模型的滥用和过度包装正把C++引入绝路. 然而,这能说这是C++的错吗?

相关内容