對(duì)面向?qū)ο蟮睦斫?/h2>

————前車之鑒,后車之師:對(duì)面向?qū)ο蟮睦斫?br>

1.考慮問題的過程和思想的轉(zhuǎn)變:

在對(duì)問題的考慮時(shí)人的主觀思維起到重要作用,遇到問題會(huì)對(duì)整體問題進(jìn)行考慮看是否遇到過類似問題,人為的向經(jīng)驗(yàn)靠攏,對(duì)問題事件進(jìn)行分析,歸納,延伸,將多個(gè)經(jīng)驗(yàn)組合在一起對(duì)更大的問題進(jìn)行處理。

人能夠解決問題的復(fù)雜性直接取決于抽象的類型和質(zhì)量,看是否能夠?qū)栴}進(jìn)行拆分,將一個(gè)大的問題轉(zhuǎn)化為多個(gè)小的問題,所謂的類型是指所抽象的是什么?就是問題的一部分,例如:所有的語言都提供抽象機(jī)制,第二代語言匯編語言就是對(duì)底層語言的輕微抽象,而第三代語言是對(duì)匯編進(jìn)行的抽象出現(xiàn)了命令式的C、BASIC等。但是這些抽象是針對(duì)計(jì)算機(jī)而言的,是為了基于計(jì)算機(jī)的結(jié)構(gòu)更好的對(duì)硬件進(jìn)行控制,而不是直接為了方便解決問題所以面對(duì)更大的代碼量就顯的略有不足(因?yàn)閱栴}更加復(fù)雜導(dǎo)致代碼繁雜)。所以必須建立起在計(jì)算機(jī)模型和實(shí)際待解問題之間的關(guān)聯(lián),這種映射是困難的,因?yàn)榫幊陶Z言的功能限制所以并不可行(面向過程是不夠的)

這就出現(xiàn)了只針對(duì)待解問題建模,早期的語言例如LISP和APL都選擇了針對(duì)問題的思路進(jìn)行編程(分別對(duì)應(yīng)“所有問題最終都是列表”和“所有問題都是算法形式”),還有將問題轉(zhuǎn)換為決策鏈的語言和基于約束條件的編程語言,但是這些語言都有著局限性,這時(shí)就體現(xiàn)出了面向?qū)ο蟮膬?yōu)勢(shì),因?yàn)樗姆绞椒浅Mㄓ茫谷瞬粫?huì)受限于任何特定類型的問題,將問題空間中的元素稱為對(duì)象,程序可以添加新類型的對(duì)象使自身適用于某個(gè)問題,面向?qū)ο笫歉鶕?jù)問題來描述問題,而不是根據(jù)執(zhí)行解決方案的代碼來解決問題。這就體現(xiàn)了面向?qū)ο蟮奶卣骱歪槍?duì)問題的靈活多變

2.面向?qū)ο蟮奶攸c(diǎn):

Simula 67是第一個(gè)支持面向?qū)ο蟮恼Z言,但是之后的Smalltalk是被認(rèn)為是最純正的面向?qū)ο箝_發(fā)語言,對(duì)之后的面向?qū)ο笳Z言,C++、java等產(chǎn)生了深遠(yuǎn)影響,出現(xiàn)了五個(gè)基本特性,表現(xiàn)了一種面相對(duì)象的設(shè)計(jì)方式:

(1)萬物皆對(duì)象:

可以抽取待解問題的任何概念化構(gòu)建,將其表示為程序中的對(duì)象

(2)程序是對(duì)象的集合:

對(duì)象之間根據(jù)消息來告知彼此要做的,要想請(qǐng)求一個(gè)對(duì)象就必須對(duì)該對(duì)象發(fā)送一個(gè)消息,這個(gè)消息相當(dāng)于一個(gè)調(diào)用請(qǐng)求

(3)每個(gè)對(duì)象都可以有由其他對(duì)象構(gòu)成的存儲(chǔ):

可以構(gòu)建復(fù)雜的體系,通過創(chuàng)建包含現(xiàn)有對(duì)象的包的方式來創(chuàng)建一個(gè)新的類的對(duì)象

(4)每個(gè)對(duì)象都有其類型:

每個(gè)對(duì)象都是某個(gè)類的實(shí)例,每個(gè)類最重要的區(qū)別其他類的特性是“可以發(fā)送什么信息給它”

(5)某一特定類型的所有對(duì)象都可以接收同樣的信息:

簡(jiǎn)單來說就是具有相同特征的類之間具有可替代性

這些特點(diǎn)成為了面向?qū)ο蟮幕A(chǔ),是面向?qū)ο缶幊痰年P(guān)鍵

