原文:http://blog.csdn.net/myan/archive/2006/05/25/754239.aspx
今天跟一些朋友在信件里討論C++的使用。一個(gè)還在學(xué)習(xí)C++的朋友,認(rèn)為要把重點(diǎn)放在虛函數(shù)、多態(tài)性、STL上。我認(rèn)為學(xué)習(xí)的時(shí)候這樣考慮肯定是對(duì)的,但是真正開發(fā)的時(shí)候,不能因?yàn)槟阏莆樟薕O、generic這些先進(jìn)武器,就非要用上這些東西,以示區(qū)別不可。謹(jǐn)慎合理地使用語言的機(jī)制是開發(fā)良好C++程序的關(guān)鍵,至少在心態(tài)上是關(guān)鍵。
下面是信件內(nèi)容的摘選:
你寫C++的時(shí)候,一定要想清楚,你是在做基礎(chǔ)設(shè)施還是在應(yīng)用。如果是基礎(chǔ)設(shè)施,比如類庫、框架、底層功能的class wrapper,那么可以允許你大膽地使用C++中的各種技巧,關(guān)鍵的要求是你得暴露出來一個(gè)clean的interface,讓別人好用。這一點(diǎn)并不容易,特別是有的時(shí)候你覺得很好用的接口人家就覺得很別扭。所以比較省心的做法就是把接口設(shè)計(jì)成流行的風(fēng)格。比如模仿STL的風(fēng)格,模仿Java的風(fēng)格,模仿COM的風(fēng)格,甚至模仿MFC的風(fēng)格,可能都比你自己發(fā)明一種新風(fēng)格要“好用”。
可是做應(yīng)用開發(fā)的時(shí)候,手就要把緊點(diǎn),別自鳴得意地濫用高級(jí)技巧。應(yīng)用開發(fā)很大程度上受基礎(chǔ)設(shè)施的制約,總的來說,使用函數(shù)、POD對(duì)象、concrete class,從framework中派生出來的class,再加上一點(diǎn)點(diǎn)用來節(jié)省打字的template,足以滿足應(yīng)用開發(fā)的需要。特別是當(dāng)你的下面沒有很完備的class library或者framework的時(shí)候,千萬不要一邊寫應(yīng)用,一邊又想著怎么讓自己的這些東西“為萬世開太平”,那樣的話很容易就會(huì)把程序結(jié)構(gòu)作的過于復(fù)雜。最后往往是應(yīng)用沒寫好,也沒有可復(fù)用性。以前我沒有經(jīng)驗(yàn)的時(shí)候,最容易犯的錯(cuò)誤就是這個(gè)。
做基礎(chǔ)設(shè)施的開發(fā),那叫“設(shè)計(jì)”,是要為以后考慮的,為了長(zhǎng)遠(yuǎn)利益可以犧牲眼前的進(jìn)度、簡(jiǎn)單性。可是做應(yīng)用,那眼前利益是第一位的,你先把手頭的東西又快又穩(wěn)地run起來,才談得上以后有復(fù)用的可能。眼前的東西作的一塌糊涂,說里面有的模塊設(shè)計(jì)得超級(jí)棒,絕對(duì)能復(fù)用,你自己都不相信。代碼要一絲不茍,該寫注釋寫注釋,該寫assert寫assert,該怎么樣怎么樣,不能因?yàn)橄胫胺凑簿褪且诲N子買賣”就馬馬虎虎。至于能不能復(fù)用,那是以后的事情。所謂Design for today, code for tomorrow,就是這個(gè)意思。