面向?qū)ο蟮某绦蜷_發(fā)方法_第1頁
面向?qū)ο蟮某绦蜷_發(fā)方法_第2頁
面向?qū)ο蟮某绦蜷_發(fā)方法_第3頁
面向?qū)ο蟮某绦蜷_發(fā)方法_第4頁
面向?qū)ο蟮某绦蜷_發(fā)方法_第5頁
已閱讀5頁,還剩1頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

2.4面向?qū)ο蟮某绦蜷_發(fā)方法2.4.1面向?qū)ο蟮幕靖拍钏季S方式?jīng)Q定解決問題的方式,傳統(tǒng)軟件開發(fā)采用自頂向下的思想指導(dǎo)程序設(shè)計,即將目標劃分為若干子目標,子目標再進一步劃分下去,直到目標能被編程實現(xiàn)為止。面向?qū)ο蠹夹g(shù)給軟件設(shè)計領(lǐng)域帶來極大的變化,它利用軟件對象來進行程序開發(fā),所謂對象是包含數(shù)據(jù)和對數(shù)據(jù)操作的代碼實體,或者說是在傳統(tǒng)的數(shù)據(jù)結(jié)構(gòu)中加入一些被稱為成員函數(shù)的過程,因而賦予對象以動作。而在程序設(shè)計中,對象具有與現(xiàn)實世界的某種對應(yīng)關(guān)系,我們正是利用這種關(guān)系對問題進行分解。從程序語言角度來看,在一個對象中代碼和(或)數(shù)據(jù)可以是這個對象私有的,不能被對象外的部分直接訪問。因而對象提供了一種高級保護以防止程序被無關(guān)部分錯誤修改或錯誤地使用了對象的私有部分。當從對象外部試圖直接對受保護的內(nèi)部數(shù)據(jù)進行修改時,將被程序拒絕,只有通過對象所提供的對外服務(wù)函數(shù)材能夠?qū)ζ鋬?nèi)部數(shù)據(jù)進行必要的加工,從而保證了數(shù)據(jù)加工的合法性。從這一意義上講,把這種代碼和數(shù)據(jù)的聯(lián)系稱為〃封裝〃。換句話說,封裝是將對象封閉保護起來,是將內(nèi)部細節(jié)隱蔽起來的能力。在強調(diào)軟件組件的重用方面,面向?qū)ο蟮募夹g(shù)與標準的工業(yè)設(shè)計規(guī)律有更多相似之處。在面向?qū)ο笳Z言中,類是創(chuàng)建對象的關(guān)鍵,事實上類描述了一族對象的公共特征和操作,而對象則是具體實現(xiàn)的類。例如小汽車是一個基本概念,它具有顏色、幾何尺寸、動力特性的特征。那我們可以定義一個稱為"car"的類,具有顏色、幾何尺寸、動力特征等參數(shù),以及描述汽車在外界條件下運動狀態(tài)的成員函數(shù)。一輛具體的小汽車則是一個對象,在這個對象中有關(guān)參數(shù)均有具體數(shù)值,并可以通過輸入說明變量(外界條件參數(shù))獲取該車具體運動狀態(tài)。C++和Smalltalk是廣泛被接受的面向?qū)ο蟮某绦蛟O(shè)計語言,在歐洲Eiffel擁有一批追隨者,而Ada9X通過附加多態(tài)性和繼承性,將把Ada語言全面引入面向?qū)ο蟮氖澜?。面向?qū)ο蠹夹g(shù)給軟件發(fā)展帶來如下益處:*可重用性。從一開始對象的產(chǎn)生就是為了重復(fù)利用,完成的對象將在今后的程序開發(fā)中被部分或全部地重復(fù)利用。*可靠性。由于面向?qū)ο蟮膽?yīng)用程序包含了通過測試的標準部分,因此更加可靠。由于大量代碼來源于成熟可靠的類庫,因而新開發(fā)程序的新增代碼明顯減少,這是程序可靠性提高的一個重要原因。*連續(xù)性。具有面向?qū)ο筇攸c的C++與C語言有很大的兼容性,C程序員可以比較容易地過渡到C++語言開發(fā)工作。面向?qū)ο笳Z言具有如下基本特征:*訪問控制。對象必須能夠?qū)ζ鋬?nèi)部的某些元素進行保護,是它們只能被內(nèi)部使用,而不受外部干擾。反過來,對象又必須同其它外部元素進行聯(lián)系,以便對對象進行操作。在C++中,類有私有的(private)、保護的(protected)和公有的(public)三種訪問機制。*繼承性。通過對已有對象進行增加或部分修改的方法建立新的對象,對已有對象可以增加數(shù)據(jù)和過程,也可以對其中某些過程進行從新定義。最初的類被稱為基類,從基類擴展出來的類稱為派生類。從已有類派生出新類是為了獲得更強的針對性。*多態(tài)性。正象生態(tài)系統(tǒng)一樣,繼承構(gòu)成了類族。通常這些類族中的類具有同名的成員函數(shù),例如OD分布類族,具有一個通用基類,兩個派生類:增長系數(shù)OD分布類和重力模型OD分布類,這幾個類都有同名的Exec成員函數(shù)。多態(tài)性意味著存在多種形式,能使人們在程序中激活任何屬于OD分布類族的類的Exec成員函數(shù),甚至在編譯可以不必具體知道對象是屬于增長系數(shù)OD類還是重力模型OD分布類。面向?qū)ο篌w系結(jié)構(gòu)技術(shù)有助于創(chuàng)建行業(yè)性軟件開發(fā)機構(gòu)。例如交通規(guī)劃盡管具有差別,但各城市所需要的軟件基本上是相同的,這就為軟件開發(fā)機構(gòu)提供了一種制作面向交通規(guī)劃的軟件框架(注意這里講的是軟件框架而不是通用性軟件)的機會。這種框架一旦開發(fā)成功,就可以多次反復(fù)利用。面向?qū)ο蠹夹g(shù)特別適合于將某一領(lǐng)域內(nèi)的軟件資源整理成體系化,因為它有很好的表現(xiàn)能力,能夠容易抓住特定功能領(lǐng)域的本質(zhì)。2.4.2面向?qū)ο蟮某绦蛟O(shè)計為有效使用面向?qū)ο蟮某绦蚍椒ǎ紫刃枰鉀Q程序的結(jié)構(gòu)設(shè)計問題。在程序設(shè)計過程中最重要的抽象,也就是說,從現(xiàn)實世界中抽象出合理的對象結(jié)構(gòu)。在面向?qū)ο笏枷胫?,抽象決定了對象的對外形象、內(nèi)部結(jié)構(gòu)以及處理對象的外部接口,其關(guān)鍵是處理對象的可見外部特征。封裝是與抽象緊密聯(lián)系的概念,它需要兩個基本前提:首先,對象必須能夠表現(xiàn)一個完備的概念,例如可以將一條道路的縱斷面設(shè)計作為一個對象,它與外部的聯(lián)系限于縱斷面地面線、縱斷面設(shè)計參數(shù)。當這些外部條件給定之后,對象可以獨立計算任意樁號的設(shè)計高程、地面高程、設(shè)計高差、填挖面積等,也可以根據(jù)給定的比例和初始坐標計算設(shè)計線和地面線的圖形坐標。第二,對象的私有性,例如上述示例中,對象的內(nèi)部數(shù)據(jù)結(jié)構(gòu)在外部是不可見的,其他程序員并不需要了解這種數(shù)據(jù)結(jié)構(gòu)就可以使用對象的功能。對于對象的接口設(shè)計是十分重要的,它必須給出必要的訪問渠道,同時必須盡可能地將內(nèi)部細節(jié)隱藏起來。我們可以將接口看作是在屏蔽墻上打開的一些出入通道,通道過多了就失去了屏蔽墻存在的意義,通道過少又由于限制過強而行動不便。一般情況下,這種通道表現(xiàn)為一組接口函數(shù),事實上我們也可以將一些變量作為對外開放的,但這并不是一種很好的方法。面向?qū)ο笤O(shè)計方法的另一個重要貢獻,是關(guān)于繼承與多態(tài)性的處理。所謂繼承是指從現(xiàn)存對象出發(fā)建立一個新的對象類型,使它具有原對象的特點和功能,這稱為〃派生"。同時,新的對象類型又具有某種新特點和新功能。這樣,我們可以采用對象派生的方法建立一個有層次的對外部世界的描述。例如,在第三章中我們可以看到一組有關(guān)三維曲面分塊的類族,從四條三維空間直線定義的簡單曲面,到四條復(fù)雜三維空間曲線定義的曲面,呈現(xiàn)復(fù)雜的分層次的多態(tài)性。但他們都有共同的接口函數(shù)形式:例如根據(jù)給定平面點計算高程等。2.4.3采用面向?qū)ο蠓椒ㄟM行程序開發(fā)的示例為了進一步幫助讀者了解面向?qū)ο蟮某绦蜷_發(fā)方法,我們在此介紹一個應(yīng)用示例,我們的目的是幫助理解這種方法,而不是具體教會讀者立刻能夠編程,因此這里使用的是不那么嚴密但易于理解的表述。為支持交通規(guī)劃決策支持系統(tǒng)、道路項目可行性研究決策支持系統(tǒng)開發(fā),建立了一個基礎(chǔ)類庫,庫中包含了大量的專用工具。這個類庫中有一個用于管理道路或交通網(wǎng)絡(luò)數(shù)據(jù)的類族,它為交通分配、數(shù)據(jù)檢查、圖形輸出等多個子系統(tǒng)提供支持。作為整個類族的基礎(chǔ),建立了一個拓撲網(wǎng)絡(luò),它只描述節(jié)點之間的連接特性,各邊均沒有長度、等級等方面的特性。對于這個拓撲網(wǎng),建立了整個類族的基礎(chǔ)-基類NetworkManager,其具體定義如下所示:【清單2—5】NetworkManager的說明classNetworkManager{本類管理拓撲特征的網(wǎng)絡(luò),在本網(wǎng)絡(luò)中各邊沒有長度、等級一類的參數(shù)。這構(gòu)成了所有網(wǎng)絡(luò)類的基類。protected:...public:構(gòu)造函數(shù)及析構(gòu)函數(shù)...