對(duì)象具有狀態(tài)、行為和標(biāo)志,分別是內(nèi)部數(shù)據(jù)、方法、和每個(gè)對(duì)象在內(nèi)存中的唯一個(gè)地址,面向?qū)ο髴?yīng)該具有封裝、繼承、多態(tài)、組合等特性,面向?qū)ο缶幊淌蔷哂羞@四個(gè)特性的編程方式

3.面向?qū)ο蠛兔嫦蜻^程

我覺得面向?qū)ο蠓譃樗枷牒途幊谈袷絻煞矫?,在考慮問題時(shí)使用思想分析問題,在編碼時(shí)使用其格式,面向過程也是同理的分為思想和格式,但是只使用格式并不能成為真正的面向?qū)ο?/p>

為什么使用面向?qū)ο??因?yàn)樵谒枷敕矫娼鉀Q了問題的復(fù)雜化并針對(duì)問題來進(jìn)行設(shè)計(jì),這樣在編程格式上解決了安全性、易于修改、可復(fù)用等問題。在面向?qū)ο蟪蔀橹髁髦埃Y(jié)構(gòu)化(命令式)編程起到了重要作用,雖然兩者有明顯的界限但是不是互相排斥的,因?yàn)閷?duì)計(jì)算機(jī)操作必然會(huì)出現(xiàn)命令式的編程,兩者之間是互補(bǔ)的,面向?qū)ο蟛灰欢ㄍ耆娲Y(jié)構(gòu)式代碼,很多遺留系統(tǒng)仍在正常工作,這些系統(tǒng)都是非面向?qū)ο蟮木帉懛绞?。面向過程的開發(fā)制約了維護(hù)和擴(kuò)展,因?yàn)樽陨隙碌慕Y(jié)構(gòu)化的開發(fā)導(dǎo)致功能結(jié)構(gòu)死板不易改變,導(dǎo)致一修改就會(huì)影響到其他的功能模塊就成為了嚴(yán)重缺陷。

兩者思想上的簡(jiǎn)單區(qū)別:

1)但是我認(rèn)為處理問題時(shí)面向過程是必不可少的,因?yàn)橐@得一個(gè)結(jié)果就必須執(zhí)行一定的步驟,這與面向過程的思想:即分解執(zhí)行步驟采用每一步都是命令相似,但在處理問題時(shí)采用面向?qū)ο蟮乃枷脒M(jìn)行對(duì)問題的分析,這些步驟指令被劃分到自然界的元素中進(jìn)行封裝,以實(shí)現(xiàn)每個(gè)自然元素的獨(dú)立功能

2)在面向過程中通過各種功能來實(shí)現(xiàn)各種步驟和劃分結(jié)構(gòu),把整個(gè)軟件系統(tǒng)劃分為多個(gè)模塊每個(gè)模塊實(shí)現(xiàn)預(yù)期的子功能,所以將問題拆分的過程就是執(zhí)行解決步驟實(shí)現(xiàn)功能的時(shí)候;而面向?qū)ο笫前褑栴}通過功能來劃分為各個(gè)對(duì)象,而不是單純的進(jìn)行功能之間的組合,而是描述這個(gè)元素在整個(gè)問題的解決步驟中的行為和狀態(tài)

3)對(duì)象式的編程先不管步驟,而是確定對(duì)象的存在去然后通過對(duì)象來實(shí)施行為,然后去通知另外一個(gè)對(duì)象自己的行為,而不是按照流程對(duì)計(jì)算機(jī)進(jìn)行命令

4)我認(rèn)為面向過程和面向?qū)ο蟮闹饕謩e在于對(duì)方法功能的使用上不同,面向過程是為了解決一個(gè)問題將功能步驟依次使用,即使劃分模塊也是為了解決子問題而執(zhí)行步驟,由數(shù)據(jù)來控制功能(函數(shù));而面向?qū)ο箅m然針對(duì)待解問題包含的元素而進(jìn)行對(duì)象的劃分,但是我認(rèn)為是依據(jù)功能的共性進(jìn)行抽象成類,使有共性的功能成為一個(gè)獨(dú)立整體,而不是松散的結(jié)構(gòu),通過功能來控制封裝內(nèi)部的數(shù)據(jù)

包裝對(duì)象是指在面向?qū)ο蟮念愔邪渌a,你可以將結(jié)構(gòu)化的代碼包裝到一個(gè)對(duì)象的內(nèi)部,使其行為就像對(duì)象一樣,即對(duì)功能的分類

4.如何進(jìn)行面向?qū)ο蟮乃枷?/p>

在開始的時(shí)候需要建立模擬問題的對(duì)象領(lǐng)域模型,這時(shí)就有自底向上的抽象過程,自上而下的分解過程:

自底向上的抽象:針對(duì)問題分析各個(gè)元素之間的供需關(guān)系(即各個(gè)最基本對(duì)象之間的關(guān)系),尋找到最基本的對(duì)象后再將其抽象為類,在將這些類抽取共性建立父類,這樣可以避免類的抽象層次過高,而復(fù)雜化問題。

