主要有以下特點(diǎn):
(1)從問(wèn)題域中客觀存在的事物出發(fā)來(lái)構(gòu)造軟件系統(tǒng),用對(duì)象作為對(duì)這些事物的抽象表示,并以此作為系統(tǒng)的基本構(gòu)成單位。
(2)事物的靜態(tài)特征(即可能用一些數(shù)據(jù)來(lái)表達(dá)的特征)用對(duì)象的屬性表示,事物的動(dòng)態(tài)特征(即事物的行為)用對(duì)象的服務(wù)表示。
(3)對(duì)象的屬性與服務(wù)結(jié)合為一體,成為一個(gè)獨(dú)立的實(shí)體,對(duì)外屏蔽其內(nèi)部細(xì)節(jié),即封裝。
(4)對(duì)事物進(jìn)行分類(lèi)。把具有相同屬性和服務(wù)的對(duì)象歸為一類(lèi),類(lèi)是這些對(duì)象的抽象描述,每個(gè)對(duì)象是它的類(lèi)的一個(gè)示例。
(5)通過(guò)在不同程度上運(yùn)用抽象的原則,可以得到較一般的類(lèi)和較特殊的類(lèi)。特殊類(lèi)繼承一般類(lèi)的屬性與服務(wù),面向?qū)ο蠓椒ㄖС謱?duì)這種繼承關(guān)系的描述與實(shí)現(xiàn),從而簡(jiǎn)化系統(tǒng)的構(gòu)造過(guò)程及其文檔。
(6)復(fù)雜的對(duì)象可以用簡(jiǎn)單的對(duì)象作為其構(gòu)成部分,稱(chēng)作聚合。
(7)對(duì)象之間通過(guò)消息進(jìn)行通信,以實(shí)現(xiàn)對(duì)象之間的動(dòng)態(tài)聯(lián)系。
(8)通過(guò)關(guān)聯(lián)表達(dá)對(duì)象之間的靜態(tài)關(guān)系。
面向?qū)ο蟮木幊陶Z(yǔ)言(Object-oriented Programming Language)是專(zhuān)門(mén)為面向?qū)ο笥^念而發(fā)展出來(lái)的,通過(guò)它可以便捷地實(shí)現(xiàn)面向?qū)ο蟮姆庋b、繼承、多態(tài)等特性。
1.封裝 封裝是一種信息隱藏技術(shù),即對(duì)象內(nèi)部對(duì)用戶(hù)是隱藏的,不可直接訪(fǎng)問(wèn);用戶(hù)只能見(jiàn)到對(duì)象封裝界面上的信息,通過(guò)對(duì)象的外部接口訪(fǎng)問(wèn)對(duì)象。封裝的目的在于將對(duì)象的使用者和對(duì)象的設(shè)計(jì)者分開(kāi),使用者無(wú)須知道對(duì)象內(nèi)部實(shí)現(xiàn)的細(xì)節(jié),只需要知道對(duì)象接收的消息即可。
當(dāng)用戶(hù)向?qū)ο蟀l(fā)送消息后,對(duì)象將根據(jù)收到的消息來(lái)調(diào)用內(nèi)部方法以做出響應(yīng)。 在C++語(yǔ)言中,對(duì)象的構(gòu)成由類(lèi)來(lái)描述,每個(gè)類(lèi)的成員可以分為私有和公有兩種類(lèi)型,對(duì)象的外部不能直接訪(fǎng)問(wèn)對(duì)象的私有部分。
對(duì)象的封裝特性可以提高模塊之間的獨(dú)立性,使得系統(tǒng)易于調(diào)試和維護(hù)。 假設(shè)應(yīng)用系統(tǒng)中有兩個(gè)模塊:一個(gè)模塊從計(jì)算機(jī)的串行通訊口接收數(shù)據(jù),放入緩沖區(qū);另一個(gè)為數(shù)據(jù)處理模塊。
數(shù)據(jù)處理模塊可以直接訪(fǎng)問(wèn)緩沖區(qū),從緩沖區(qū)中讀取數(shù)據(jù)。此時(shí)這兩個(gè)模塊之間的關(guān)聯(lián)程度密切,模塊獨(dú)立性很差。
如果接收數(shù)據(jù)的模塊改變緩沖區(qū)的管理方法,則第二個(gè)模塊必須做相應(yīng)的改變。如果數(shù)據(jù)處理模塊對(duì)緩沖區(qū)操作有誤,將影響數(shù)據(jù)接收模塊,在程序調(diào)試時(shí)難以確定錯(cuò)誤發(fā)生在哪一個(gè)模塊中。
實(shí)際上,數(shù)據(jù)處理模塊并不需要緩沖區(qū)的管理信息,它只需要知道緩沖區(qū)中有沒(méi)有數(shù)據(jù)以及有什么樣的數(shù)據(jù)。上面的處理方法違反了軟件工程中的信息隱藏原則,數(shù)據(jù)處理模塊訪(fǎng)問(wèn)了它不需要的信息。
將數(shù)據(jù)接收模塊封裝為一個(gè)對(duì)象,緩沖區(qū)的管理信息作為其私有數(shù)據(jù),即可避免上面的問(wèn)題。數(shù)據(jù)接收模塊只要提供一個(gè)從緩沖區(qū)獲得數(shù)據(jù)的接口即可。
數(shù)據(jù)處理模塊只能訪(fǎng)問(wèn)該接口,而不能直接操作緩沖區(qū)。此時(shí)兩個(gè)模塊之間的獨(dú)立性提高,如需改變緩沖區(qū)的管理方法,只需修改數(shù)據(jù)接收模塊,數(shù)據(jù)處理模塊將不受任何影響,因?yàn)閿?shù)據(jù)接收模塊提供的外部接口沒(méi)有改變。
2.繼承 人們?cè)趯?duì)客觀世界的事物進(jìn)行描述時(shí),經(jīng)常采取分類(lèi)的方法。類(lèi)是有層次的,即某個(gè)大類(lèi)的事物可能分為若干小類(lèi),而這些小類(lèi)可能又分為若干個(gè)更小的類(lèi)。
面向?qū)ο笏枷氩杉{了事物分類(lèi)的層次思想,在描述類(lèi)的時(shí)候,某些類(lèi)之間具有結(jié)構(gòu)和行為的共性。例如教師類(lèi)與學(xué)生類(lèi),在結(jié)構(gòu)方面均具有姓名、年齡、身高、體重等,在行為(或操作)方面均具有回答身高、回答體重等操作。
將這些共性抽取出來(lái),形成一個(gè)單獨(dú)的類(lèi)--人,描述教師類(lèi)和學(xué)生類(lèi)中的共性。類(lèi)(人)的結(jié)構(gòu)特征和行為特征可以被多個(gè)相關(guān)的類(lèi)共享,例如教師類(lèi)和學(xué)生類(lèi)繼承了人的結(jié)構(gòu)和行為特征。
在C++語(yǔ)言中,通過(guò)類(lèi)的派生機(jī)制來(lái)實(shí)現(xiàn)類(lèi)的繼承,可以從一個(gè)類(lèi)中派生出一個(gè)新的類(lèi),這個(gè)類(lèi)稱(chēng)為派生類(lèi)的基類(lèi)或父類(lèi),派生出的新類(lèi)稱(chēng)為基類(lèi)的派生類(lèi)或子類(lèi)。派生類(lèi)的對(duì)象具有基類(lèi)對(duì)象的特征,同時(shí)又有其自身特有的特征。
一個(gè)教師類(lèi)的對(duì)象與一個(gè)學(xué)生類(lèi)的對(duì)象都具有人這個(gè)類(lèi)所描述的特征,同時(shí)又具有教師類(lèi)和學(xué)生類(lèi)各自所特有的特征。 利用類(lèi)之間的繼承關(guān)系,可以簡(jiǎn)化類(lèi)的描述。
在人這個(gè)類(lèi)中描述教師類(lèi)和學(xué)生類(lèi)的共性,而在學(xué)生類(lèi)和教師類(lèi)中只需描述各自的個(gè)性。利用繼承機(jī)制可以提高軟件代碼的可重用性。
在設(shè)計(jì)一個(gè)新類(lèi)時(shí),不必從頭設(shè)計(jì)和編寫(xiě)全部的代碼,可以通過(guò)從已有的具有類(lèi)似特性的類(lèi)中派生出一個(gè)類(lèi),繼承原有類(lèi)中的部分特性,再加上所需要的新特性。這一點(diǎn)與面向過(guò)程的設(shè)計(jì)語(yǔ)言中的過(guò)程或函數(shù)不同,在面向過(guò)程的設(shè)計(jì)語(yǔ)言中,要使用具有相似功能的過(guò)程或函數(shù),必須修改源程序代碼以使其適應(yīng)新系統(tǒng)的功能需求,而類(lèi)的派生機(jī)制無(wú)需原有類(lèi)的源代碼即可派生出新的類(lèi)。
利用類(lèi)及其繼承性描述系統(tǒng)時(shí),由于類(lèi)之間的繼承關(guān)系,可能會(huì)形成一種具有層次性的類(lèi)結(jié)構(gòu)。在使用類(lèi)的層次結(jié)構(gòu)描述系統(tǒng)時(shí),某些類(lèi)之間的層次關(guān)系可以有多種實(shí)現(xiàn)方案。
例如中學(xué)生類(lèi),既可以直接從人這個(gè)類(lèi)派生出來(lái),也可以從人這個(gè)類(lèi)的派生類(lèi)--學(xué)生類(lèi)派生出來(lái)。 在設(shè)計(jì)類(lèi)的層次結(jié)構(gòu)時(shí),應(yīng)注意建立的類(lèi)層次結(jié)構(gòu)是否易于理解以及組織類(lèi)結(jié)構(gòu)的費(fèi)用等方面的問(wèn)題。
設(shè)計(jì)出來(lái)的類(lèi)層次結(jié)構(gòu)是否合理,往往取決于系統(tǒng)分析員的經(jīng)驗(yàn)等因素。 3.多態(tài)性 多態(tài)性是面向?qū)ο笙到y(tǒng)的又一重要特性。
所謂多態(tài),即一個(gè)名詞可具有多種語(yǔ)義。在C++語(yǔ)言中,多態(tài)性主要表現(xiàn)在以下兩個(gè)方面。
(1) 重載 在C++語(yǔ)言中,同一函數(shù)名以及運(yùn)算符可以具有不同含義的多種實(shí)現(xiàn)版本,編譯器將根據(jù)函數(shù)調(diào)用的參數(shù)形式?jīng)Q定調(diào)用哪一種實(shí)現(xiàn)版本。 (2) 虛函數(shù) C++語(yǔ)言引入了虛函數(shù)機(jī)制,允許在不同類(lèi)層次對(duì)象中應(yīng)用函數(shù)成員的不同版本。
例如實(shí)現(xiàn)一個(gè)類(lèi)Shape,然后從該類(lèi)派生出畫(huà)點(diǎn)的類(lèi)Point、畫(huà)圓的類(lèi)Circle、畫(huà)直線(xiàn)的類(lèi)Line,每一種圖形的畫(huà)法均不同,但是它們都有幾種共同的操作--顯示圖形、擦除圖形、移動(dòng)圖形。移動(dòng)圖形的操作都是首先擦除圖形,然后改變圖形的位置基準(zhǔn)點(diǎn),再在新位置顯示出圖形。
在類(lèi)Shape中實(shí)現(xiàn)移動(dòng)圖形的操作,每種圖形的顯示、擦除、改變基準(zhǔn)點(diǎn)等操作在派生類(lèi)中分別實(shí)現(xiàn)。若程序中使用某圖形對(duì)象的移動(dòng)操作,編譯器采用動(dòng)態(tài)聯(lián)編的手段,在執(zhí)行時(shí)根據(jù)該圖形對(duì)象是哪一個(gè)類(lèi)的實(shí)例,決定調(diào)用。
主要有以下特點(diǎn):(1)從問(wèn)題域中客觀存在的事物出發(fā)來(lái)構(gòu)造軟件系統(tǒng),用對(duì)象作為對(duì)這些事物的抽象表示,并以此作為系統(tǒng)的基本構(gòu)成單位。
(2)事物的靜態(tài)特征(即可能用一些數(shù)據(jù)來(lái)表達(dá)的特征)用對(duì)象的屬性表示,事物的動(dòng)態(tài)特征(即事物的行為)用對(duì)象的服務(wù)表示。(3)對(duì)象的屬性與服務(wù)結(jié)合為一體,成為一個(gè)獨(dú)立的實(shí)體,對(duì)外屏蔽其內(nèi)部細(xì)節(jié),即封裝。
(4)對(duì)事物進(jìn)行分類(lèi)。把具有相同屬性和服務(wù)的對(duì)象歸為一類(lèi),類(lèi)是這些對(duì)象的抽象描述,每個(gè)對(duì)象是它的類(lèi)的一個(gè)示例。
(5)通過(guò)在不同程度上運(yùn)用抽象的原則,可以得到較一般的類(lèi)和較特殊的類(lèi)。特殊類(lèi)繼承一般類(lèi)的屬性與服務(wù),面向?qū)ο蠓椒ㄖС謱?duì)這種繼承關(guān)系的描述與實(shí)現(xiàn),從而簡(jiǎn)化系統(tǒng)的構(gòu)造過(guò)程及其文檔。
(6)復(fù)雜的對(duì)象可以用簡(jiǎn)單的對(duì)象作為其構(gòu)成部分,稱(chēng)作聚合。(7)對(duì)象之間通過(guò)消息進(jìn)行通信,以實(shí)現(xiàn)對(duì)象之間的動(dòng)態(tài)聯(lián)系。
(8)通過(guò)關(guān)聯(lián)表達(dá)對(duì)象之間的靜態(tài)關(guān)系。
你是說(shuō)面向?qū)ο缶幊蹋∣OP)嗎?面向?qū)ο缶幊逃袃桑ㄈ??)大特征:封裝、繼承和多態(tài)。
對(duì)于Java來(lái)說(shuō):封裝即不公開(kāi)屬性本身,而是公開(kāi)對(duì)屬性存取操作的方法(getter/setter),在方法中進(jìn)行部分邏輯的判斷保證屬性的值合法(比如年齡必須為大于0的整數(shù));繼承可以實(shí)現(xiàn)類(lèi)的重用;多態(tài)依賴(lài)于繼承存在,在子類(lèi)中重寫(xiě)自父類(lèi)繼承的方法實(shí)現(xiàn)對(duì)象不同時(shí)調(diào)用同樣方法做出不同響應(yīng)。之所以說(shuō)是三大特征是將繼承與多態(tài)拆開(kāi)說(shuō),但是以我的理解我認(rèn)為沒(méi)有繼承就沒(méi)有多態(tài)。
面向?qū)ο蟀阉谐绦蛑谐霈F(xiàn)的量都定義為類(lèi),一個(gè)合理的類(lèi)定義中,其屬性和方法都是必須的合理的,能夠合理描述這個(gè)類(lèi)型完成的任務(wù)。
現(xiàn)在讓我們把所有這些屬性方法分散開(kāi)來(lái),出現(xiàn)了什么!它變成了C程序的樣子,我們無(wú)法分清楚多個(gè)相同name變量是用來(lái)描述什么的,我們需要維護(hù)一長(zhǎng)串變量列表和函數(shù)列表。但是對(duì)象語(yǔ)言將一組屬性和函數(shù)封裝在一起,我們聲明了一個(gè)人的對(duì)象便知道他有名字屬性和吃飯動(dòng)作。
我們僅需要維護(hù)少量的類(lèi)型,類(lèi)型的屬性則在我們聲明此類(lèi)的時(shí)候明確理解了因此不需要額外的記憶。對(duì)象語(yǔ)言設(shè)計(jì)更加緊湊明了,代碼意義更加明確。
VFP,也就是Visual FoxPro,是應(yīng)用程序開(kāi)發(fā)軟件,主要用于開(kāi)發(fā)數(shù)據(jù)管理與運(yùn)算等方面的軟件。
VFP通過(guò)對(duì)象的屬性、事件和方法來(lái)處理對(duì)象。
屬性定義對(duì)象的特征或某一方面的行為。
方法(Method)是對(duì)象能夠執(zhí)行的一個(gè)操作。在Visual FoxPro中,方法是與對(duì)象相關(guān)聯(lián)的過(guò)程
(完成某種操作的處理代碼),通常也稱(chēng)為方法程序,它緊密地和對(duì)象連接在一起。
事件(Event)是由對(duì)象識(shí)別的一個(gè)動(dòng)作,可以編寫(xiě)相應(yīng)的代碼對(duì)此動(dòng)作進(jìn)行響應(yīng).事件可
以具有與之相關(guān)聯(lián)的方法程序。
通常事件是由一個(gè)用戶(hù)動(dòng)作產(chǎn)生,如單擊鼠標(biāo)(Click)、移動(dòng)鼠標(biāo)(MouseMove)或按鍵(KeyPress)等,也可以由程序代碼或系統(tǒng)產(chǎn)生,如計(jì)時(shí)器。在Visual FoxPro中,不同的
對(duì)象所能識(shí)別的事件雖然有所不同,但事件集合是固定的,用戶(hù)不能創(chuàng)建新的事件。
面向?qū)ο箝_(kāi)發(fā)方法的特點(diǎn)主要有一下三點(diǎn):
1、可重用性
可重用性是面向?qū)ο筌浖_(kāi)發(fā)的一個(gè)核心思路,事實(shí)上前面所介紹的面向?qū)ο蟪绦蛟O(shè)的四大特點(diǎn),無(wú)一例外地,都或多或少地在圍繞著可重用性這個(gè)核心并為之服務(wù)。
我們知道,應(yīng)用軟件是由模塊組成的。可重用性就是指一個(gè)軟件項(xiàng)目中所開(kāi)發(fā)的模塊,能夠不僅限于在這個(gè)項(xiàng)目中使用,而是可以重復(fù)地使用在其他項(xiàng)目中,從而在多個(gè)不同的系統(tǒng)中發(fā)揮作用。
可重用模塊必須是結(jié)構(gòu)完整、邏輯嚴(yán)謹(jǐn)、功能明確的獨(dú)立軟件結(jié)構(gòu);其次,可重用模塊必須具有良好的可移植性,可以使用在各種不同的軟硬件環(huán)境和不同的程序框架里;最后,可重用模塊應(yīng)該具有與外界交互、通信的功能。
2、可擴(kuò)展性
可擴(kuò)展性是對(duì)現(xiàn)代應(yīng)用軟件提出的又一個(gè)重要要求,即要求應(yīng)用軟件能夠很方便、容易地進(jìn)行擴(kuò)充和修改,
這種擴(kuò)充和修改的范圍不但涉及到軟件的內(nèi)容,也涉及到軟件的形進(jìn)和工作機(jī)制?,F(xiàn)代應(yīng)用軟件的修改更新頻率越來(lái)越快,究其原因,即有用戶(hù)業(yè)務(wù)發(fā)展、更迭引起
的相應(yīng)的軟件內(nèi)容的修改和擴(kuò)充,也有因計(jì)算機(jī)技術(shù)本身發(fā)展造成的軟件的升級(jí)換代,如現(xiàn)在呼聲很迫切的把原客戶(hù)機(jī)/服務(wù)器模式下的應(yīng)用移植到因特網(wǎng)上的工
作,就是這樣一種軟件升級(jí)。
使用面向?qū)ο蠹夹g(shù)開(kāi)發(fā)的應(yīng)用程序,具有較好的可擴(kuò)展性。
面向?qū)ο蠹夹g(shù)的可擴(kuò)展性,首先體現(xiàn)在它特別適合于使用在快速原型的軟件開(kāi)發(fā)方法中??焖僭头ㄊ茄芯寇浖芷诘难芯咳藛T提出的一種開(kāi)發(fā)步驟,相對(duì)
于傳統(tǒng)的瀑布式的開(kāi)發(fā)方法,它在某些程度上來(lái)說(shuō)更加靈活和實(shí)用。快速原型法的開(kāi)發(fā)過(guò)程是這樣的(參看圖4.9),首先在了解了用戶(hù)的需求之后,開(kāi)發(fā)人員利
用開(kāi)發(fā)工具先做一個(gè)系統(tǒng)的雛形,稱(chēng)為原型,這個(gè)原型盡管粗糙,但卻應(yīng)該是完整的、可工作的。開(kāi)發(fā)人員帶著這個(gè)原型征求用戶(hù)的意見(jiàn),再根據(jù)用戶(hù)的改進(jìn)意見(jiàn)在
第一個(gè)原型的基礎(chǔ)上修改和進(jìn)一步開(kāi)發(fā),形成第二個(gè)原型,再帶著第二個(gè)原型去征求用戶(hù)的意見(jiàn)……如此循環(huán)往復(fù),不斷地在已有工作的基礎(chǔ)上修改、細(xì)化、完善,
直到把最初粗陋的雛形精雕細(xì)琢成最終的功能完整、結(jié)構(gòu)嚴(yán)謹(jǐn)?shù)膽?yīng)用系統(tǒng)。
3、可管理性
以往面向過(guò)程的開(kāi)發(fā)方法是以過(guò)程或函數(shù)為基本單元來(lái)構(gòu)建整個(gè)系統(tǒng)的,當(dāng)開(kāi)發(fā)項(xiàng)目的規(guī)模變大時(shí),需要的過(guò)程和函數(shù)數(shù)量成倍增多,不利于管理和控制。而面向?qū)ο蟮拈_(kāi)發(fā)方法采用內(nèi)涵比過(guò)程和函數(shù)豐富、復(fù)雜得多的類(lèi)作為構(gòu)建系統(tǒng)的部件,使整個(gè)項(xiàng)目的組織更加合理、方便。
例如一個(gè)系統(tǒng),如采用面向過(guò)程的開(kāi)發(fā)方法來(lái)實(shí)現(xiàn),可能需要3000個(gè)過(guò)程或函數(shù),要管理好這3000個(gè)過(guò)程或函數(shù),它們?cè)谙到y(tǒng)各種可能狀態(tài)下的行為,
它們之間錯(cuò)綜復(fù)雜的關(guān)系,顯然是一件非常麻煩的工作,也容易出現(xiàn)失誤和遺漏。如果這個(gè)系統(tǒng)采用面向?qū)ο箝_(kāi)發(fā)方法來(lái)實(shí)現(xiàn),則可能僅用100個(gè)類(lèi),平均每個(gè)類(lèi)
包含30個(gè)方法,就可以完成同樣的功能。100相對(duì)于3000,大大降低了管理、控制的工作量,從開(kāi)發(fā)效率和質(zhì)量保證等各個(gè)方面,都有很大的優(yōu)越性。
另外,面向?qū)ο箝_(kāi)發(fā)方法中的類(lèi),把數(shù)據(jù)和基上的操作封裝在一起,使得僅本類(lèi)的有限個(gè)方法才可以操縱、改變這些數(shù)據(jù)。這樣,仍以上面的例子為例,當(dāng)出現(xiàn)
數(shù)據(jù)的錯(cuò)誤時(shí),只需要檢查與該據(jù)相關(guān)的在同一個(gè)類(lèi)中的30個(gè)方法即可,而在面向過(guò)程開(kāi)發(fā)方法中處理相同的問(wèn)題,則可能需要把所有的3000個(gè)過(guò)程或函數(shù)統(tǒng)
統(tǒng)檢查一遍,兩者在工作量、效率和難易程度方面的差別是不信而喻的。
聲明:本網(wǎng)站尊重并保護(hù)知識(shí)產(chǎn)權(quán),根據(jù)《信息網(wǎng)絡(luò)傳播權(quán)保護(hù)條例》,如果我們轉(zhuǎn)載的作品侵犯了您的權(quán)利,請(qǐng)?jiān)谝粋€(gè)月內(nèi)通知我們,我們會(huì)及時(shí)刪除。
蜀ICP備2020033479號(hào)-4 Copyright ? 2016 學(xué)習(xí)鳥(niǎo). 頁(yè)面生成時(shí)間:2.626秒