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

面對(duì)對(duì)象的思考

[摘要]在比較老一些的討論面對(duì)對(duì)象方法的書籍中,都把繼承看成了最為關(guān)鍵的部分。一般認(rèn)為,面對(duì)對(duì)象的方法中最為核心的部分就是繼承,因?yàn)閺睦^承的角度思考問題,是和結(jié)構(gòu)化設(shè)計(jì)最為明顯的區(qū)別。如果,對(duì)象都沒有繼承,那么對(duì)象和傳統(tǒng)的模塊的概念沒有太多的差別。我并不是要把這兩種方法對(duì)立起來,我只是認(rèn)為面對(duì)對(duì)象的方法背...
在比較老一些的討論面對(duì)對(duì)象方法的書籍中,都把繼承看成了最為關(guān)鍵的部分。一般認(rèn)為,面對(duì)對(duì)象的方法中最為核心的部分就是繼承,因?yàn)閺睦^承的角度思考問題,是和結(jié)構(gòu)化設(shè)計(jì)最為明顯的區(qū)別。如果,對(duì)象都沒有繼承,那么對(duì)象和傳統(tǒng)的模塊的概念沒有太多的差別。我并不是要把這兩種方法對(duì)立起來,我只是認(rèn)為面對(duì)對(duì)象的方法背后的思想是應(yīng)該和傳統(tǒng)結(jié)構(gòu)化的方法有所區(qū)別的。
在結(jié)構(gòu)化的方法中,我們首先需要考慮的是整個(gè)軟件系統(tǒng)的功能,然后按照一些基本的模塊劃分的原則,比如高內(nèi)聚,松耦合,還有模塊的扇入扇出數(shù)等等,把整個(gè)軟件的功能分解為各個(gè)模塊的子功能。當(dāng)然,模塊一般認(rèn)為是黑箱的。在設(shè)計(jì)階段需要定義的是各個(gè)模塊的調(diào)用規(guī)則,我不想說是接口,接口我想用在下面另外一個(gè)地方。在完成了所有的模塊的設(shè)計(jì)后,拼裝好,就應(yīng)該能夠?qū)崿F(xiàn)整個(gè)軟件的功能了。當(dāng)然這屬于自頂向下的設(shè)計(jì)。這種思考的方式應(yīng)該說是很自然的,就像搭積木一樣,也和我們平時(shí)的思維習(xí)慣相一致,他不是探究為什么會(huì)有這樣的功能,而是思考我如何實(shí)現(xiàn)這樣的功能,當(dāng)然我們的目標(biāo)就是如何實(shí)現(xiàn),但是他的思考方式是很直接的。這種方式有很大的局限性,一是需求分析總不是很明確,也永遠(yuǎn)不可能很明確,這就需要經(jīng)常的變化原來的軟件功能構(gòu)想,這帶來了麻煩,因?yàn)樾枰薷母鱾(gè)模塊的設(shè)計(jì),有時(shí)候甚至是致命的,會(huì)造成原來的設(shè)計(jì)被完全推翻。這需要一個(gè)很有經(jīng)驗(yàn)的設(shè)計(jì)師,他必須了解這個(gè)軟件適用行業(yè)的業(yè)務(wù),必須了解未來的軟件發(fā)展趨勢(shì),并且要能夠預(yù)測(cè)用戶可能的需求變化,這種要求是相當(dāng)高的,一個(gè)設(shè)計(jì)師的水平就往往決定了一個(gè)軟件的生存時(shí)間,就算他有一個(gè)很好的團(tuán)隊(duì),他的拙劣設(shè)計(jì)仍然會(huì)使這個(gè)軟件成為曇花一現(xiàn)。二是結(jié)構(gòu)化設(shè)計(jì)帶來的漂亮的文檔,仍然不能為以后的維護(hù)工作帶來相當(dāng)?shù)暮锰帲蠖鄶?shù)的維護(hù)工作都是由于用戶的需求發(fā)生變化引起的,漂亮清晰的文檔雖然能給后來的維護(hù)者很大的幫助,卻仍然不能減少他們的工作量,維護(hù)者在改動(dòng)的時(shí)候仍然需要全面準(zhǔn)確的理解原來設(shè)計(jì)者的意圖,否則就算有好的文檔,維護(hù)工作仍然會(huì)帶來大量的錯(cuò)誤,特別是在用戶需求發(fā)生大的變化的時(shí)候。在最近有了一些變化,我會(huì)在后面討論。
面對(duì)對(duì)象的方法在開始的時(shí)候,第一個(gè)工作就是識(shí)別對(duì)象,識(shí)別在問題域出現(xiàn)的對(duì)象,最經(jīng)典方式是尋找需求說明書中出現(xiàn)的名詞,這是有道理的,語言是思維的外殼,這些名詞在我們頭腦中的概念決定了他們之間的聯(lián)系,這種方式是偷懶的也是最自然的方式。第二步是尋找這些已經(jīng)確定了的對(duì)象之間的共性,當(dāng)然我們尋找的對(duì)象集應(yīng)該是能夠涵蓋整個(gè)問題的了。尋找共性就是確定它們的共同祖先,在這個(gè)過程中設(shè)計(jì)師能夠?qū)栴}有進(jìn)一步的清晰的了解。第三步就是確定問題中各個(gè)對(duì)象之間的關(guān)系,也就是它們之間的消息傳遞,這不是指Windows中窗口的消息,呵呵。這個(gè)過程是苦難的,因?yàn)橐_定各個(gè)對(duì)象之間的關(guān)系,也就是要更加精確的描述原來的問題,但是也是靈活的,就算理解出現(xiàn)了偏差,仍然是可以愉快的加以改正,因?yàn)槲覀兪窃诶斫鈱?duì)象,而不是分解功能,注意,我強(qiáng)調(diào)的是理解,而不是設(shè)計(jì)。這時(shí)候我們就可以提交我們的初步成果給客戶使用了,有問題的時(shí)候加以修改,這種修改不會(huì)很困難,因?yàn)槲覀儾皇腔诠δ芊纸猓腔诶斫鈫栴}域中的對(duì)象概念。我們不太會(huì)把所有的對(duì)象都理解錯(cuò)誤,理解錯(cuò)的只是一個(gè)或者很少的一部分對(duì)象。我認(rèn)為面對(duì)對(duì)象方法的實(shí)質(zhì)在于迫使設(shè)計(jì)師從為什么的角度來設(shè)計(jì)軟件,而不是很直接的怎么做,在這種理解過程中,很自然的形成了我們的設(shè)計(jì)方案。在這個(gè)機(jī)制中,能夠起到關(guān)鍵性作用正是繼承,他是連接為什么到怎么做的橋梁,他自然和不自覺的就把設(shè)計(jì)師對(duì)問題的理解變成了解決問題的方案。之所以會(huì)這樣,那是因?yàn)椋诂F(xiàn)實(shí)世界中我們?cè)缇托纬闪私鉀Q這個(gè)問題的方法,我們需要的只是把這個(gè)解決方案轉(zhuǎn)換成計(jì)算機(jī)的描述。我們?cè)陬^腦中的各種概念就是我們解決現(xiàn)實(shí)世界的各種問題留下的痕跡,他為我們解決類似的問題提供了參考,請(qǐng)注意到一個(gè)事實(shí),科學(xué)研究就是想知道是什么和為什么,而不是要干什么,但是我們知道了是什么和為什么以后,我們就會(huì)知道要干什么。舉一個(gè)不恰當(dāng)?shù)睦,有一個(gè)工人很不滿他的工資待遇,于是有一個(gè)人跑來跟他說,你這么少的工資待遇是因?yàn)槲覀儑疫很困難,社會(huì)還在轉(zhuǎn)形,不可避免的要有一部分人作出犧牲,于是這個(gè)工人就很滿意了。為什么這個(gè)工人會(huì)滿意?他原來要尋找的是解決他不滿工資待遇的途徑。其實(shí),國家的概念在他的腦子中是神圣的,換一句話說,就是一種難以抗拒的力量,這是他的成長道路上教訓(xùn)形成的,當(dāng)他不尊重國家的時(shí)候,老師會(huì)罰站,然后那個(gè)人的話,就演變成,你現(xiàn)在無法抗拒國家的力量,你現(xiàn)在這種狀況是國家的意志,呵呵,這個(gè)工人知道怎么做了,就是安于現(xiàn)狀。當(dāng)然他不這樣認(rèn)為,他的概念是我是崇高的。這有點(diǎn)像宗教哦,有點(diǎn)跑題了。不過的確,理解一個(gè)問題,實(shí)際上就是尋找解決問題的途徑。
在最近的一些日子里,傳統(tǒng)的結(jié)構(gòu)化的方法發(fā)生了變化,他開始吸收面對(duì)對(duì)象的概念,用于解決他的傳統(tǒng)問題,就是修改模塊困難的問題。一方面,他形成一些經(jīng)典的設(shè)計(jì)模式,幫助提高設(shè)計(jì)師在設(shè)計(jì)同類問題時(shí)的能力,如同建筑中的經(jīng)典設(shè)計(jì)結(jié)構(gòu),不過,這種幫助是有限的,我們很少見到一樣的建筑物吧!另一方面,它使用接口的概念,意圖就是,使模塊的實(shí)現(xiàn)和描述進(jìn)一步的分離,這種好處在于,可以在一開始就設(shè)計(jì)靈活性很高的接口,使用模塊是通過接口,這樣做實(shí)際上把總體設(shè)計(jì)的負(fù)擔(dān)進(jìn)一步減輕,他把責(zé)任推給了接口實(shí)現(xiàn)者,因?yàn)樵诮Y(jié)構(gòu)化的方法中靈活和精確始終是矛盾的。很多人把這種變化看成是面對(duì)對(duì)象方法的延伸,而我始終堅(jiān)持認(rèn)為:面對(duì)對(duì)象的方法是尋找是什么和為什么的過程,結(jié)構(gòu)化的方法永遠(yuǎn)是尋找做什么和怎么做的過程。