明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

面對對象的思考(二)

[摘要]如今,面對對象方法幾乎成為了成功、先進(jìn)、效率的代名詞。使用面對對象的方法設(shè)計(jì)和實(shí)現(xiàn)一個(gè)軟件幾乎成為了開發(fā)者們的默認(rèn)選擇。但是,這種方法是否已經(jīng)真正取得了成功了呢?真的達(dá)到了在他產(chǎn)生時(shí)候宣稱的優(yōu)勢呢?...
如今,面對對象方法幾乎成為了成功、先進(jìn)、效率的代名詞。使用面對對象的方法設(shè)計(jì)和實(shí)現(xiàn)一個(gè)軟件幾乎成為了開發(fā)者們的默認(rèn)選擇。但是,這種方法是否已經(jīng)真正取得了成功了呢?真的達(dá)到了在他產(chǎn)生時(shí)候宣稱的優(yōu)勢呢?很顯然對于這樣的問題大多數(shù)人是迷惑,不能作出肯定的回答。面對對象的方法在軟件分析和設(shè)計(jì)方面仍然遇到了困難,這些困難主要有這些表現(xiàn):
1、抽象現(xiàn)實(shí)問題的方法不容易被開發(fā)者真正掌握。分解問題域中對象一般的思考方式有以下兩種,一種是抽象對象的性質(zhì),這種方法實(shí)際上就是對象繼承,第二種就是對象組合的方法。在經(jīng)典的理論中認(rèn)為對象的繼承是面對對象方法的實(shí)質(zhì),但是不符合大多數(shù)人的思維習(xí)慣。對于一個(gè)輪胎而言,人們更愿把它看成輪箍、外胎、內(nèi)胎等等結(jié)構(gòu)的組合體,而不是抽象成這樣的層次關(guān)系,橡膠-〉含有金屬的橡膠-含有金屬的圓形橡膠-〉輪胎。
2、分析到設(shè)計(jì)仍然不能平滑的過渡,在分析階段產(chǎn)生對象,往往有很多現(xiàn)實(shí)的名詞,這影響了設(shè)計(jì)者的思考,使他們不能關(guān)注對象在問題域中的關(guān)系,往往受到這些名詞其他含義影響。假定普通的企業(yè)管理系統(tǒng)中,分析作了人-〉公司職員-〉高級(jí)職員-〉經(jīng)理的抽象,設(shè)計(jì)人員往往會(huì)被人、經(jīng)理、高級(jí)職員這些名詞的影響,不能把這樣的現(xiàn)實(shí)對象很好的映射到程序結(jié)構(gòu)中去,甚至?xí)ザx人的姓名、年齡這些屬性,然而這些屬性在問題域中是不關(guān)心的,實(shí)際上在程序結(jié)構(gòu)中人這個(gè)對象會(huì)和真正的人概念完全不一樣,之所以抽象這些對象實(shí)際上為了提取問題域中的靜態(tài)關(guān)系和動(dòng)態(tài)關(guān)系,現(xiàn)實(shí)的名詞干擾了設(shè)計(jì)者。
3、面對對象方法產(chǎn)生的軟件沒有完全實(shí)現(xiàn)宣稱的軟件復(fù)用和簡化維護(hù)的目標(biāo)。在沒有完全采用抽象對象性質(zhì)的方法的時(shí)候,實(shí)際上完全采用也是很困難的,大多數(shù)人習(xí)慣于把復(fù)雜的事物分解成一組組合的對象,把簡單的事物進(jìn)行抽象,在這種情況下產(chǎn)生的軟件結(jié)構(gòu)是復(fù)雜的,對象組合之間必然充滿了復(fù)雜的消息,要進(jìn)行重復(fù)使用和維護(hù)當(dāng)然是不容易的。
4、缺乏評價(jià)一個(gè)面對對象設(shè)計(jì)的標(biāo)準(zhǔn),一個(gè)設(shè)計(jì),或者說怎樣做出一個(gè)能夠?qū)崿F(xiàn)軟件復(fù)用、降低軟件復(fù)雜性的設(shè)計(jì),沒有很好的理論支持。這本身就是由于對象抽象的靈活性造成的,不同的人對同樣的問題完全會(huì)有不同的抽象方法,面對對象的方法不限制人們抽象的方法,或者說根本沒有一套抽象的方法。我說的是抽象,和對象組合對應(yīng)。缺乏標(biāo)準(zhǔn),也必然造成軟件復(fù)用困難。
為了解決這些問題,很多人進(jìn)行了回歸,我要說一些大逆不道的話了。第一個(gè)概念把繼承分解為接口繼承和實(shí)現(xiàn)繼承,認(rèn)為對象實(shí)際上是實(shí)現(xiàn)和宣稱的方法集組成的,在現(xiàn)實(shí)的設(shè)計(jì)活動(dòng)中,他們找到了復(fù)用的好辦法,因?yàn)樗麄儼呀涌诤蛯?shí)現(xiàn)分離,這樣在通過同樣的接口就可以操縱不同的對象,而不用關(guān)心背后對象的細(xì)節(jié),這樣降低了對象之間的關(guān)聯(lián)程度。第二個(gè)概念,盡量使用對象組合而不是繼承,在把繼承分解以后,就會(huì)很自然的發(fā)現(xiàn),純虛的基類實(shí)際上成為了對象的接口,而且為了復(fù)用的方便,幾乎完全不要實(shí)現(xiàn)繼承,因?yàn)閺?fù)用是對象本身,而不是用它的基類,所以定義一個(gè)良好的組合成為了關(guān)鍵,而且繼承也會(huì)為這種復(fù)用帶來麻煩。我把這種解決方法稱為回歸,這是面對對象向結(jié)構(gòu)化的回歸,或者說結(jié)構(gòu)化方法的延伸。在對象進(jìn)行復(fù)用的時(shí)候,一般不使用已經(jīng)成型的對象,而是使用基類,復(fù)用的是基類已經(jīng)實(shí)現(xiàn)的方法,當(dāng)然這樣做,需要深刻理解原作者的意圖。一個(gè)只有一個(gè)純虛基類的對象和一個(gè)模塊有什么差別呢?這是模塊的復(fù)用。復(fù)用的只是接口,也就是一組定義,要實(shí)現(xiàn)支持同樣接口的不同對象,需要完全重新設(shè)計(jì),實(shí)際上并沒有代碼復(fù)用。他把實(shí)現(xiàn)的復(fù)雜性推給了后面的設(shè)計(jì)者。如果僅僅把接口復(fù)用當(dāng)成分析,在實(shí)現(xiàn)這個(gè)借口對象的時(shí)候仍然堅(jiān)持實(shí)現(xiàn)繼承,也就是實(shí)現(xiàn)的時(shí)候仍然分層,那么這當(dāng)然是可取的,但是我看不出需要接口繼承的意義。在這種方法下,設(shè)計(jì)者更傾向于進(jìn)行問題的功能分解,舉個(gè)例子,設(shè)計(jì)企業(yè)的管理系統(tǒng),設(shè)計(jì)者很可能在這種思考方式的主導(dǎo)下,劃分成財(cái)務(wù)部,人事部,業(yè)務(wù)部。這完全背離了面對對象方法的初衷。
大多數(shù)問題是復(fù)雜的,習(xí)慣總是明智的,把一個(gè)大的問題分解成小問題,在解決小問題的時(shí)候使用抽象的方法,可以說是一個(gè)很好的折衷,也是很有效率的。但是不能把整個(gè)問題都細(xì)化,或者說完全取消實(shí)現(xiàn)繼承,如果那樣我看不出這還是面對對象。我更愿意看到結(jié)構(gòu)化方法和面對對象方法的融合,而不是盜用了面對對象的概念行結(jié)構(gòu)化的做法。在對于評價(jià)分層抽象,或者說分層抽象指導(dǎo)原則、模式,幾乎沒有,這不能說是完整的。就像氣宗和劍宗構(gòu)成了華山派一樣,獨(dú)孤九劍好像是絕種的劍宗武功,雖然難煉,但是殺了岳不群。


標(biāo)簽:面對對象的思考(二)