3.5 詳解面向對象的編程(OOP)
3.5.1 什麼是面向對象
剛接觸編程的時候,多數人本能的反映多是面向過程(OP)的,而不是面向對象(OO)的。這種現象實際上是很正常的,改變思惟方式是須要一個過程的,我大致概括了一下其造成的緣由:
一、直接緣由
你尚未養成面向對象分析問題和解決問題的習慣。創建面向對象的思惟方式須要必定時間的訓練和揣摩才能造成,因此你能夠在學習或具體項目中刻意地強化這種意識。通常狀況下,通過一段時間以後,你會以爲這是天然而然的事情,只有心中OO,眼中天然OO了。
二、歷史緣由
咱們從小接受的培訓都是採用面向過程(OP)的方式分析問題和解決問題,尤爲是數學,多數是強調循序漸進的解決問題,計算機軟件的發展一直就與數學是頗有淵源,因此,瓜熟蒂落的,把面向過程(OP)的方式帶入到軟件開發也是很天然的事情。
什麼是面向對象,或者談談你對面向對象的理解,這恐怕是軟件開發人員,尤爲是程序員和設計師應聘的時候,面試官常最掛在嘴邊的問題吧。面向對象對應的英文是Object-Oriented,把Object-Oriented翻譯成「面向對象」,我一直以爲這個譯法不太確切,由於多數人第一次看到「面向對象」這四個字,都很難從字面上理解它究竟是什麼意思。後來,我又查閱了一些有關的資料,發現港澳臺的計算機書籍中是把它翻譯成了「物件導向」,這個譯法,我感受不錯,於我心很有些慼慼焉。「物件導向」比較準確地反映了面向對象認識和解決問題都是要圍繞對象展開的。
因此,面向對象的思惟方式認爲:軟件系統是一組交互的對象的集合。一組相關的對象組合爲一個子系統,一組子系統繼續組合爲更復雜的子系統,直至組合成整個系統。
面向對象方式的出發點是儘量模擬人類習慣的思惟方式,將「問題域」中涉及的內容抽象爲「對象」,使軟件開發的方法與過程儘量接近人類認識世界解決問題的方法與過程。
面向過程就是分析出解決問題所須要的步驟,而後用函數把這些步驟一步一步實現,使用的時候一個一個依次調用就能夠了。面向對象是把構成問題事務分解成各個對象,創建對象的目的不是爲了完成一個步驟,而是爲了描敘某個事物在整個解決問題的步驟中的行爲。
面向過程認識和解決問題的思惟,能夠稱爲「流程論」,重點放在處理過程的步驟,流程是整個系統的核心。
面向對象認識和解決問題的思惟,能夠稱爲「組裝論」,重心放在對象的抽象和提取上,而後將對象組裝爲總體。
因此OO和OP從思惟方式來說,出發點仍是徹底不一樣的。
3.5.2 OP PK OO
我們用象棋對戰的例子,來比較OP和OO的不一樣:
紅方:功夫熊貓 黑方:悍嬌虎 裁判:龜仙人
採用面向過程(OPP)的設計思路,首先分拆整個對戰過程,分析雙方對戰的步驟,獲得以下流程:
把上面每一個步驟分別用函數進行實現,問題就解決了。
咱們再來看看面向對象是如何來解決問題,整個象棋遊戲能夠抽象出3種對象:
一、棋手,負責行棋,這二者行爲一致。
二、棋盤,負責繪製棋盤畫面。
三、裁判,負責斷定諸如吃子、犯規和輸贏。
三者之間的關係以下:
第一類對象棋手負責行棋,並告知第二類對象棋盤中棋子佈局的變化,棋盤接收到了棋子佈局的變化後,負責在繪製屏幕,同時利用第三類對象裁判來對棋局進行斷定。
從以上兩種的實現方式能夠看出幾點:
一、可維護性
面向對象是以數據和功能來劃分問題,而不是依據流程和步驟。一樣是繪製棋盤的行爲,在面向過程的設計中分散在了不少的步驟中,極可能出如今不一樣的繪製版本中,只是否是很像一份「蛋炒飯」中的雞蛋?在面向對象的設計中,繪圖只可能在棋盤對象中出現,從而保證了繪圖的統一,這就是把雞蛋從「蛋炒飯」中分離出來的效果。
二、可擴展性
假如我要加入悔棋的功能,若是要改動面向過程的設計,那麼從行棋到顯示再到斷定這一連串的步驟都要改動,甚至步驟之間的循序都要進行大規模調整。若是是面向對象的話,只用改動棋盤對象就好了,棋盤對象保存了雙方的棋譜,簡單回溯,減一就能夠了,而顯示和斷定不涉及,同時總體對各個對象功能的調用順序都沒有變化,改動只限定在了局部。
3.5.3 OO的深層思考
OO認爲:軟件系統是一組交互的對象的集合。
由於人類對現實世界是很是熟悉的,因此OO就是經過抽象的方式,把問題域映射到現實世界,儘可能模擬現實世界的萬事萬物。經過這種方式,就能夠運用現實世界中解決問題的方法與過程,來解決軟件領域內的問題。
有人說:OO眼裏一切皆對象,這句話仍是頗有道理的。
OO到底給軟件開發帶來了什麼樣的好處?OO的抽象的尺度是如何把握的呢?這都是問題。
(未完待續) --------------------------------------------------------------------------- 後記:今天累了,寫到這兒吧。晚上回家的時候碰到兩個blond beauty,they are from USA。They want to go to 2nd foreign language colledge,but did not know how to get there. I told them the correct route in English. 我學了這麼多年的英語,終於幫了國際友人一個小忙。