剖析C++的復(fù)雜性的兩種分類方法
下面寫的文章是要介紹從一個(gè)較高的層次去把握C++中的復(fù)雜性。其中最重要的一個(gè)指導(dǎo)思想就是在學(xué)習(xí)的過(guò)程中注意你正學(xué)習(xí)的技術(shù)或細(xì)節(jié)到底是80%場(chǎng)景下的還是20%場(chǎng)景。
因此,當(dāng)你發(fā)現(xiàn)在這個(gè)習(xí)以為常的環(huán)境下居然出現(xiàn)了新的可能性時(shí),你當(dāng)然是會(huì)歡呼雀躍的(比如我當(dāng)年讀《Modern C++ Design》的時(shí)候就有一次從早讀到晚,午飯都沒(méi)吃),然而實(shí)際上呢?
其它語(yǔ)言中也許早就有first-class的支持了,其它語(yǔ)言也許根本不需要這個(gè)慣用法,因?yàn)樗鼈兙蜎](méi)有這些缺陷。此外,從實(shí)踐的角度來(lái)說(shuō),更重要的是,這些“解決方案”也許你平時(shí)編程根本就用不到。
不,我當(dāng)然不是說(shuō)這些補(bǔ)丁方案不重要。正如前面所說(shuō),C++中繁雜的技巧并非空穴來(lái)風(fēng),總有實(shí)際問(wèn)題在背后驅(qū)動(dòng)的。但問(wèn)題是,對(duì)于我們?nèi)粘>幊虂?lái)說(shuō),這些“實(shí)際問(wèn)題”簡(jiǎn)直是八桿子打不著的。犯不著先費(fèi)上80%的勁兒把20%時(shí)候才用到的東西揣在腦子里,用的時(shí)候查文檔或書就行了。
看到這里,塑造C++中特定的心態(tài)哲學(xué)的另一個(gè)原因想必你也已經(jīng)知道了。實(shí)際上,這個(gè)原因才是真正根本的。前面說(shuō)的一個(gè)原因是C++書籍市場(chǎng)(教育)造就的,然而為什么人們喜歡寫這些書呢?進(jìn)一步說(shuō),為什么人們喜歡讀這些書呢?
(我承認(rèn),我也曾經(jīng)讀得津津有味。)答案很簡(jiǎn)單:心理。每個(gè)人都喜歡戴著腳鐐跳舞(事實(shí)8)。認(rèn)識(shí)到這一點(diǎn)不是為了提倡它,而是只有當(dāng)我們認(rèn)識(shí)到自己為什么會(huì)津津有味地去鉆研一堆補(bǔ)丁解決方案的時(shí)候,我們才真正能夠擺脫它們的吸引。
總而言之,C++的復(fù)雜性只是一個(gè)必要條件,并非問(wèn)題的根本癥結(jié)。根本癥結(jié)在于人的心理,每個(gè)人都喜歡戴著腳鐐跳舞,并且以為是“創(chuàng)新”。意識(shí)到這一點(diǎn)之后可以幫我們避免被各種各樣名目繁多的語(yǔ)言細(xì)節(jié)和技巧占去不必要的時(shí)間。
然而,C++的復(fù)雜性始終是一個(gè)不可回避的現(xiàn)實(shí)。C++中有大量的陷阱和缺陷,后者導(dǎo)致了數(shù)目驚人的慣用法和workarounds。不加選擇的全盤預(yù)先學(xué)習(xí),是非常糟糕的做法,不僅低效,而且根本沒(méi)有必要,實(shí)在是浪費(fèi)生命。
愛因斯坦曾經(jīng)說(shuō)過(guò),“我只想知道‘他’(宇宙)的設(shè)計(jì)理念,其它的都是細(xì)節(jié)”。然而,正如另一些讀者指出的,如果對(duì)C++中的這些細(xì)節(jié)事先一點(diǎn)都沒(méi)有概念的話,那么實(shí)際編碼中一旦遇到恐怕就變成沒(méi)頭蒼蠅了,也許到哪里去RTFM都不知道。這也是為什么那么多C++面試都會(huì)不厭其煩地問(wèn)一些有代表性的語(yǔ)言細(xì)節(jié)的原因。
把細(xì)節(jié)全盤裝在腦子里固然不好,但對(duì)細(xì)節(jié)一無(wú)所知同樣也不是個(gè)辦法。那么對(duì)于C++程序員來(lái)說(shuō),在學(xué)習(xí)中究竟應(yīng)該以怎樣的態(tài)度和學(xué)習(xí)方法來(lái)對(duì)付C++的復(fù)雜性呢?其實(shí)答案也非常簡(jiǎn)單。
首先有一些很重要&必須的語(yǔ)言細(xì)節(jié)&特性是需要掌握的,然后我們只需知道在C++中大抵有哪些地方有復(fù)雜性(陷阱、缺陷),那么遇到問(wèn)題的時(shí)候自然能夠知道到哪兒去尋找答案了。具體的建議在后文。 #t#
本來(lái)這一節(jié)是打算做成一個(gè)C++復(fù)雜性索引的,然而一來(lái)C++的復(fù)雜性太多,二來(lái)網(wǎng)上其實(shí)已經(jīng)有許多資料(比如Bjarne Stroustrup本人的C++ Technical FAQ就是一個(gè)很好的文檔),加上市面上的大多數(shù)C++書里面也不停的講語(yǔ)言細(xì)節(jié);因此實(shí)際上我們不是缺乏資料,而是缺乏一種索引這些資料的辦法,以及一種掌控這些復(fù)雜性的模塊化思維方法。
由于以上原因,這里并不詳細(xì)羅列C++的復(fù)雜性,而是提供一個(gè)分類標(biāo)準(zhǔn)。 C++的復(fù)雜性有兩種分類辦法,一是分為非本質(zhì)復(fù)雜性和本質(zhì)復(fù)雜性;其中非本質(zhì)復(fù)雜性分為缺陷和陷阱兩類。另一種分類辦法是按照?qǐng)鼍胺诸悾簬?kù)開發(fā)場(chǎng)景下的復(fù)雜性和日常編碼的復(fù)雜性。從從事日常編碼的實(shí)踐者的角度來(lái)說(shuō),采用后一種分類可以讓我們迅速掌握80%場(chǎng)景下的復(fù)雜性。






