《不得不看的兩次從C++回歸C的高手評(píng)論C++》中先是提了一下所謂C++帶來(lái)的思想包袱(文言文曰"心智包袱")問題,然后重重地引用了Linus的話:"關(guān)鍵是設(shè)計(jì)",其實(shí)他是在暗示:好的設(shè)計(jì)C同樣能做出來(lái),不勞C++大駕;而C++一旦出面,就要讓人背上額外的思想包袱。
我明確地表個(gè)態(tài),在系統(tǒng)級(jí)程序設(shè)計(jì)中,事實(shí)就是這樣的。
別小看這個(gè)思想包袱,大部分,甚至絕大部分C++程序員過不了這一關(guān)。相反,做系統(tǒng)級(jí)開發(fā),C是幾乎沒有思想包袱的語(yǔ)言,說(shuō)白了就是刺刀見紅,你想要啥你就去寫啥,它給你的不多也不少,沒什么干不了,也沒什么非讓你背著不可。
我早在N年前就發(fā)現(xiàn)自己寫程序速度慢,我當(dāng)時(shí)對(duì)STL遠(yuǎn)比周圍人熟悉,照例說(shuō)長(zhǎng)纓在手,應(yīng)該效率很高才對(duì)。結(jié)果發(fā)現(xiàn)不是,寫程序的時(shí)候特別沒自信,總在想:"這樣固然是可以work了,但恐怕有更好的方案吧!會(huì)是什么呢?加個(gè)模板參數(shù)試試?要么抽象出一個(gè)基類?做一個(gè)bridge模式?那么Ownership的問題怎么解決?誰(shuí)來(lái)負(fù)責(zé)回收內(nèi)存呢?移植一個(gè)boost::shared_ptr過來(lái)吧!可多線程情況下會(huì)不會(huì)拖慢速度呢?應(yīng)該不會(huì),可是會(huì)碰到循環(huán)引用的情況。要么在中間搞一個(gè)weak_ptr把循環(huán)鏈斷開?哎呀!不行不行,太復(fù)雜,別人也理解不了。還是先這樣吧!能work就行。"就這樣,兜了一個(gè)圈子回來(lái)。有的時(shí)候,這個(gè)圈子不是純柏拉圖式的,我會(huì)真的實(shí)現(xiàn)不少"優(yōu)化"設(shè)計(jì)來(lái)比對(duì),那個(gè)時(shí)間啊!花花的就耗在里面了。有的時(shí)候確實(shí)會(huì)獲得一些改進(jìn),但是多數(shù)時(shí)候是得不償失,旁邊那些在我看來(lái)連C都只是一知半解的家伙采用"CtrlC-CtrlV-Modify-Debug"大法,早就沖到我前頭去了。這就是"心智包袱"的威力。
近幾年沒怎么用C++寫程序,業(yè)余時(shí)間倒是別的語(yǔ)言用了好幾種。大概是體會(huì)到這些語(yǔ)言的某些好處之后,對(duì)C++就能看得更客觀一些了,也琢磨了一下,如果自己有朝一日重新跑回去寫C/C++,我會(huì)怎么干?畢竟現(xiàn)在C++程序員全球緊缺,工資越來(lái)越高,這個(gè)問題還是有其現(xiàn)實(shí)意義的。正好跟chensh 聊了一會(huì)兒,兩個(gè)人的看法一致,就是采取" C + Concreate Class + STL"的風(fēng)格。說(shuō)白了就是用C來(lái)設(shè)計(jì),用C++來(lái)編碼。
這里面的道理是這樣的,反正現(xiàn)在C和C++都是來(lái)做系統(tǒng)級(jí)開發(fā),那些華麗的抽象機(jī)制用不上,思考解決方案的時(shí)候,就以C的方式。注意,C也是可以做基于對(duì)象甚至面向?qū)ο笊踔两M件級(jí)別的設(shè)計(jì)的,但是在C的層面上思考問題,設(shè)計(jì)能夠更精益(lean,現(xiàn)在這是個(gè)時(shí)髦詞),更輕便,更直接。當(dāng)你構(gòu)思的設(shè)計(jì)方案出來(lái)以后,如果其中有些部分,恰好是C++現(xiàn)成做好了,而且使用C++又可以提高開發(fā)效率,也沒什么明顯的副作用,那么就用C++來(lái)做相應(yīng)的部分。比如,COM原來(lái)設(shè)計(jì)的時(shí)候就是在C基礎(chǔ)上做的,設(shè)計(jì)的時(shí)候發(fā)現(xiàn)實(shí)際上跟C++實(shí)現(xiàn)多態(tài)的的vptr + vtable是吻合的,所以后來(lái)就主要用C++來(lái)做COM開發(fā)。事實(shí)上,為了適應(yīng)COM開發(fā)的需要,微軟直接改了C++編譯器。很顯然,微軟是首先構(gòu)思好的設(shè)計(jì),然后讓C++去適應(yīng)這個(gè)設(shè)計(jì)。而后來(lái)很多C++程序員,是讓設(shè)計(jì)去適應(yīng)C++的那些語(yǔ)言機(jī)制,在系統(tǒng)開發(fā)中,這個(gè)叫做本末倒置。當(dāng)然這樣的事情在應(yīng)用級(jí)別上就不是那么離譜。
實(shí)際上回頭看看C++早期的歷史,早C++就是把一些C中常用的patterns內(nèi)置到語(yǔ)言里而出現(xiàn)的,早期它曾經(jīng)有效地提高了開發(fā)效率。今天應(yīng)該回頭去尋找這種精神。
我支持STL是基于同樣的理由。很多時(shí)候,你從C出發(fā)得到的設(shè)計(jì),也無(wú)非就是STL已經(jīng)實(shí)現(xiàn)得很好的東西。在這個(gè)時(shí)候,當(dāng)然可以用STL.尤其是那些算法,針對(duì)Carray也是適用的,用accumulate求和,用transform映射,用adjacent_find尋找相等的毗鄰項(xiàng),用lower_bound和equal_range做二分查找等等,這不是比手寫要爽多了嗎?當(dāng)然,使用STL,還是必須熟悉其背后的機(jī)理,沒有這個(gè)底子,還是規(guī)規(guī)矩矩用C算了。
用C設(shè)計(jì) 用C++編碼
更新時(shí)間: 2011-12-13 15:06:21來(lái)源: 粵嵌教育瀏覽量:1493
粵嵌動(dòng)態(tài)
推薦閱讀
- ·北京朝歌數(shù)碼科技股份有限公司專場(chǎng)招聘
- ·深圳研賽自動(dòng)化設(shè)備公司專場(chǎng)招聘(長(zhǎng)沙校區(qū))
- ·深圳市興禾自動(dòng)化股份有限公司專場(chǎng)招聘(長(zhǎng)沙校區(qū))
- ·中山市弘億實(shí)業(yè)有限公司專場(chǎng)招聘會(huì)
- ·東莞市德聲實(shí)業(yè)有限公司專場(chǎng)招聘
- ·深圳華創(chuàng)智聯(lián)電子有限公司專場(chǎng)招聘
- ·廣州2512全網(wǎng)運(yùn)營(yíng)就業(yè)班
- ·廣州2511嵌入式開發(fā)就業(yè)班
- ·深圳市領(lǐng)世達(dá)科技有限公司專場(chǎng)招聘
- ·廣州2510嵌入式開發(fā)就業(yè)班