闡述復(fù)雜的C++編程語(yǔ)言技巧說(shuō)明
本文詳細(xì)介紹說(shuō)明C++編程語(yǔ)言中的多種范式并行,是一些最復(fù)雜問(wèn)題的表面原因。以至于Doug Lea建議在一個(gè)項(xiàng)目里只堅(jiān)持一個(gè)范式。但是這仍然只是表象。歸根結(jié)底還是因?yàn)镺O的缺陷,使得與其它范式合作時(shí)困難成倍放大。
1. 首先選定一種思維方式(即范式),盡可能只用這一種思維方式解決問(wèn)題;
2. 如果在局部遇到其他思維方式更得力的問(wèn)題,則經(jīng)慎重考慮后,可以將另一種風(fēng)格包裝在局部,解決局部問(wèn)題。但整個(gè)系統(tǒng)在某一層次之上看來(lái),應(yīng)當(dāng)是統(tǒng)一一致的。一般C++的開(kāi)發(fā),應(yīng)以O(shè)B為基本風(fēng)格。除非有類似MFC那樣龐大而成熟的OO庫(kù)支持,不應(yīng)貿(mào)然在整體上使用OO風(fēng)格。
3. 多種風(fēng)格混用,除非有已被充分討論并驗(yàn)證的方案(即成熟模式),可提供單一風(fēng)格不能提供的較大優(yōu)勢(shì),否則應(yīng)極力避免。當(dāng)然鼓勵(lì)在研究中探索,但實(shí)踐是另一回事。C++完全可以在90年左右擺脫C的約束,隨后簡(jiǎn)化模板語(yǔ)法,完善異常模型,接納可選GC,建立完整的單根類庫(kù),付出性能小幅度下降的代價(jià)之后,實(shí)現(xiàn)語(yǔ)言整體升級(jí)。
但是C++選擇了另一條路,三大約束堅(jiān)持到底,堅(jiān)守系統(tǒng)層面,以替代C為己任。是福是禍,實(shí)難判別。如果90年代初選擇升級(jí),勝則扼死Java于搖籃之中,敗則寸土不保。不過(guò)以C++之高性能,勝面應(yīng)稍大。如今看來(lái),在系統(tǒng)面徹底取代C已無(wú)可能。#T#
1994年為STL拖延標(biāo)準(zhǔn)立案時(shí)間長(zhǎng)達(dá)四年,如今來(lái)看功過(guò)亦存爭(zhēng)議。錯(cuò)過(guò)黃金時(shí)機(jī)不說(shuō),STL典范一立,庫(kù)設(shè)計(jì)風(fēng)氣為之一改。然而在解決應(yīng)用問(wèn)題上,泛型較之OO,適應(yīng)能力遠(yuǎn)遜之,且應(yīng)用困難??傊?FONT>C++的三大約束,既是其興起之要素,也是其衰落之源頭,同時(shí),又是其今天得以屹立不倒的重要基石。其是非功過(guò),實(shí)難一言以蔽之。
C++編程語(yǔ)言之對(duì)于C++的意義,其實(shí)并不在于使C++重新獲得了制勝Java或者C#的機(jī)會(huì),而在于鞏固了C++作為.NET平臺(tái)上系統(tǒng)語(yǔ)言的地位。由此知,C++/CLI的發(fā)展,的確如Stan Lippman所說(shuō),是C++一貫發(fā)展思路的延續(xù)。三大約束固然已經(jīng)放棄,但其精神實(shí)質(zhì)仍在,形攻而實(shí)守,未來(lái)將可作為.NET上唯一最強(qiáng)之系統(tǒng)語(yǔ)言而長(zhǎng)命百歲。
C++/CLI決不簡(jiǎn)單,但在大多數(shù)時(shí)候,它能夠比傳統(tǒng)的C++表現(xiàn)的簡(jiǎn)單些。這就是Andrew Koenig說(shuō)的,通過(guò)復(fù)雜實(shí)現(xiàn)簡(jiǎn)單。
C#和Java的繁榮期,則有賴于人們對(duì)于大一統(tǒng)的中層次語(yǔ)言的信仰有多堅(jiān)持。此兩種語(yǔ)言無(wú)論在系統(tǒng)開(kāi)發(fā)還是在應(yīng)用開(kāi)發(fā)中都非最優(yōu)選。目前C#出現(xiàn)一些跡象,引入一些動(dòng)態(tài)語(yǔ)言特性如cmdlet,又強(qiáng)化系統(tǒng)編程能力,想上下通吃。這是一條不歸路,必會(huì)使C#變得更加復(fù)雜怪異。
學(xué)習(xí)編程語(yǔ)言,通語(yǔ)法能實(shí)踐,不過(guò)十分之一。真正重要的是掌握其多種多樣的實(shí)用的idioms或模式。這些模式才是體現(xiàn)了語(yǔ)言精神的東西。未掌握各種語(yǔ)言中的主要應(yīng)用模式,則應(yīng)羞于用“會(huì)”字。常聽(tīng)有人說(shuō)某某語(yǔ)言一周乃至一兩天即可掌握,這個(gè)掌握的層次肯定是很低的。
真正要“掌握”語(yǔ)言,則我等凡人,諸事纏身,非得集中精力學(xué)習(xí)實(shí)踐一兩年,將該語(yǔ)言所擅長(zhǎng)領(lǐng)域的應(yīng)用問(wèn)題熟悉過(guò)一遍,才有可能。若論精通,則十年也不容易。Henry Spencer用了30年C++編程語(yǔ)言,仍樂(lè)此不疲;Pragmatic Programmer中評(píng)價(jià)Ruby說(shuō)。
學(xué)上四個(gè)小時(shí)就可以用它解決實(shí)際問(wèn)題,但是10年之后還為它層出不窮的新意感到驚訝。偶見(jiàn)有人舉出自己“精通和掌握”的工具和語(yǔ)言,動(dòng)輒長(zhǎng)達(dá)八九上十種,實(shí)為笑柄。真正掌握一種,已經(jīng)是難能可貴。
熟練掌握兩種層次不同,思維不同的語(yǔ)言,應(yīng)是有抱負(fù)的程序員的自我要求。何況如今之軟件開(kāi)發(fā)涉獵甚廣,僅通編程層次還顯不夠。不過(guò)總之百招會(huì)不如一招精,做什么工作都要有自己的過(guò)人之處。

2011-07-13 16:36:11

















