熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

我的面向對象程序觀

2013-11-23 18:44:47  來源: Java核心技術 

  我的面向對象程序觀
  
  )面向對象概念的一些誤解
  
  面向對象是一個如今被人叫爛的詞匯就像去年人們都喜歡把自己的公司打上的標記一樣其實有多少人能真正理解這個詞匯呢很難說我喜歡這樣來比喻人們對對象一詞的濫用對象就好比人們經常說的很多人並不仔細考慮這兩個詞的差別在很多情況下他們是通用的通常表達心情不錯的意思你可以在你玩的高興的時候大聲的叫嚷太酷了太爽了這個時候兩個詞匯是通用的但是你可以說這個人很酷啊但是你不能說這個人很爽啊人們對對象這個詞匯的濫用就發生在這裡面向對象基於對象就好比這是兩個不同的概念但是人們通常將這兩個詞匯混為一談一律用面向對象來表達常見的錯誤可以在此列舉一些
  
  )有個人興高采烈的和你說我不喜歡 flash 的腳本語言flash 版本的 action script 采用了新的面向對象的語法寫起來很舒服我現在一直用 flash 來做東西(同樣的話語也發生在 director 的 lingo 腳本語言中)
  
  )visual basic 采用了面向對象的屬性和方法比起過去的 basic 語言有了很大的提高
  
  )javascript 是面向對象的
  
  等等
  
  通常聽到類似的話你都要認真審視說話之人分析他說的話可以肯定一點他並非真正懂得什麼是面向對象的思想很多人沒有區分面向對象基於對象兩個不同的概念面向對象的三大特點(封裝繼承多態)卻一不可通常基於對象使用對象但是無法利用現有的對象模板產生新的對象類型繼而產生新的對象也就是說基於對象沒有繼承的特點多態是表示為父類類型的子類對象實例沒有了繼承的概念也就無從談論多態現在的很多流行技術都是基於對象的它們使用一些封裝好的對象調用對象的方法設置對象的屬性但是它們無法讓程序員派生新對象類型他們只能使用現有對象的方法和屬性所以當你判斷一個新的技術是否是面向對象的時候通常可以使用後兩個特性來加以判斷面向對象基於對象都實現了封裝的概念但是面向對象實現了繼承和多態基於對象沒有實現這些的確很饒口
  
  )java 比 C++ 在貫徹面向對象的思想方面更加徹底
  我最近上的學習班的老師對我說C++ 是打著面向對象的幌子干著過程編程的勾當這句話我非常的贊同而且我一直以來也是這麼認為的但是仔細聽他講解後我才發現我是只是理解了這句話前兩層的意思但是還有一層意思我沒有理解你可能要問難道 C++ 不是面向對象的嗎?事實上 C++ 是真正的面向對象編程語言但是它也是過程編程語言為什麼怎麼說呢 C++ 的產生不但考慮了面向對象的特性而且也更多的考慮了對 C 語言的向後兼容使得 C++ 這種雜合語言表現出過程對象編程的雙重性你通常既可以繼續用 C++ 編譯器來編寫傳統的 C 程序也可以使用 C ++ 的類庫或者編寫自己的類來作面向對象編程這種兩面性使得人們可以繼續保留原有的 C 代碼同時也阻礙了面向對象思想的推廣
  
  舉個簡單的例子 年的時候我開始學習 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 的思想都是繼承自其他的語言和技術沒有什麼革命的地方虛擬機的概念早在 年前的 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 的 awtevent 編程方式的話通常也是把它當作普普通通的類 VB的編寫方式來寫程序而實際分析它在後台所生成的代碼你才能明白這些代碼是真正的面向對象的但是如果你只是簡單的把它當作可視編程工具你是永遠不會明白什麼是委托模型什麼是面向對象編程的這是我理解的 C++ 是打著面向對象的幌子干著過程編程的勾當第三重
From:http://tw.wingwit.com/Article/program/Java/hx/201311/25656.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.