存序號intGetSetFlag(void);intNWAlloc(void);voidSetNetworkType(voidSetMaxLink(intvoidSetMaxNode(intinttype););intn2););intSetNetwork(intn1,intSetEnd(void);voidReverse(void);GetNumLink(void);GetNumNode(void);GetLinkStat(intn1,intn2);GetLink(intn1,intn2,intintintintintintint存序號intGetSetFlag(void);intNWAlloc(void);voidSetNetworkType(voidSetMaxLink(intvoidSetMaxNode(intinttype););intn2););intSetNetwork(intn1,intSetEnd(void);voidReverse(void);GetNumLink(void);GetNumNode(void);GetLinkStat(intn1,intn2);GetLink(intn1,intn2,intintintintintintintintintno);獲取設(shè)置狀態(tài)標志進行系統(tǒng)內(nèi)存分配設(shè)置網(wǎng)絡(luò)類型設(shè)置最大邊數(shù)設(shè)置節(jié)點的最大編號X在網(wǎng)絡(luò)中增設(shè)一條邊網(wǎng)絡(luò)數(shù)據(jù)設(shè)置完成后的處理將網(wǎng)絡(luò)中的所有有向邊反向獲取網(wǎng)絡(luò)中的邊數(shù)獲取網(wǎng)絡(luò)中的節(jié)點數(shù)獲取兩指定節(jié)點間有幾條連接邊獲取指定節(jié)點間第no條邊的內(nèi)存序GetNode1(intl);GetNode2(intl);GetNumOutLink(intn);GetOutLink(intn,intno);獲取內(nèi)存序號為l的邊的起點編號獲取內(nèi)存序號為l的邊的終點編號獲取以節(jié)點n為起點的邊的數(shù)量獲取以節(jié)點n為起點的第no條邊的內(nèi)intintGetNumInLink(intn);GetInLink(intn,intno);獲取以節(jié)點n為終點的第no條邊的內(nèi)存序號};一個是說明符"protected一個是說明符"protected:"以下直到說明符"public:”,這里略去了其中的內(nèi)容。實際上這里有一些數(shù)據(jù)的定義,以及內(nèi)部函數(shù)的定義。但對于外部調(diào)用來說,這些內(nèi)容都是不可見的,以防止使用者無意中對這部分內(nèi)容進行了錯誤的操作。這就是類的屏蔽。而在說明符"public”以下列出的函數(shù)均是對外開放的服務(wù)函數(shù),從外部可以調(diào)用它們獲得所需的支持。在這些函數(shù)中GetNode1(邊的編號)、GetNode2(邊的編號)、GetNumOutLink(節(jié)點編號)、GetOutLink(節(jié)點編號,邊的相對序號)、GetNumInLink(節(jié)點編號)、GetInLink(節(jié)點編號,邊的相對序號)等是真正提供我們非常需要的服務(wù)功能的函數(shù)。它們分別可以通過給定邊的編號查詢該邊的起(終)點編號,根據(jù)給定節(jié)點的編號查詢從該節(jié)點出去或進來的邊的編號,以及查詢給定節(jié)點出去或進來的第i條邊的編號。這類函數(shù)還有Reverse(void)、GetNumLink(void)、GetNumNode(void)、GetLinkStat(intn1,intn2)、GetLink(intn1,intn2,intno)等。而SetNetwork(intn1,intn2)起的作用是告訴類網(wǎng)絡(luò)中的某一條邊的起點和終點,換句話說是將外部的數(shù)據(jù)輸入到NetowrkManager中間去。由于這種處理方法,這個類與具體數(shù)據(jù)形式脫鉤了,從而增強了其通用性。調(diào)用者可以根據(jù)具體情況從數(shù)據(jù)文件或數(shù)據(jù)庫中獲取網(wǎng)絡(luò)數(shù)據(jù),而后通過調(diào)用SetNetwork一條邊一條邊地把數(shù)據(jù)送進網(wǎng)絡(luò)管理類中。這類函數(shù)還有SetNetworkType(inttype)、SetMaxLink(intn)、SetMaxNode(intn)等。類族結(jié)構(gòu)如圖2-1所示,從NetworkManager逐步派生出整個類族。CTPSNetworkForWin與CTPSNetworkForDOS在內(nèi)存申請?zhí)幚矸矫嬗兴鶇^(qū)別,分別為Windows和DOS環(huán)境下的程序開發(fā)提供服務(wù),與NetworkManager相比,對各邊增加了長度和等級的特征值。CTPSNetworkCost新增加了有關(guān)各邊的費用函數(shù)處理功能,以及能夠?qū)Ω鬟呥M行流量、運行

車速等數(shù)據(jù)存取。Network-Cost與其父類相比,增加了一些有關(guān)網(wǎng)絡(luò)總體狀態(tài)合計處理的功能,例如計算整個網(wǎng)絡(luò)的車公里合計值等。NetworkNode則是在節(jié)點上增加了數(shù)據(jù)存儲功能,因而能夠記錄節(jié)點的坐標值等數(shù)據(jù)。NetworkFlowNode也是增加了節(jié)點數(shù)據(jù)的存儲處理功能,但由于其父類的不同,因而能夠處理許多有關(guān)流量的信息。圖2-1網(wǎng)絡(luò)類派生關(guān)系圖我們進一步以CTPSNetworkForWin為例,說明派生類與父類之間的關(guān)系。在以下列出的定義說明中,我們可以看到在派生類中僅增加了一些新函數(shù)。對于父類已有的對外服務(wù)函數(shù),派生類仍然可以繼續(xù)使用。也就是說,派生類是在父類的基礎(chǔ)上,增加開發(fā)一些新功能而建立的。這就使得我們能夠根據(jù)需要逐步通過派生的方法建立即有相同功能,又有所區(qū)別的類族,以滿足不同的要求?!厩鍐?—6】CTPSNetworkForWin的說明classCTPSNetworkForWin:publicNetworkManag{//本網(wǎng)絡(luò)類是針對Windows環(huán)境所開發(fā)的派生類,與NetworkManag相比,網(wǎng)絡(luò)邊增加了長度及等級特征。public:構(gòu)造及析構(gòu)函數(shù)...intSetLinkLength(intn1,intn2,intno,doublex); /置指定節(jié)點設(shè)間第no條邊的長度//根據(jù)邊的內(nèi)存序號設(shè)intSetLinkLength(intn,doublex);//根據(jù)邊的內(nèi)存序號設(shè)置長度intSetLinkClass(intn1,intn2

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論