1.2 面向?qū)ο蟮拈_(kāi)發(fā) (OOP: Object Oriented Programming)
1.2.1 面向?qū)ο蟪绦蛟O(shè)計(jì)模式
發(fā)明面向?qū)ο蟪绦蛟O(shè)計(jì)方法的主要出發(fā)點(diǎn)是彌補(bǔ)面向過(guò)程程序設(shè)計(jì)方法中的一些缺點(diǎn)。OOP把數(shù)據(jù)看作程序開(kāi)發(fā)中的基本元素,并且不允許它們?cè)谙到y(tǒng)中自由流動(dòng)。它將數(shù)據(jù)和操作這些數(shù)據(jù)的函數(shù)緊密的連結(jié)在一起,并保護(hù)數(shù)據(jù)不會(huì)被外界的函數(shù)意外的改變。OOP允許我們將問(wèn)題分解為一系列實(shí)體——這些實(shí)體被稱為對(duì)象(object),然后圍繞這些實(shí)體建立數(shù)據(jù)和函數(shù)。面向?qū)ο蟪绦蛟O(shè)計(jì)中的數(shù)據(jù)和函數(shù)的組織結(jié)構(gòu)如圖所示。
?
1.2.2 什么是面向?qū)ο蟪绦蛟O(shè)計(jì)?
? ? ? ?面向?qū)ο蟪绦蛟O(shè)計(jì)(OOP)技術(shù)汲取了結(jié)構(gòu)化程序設(shè)計(jì)中好的思想,并將這些思想與一些新的、強(qiáng)大的理念相結(jié)合,從而給你的程序設(shè)計(jì)工作提供了一種全新的方法。通常,在面向?qū)ο蟮某绦蛟O(shè)計(jì)風(fēng)格中,你會(huì)將一個(gè)問(wèn)題分解為一些相互關(guān)聯(lián)的子集,每個(gè)子集內(nèi)部都包含了相關(guān)的數(shù)據(jù)和函數(shù)。同時(shí),你會(huì)以某種方式將這些子集分為不同等級(jí),而一個(gè)對(duì)象就是已定義的某個(gè)類型的變量。當(dāng)你定義了一個(gè)對(duì)象,你就隱含的創(chuàng)建了一個(gè)新的數(shù)據(jù)類型。 1.2.3 面向?qū)ο蟪绦蛟O(shè)計(jì)中的基本概念 “面向?qū)ο蟆弊鳛橐粋€(gè)術(shù)語(yǔ),在不同的人群中有著不同的解釋。因此,了解一些在面向?qū)ο蟪绦蛟O(shè)計(jì)中廣泛應(yīng)用的概念是必須的。本節(jié)我們討論以下這些內(nèi)容:
1、對(duì)象(Object)
2、類(Class)
?3、數(shù)據(jù)抽象(Data abstraction)
4、繼承(Inheritance)
5、動(dòng)態(tài)綁定(Dynamic binding)
6、數(shù)據(jù)封裝(Data encapsulation)
7、多態(tài)性(Polymorphism)
8、消息傳遞(Message passing)
對(duì)象
在一個(gè)面向?qū)ο蟮南到y(tǒng)中,對(duì)象是運(yùn)行期的基本實(shí)體。它可以用來(lái)表示一個(gè)人或者說(shuō)一個(gè)銀行帳戶,一張數(shù)據(jù)表格,或者其它什么需要被程序處理的東西。它也可以用來(lái)表示用戶定義的數(shù)據(jù),例如一個(gè)向量,時(shí)間或者列表。在面向?qū)ο蟪绦蛟O(shè)計(jì)中,問(wèn)題的分析一般以對(duì)象及對(duì)象間的自然聯(lián)系為依據(jù)。如前所述,對(duì)象在內(nèi)存中占有一定空間,并且具有一個(gè)與之關(guān)聯(lián)的地址,就像Pascal中的record和C中的結(jié)構(gòu)一樣。 當(dāng)一個(gè)程序運(yùn)行時(shí),對(duì)象之間通過(guò)互發(fā)消息來(lái)相互作用。例如,程序中包含一個(gè)“customer”對(duì)象和一個(gè)“account”對(duì)象,而customer對(duì)象可能會(huì)向account對(duì)象發(fā)送一個(gè)消息,查詢其銀行帳目。每個(gè)對(duì)象都包含數(shù)據(jù)以及操作這些數(shù)據(jù)的代碼。即使不了解彼此的數(shù)據(jù)和代碼的細(xì)節(jié),對(duì)象之間依然可以相互作用,所要了解的只是對(duì)象能夠接受的消息的類型,以及對(duì)象返回的響應(yīng)的類型,雖然不同的人會(huì)以不同的方法實(shí)現(xiàn)它們。
類
我們剛才提到,對(duì)象包含數(shù)據(jù)以及操作這些數(shù)據(jù)的代碼。一個(gè)對(duì)象所包含的所有數(shù)據(jù)和代碼可以通過(guò)類來(lái)構(gòu)成一個(gè)用戶定義的數(shù)據(jù)類型。事實(shí)上,對(duì)象就是類類型(class type)的變量。一旦定義了一個(gè)類,我們就可以創(chuàng)建這個(gè)類的多個(gè)對(duì)象,每個(gè)對(duì)象與一組數(shù)據(jù)相關(guān),而這組數(shù)據(jù)的類型在類中定義。因此,一個(gè)類就是具有相同類型的對(duì)象的抽象。例如,芒果、蘋果和桔子都是fruit類的對(duì)象。類是用戶定義的數(shù)據(jù)類型,但在一個(gè)程序設(shè)計(jì)語(yǔ)言中,它和內(nèi)建的數(shù)據(jù)類型行為相同。比如創(chuàng)建一個(gè)類對(duì)象的語(yǔ)法和創(chuàng)建一個(gè)整數(shù)對(duì)象的語(yǔ)法一模一樣。如果fruit被定義為一個(gè)
類,那么語(yǔ)句 fruit mango; 就創(chuàng)建了一個(gè)fruit類的對(duì)象mango。 數(shù)據(jù)抽象和封裝
把數(shù)據(jù)和函數(shù)包裝在一個(gè)單獨(dú)的單元(稱為類)的行為稱為封裝。數(shù)據(jù)封裝是類的最典型特點(diǎn)。數(shù)據(jù)不能被外界訪問(wèn),只能被封裝在同一個(gè)類中的函數(shù)訪問(wèn)。這些函數(shù)提供了對(duì)象數(shù)據(jù)和程序之間的接口。避免數(shù)據(jù)被程序直接訪問(wèn)的概念被稱為“數(shù)據(jù)隱藏”。 抽象指僅表現(xiàn)核心的特性而不描述背景細(xì)節(jié)的行為。類使用了抽象的概念,并且被定義為一系列抽象的屬性如尺寸、重量和價(jià)格,以及操作這些屬性的函數(shù)。類封裝了將要被創(chuàng)建的對(duì)象的所有核心屬性。因?yàn)轭愂褂昧藬?shù)據(jù)抽象的概念,所以它們被稱為抽象數(shù)據(jù)類型(ADT)。
封裝
封裝機(jī)制將數(shù)據(jù)和代碼捆綁到一起,避免了外界的干擾和不確定性。它同樣允許創(chuàng)建對(duì)象。簡(jiǎn)單的說(shuō),一個(gè)對(duì)象就是一個(gè)封裝了數(shù)據(jù)和操作這些數(shù)據(jù)的代碼的邏輯實(shí)體。 在一個(gè)對(duì)象內(nèi)部,某些代碼和(或)某些數(shù)據(jù)可以是私有的,不能被外界訪問(wèn)。通過(guò)這種方式,對(duì)象對(duì)內(nèi)部數(shù)據(jù)提供了不同級(jí)別的保護(hù),以防止程序中無(wú)關(guān)的部分意外的改變或錯(cuò)誤的使用了對(duì)象的私有部分。
繼承
繼承是可以讓某個(gè)類型的對(duì)象獲得另一個(gè)類型的對(duì)象的屬性的方法。它支持按級(jí)分類的概念。例如,知更鳥屬于飛鳥類,也屬于鳥類。就像圖5中描繪的那樣,這種分類的原則是,每一個(gè)子類都具有父類的公共特性。
?
在OOP中,繼承的概念很好的支持了代碼的重用性(reusability),也就是說(shuō),我們可以向一個(gè)已經(jīng)存在的類中添加新的特性,而不必改變這個(gè)類。這可以通過(guò)從這個(gè)已存在的類派生一個(gè)新類來(lái)實(shí)現(xiàn)。這個(gè)新的類將具有原來(lái)那個(gè)類的特性,以及新的特性。而繼承機(jī)制的魅力和強(qiáng)大就在于它允許程序員利用已經(jīng)存在的類(接近需要,而不是完全符合需要的類),并且可以以某種方式修改這個(gè)類,而不會(huì)影響其它的東西。 注意,每個(gè)子類只定義那些這個(gè)類所特有的特性。而如果沒(méi)有按級(jí)分類,每類都必須顯式的定義它所有的特性。
多態(tài)
多態(tài)是OOP的另一個(gè)重要概念。多態(tài)的意思是事物具有不同形式的能力。舉個(gè)例子,對(duì)于不同的實(shí)例,某個(gè)操作可能會(huì)有不同的行為。這個(gè)行為依賴于所要操作數(shù)據(jù)的類型。比如說(shuō)加法操作,如果操作的數(shù)據(jù)是數(shù),它對(duì)兩個(gè)數(shù)求和。如果操作的數(shù)據(jù)是字符串,則它將連接兩個(gè)字符串。 圖6演示了一個(gè)函數(shù)處理不同數(shù)量、不同類型的參數(shù)。就像某個(gè)單詞在不同的上下文中具有不同的含義
?
多態(tài)機(jī)制使具有不同內(nèi)部結(jié)構(gòu)的對(duì)象可以共享相同的外部接口。這意味著,雖然針對(duì)不同對(duì)象的具體操作不同,但通過(guò)一個(gè)公共的類,它們(那些操作)可以通過(guò)相同的方式予以調(diào)用。多態(tài)在實(shí)現(xiàn)繼承的過(guò)程中被廣泛應(yīng)用。 面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言支持多態(tài),術(shù)語(yǔ)稱之為“one interface multiple method(一個(gè)接口,多個(gè)實(shí)現(xiàn))”。簡(jiǎn)單來(lái)說(shuō),多態(tài)機(jī)制允許通過(guò)相同的接口引發(fā)一組相關(guān)但不相同的動(dòng)作,通過(guò)這種方式,可以減少代碼的復(fù)雜度。在某個(gè)特定的情況下應(yīng)該作出怎樣的動(dòng)作,這由編譯器決定,而不需要程序員手工干預(yù)。 在多函數(shù)程序中,許多重要的數(shù)據(jù)被聲明為全局變量,這樣它們才可以被所有的函數(shù)訪問(wèn)。每個(gè)函數(shù)又可以具有它自己的局部變量。全局變量很容易被某個(gè)函數(shù)不經(jīng)意之間改變。而在一個(gè)大程序中,很難分辨每個(gè)函數(shù)都使用了哪些變量。如果我們需要修改某個(gè)外部數(shù)據(jù)的結(jié)構(gòu),我們就要修改所有訪問(wèn)這個(gè)數(shù)據(jù)的函數(shù)。這很容易導(dǎo)致bug的產(chǎn)生
在結(jié)構(gòu)化程序設(shè)計(jì)中,另一個(gè)嚴(yán)重的缺陷是不能很好的模擬真實(shí)世界的問(wèn)題。這是因?yàn)楹瘮?shù)都是面向過(guò)程的,而不是真正的對(duì)應(yīng)于問(wèn)題中的各個(gè)元素。 面向過(guò)程的程序設(shè)計(jì)的一些特點(diǎn)如下:
?強(qiáng)調(diào)做(算法);
?大程序被分隔為許多小程序,這些小程序稱為函數(shù); ?大多數(shù)函數(shù)共享全局?jǐn)?shù)據(jù);
?數(shù)據(jù)開(kāi)放的由一個(gè)函數(shù)流向另一個(gè)函數(shù)。函數(shù)把數(shù)據(jù)從一種形式轉(zhuǎn)換為另一種形式。 采用由上至下的程序設(shè)計(jì)方法。
動(dòng)態(tài)綁定
綁定指的是將一個(gè)過(guò)程調(diào)用與相應(yīng)代碼鏈接起來(lái)的行為。動(dòng)態(tài)綁定的意思是,與給定的過(guò)程調(diào)用相關(guān)聯(lián)的代碼只有在運(yùn)行期才可知。它與多態(tài)和繼承的聯(lián)系極為緊密。一個(gè)多態(tài)引用的函數(shù)調(diào)用決定于這個(gè)引用的動(dòng)態(tài)類型。 考慮圖6中的“draw”方法。通過(guò)繼承,每個(gè)對(duì)象都具備了這個(gè)過(guò)程。但是,對(duì)于不同的對(duì)象它的算法是不同的,因此,draw過(guò)程必須在每一個(gè)類中重新定義。在運(yùn)行期,當(dāng)前引用對(duì)象所對(duì)應(yīng)的代碼將被調(diào)用。
消息傳遞
一個(gè)面向?qū)ο蟮某绦蛴稍S多對(duì)象組成,這些對(duì)象之間需要相互溝通。因此,在面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言中,程序設(shè)計(jì)的主要步驟如下: 1、創(chuàng)建類,這些類定義了對(duì)象及其行為; 2、由類定義創(chuàng)建對(duì)象; 3、建立對(duì)象之間的通訊。 對(duì)象之間通過(guò)收發(fā)信息相互溝通,這一點(diǎn)類似于人與人之間的信息傳遞。信息傳遞的概念使得真實(shí)世界的直接模擬更易于和建立系統(tǒng)交流。 對(duì)于某個(gè)特定對(duì)象來(lái)說(shuō),消息就是請(qǐng)求執(zhí)行某個(gè)過(guò)程,因此,消息的接收對(duì)象會(huì)調(diào)用一個(gè)函數(shù)(過(guò)程),以產(chǎn)生預(yù)期的結(jié)果。傳遞的消息的內(nèi)容包括接收消息的對(duì)象的名字,需要調(diào)用的函數(shù)的名字,以及必要的信息。 對(duì)象就有一個(gè)生命周期。它們可以被創(chuàng)建和銷毀。只要對(duì)象正處于其生存期,就可以與其進(jìn)行通訊。
評(píng)論
查看更多