我的物件導向程式觀

來源:互聯網
上載者:User

在尋找”基於對象“和”物件導向“時,發現了這篇文章,感覺寫得挺好的,不過不知道出自哪裡了。

一、物件導向概念的一些誤解

"面向對 象"是一個如今被人叫爛的詞彙,就像去年人們都喜歡把自己的公司打上".com"的標記一樣。其實有多少人能真正理解這個詞彙呢,很難說。我喜歡這樣來比 喻人們對"對象"一詞的濫用。"對象"就好比人們經常說的"酷"和"爽",很多人並不仔細考慮這兩個詞的差別,在很多情況下他們是通用的,"酷"和"爽" 通常表達"心情不錯"的意思,你可以在你玩的高興的時候,大聲的叫嚷"太酷了,太爽了",這個時候兩個詞彙是通用的。但是你可以說"這個人很酷啊",但是 你不能說"這個人很爽啊"。人們對"對象"這個詞彙的濫用就發生在這裡,"物件導向"和"基於對象"就好比"酷"和"爽",這是兩個不同的概念,但是人們通常將這兩個詞彙混為一談,一律用"物件導向"來表達。常見的錯誤可以在此列舉一些:
1)有個人興高采烈的和你說"我不喜歡 flash 4 的指令碼語言,flash 5 版本的 action script 採用了新的物件導向的"."文法,寫起來很舒服。我現在一直用 flash 5 來做東西。"(同樣的話語也發生在 director 的 lingo 指令碼語言中)
2)visual basic 採用了物件導向的屬性和方法,比起過去的 basic 語言有了很大的提高。
3)javascript 是物件導向的。
等等。
通常聽到類似的話,你都要認真審視說話之人,分析他說的話。可以肯定一點,他並非真正懂得什麼是物件導向的思想。很多人沒有區分"物件導向"和"基於對象"兩個不同的概念。物件導向的三大特點(封裝,繼承,多態)卻一不可,通常"基於對象"使用對象,但是無法利用現有的對象模板產生新的物件類型,繼而產生新的對象,也就是說"基於對象"沒有繼承的特點,而"多態"是表示為父類類型的子類對象執行個體,沒有了繼承的概念也就無從談論"多態"。現在的很多流行技術都是基於對象的,它們使用一些封裝好的對象,調用對象的方法,設定對象的屬性。但是它們無法讓程式員派生新物件類型。他們只能使用現有對象的方法和屬性。所以當你判斷一個新的技術是否是物件導向的時候,通常可以使用後兩個特性來加以判斷。"物件導向"和"基於對象"都實現了"封裝"的概念,但是物件導向實現了"繼承和多態",而"基於對象"沒有實現這些,的確很饒口。
二、java 比 C++ 在貫徹物件導向的思想方面更加徹底。
我最近上的學習班的老師對我說:"C++ 是打著物件導向的幌子,乾著過程編程的勾當",這句話我非常的贊同,而且我一直以來也是這麼認為的。但是仔細聽他講解後,我才發現,我是只是理解了這句話前兩層的意思。但是還有一層意思我沒有理解。你可能要問,"難道 C++ 不是物件導向的嗎?"。事實上 C++ 是真正的物件導向程式設計語言。但是它也是過程程式設計語言。為什麼怎麼說呢, C++ 的產生不但考慮了物件導向的特性,而且也更多的考慮了對 C 語言的向後相容,使得 C++ 這種雜合語言表現出"過程"和"對象"編程的雙重性。你通常既可以繼續用 C++ 編譯器來編寫傳統的 C 程式,也可以使用 C ++ 的類庫或者編寫自己的類來作物件導向編程。這種"兩面性"使得人們可以繼續保留原有的 C 代碼,同時也阻礙了物件導向思想的推廣。
舉個簡單的例子,94 年的時候,我開始學習 C++ ,當時是學習 turbo C++ 自己帶的一個叫作 turbo vision 的類庫來做項目。我的同學也用 turbo C++ ,但是他一點也沒有學習過 C++ 這個語言,他只是用 turbo c++ 編譯器來重新編譯他以前用 turbo c 寫的程式,然後他自豪的對我說:"瞧,我用 c++ 做的東西",好像意思是說"我用 c++ 開發項目了",在那個 c 比 pascal 高檔, pascal 比 foxbase 高檔的年代裡, C++ 的標籤絕對是個很"酷"的標誌。我其實很清楚他的行為。這就是"C++ 是打著物件導向的幌子,乾著過程編程的勾當"的第一重意思,也就是說, C++ 編譯器對 C 程式的相容性造成了最底層的"過程勾當"。在國內有很長一段時間,人們都是在用 C++ 編譯器做 C 編程。 我當時在想,比起我那個同學,我才是真正懂得物件導向的人。 我學習了 C++ 語言,我懂得封裝,繼承和多態,我學習了 turbo vision 的類庫,我派生了 turbo vision 的類庫並編寫了自己的類,所以我是懂得物件導向的。從某種意義上說,我這麼想是對的。但是從物件導向程式員的分類來說,我又不完全懂得物件導向的思想。從事物件導向編程的人按照分工來說,可以分為"類庫的建立者"和"類庫的使用者",通常建立類庫的人才是真正懂得物件導向思想的人,他們建立類庫供給那些"客戶程式員"來使用,他們從頭開始製作類庫,他們進行面向對 象的分析,設計,實現的全過程。當學習完 C++ 後,我的第一個感覺是,從頭建立一個類庫真是很麻煩的事情,通常用 C 過程編程很容易實現的功能,你必須按照類的思想來從建立立對象,但是一旦類庫建立好後,使用類庫和衍生類別,以及維護代碼都是非常舒服的事情。使用類庫的人 並不都是具備了物件導向思想的人,通常知道如何繼承和派生新對象就可以使用類庫了,然而我們的思維並沒有真正的轉過來,使用類庫只是在形式上是物件導向,而實質上只是庫函數的一種擴充。這就是我理解的"C++ 是打著物件導向的幌子,乾著過程編程的勾當"的第二重意思,實際上用 C++ 編程的人,大部分不自己建立類,而是使用類庫,這樣就造成了他們把類庫作為一種進階的庫函數庫來理解,並沒有真正理解物件導向的思想。
C++ 的物件導向的思想推廣很慢,直到 MFC ,OWL ,VCL 這樣的類庫出來以後,人們才漸漸的接受了一些物件導向的思想。為什麼這條物件導向的道路那麼難走?我的答案是"因為 C++ 給了我們第二條道路去走過程編程",當然原因是為了考慮相容 C 語言,然而正是由於有了第二條老路才使得使得我們不會再去考慮新的物件導向編程思維方式。
直到出現了 Java ,才真正迎來了面向對 象的曙光。Java 真正是革命性的東西嗎?不是,所有現有的 java 的思想都是繼承自其他的語言和技術,沒有什麼革命的地方,虛擬機器的概念早在 20 年前的 UCSD pascal 中就採用了,只是當時的機器速度太慢,虛擬機器模擬造成的效能降低對於當時的硬體來說是相當嚴重的。java 本身的很多東西也借鑒了 C++ 語言,連它的創始人也說,java 是 "C++--" 也就是說 java 去除了 C++ 的一些不太好的地方。所以說 Java 本質上沒有什麼革命的東西,所以那些對 Java 的讚美之詞都是 Sun 公司的宣傳伎倆。沒有一種語言會長久的存在下去,你很難說你的孩子在二十年後還會繼續使用 C++ 或 java,所以我們要拋開這些浮華詞彙的背後,找尋真正我們需要學習的東西。否則今天我們大家都是微軟的傀儡,明天 Sun 公司起來了,我們就都是 Sun 的傀儡。仔細研究美國電腦技術發展的曆史,美國人一向喜歡象第三世界兜售他們的過時技術,而他們始終可以自豪的說,我們將永遠領先你們第三世界國家二十 年。我們始終在跟在美國人的後面學習他們的東西,這的確讓人擔憂。我說著說著又跑題了。Java 雖然沒有什麼真正的革命性的東西,但是 Java 在真正推動物件導向編程思想方面是功不可末的。使用 Java 編程,你無需考慮到向後相容什麼語言的問題,它是重建立立的語言,你在掌握這門語言之前,你必須將自己的編程思想由過程編程徹底轉向物件導向編程,因為 每個 Java 程式,本身就是一個類,你編寫任何 java 程式,你都不自覺的在構造一個對象模板,沒有第二條道路,只能是面向對 象編程。( 我非常喜歡 java 將所有類定義和類聲明放在一個檔案中,而不是象 C++ 那樣,cpp 和 .h 檔案是分開的。通常剛剛開始學習 java 的人不習慣,不過學習一段時間,你就會體會到它的好處了。), 使用 java 編寫程式(我更喜歡說---編寫類,而不是程式)的時候,你會必須從一個對象的角度來考慮問題,因為你的程式就是一個類,你必須考慮把哪些東西作為成員變 量,哪些作為方法,要產生幾個類,哪些變數是成員變數,哪些是靜態變數和方法,等等。通常做完一個項目,你就已經將物件導向的思想運用其中了。之所以說 Java 在物件導向的貫徹方面要比 C++ 徹底,就是因為你只能使用物件導向的方式來編寫 java 程式,而 C++ 卻可以採用另外一條非物件導向的方式來編寫程式。Java 並沒有什麼真正革命性的東西,它最大的貢獻當然是推廣物件導向的思想了。
Java 總的來說是降低了繼續過程編程的可能性,但是並沒有完全消除它。面向對 象是一種思想,是我們考慮事情的方法,通常表現為為我們是將問題的解決按照過程方式來解決呢,還是將問題抽象為一個對象來解決它。很多情況下,我們會不知 不覺的按照過程方式來解決它,因為我們通常習慣於考慮解決問題的方法,而不是考慮將要解決問題抽象為對象去解決它。很多新的技術使我們更加趨向於過程而非 對象的思想。最明顯的就是 RAD (快速應用程式開發)可視技術的出現,人們可以通過設定屬性和編寫事件函數來快速開發應用程式,編寫事件函數就是典型的按照過程編程的思想(至少我是這麼 認為的),試問有多少人能區分VB 和 delphi ,c++ builder ,java 的事件函數編寫有什麼本質的區別, 後三者都採用了 Delegation (委託模型),在 java 中是通過 anonymous 類(無名類),或者 Adapter 類來實現Delegation,這是一種面向對 象的構想,但是 VB 不是,所以這底層的區別都被上層的相似性所抹殺了,使用 jbuilder 編程的時候,我們如果沒有仔細研究 java 的 awt.event 編程方式的話,通常也是把它當作普普通通的"類 VB"的編寫方式來寫程式,而實際分析它在後台所產生的程式碼,你才能明白這些代碼是真正的物件導向的,但是如果你只是簡單的把它當作可視編程工具,你是永遠不會明白什麼是"委託模型",什麼是物件導向編程的。這是我理解的 "C++ 是打著物件導向的幌子,乾著過程編程的勾當"第三重意思。無論是 C++ 還是 java 都有可能走過程編程的老路, java 降低的過程編寫的可能性,但是如果你沒有具備物件導向的編程思想,你還是可能走面向過程的老路的。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.