我的面向對象程序觀
)面向對象概念的一些誤解
面向對象
是一個如今被人叫爛的詞匯
就像去年人們都喜歡把自己的公司打上
的標記一樣
其實有多少人能真正理解這個詞匯呢
很難說
我喜歡這樣來比喻人們對
對象
一詞的濫用
對象
就好比人們經常說的
酷
和
爽
很多人並不仔細考慮這兩個詞的差別
在很多情況下他們是通用的
酷
和
爽
通常表達
心情不錯
的意思
你可以在你玩的高興的時候
大聲的叫嚷
太酷了
太爽了
這個時候兩個詞匯是通用的
但是你可以說
這個人很酷啊
但是你不能說
這個人很爽啊
人們對
對象
這個詞匯的濫用就發生在這裡
面向對象
和
基於對象
就好比
酷
和
爽
這是兩個不同的概念
但是人們通常將這兩個詞匯混為一談
一律用
面向對象
來表達
常見的錯誤可以在此列舉一些
)有個人興高采烈的和你說
我不喜歡 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 的 awt
event 編程方式的話
通常也是把它當作普普通通的
類 VB
的編寫方式來寫程序
而實際分析它在後台所生成的代碼
你才能明白這些代碼是真正的面向對象的
但是如果你只是簡單的把它當作可視編程工具
你是永遠不會明白什麼是
委托模型
什麼是面向對象編程的
這是我理解的
C++ 是打著面向對象的幌子
干著過程編程的勾當
第三重
From:http://tw.wingwit.com/Article/program/Java/hx/201311/25656.html