(原創) 回讀者的信,一篇學習C#/C++/OO的FAQ (OO) (Design Pattern) (C/C++) (.NET) (C#)
Abstract
因為我覺得這是很多人都會有的疑問,所以我將回復的內容公開出來和大家分享。
讀者Email內容
在拜讀了您在"博客園"的一些文章之後,有個問題想請教您,希望不會打擾到您。
從文章中得知您是從C#轉C++的,但是現在C#不是當紅炸子雞嗎? 怎麼會想轉學C++呢? 學習C#是不是要打好C++的基礎呢?
蠻多文章對我而言有點深度,看來我要再加把勁才行了。
我的回信
你好
>>從文章中得知您是從C#轉C++的,但是現在C#不是當紅炸子雞嗎? 怎麼會想轉學C++呢?
C#和C++專屬不同的領域 井水不犯河水
如網頁、商用軟件、資料庫這些,本來就該用C#寫,也不該用C++寫。
但是OS、Driver、嵌入式系統、Game、3D、影像處理這些領域C#也無法搶,因為C#的無法寫底層的OS、Driver、嵌入式系統,速度也無法達到Game、3D的需求。
舉個例子來說,你看過Microsoft哪個軟體用C#寫嗎? XP、Vista、Office、SQL Server,就連C# compiler也是C++寫出來的,這也是微軟被很多人批評的一個地方,大力鼓吹C#,自己卻從來沒有軟體用C#,除了微軟的網站用ASP.NET且用C#寫外。
所以其實我C#和C++都很喜歡,若以語法來說,C#乾淨很多,也穩定許多,大部分程式,若和速度牽涉不大,且記憶體可以接受,我會用C#寫,但若對速度非常要求,如3D、影像處理,這些我就會用C++寫,畢竟這些演算法都要跑很久,很需要速度,而且C++又可內嵌組合語言,對於一些速度更需求的,可以用組合語言去改善速度。
以上是以實用的角度去看C#和C++。
其實C++讓我著迷的,是STL和泛型。
C# 1.0並沒有泛型,C# 2.0有了泛型了,但相關討論、書籍都很少,我學了C++之後,原本以為OO已經是抽象化的極致了,但泛型讓我眼界全開,發現除了OO外,還有另外一種思維模式,剛好解決了OO的一些問題。
OO有什麼問題呢?
1.記憶體需求大,因為OO的多型須靠vtable去紀錄virtual function
2.速度慢,因為OO要靠vptr來執行virtual function
導致OO在寫library/framework時,記憶體和速度成了一大瓶頸,或許你會說現在CPU這麼快,速度這麼重要嗎?但事實上在不少領域,CPU是很慢的,如嵌入式很多只有8 bit/ 16 bit,如影像、3D領域,目前的CPU還是不夠用,舉個例子來說,現在有影像規格有FullHD,但不久的規格會比1920 * 1080更高,顯示頻率還要 120MHz以上,這種規格,目前pentium CPU沒有一顆做得到,所以當然軟體就必須能省CPU則省,盡可能達到規格要求,所以速度一直是C和C++這種語言的重要堅持!!,以C++的標準程式庫STL來說,若用OO寫當然可以,但速度和記憶體花費一定相當可觀,泛型是compile-time技術,剛好解決記憶體和速度的問題,當然缺點就是無法如OO那樣動態改變,所以在寫library/framework下,泛型成了一個很好的選擇,C#和Java雖然也提供了泛型,但C#的泛型還很弱,且ms似乎沒打算讓C#泛型更強了,C# 3已經沒看到泛型有重大改變,Java的泛型又比C#更弱,總而言之,C#和Java是想將泛型用在 容器 這個問題,而不像C++是用在compile-time來增進速度,改善OO的問題。
所以C++讓我有興趣的是『泛型』,一種有別於function (C語言)和OO(C#、Java)的思維方式,事實上,這幾年C++重點也都是放在泛型了,將來C++ 0x的新規格,也都是放在泛型的加強上。
泛型也成為C++和C#、Java的重要分水嶺,若你醉心於泛型,C++是唯一的選擇,不只C++在泛型支援完整,且相關的資料、書籍都多,聖經也已經出現,不像C#、Java的泛型書籍都還在幼稚園。
>>學習C#是不是要打好C++的基礎呢?
很多人說,要先學什麼語言,再學什麼語言...
我的想法剛好相反!!
我覺得一張白紙最好!!
因為一個語言熟悉了之後,就會用那種語言的思維去學其他語言,就如同鳩摩智用小無相功耍少林72絕技一樣。
很多C高手寫的C++,根本沒有C++的精神,只是用了C++ compiler而已。
很多C++高手寫的C#,其實也只是keyword從C++改成C#。
所以我覺得,若要學C#,最好沒不會C,也不會C++,就好好的用OO的方式將C#學好就好。
若已經會C++的學C#,也千萬不要像我早期一樣,總喜歡將C++ code 一行一行翻譯成C#,其實這樣沒有意義,若要從C++帶進C#的,只有那些Design Patttern而已,其他的C++ idiom千萬別帶進C#。
> 蠻多文章對我而言有點深度,看來我要再加把勁才行了。
不知道是哪方面你覺得有深度,是Design Pattern和泛型那部分嗎?
那部份的確比較玄,屬於內功部分,一旦打通任督二脈,學什麼語言都很快,就如同一般人練乾坤大挪移要六十年,但任督二脈高手鍊只要幾個時辰即可,我一直覺得,重要的是內功,這種可以用很久,而不是一直練外功,從DOS -> Windows -> ASP.NET -> AJAX -> Silverlight ->....?,學來學去一直都在學GUI,只要MS打一個噴嚏從VB或MFC改成.NET,大家就得哀嚎重學,從.NET 1.x -> .NET 2.0 -> .NET 3.x,又得跟著MS屁股走,如OO / Design Pattern這種內功,無問MS怎麼改,都還可繼續用,投資報酬率最高。
很多人學語言,將每個keyword用法學會了,就說會了這個語言,我曾經問了一個會C#的朋友,我問他
請問interface該用在哪些地方?
請問virtual該用在哪些地方?
他知知嗚嗚的說不上來,其實interface和virtual正是OO的精華,也是C#的精華,這兩個沒學好,C#就等於沒學好。
要如何用好interface和virtual呢?其實就是學Design Pattern,他已經將OO的精華歸納成招式,基本上若能套著招式打,就可以打出很漂亮的OO了,至於泛型,我也還在摸索,是有Generic Pattern沒錯,但我現在也只對Policy Based Design這一招比較有感覺,其他的我也還不敢說,我會陸陸續續的將Design Pattern和Generic Pattern寫上Blog,但多久能寫完我也不知道,就看我有多少空閒時間了,呵呵。
總之,若你想學好C#,想提升C#功力,就得提升OO功力,要提升OO功力,就是用好Design Pattern。
若有問題歡迎隨時email或msn跟我聯絡。