C++語言常見問題解答(3)
2019-11-17 05:44:08
供稿:網(wǎng)友
== Part 3/4 ============================ =============================
■□ 第14節(jié):程式風(fēng)格指導(dǎo)
=============================
Q81:有任何好的 C++ 程式寫作的標(biāo)準(zhǔn)嗎?
感謝您閱讀這份文件,而不是再發(fā)明自己的一套。
但是請(qǐng)不要在 comp.lang.c++ 里問這問題。幾乎所有軟體工程師,或多或少都把這
種東西看成是「大玩具」。而且,一些想成為 C++ 程式撰寫標(biāo)準(zhǔn)的東西,是由那些
不熟悉這語言及方法論的人弄出來的,所以最後它只能成為「過去式」的標(biāo)準(zhǔn)。這種
「擺錯(cuò)位置」的現(xiàn)象,讓大家對(duì)程式寫作標(biāo)準(zhǔn)產(chǎn)生不信任感。
很明顯的,在 comp.lang.c++ 問這問題的人,是想使自己更精進(jìn),不會(huì)因自己的無
知而絆倒,然而一些回答卻只是讓情況更糟而已。
========================================
Q82:程式撰寫標(biāo)準(zhǔn)是必要的嗎?有它就夠了嗎?
程式撰寫標(biāo)準(zhǔn)不會(huì)讓不懂 OO 的人變懂;只有練習(xí)及經(jīng)驗(yàn)才有可能。假如它有用處的
話,那就是抑制住那些瑣碎無關(guān)緊要的程式片段--當(dāng)大機(jī)構(gòu)想把零散的程式設(shè)計(jì)組
織整合起來時(shí),這些片段經(jīng)常會(huì)出現(xiàn)。
但事實(shí)上你要的不光是這種標(biāo)準(zhǔn)而已。它們提供的架構(gòu)讓新手少去擔(dān)心一些自由度,
但是系統(tǒng)化的方法論會(huì)比這些好看的標(biāo)準(zhǔn)做得更好。組織機(jī)構(gòu)需要的是一致性的設(shè)計(jì)
與實(shí)行“哲學(xué)”,譬如:強(qiáng)型別或弱型別?用指標(biāo)還是參考介面? stream I/O 還是
stdio? C++ 程式該不該呼叫 C 的?反過來呢? ABC 該怎麼用?繼續(xù)該用為實(shí)作的
技巧還是特異化的技巧?該用哪一種測(cè)試策略?一一去檢查嗎?該不該為每個(gè)資料成
員都提供一致的 "get" 和 "set" 介面?介面該由外往內(nèi)還是由內(nèi)往外設(shè)計(jì)?錯(cuò)誤狀
況該用 try/catch/throw 還是傳回值來處理?……等等。
我們需要的是具體的“設(shè)計(jì)”部份的「半標(biāo)準(zhǔn)」。我推薦一個(gè)三段式標(biāo)準(zhǔn):練習(xí)、諮
詢顧問以及程式庫。練習(xí)乃提供「密集教學(xué)」,諮詢顧問讓 OO 觀念深刻化,而非僅
僅是被教過而已,高品質(zhì)的程式庫則是提供「長程的教學(xué)」。上述三種培訓(xùn)都有很熱
門的市場(chǎng)景況。(【譯注】無疑的,這是指美、加地區(qū)。)接受過上述培訓(xùn)的組織都
有如此的忠告:「買現(xiàn)成的吧,不要自己硬干 (Buy, Don't Build.)。」買程式庫,
買練習(xí)課程,買開發(fā)工具,買諮詢顧問。想靠自學(xué)來達(dá)到成功的工具廠商及應(yīng)用/系
統(tǒng)廠商,都會(huì)發(fā)現(xiàn)成功很困難。
【譯注】這一段十分具有參考價(jià)值。不過有些背景資料得提供給各位參考。別忘了:
作者是美國人,是以該地為背景,且留意一下他所服務(wù)的公司是做什麼的..
... :-) 唉!國內(nèi)有這麼多的專業(yè)顧問公司嗎? :-<
少數(shù)人會(huì)說:程式撰寫標(biāo)準(zhǔn)只是「理想」而已,但在上述的組織機(jī)構(gòu)中,它仍有其必
要性。
底下的 FAQs 提供一些基本的指導(dǎo)慣例及風(fēng)格。
========================================
Q83:我們的組織該以以往 C 的經(jīng)驗(yàn)來決定程式撰寫標(biāo)準(zhǔn)嗎?
No!
不論你的 C 經(jīng)驗(yàn)有多豐富,不論你有多高深的 C 能力,好的 C 程式員并不會(huì)讓你
直接就成為好的 C++ 程式員。從 C 移到 C++ 并不僅是學(xué)習(xí) "++" 的語法語意而已
,一個(gè)組織想達(dá)到 OOP 的境界,卻未將 "OO" 的精神放進(jìn) OOP 里的話,只是自欺罷
了;會(huì)計(jì)的資產(chǎn)負(fù)債表會(huì)把他們的愚蠢顯現(xiàn)出來。
C++ 程式撰寫標(biāo)準(zhǔn)應(yīng)該由 C++ 專家來調(diào)整,不妨先在 comp.lang.c++ 里頭問問題(
但是不要用 "coding standard" 這種字眼;只要這樣子問:「這種技巧有何優(yōu)缺點(diǎn)
?」)。找個(gè)能幫你避開陷阱的高手,上個(gè)練習(xí)課程,買程式庫,看看「好的」程式
庫是否合乎你的程式撰寫標(biāo)準(zhǔn)。絕對(duì)不要光靠自己來制定標(biāo)準(zhǔn),除非你對(duì)它已有某種
程度的把握。沒有標(biāo)準(zhǔn)總比有爛標(biāo)準(zhǔn)好,因?yàn)椴磺‘?dāng)?shù)摹腹俜秸f法」會(huì)讓不夠聰明的
平民難以追隨。現(xiàn)在 C++ 練習(xí)課程及程式庫,已有十分興盛的市場(chǎng)。
再提一件事:當(dāng)某個(gè)東西炙手可熱時(shí),招搖撞騙者亦隨之而生;務(wù)必三思而後行。也
要問一下從某處修過課的人,因?yàn)槔鲜植灰姷靡彩莻€(gè)好教員。最後,選個(gè)懂得指導(dǎo)別
人的從業(yè)人員,而不是個(gè)對(duì)此語言/方法論只有過時(shí)知識(shí)的全職教師。
【譯注】善哉斯言!
========================================
Q84:我該在函數(shù)中間或是開頭來宣告區(qū)域變數(shù)?
在第一次用到它的地方四周。
物件在宣告的時(shí)候就會(huì)被初始化(被建構(gòu))。假如在初始化物件的地方?jīng)]有足夠的資
訊,直到函數(shù)中間才有的話,你可以在開頭處初始個(gè)「空值」給它,等以後再「設(shè)定
」其值;你也可以在函數(shù)中間再初始個(gè)正確的東西給它。以執(zhí)行效率來說,一開始就
讓它有正確的值,會(huì)比先建立它,搞一搞它,之後再重建它來得好。以像 "String"
這種簡單的例子來看,會(huì)有 350% 的速度差距。在你的系統(tǒng)上可能會(huì)不同;當(dāng)然整個(gè)
系統(tǒng)可能不會(huì)降低到 300+%,但是“一定”會(huì)有不必要的性能衰退現(xiàn)象。
常見的反駁是:「我們會(huì)替物件的每個(gè)資料提供 "set" 運(yùn)作行為,則建構(gòu)時(shí)的額外
耗費(fèi)就會(huì)分散開來。」這比效能負(fù)荷更糟,因?yàn)槟闾砑恿司S護(hù)的夢(mèng)靨。替每個(gè)資料提
供 "set" 運(yùn)作行為就等於對(duì)資料不設(shè)防:你把內(nèi)部實(shí)作技巧都顯露出來了。你隱藏
到的只有成員物件的實(shí)體“名字”而已,但你用到的 List、String 和 float(舉例
來說)型態(tài)都曝光了。通常維護(hù)會(huì)比 CPU 執(zhí)行時(shí)間耗費(fèi)的資源更多。
區(qū)域變數(shù)應(yīng)該在靠近它第一次用到之處宣告。很抱歉,這和 C 老手的習(xí)慣不同,但
是「新的」不見得就是「不好的」。
========================================
Q85:哪一種原始檔命名慣例最好? "foo.C"? "foo.cc"? "foo.cpp"?
假如你已有個(gè)慣例,就用它吧。假如沒有,看看你的編譯器,看它用的是哪一種。典
型的答案是:".C", ".cc", ".cpp", 或 ".cxx"(很自然的,".C" 副檔名是假設(shè)該
檔案系統(tǒng)會(huì)區(qū)分出 ".C" ".c