自上而下的分解:每一步分解都有具體的對(duì)象,方便的分清功能,但是不同于結(jié)構(gòu)化(命令式)的思想,因?yàn)椴幌衩嫦蜻^程一樣去分解功能,而是將功能分開,降低耦合性在開發(fā)過程中針對(duì)的問題不斷擴(kuò)大,導(dǎo)致需要建立模擬問題的各種對(duì)象模型。

建立模型必要的組成部分:

問題領(lǐng)域 :是軟件系統(tǒng)對(duì)真實(shí)系統(tǒng)的模擬,是系統(tǒng)對(duì)真實(shí)的映射

對(duì)象 :在問題領(lǐng)域?qū)Ω髯匀辉氐某橄?,由眾多?duì)象組合起來構(gòu)成對(duì)問題領(lǐng)域的系統(tǒng)

屬性、行為 :包括具有的實(shí)現(xiàn)和功能,在設(shè)計(jì)時(shí)只需要考慮有什么功能

狀態(tài) :狀態(tài)是對(duì)象的某個(gè)狀態(tài)的屬性取值,是可以改變的

實(shí)例 :同種類的實(shí)例具有相同的屬性,表明具有相同的含義

消息和服務(wù) :一個(gè)功能可能由多個(gè)對(duì)象協(xié)同工作,一個(gè)對(duì)象根據(jù)一個(gè)對(duì)象發(fā)送的消息來執(zhí)行相應(yīng)的方法,消息由調(diào)用者發(fā)送,服務(wù)由被調(diào)用者提供。一個(gè)軟件對(duì)使用者來說就是一個(gè)服務(wù)提供者,在系統(tǒng)內(nèi)部的子系統(tǒng)也是服務(wù)提供者,子系統(tǒng)就是對(duì)象或多個(gè)對(duì)象的組合,每個(gè)子系統(tǒng)都是獨(dú)立的個(gè)體通過消息來獲得服務(wù)

接口 :每個(gè)對(duì)象都是服務(wù)提供者,通過接口對(duì)外提供服務(wù),由公開的方法構(gòu)成接口,但在java中的接口還有另一個(gè)意思即接口類型,明確的描述系統(tǒng)對(duì)外提供的所有服務(wù),能夠更加清晰的把實(shí)現(xiàn)細(xì)節(jié)和接口分離

5.面向?qū)ο蟮奶攸c(diǎn)

封裝(透明):隱藏內(nèi)部細(xì)節(jié)僅對(duì)外公開接口,可以避免暴露內(nèi)部的內(nèi)聚關(guān)系,降低整體的耦合度通過訪問控制機(jī)制來進(jìn)行封裝

抽象 :從問題領(lǐng)域的事物開始,對(duì)事物抽取屬性和行為成為一個(gè)對(duì)象,在抽象對(duì)象把具有相同屬性和行為的對(duì)象抽象為類,在對(duì)類實(shí)現(xiàn)抽象成為父類,在java語言中則有兩種意思,一是抽象的思維過程,二是用來修飾類和方法,若一個(gè)方法被abstract修飾則表明這個(gè)方法沒有具體的實(shí)現(xiàn),若一個(gè)類被abstract 修飾則表明這個(gè)類沒有辦法被實(shí)例化

繼承 :在父類和子類之間存在著繼承和擴(kuò)展關(guān)系,子類繼承了父類的方法還同時(shí)擴(kuò)展出新的功能和方法,并且可以覆蓋父類中的方法實(shí)現(xiàn)方式(覆蓋:指在子類中重新實(shí)現(xiàn)父類的方法)

組合 :組合是一種用多個(gè)簡(jiǎn)單子系統(tǒng)來組裝出復(fù)雜系統(tǒng)的有效手段 ,對(duì)于子系統(tǒng)之間存在關(guān)聯(lián)或依賴關(guān)系

多態(tài) :當(dāng)系統(tǒng)A訪問系統(tǒng)B時(shí),B可以通過多種實(shí)現(xiàn)方式來提供服務(wù),而對(duì)于A來說是透明的,動(dòng)態(tài)綁定(是指在執(zhí)行期間判斷所引用對(duì)象的實(shí)際類型,根據(jù)其實(shí)際類型決定其相應(yīng)的方法,在運(yùn)行過程中把函數(shù)的調(diào)用與響應(yīng)所需要的代碼相結(jié)合的過程稱為動(dòng)態(tài)綁定)

6.UML對(duì)面向?qū)ο蟮膸椭?/p>

UML主要是建模用的,是一種設(shè)計(jì)方法,是在軟件設(shè)計(jì)開發(fā)時(shí)進(jìn)行溝通的,是開發(fā)團(tuán)隊(duì)內(nèi)部的高效手段

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容