架構(gòu)師之路(4)詳解面向?qū)ο?/h1>

字號(hào):

詳解面向?qū)ο蟮木幊?OOP)
    1 什么是面向?qū)ο?BR>    剛接觸編程的時(shí)候,多數(shù)人本能的反映可能是面向過程(OP)的,而不是面向?qū)ο?OO)的。這種現(xiàn)象其實(shí)是很正常的,改變思維方式是需要一個(gè)過程的,我大體歸納了一下其形成的原因:
    1、直接原因
    你還沒有養(yǎng)成面向?qū)ο蠓治鰡栴}和解決問題的習(xí)慣。建立面向?qū)ο蟮乃季S方式需要一定時(shí)間的訓(xùn)練和揣摩才能形成,所以你可以在學(xué)習(xí)或具體項(xiàng)目中刻意地強(qiáng)化這種意識(shí)。一般情況下,經(jīng)過一段時(shí)間之后,你會(huì)覺得這是自然而然的事情,只有心中OO,眼中自然OO了。
    2、歷史原因
    我們從小接受的培訓(xùn)都是采用面向過程(OP)的方式分析問題和解決問題,尤其是數(shù)學(xué),多數(shù)是強(qiáng)調(diào)按部就班的解決問題,計(jì)算機(jī)軟件的發(fā)展一直就與數(shù)學(xué)是很有淵源,所以,順理成章的,把面向過程(OP)的方式帶入到軟件開發(fā)也是很自然的事情。
    什么是面向?qū)ο?,或者談?wù)勀銓?duì)面向?qū)ο蟮睦斫猓@恐怕是軟件開發(fā)人員,尤其是程序員和設(shè)計(jì)師應(yīng)聘的時(shí)候,面試官常掛在嘴邊的問題吧。面向?qū)ο髮?duì)應(yīng)的英文是Object-Oriented,把Object-Oriented翻譯成“面向?qū)ο蟆?,我一直覺得這個(gè)譯法不太確切,因?yàn)槎鄶?shù)人第看到“面向?qū)ο蟆边@四個(gè)字,都很難從字面上理解它到底是什么意思。后來,我又查閱了一些有關(guān)的資料,發(fā)現(xiàn)港澳臺(tái)的計(jì)算機(jī)書籍中是把它翻譯成了“物件導(dǎo)向”,這個(gè)譯法,我感覺不錯(cuò),于我心頗有些戚戚焉?!拔锛?dǎo)向”比較準(zhǔn)確地反映了面向?qū)ο笳J(rèn)識(shí)和解決問題都是要圍繞對(duì)象展開的。
    所以,面向?qū)ο蟮乃季S方式認(rèn)為:軟件系統(tǒng)是一組交互的對(duì)象的集合。一組相關(guān)的對(duì)象組合為一個(gè)子系統(tǒng),一組子系統(tǒng)繼續(xù)組合為更復(fù)雜的子系統(tǒng),直至組合成整個(gè)系統(tǒng)。
    面向?qū)ο蠓绞降某霭l(fā)點(diǎn)是盡可能模擬人類習(xí)慣的思維方式,將“問題域”中涉及的內(nèi)容抽象為“對(duì)象”谷砑⒌姆椒ㄓ牘嘆】贍芙詠死噯鮮妒瀾緗餼鑫侍獾姆椒ㄓ牘獺?/p>
    面向過程就是分析出解決問題所需要的步驟,然后用函數(shù)把這些步驟一步一步實(shí)現(xiàn),使用的時(shí)候一個(gè)一個(gè)依次調(diào)用就可以了。面向?qū)ο笫前褬?gòu)成問題事務(wù)分解成各個(gè)對(duì)象,建立對(duì)象的目的不是為了完成一個(gè)步驟,而是為了描敘某個(gè)事物在整個(gè)解決問題的步驟中的行為。
    面向過程認(rèn)識(shí)和解決問題的思維,可以稱為“流程論”,重點(diǎn)放在處理過程的步驟,流程是整個(gè)系統(tǒng)的核心。
    面向?qū)ο笳J(rèn)識(shí)和解決問題的思維,可以稱為“組裝論”,重心放在對(duì)象的抽象和提取上,然后將對(duì)象組裝為整體。
    所以O(shè)O和OP從思維方式來講,出發(fā)點(diǎn)還是完全不同的。
    2 OP PK OO
    咱們用象棋對(duì)戰(zhàn)的例子,來比較OP和OO的不同:
    http://img.ddvip.com/2009_03_06/1236333416_ddvip_6956.jpeg
    紅方:功夫熊貓 黑方:悍嬌虎 裁判:龜仙人
    采用面向過程(OPP)的設(shè)計(jì)思路,首先分拆整個(gè)對(duì)戰(zhàn)過程,分析雙方對(duì)戰(zhàn)的步驟,得到如下流程:
    http://img.ddvip.com/2009_03_06/1236333416_ddvip_1731.jpeg
    把上面每個(gè)步驟分別用函數(shù)進(jìn)行實(shí)現(xiàn),問題就解決了。
    我們?cè)賮砜纯疵嫦驅(qū)ο笫侨绾蝸斫鉀Q問題,整個(gè)象棋游戲可以抽象出3種對(duì)象:
    1、棋手,負(fù)責(zé)行棋,這兩者行為一致。
    2、棋盤,負(fù)責(zé)繪制棋盤畫面。
    3、裁判,負(fù)責(zé)判定諸如吃子、犯規(guī)和輸贏。
    三者之間的關(guān)系如下:
    http://img.ddvip.com/2009_03_06/1236333416_ddvip_219.jpeg
    第一類對(duì)象棋手負(fù)責(zé)行棋,并告知第二類對(duì)象棋盤中棋子布局的變化,棋盤接收到了棋子布局的變化后,負(fù)責(zé)在繪制屏幕,同時(shí)利用第三類對(duì)象裁判來對(duì)棋局進(jìn)行判定。
    從以上兩種的實(shí)現(xiàn)方式可以看出幾點(diǎn):
    1、可維護(hù)性
    面向?qū)ο笫且詳?shù)據(jù)和功能來劃分問題,而不是依據(jù)流程和步驟。同樣是繪制棋盤的行為,在面向過程的設(shè)計(jì)中分散在了很多的步驟中,很可能出現(xiàn)在不同的繪制版本中,只是不是很像一份“蛋炒飯”中的雞蛋?在面向?qū)ο蟮脑O(shè)計(jì)中,繪圖只可能在棋盤對(duì)象中出現(xiàn),從而保證了繪圖的統(tǒng)一,這就是把雞蛋從“蛋炒飯”中分離出來的效果。
    2、可擴(kuò)展性
    假如我要加入悔棋的功能,如果要改動(dòng)面向過程的設(shè)計(jì),那么從行棋到顯示再到判定這一連串的步驟都要改動(dòng),甚至步驟之間的循序都要進(jìn)行大規(guī)模調(diào)整。如果是面向?qū)ο蟮脑?,只用改?dòng)棋盤對(duì)象就行了,棋盤對(duì)象保存了雙方的棋譜,簡(jiǎn)單回溯,減一就可以了,而顯示和判定不涉及,同時(shí)整體對(duì)各個(gè)對(duì)象功能的調(diào)用順序都沒有變化,改動(dòng)只限定在了局部。
    3 深層思考
    認(rèn)為:軟件系統(tǒng)是一組交互的對(duì)象的集合。
    因?yàn)槿祟悓?duì)現(xiàn)實(shí)世界是非常熟悉的,所以O(shè)O就是通過抽象的方式,把問題域映射到現(xiàn)實(shí)世界,盡量模擬現(xiàn)實(shí)世界的萬事萬物。通過這種方式,就可以運(yùn)用現(xiàn)實(shí)世界中解決問題的方法與過程,來解決軟件領(lǐng)域內(nèi)的問題。
    有人說:OO眼里一切皆對(duì)象,這句話還是很有道理的。
    到底給軟件開發(fā)帶來了什么樣的好處?OO的抽象的尺度是如何把握的呢?這都是問題。