標籤:事務 調整 繪製 之間 .net 發展 計算 src 建立
詳解物件導向的編程(OOP)
3.5.1 什麼是物件導向
剛接觸編程的時候,多數人本能的反映可能是面向過程(OP)的,而不是物件導向(OO)的。這種現象其實是很正常的,改變思維方式是需要一個過程的,我大體歸納了一下其形成的原因:
1、直接原因
你還沒有養成物件導向分析問題和解決問題的習慣。建立物件導向的思維方式需要一定時間的訓練和揣摩才能形成,所以你可以在學習或具體項目中刻意地強化這種意識。一般情況下,經過一段時間之後,你會覺得這是自然而然的事情,只有心中OO,眼中自然OO了。
2、曆史原因
我們從小接受的培訓都是採用面向過程(OP)的方式分析問題和解決問題,尤其是數學,多數是強調按部就班的解決問題,電腦軟體的發展一直就與數學是很有淵源,所以,順理成章的,把面向過程(OP)的方式帶入到軟體開發也是很自然的事情。
什麼是物件導向,或者談談你對物件導向的理解,這恐怕是軟體開發人員,尤其是程式員和設計師應聘的時候,面試官常最掛在嘴邊的問題吧。物件導向對應的英文是Object-Oriented,把Object-Oriented翻譯成“物件導向”,我一直覺得這個譯法不太確切,因為多數人第一次看到“物件導向”這四個字,都很難從字面上理解它到底是什麼意思。後來,我又查閱了一些有關的資料,發現港澳台的電腦書籍中是把它翻譯成了“物件導向”,這個譯法,我感覺不錯,於我心頗有些戚戚焉。“物件導向”比較準確地反映了物件導向認識和解決問題都是要圍繞對象展開的。
所以,物件導向的思維方式認為:軟體系統是一組互動的對象的集合。一組相關的對象組合為一個子系統,一組子系統繼續組合為更複雜的子系統,直至組合成整個系統。
物件導向方式的出發點是儘可能類比人類習慣的思維方式,將“問題域”中涉及的內容抽象為“對象”,使軟體開發的方法與過程儘可能接近人類認識世界解決問題的方法與過程。
面向過程就是分析出解決問題所需要的步驟,然後用函數把這些步驟一步一步實現,使用的時候一個一個依次調用就可以了。物件導向是把構成問題事務分解成各個對象,建立對象的目的不是為了完成一個步驟,而是為了描敘某個事物在整個解決問題的步驟中的行為。 面向過程認識和解決問題的思維,可以稱為“流程論”,重點放在處理過程的步驟,流程是整個系統的核心。 物件導向認識和解決問題的思維,可以稱為“組裝論”,重心放在對象的抽象和提取上,然後將對象組裝為整體。所以OO和OP從思維方式來講,出發點還是完全不同的。
3.5.2 OP PK OO
咱們用象棋對戰的例子,來比較OP和OO的不同:
紅方:功夫熊貓 黑方:悍嬌虎 裁判:龜仙人
採用面向過程(OPP)的設計思路,首先分拆整個對戰過程,分析雙方對戰的步驟,得到如下流程:
把上面每個步驟分別用函數進行實現,問題就解決了。 我們再來看看物件導向是如何來解決問題,整個象棋遊戲可以抽象出3種對象:
1、棋手,負責行棋,這兩者行為一致。
2、棋盤,負責繪製棋盤畫面。
3、裁判,負責判定諸如吃子、犯規和輸贏。
三者之間的關係如下:
第一類對象棋手負責行棋,並告知第二類對象棋盤中棋子布局的變化,棋盤接收到了棋子布局的變化後,負責在繪製螢幕,同時利用第三類對象裁判來對棋局進行判定。
從以上兩種的實現方式可以看出幾點:
1、可維護性
物件導向是以資料和功能來劃分問題,而不是依據流程和步驟。同樣是繪製棋盤的行為,在面向過程的設計中分散在了很多的步驟中,很可能出現在不同的繪製版本中,只是不是很像一份“蛋炒飯”中的雞蛋?在物件導向的設計中,繪圖只可能在棋盤對象中出現,從而保證了繪圖的統一,這就是把雞蛋從“蛋炒飯”中分離出來的效果。
2、可擴充性
假如我要加入悔棋的功能,如果要改動面向過程的設計,那麼從行棋到顯示再到判定這一連串的步驟都要改動,甚至步驟之間的循序都要進行大規模調整。如果是物件導向的話,只用改動棋盤對象就行了,棋盤對象儲存了雙方的棋譜,簡單回溯,減一就可以了,而顯示和判定不涉及,同時整體對各個對象功能的調用順序都沒有變化,改動只限定在了局部。
3.5.3 OO的深層思考
OO認為:軟體系統是一組互動的對象的集合。
因為人類對現實世界是非常熟悉的,所以OO就是通過抽象的方式,把問題域映射到現實世界,盡量類比現實世界的萬事萬物。通過這種方式,就可以運用現實世界中解決問題的方法與過程,來解決軟體領域內的問題。
有人說:OO眼裡一切皆對象,這句話還是很有道理的。
OO到底給軟體開發帶來了什麼樣的好處?OO的抽象的尺度是如何把握的呢?這都是問題。
.NET 進階架構師0004 架構師之路(3)---詳解物件導向