明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

我的面向?qū)ο蟪绦蛴^

[摘要]一、面向?qū)ο蟾拍畹囊恍┱`解   “面向?qū)ο蟆笔且粋(gè)如今被人叫爛的詞匯,就像去年人們都喜歡把自己的公司打上“.com”的標(biāo)記一樣。其實(shí)有多少人能真正理解這個(gè)詞匯呢,很難說。我喜歡這樣來比喻人們對(duì)“對(duì)象”一詞的濫用。“對(duì)象”就好比人們經(jīng)常說的“酷”和“爽”,很多人并不仔細(xì)考慮這兩個(gè)詞的差別,在很多情況...
 一、面向?qū)ο蟾拍畹囊恍┱`解

  “面向?qū)ο蟆笔且粋(gè)如今被人叫爛的詞匯,就像去年人們都喜歡把自己的公司打上“.com”的標(biāo)記一樣。其實(shí)有多少人能真正理解這個(gè)詞匯呢,很難說。我喜歡這樣來比喻人們對(duì)“對(duì)象”一詞的濫用!皩(duì)象”就好比人們經(jīng)常說的“酷”和“爽”,很多人并不仔細(xì)考慮這兩個(gè)詞的差別,在很多情況下他們是通用的,“酷”和“爽”通常表達(dá)“心情不錯(cuò)”的意思,你可以在你玩的高興的時(shí)候,大聲的叫嚷“太酷了,太爽了”,這個(gè)時(shí)候兩個(gè)詞匯是通用的。但是你可以說“這個(gè)人很酷啊”,但是你不能說“這個(gè)人很爽啊”。人們對(duì)“對(duì)象”這個(gè)詞匯的濫用就發(fā)生在這里,“面向?qū)ο蟆焙汀盎趯?duì)象”就好比“酷”和“爽”,這是兩個(gè)不同的概念,但是人們通常將這兩個(gè)詞匯混為一談,一律用“面向?qū)ο蟆眮肀磉_(dá)。常見的錯(cuò)誤可以在此列舉一些:

  1)有個(gè)人興高采烈的和你說“我不喜歡 flash 4 的腳本語言,flash 5 版本的 action script 采用了新的面向?qū)ο蟮摹?”語法,寫起來很舒服。我現(xiàn)在一直用 flash 5 來做東西!保ㄍ瑯拥脑捳Z也發(fā)生在 director 的 lingo 腳本語言中)

  2)visual basic 采用了面向?qū)ο蟮膶傩院头椒,比起過去的 basic 語言有了很大的提高。

  3)javascript 是面向?qū)ο蟮摹?

  等等。

  通常聽到類似的話,你都要認(rèn)真審視說話之人,分析他說的話?梢钥隙ㄒ稽c(diǎn),他并非真正懂得什么是面向?qū)ο蟮乃枷。很多人沒有區(qū)分“面向?qū)ο蟆焙汀盎趯?duì)象”兩個(gè)不同的概念。面向?qū)ο蟮娜筇攸c(diǎn)(封裝,繼承,多態(tài))卻一不可,通!盎趯(duì)象”使用對(duì)象,但是無法利用現(xiàn)有的對(duì)象模板產(chǎn)生新的對(duì)象類型,繼而產(chǎn)生新的對(duì)象,也就是說“基于對(duì)象”沒有繼承的特點(diǎn),而“多態(tài)”是表示為父類類型的子類對(duì)象實(shí)例,沒有了繼承的概念也就無從談?wù)摗岸鄳B(tài)”。現(xiàn)在的很多流行技術(shù)都是基于對(duì)象的,它們使用一些封裝好的對(duì)象,調(diào)用對(duì)象的方法,設(shè)置對(duì)象的屬性。但是它們無法讓程序員派生新對(duì)象類型。他們只能使用現(xiàn)有對(duì)象的方法和屬性。所以當(dāng)你判斷一個(gè)新的技術(shù)是否是面向?qū)ο蟮臅r(shí)候,通?梢允褂煤髢蓚(gè)特性來加以判斷。“面向?qū)ο蟆焙汀盎趯?duì)象”都實(shí)現(xiàn)了“封裝”的概念,但是面向?qū)ο髮?shí)現(xiàn)了“繼承和多態(tài)”,而“基于對(duì)象”沒有實(shí)現(xiàn)這些,的確很饒口。

  二、java 比 C++ 在貫徹面向?qū)ο蟮乃枷敕矫娓訌氐住?/strong>

  我最近上的學(xué)習(xí)班的老師對(duì)我說:“C++ 是打著面向?qū)ο蟮幕献,干著過程編程的勾當(dāng)”,這句話我非常的贊同,而且我一直以來也是這么認(rèn)為的。但是仔細(xì)聽他講解后,我才發(fā)現(xiàn),我是只是理解了這句話前兩層的意思。但是還有一層意思我沒有理解。你可能要問,“難道 C++ 不是面向?qū)ο蟮膯?”。事?shí)上 C++ 是真正的面向?qū)ο缶幊陶Z言。但是它也是過程編程語言。為什么怎么說呢, C++ 的產(chǎn)生不但考慮了面向?qū)ο蟮奶匦,而且也更多的考慮了對(duì) C 語言的向后兼容,使得 C++ 這種雜合語言表現(xiàn)出“過程”和“對(duì)象”編程的雙重性。你通常既可以繼續(xù)用 C++ 編譯器來編寫傳統(tǒng)的 C 程序,也可以使用 C ++ 的類庫或者編寫自己的類來作面向?qū)ο缶幊。這種“兩面性”使得人們可以繼續(xù)保留原有的 C 代碼,同時(shí)也阻礙了面向?qū)ο笏枷氲耐茝V。

  舉個(gè)簡(jiǎn)單的例子,94 年的時(shí)候,我開始學(xué)習(xí) C++ ,當(dāng)時(shí)是學(xué)習(xí) turbo C++ 自己帶的一個(gè)叫作 turbo vision 的類庫來做項(xiàng)目。我的同學(xué)也用 turbo C++ ,但是他一點(diǎn)也沒有學(xué)習(xí)過 C++ 這個(gè)語言,他只是用 turbo c++ 編譯器來重新編譯他以前用 turbo c 寫的程序,然后他自豪的對(duì)我說:“瞧,我用 c++ 做的東西”,好像意思是說“我用 c++ 開發(fā)項(xiàng)目了”,在那個(gè) c 比 pascal 高檔, pascal 比 foxbase 高檔的年代里, C++ 的標(biāo)簽絕對(duì)是個(gè)很"酷"的標(biāo)志。我其實(shí)很清楚他的行為。這就是“C++ 是打著面向?qū)ο蟮幕献樱芍^程編程的勾當(dāng)”的第一重意思,也就是說, C++ 編譯器對(duì) C 程序的兼容性造成了最底層的“過程勾當(dāng)”。在國(guó)內(nèi)有很長(zhǎng)一段時(shí)間,人們都是在用 C++ 編譯器做 C 編程。 我當(dāng)時(shí)在想,比起我那個(gè)同學(xué),我才是真正懂得面向?qū)ο蟮娜恕?我學(xué)習(xí)了 C++ 語言,我懂得封裝,繼承和多態(tài),我學(xué)習(xí)了 turbo vision 的類庫,我派生了 turbo vision 的類庫并編寫了自己的類,所以我是懂得面向?qū)ο蟮摹哪撤N意義上說,我這么想是對(duì)的。但是從面向?qū)ο蟪绦騿T的分類來說,我又不完全懂得面向?qū)ο蟮乃枷。從事面向(qū)ο缶幊痰娜税凑辗止碚f,可以分為“類庫的創(chuàng)建者”和“類庫的使用者”,通常創(chuàng)建類庫的人才是真正懂得面向?qū)ο笏枷氲娜,他們?chuàng)建類庫供給那些“客戶程序員”來使用,他們從頭開始制作類庫,他們進(jìn)行面向?qū)ο蟮姆治,設(shè)計(jì),實(shí)現(xiàn)的全過程。當(dāng)學(xué)習(xí)完 C++ 后,我的第一個(gè)感覺是,從頭創(chuàng)建一個(gè)類庫真是很麻煩的事情,通常用 C 過程編程很容易實(shí)現(xiàn)的功能,你必須按照類的思想來從新建立對(duì)象,但是一旦類庫建立好后,使用類庫和派生類,以及維護(hù)代碼都是非常舒服的事情。使用類庫的人并不都是具備了面向?qū)ο笏枷氲娜,通常知道如何繼承和派生新對(duì)象就可以使用類庫了,然而我們的思維并沒有真正的轉(zhuǎn)過來,使用類庫只是在形式上是面向?qū)ο,而?shí)質(zhì)上只是庫函數(shù)的一種擴(kuò)展。這就是我理解的“C++ 是打著面向?qū)ο蟮幕献樱芍^程編程的勾當(dāng)”的第二重意思,實(shí)際上用 C++ 編程的人,大部分不自己創(chuàng)建類,而是使用類庫,這樣就造成了他們把類庫作為一種高級(jí)的庫函數(shù)庫來理解,并沒有真正理解面向?qū)ο蟮乃枷搿?

  C++ 的面向?qū)ο蟮乃枷胪茝V很慢,直到 MFC ,OWL ,VCL 這樣的類庫出來以后,人們才漸漸的接受了一些面向?qū)ο蟮乃枷。為什么這條面向?qū)ο蟮牡缆纺敲措y走?我的答案是“因?yàn)?C++ 給了我們第二條道路去走過程編程”,當(dāng)然原因是為了考慮兼容 C 語言,然而正是由于有了第二條老路才使得使得我們不會(huì)再去考慮新的面向?qū)ο缶幊趟季S方式。

  直到出現(xiàn)了 Java ,才真正迎來了面向?qū)ο蟮氖锕。Java 真正是革命性的東西嗎?不是,所有現(xiàn)有的 java 的思想都是繼承自其他的語言和技術(shù),沒有什么革命的地方,虛擬機(jī)的概念早在 20 年前的 UCSD pascal 中就采用了,只是當(dāng)時(shí)的機(jī)器速度太慢,虛擬機(jī)仿真造成的性能降低對(duì)于當(dāng)時(shí)的硬件來說是相當(dāng)嚴(yán)重的。java 本身的很多東西也借鑒了 C++ 語言,連它的創(chuàng)始人也說,java 是 "C++--" 也就是說 java 去除了 C++ 的一些不太好的地方。所以說 Java 本質(zhì)上沒有什么革命的東西,所以那些對(duì) Java 的贊美之詞都是 Sun 公司的宣傳伎倆。沒有一種語言會(huì)長(zhǎng)久的存在下去,你很難說你的孩子在二十年后還會(huì)繼續(xù)使用 C++ 或 java,所以我們要拋開這些浮華詞匯的背后,找尋真正我們需要學(xué)習(xí)的東西。否則今天我們大家都是微軟的傀儡,明天 Sun 公司起來了,我們就都是 Sun 的傀儡。仔細(xì)研究美國(guó)電腦技術(shù)發(fā)展的歷史,美國(guó)人一向喜歡象第三世界兜售他們的過時(shí)技術(shù),而他們始終可以自豪的說,我們將永遠(yuǎn)領(lǐng)先你們第三世界國(guó)家二十年。我們始終在跟在美國(guó)人的后面學(xué)習(xí)他們的東西,這的確讓人擔(dān)憂。我說著說著又跑題了。Java 雖然沒有什么真正的革命性的東西,但是 Java 在真正推動(dòng)面向?qū)ο缶幊趟枷敕矫媸枪Σ豢赡┑。使?Java 編程,你無需考慮到向后兼容什么語言的問題,它是重新建立的語言,你在掌握這門語言之前,你必須將自己的編程思想由過程編程徹底轉(zhuǎn)向面向?qū)ο缶幊蹋驗(yàn)?每個(gè) Java 程序,本身就是一個(gè)類,你編寫任何 java 程序,你都不自覺的在構(gòu)造一個(gè)對(duì)象模板,沒有第二條道路,只能是面向?qū)ο缶幊獭#?我非常喜歡 java 將所有類定義和類聲明放在一個(gè)文件中,而不是象 C++ 那樣,cpp 和 .h 文件是分開的。通常剛剛開始學(xué)習(xí) java 的人不習(xí)慣,不過學(xué)習(xí)一段時(shí)間,你就會(huì)體會(huì)到它的好處了。), 使用 java 編寫程序(我更喜歡說---編寫類,而不是程序)的時(shí)候,你會(huì)必須從一個(gè)對(duì)象的角度來考慮問題,因?yàn)槟愕某绦蚓褪且粋(gè)類,你必須考慮把哪些東西作為成員變量,哪些作為方法,要生成幾個(gè)類,哪些變量是成員變量,哪些是靜態(tài)的變量和方法,等等。通常做完一個(gè)項(xiàng)目,你就已經(jīng)將面向?qū)ο蟮乃枷脒\(yùn)用其中了。之所以說 Java 在面向?qū)ο蟮呢瀼胤矫嬉?C++ 徹底,就是因?yàn)槟阒荒苁褂妹嫦驅(qū)ο蟮姆绞絹砭帉?java 程序,而 C++ 卻可以采用另外一條非面向?qū)ο蟮姆绞絹砭帉懗绦。Java 并沒有什么真正革命性的東西,它最大的貢獻(xiàn)當(dāng)然是推廣面向?qū)ο蟮乃枷肓恕?

  Java 總的來說是降低了繼續(xù)過程編程的可能性,但是并沒有完全消除它。面向?qū)ο笫且环N思想,是我們考慮事情的方法,通常表現(xiàn)為為我們是將問題的解決按照過程方式來解決呢,還是將問題抽象為一個(gè)對(duì)象來解決它。很多情況下,我們會(huì)不知不覺的按照過程方式來解決它,因?yàn)槲覀兺ǔA?xí)慣于考慮解決問題的方法,而不是考慮將要解決問題抽象為對(duì)象去解決它。很多新的技術(shù)使我們更加趨向于過程而非對(duì)象的思想。最明顯的就是 RAD (快速應(yīng)用程序開發(fā))可視技術(shù)的出現(xiàn),人們可以通過設(shè)置屬性和編寫事件函數(shù)來快速開發(fā)應(yīng)用程序,編寫事件函數(shù)就是典型的按照過程編程的思想(至少我是這么認(rèn)為的),試問有多少人能區(qū)分VB 和 delphi ,c++ builder ,java 的事件函數(shù)編寫有什么本質(zhì)的區(qū)別, 后三者都采用了 Delegation (委托模型),在 java 中是通過 anonymous 類(無名類),或者 Adapter 類來實(shí)現(xiàn)Delegation,這是一種面向?qū)ο蟮臉?gòu)想,但是 VB 不是,所以這底層的區(qū)別都被上層的相似性所抹殺了,使用 jbuilder 編程的時(shí)候,我們?nèi)绻麤]有仔細(xì)研究 java 的 awt.event 編程方式的話,通常也是把它當(dāng)作普普通通的“類 VB"的編寫方式來寫程序,而實(shí)際分析它在后臺(tái)所生成的代碼,你才能明白這些代碼是真正的面向?qū)ο蟮,但是如果你只是?jiǎn)單的把它當(dāng)作可視編程工具,你是永遠(yuǎn)不會(huì)明白什么是”委托模型“,什么是面向?qū)ο缶幊痰。這是我理解的 “C++ 是打著面向?qū)ο蟮幕献,干著過程編程的勾當(dāng)”第三重意思。無論是 C++ 還是 java 都有可能走過程編程的老路, java 降低的過程編寫的可能性,但是如果你沒有具備面向?qū)ο蟮木幊趟枷,你還是可能走面向過程的老路的。