用C设计,用C++编码,第1张

用C设计,用C++编码,第2张

昨晚看到刘江的博客加了几段,今天早上看到冯云的人肉trackback,真的很吸引人的眼球。

先是冯云提到了C++带来的所谓思想负担(文言文“精神负担”),然后又重重地引用了莱纳斯的一句话:“关键是设计”。事实上,他是在暗示,好的设计C也可以做出来,不需要C++的任何努力;而一旦C++问世,人们就会背负着额外的思想负担。

我明确表示,这是系统级编程的情况。

不要小看这个思想包袱。大多数,甚至大部分C++程序员都过不了这个关。相反,做系统级开发,C是一门几乎没有思想负担的语言。说白了,想怎么写就怎么写。它什么也没给你,什么也没给你做,什么也没给你带。

早在N年前,我就发现自己在慢慢写程序。那时候我对STL的熟悉程度远远超过身边的人。老规矩,我说长流苏在手要有效率。结果证明不是。当我写程序的时候,我没有自信。我一直在想,“这个肯定行,但是恐怕还有更好的方案。会是什么呢?尝试添加模板参数?还是抽象一个基类?做一个桥梁模型?那么如何解决归属问题呢?谁负责回收内存?移植一个boost::shared_ptr。过来这里!但是在多线程的情况下会不会变慢?不,但是会有循环引用。还是中间做个弱_ptr打破循环链?哦,不,太复杂了,别人理解不了。先这样吧,干活就行。”就这样,我兜了一圈回来了。有时候,这个圈子并不纯粹是柏拉图式的,我会真的去实现很多“优化”的设计来做比较。那时候我花的都是在里面度过的。有时候,我确实得到了一些改善,但大多数时候,这是得不偿失的。在我看来,我旁边那些连C都一知半解的家伙采用的是“CtrlC-CtrlV-Modify-Debug”的解决方案,他们已经冲到我前面了。这就是“精神包袱”的力量。

这几年,我没有用C++写过程序,但业余时间用过其他几种语言。大概是意识到这些语言的一些好处后,我才能更客观的看待C++。我也想过。如果有一天我跑回去写C/C++我会怎么做?毕竟C++程序员在全世界都是供不应求的,薪水也越来越高。这个问题还是有其现实意义的。昨天刚和chensh聊了一下,两人一致同意采用“C+Concreate Class+STL”的风格。说白了就是用C设计,用C++编码。
事实是这样的。反正现在C和C++都是做系统级开发的,那些华丽的抽象机制都不用了。在思考解决方案的时候,是用C的方式,注意C也可以做面向对象甚至组件级的设计,但是在C层思考问题,可以让设计更精简(lean,现在是个流行语),更轻便,更直接。当你构思的设计出来后,如果其中的某些部分恰好是C++现成的,并且使用C++可以提高开发效率,又没有明显的副作用,那么就用C++来制作相应的部分。比如COM最初设计的时候是在C的基础上做的,设计的时候发现其实和vptr+vtable是一致的,在C++里是多态的,所以后来主要是用C++开发的。事实上,为了满足COM开发的需要,微软直接改变了C++编译器。很明显,微软首先构思了一个好的设计,然后让C++去适应。后来,许多C++程序员使设计适应C++的语言机制。在系统开发中,这叫做本末倒置。当然,这样的事情在应用层面并没有那么离谱。

其实回顾C++的早期历史,最早的C++是通过将C中常用的一些模式内置到语言中而产生的,有效的提高了早期的开发效率。我们今天应该回去寻找这种精神。

我支持STL也是出于同样的原因。很多时候,你从C中得到的设计,无非是STL已经做得很好的东西。这时候STL当然可以用。尤其是那些计算方法,也适用于C数组,用累加求和,用变换映射,用adjacent_find求等邻项,用lower_bound和equal_range做二分搜索法等等。这不是比手写好多了吗?当然,如果使用STL,还是要熟悉背后的机制。如果没有这个想法,最好用c。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 用C设计,用C++编码

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情