版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第11章面向?qū)ο髮?shí)現(xiàn)11.1面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言11.2面向?qū)ο蟮某绦驅(qū)崿F(xiàn)特征11.3面向?qū)ο鬁y(cè)試11.4組件技術(shù)簡(jiǎn)介第11章面向?qū)ο髮?shí)現(xiàn)11.1面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言111.1面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言11.1.1面向?qū)ο笳Z(yǔ)言的優(yōu)點(diǎn)編碼相對(duì)軟件生命期的各個(gè)階段來(lái)說(shuō)是最容易的,所以為數(shù)較多的初級(jí)程序員均可參加這一階段的工作。但是在軟件生命期中,程序是經(jīng)常需要被閱讀的,例如設(shè)計(jì)測(cè)試用例、排錯(cuò)、修改、功能擴(kuò)充等都需要程序員或其他人員閱讀程序??梢赃@樣說(shuō),在軟件開(kāi)發(fā)過(guò)程中,讀程序的時(shí)間比寫程序的時(shí)間還要多,因此,如何能夠更完整、更準(zhǔn)確地表達(dá)問(wèn)題域語(yǔ)義,使所開(kāi)發(fā)出的程序易于閱讀,使所開(kāi)發(fā)的系統(tǒng)具有很強(qiáng)的可重用性和可維護(hù)性,選擇一種什么樣的語(yǔ)言作為開(kāi)發(fā)工具就顯得尤為重要。11.1面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言11.1.1面向?qū)ο笳Z(yǔ)2面向?qū)ο笤O(shè)計(jì)的結(jié)果要轉(zhuǎn)換為計(jì)算機(jī)系統(tǒng)可以識(shí)別的代碼,既可以用面向?qū)ο笳Z(yǔ)言,也可以用非面向?qū)ο笳Z(yǔ)言實(shí)現(xiàn)。設(shè)計(jì)階段設(shè)計(jì)的對(duì)象和關(guān)聯(lián)最終都必須用具體的編程語(yǔ)言或數(shù)據(jù)庫(kù)實(shí)現(xiàn)。使用OO語(yǔ)言來(lái)實(shí)現(xiàn)OO設(shè)計(jì)相對(duì)來(lái)說(shuō)比較容易,因?yàn)檎Z(yǔ)言的結(jié)構(gòu)與設(shè)計(jì)的構(gòu)造是相似的,OO語(yǔ)言支持對(duì)象、多態(tài)性和繼承性。使用非OO語(yǔ)言需要特別注意和規(guī)定保留程序的OO結(jié)構(gòu),OO概念可以映射到非OO語(yǔ)言結(jié)構(gòu)中,這只是一個(gè)表達(dá)方式的問(wèn)題,不是語(yǔ)言能力的問(wèn)題,因?yàn)榫幊陶Z(yǔ)言最終要轉(zhuǎn)換為機(jī)器語(yǔ)言,但OO語(yǔ)言良好的風(fēng)格尤為突出。由于語(yǔ)言本身充分支持面向?qū)ο蟾拍畹膶?shí)現(xiàn),因此,編譯程序可以自動(dòng)把面向?qū)ο蟾拍钣成涞侥繕?biāo)程序中。使用非面向?qū)ο笳Z(yǔ)言編寫面向?qū)ο蟪绦?,則必須由程序員自己把面向?qū)ο蟾拍钣成涞侥繕?biāo)程序中。面向?qū)ο笤O(shè)計(jì)的結(jié)果要轉(zhuǎn)換為計(jì)算機(jī)系統(tǒng)可以識(shí)3例如人語(yǔ)言并不直接支持類或?qū)ο蟮母拍睿绦騿T只能在結(jié)構(gòu)中定義變量和相應(yīng)的函數(shù)(事實(shí)上,不能直接在結(jié)構(gòu)中定義函數(shù)而是要利用指針間接定義)。所有非面向?qū)ο笳Z(yǔ)言都不支持一般到特殊結(jié)構(gòu)的實(shí)現(xiàn),使用這類語(yǔ)言編程時(shí)要么完全回避繼承的概念,要么在聲明特殊化類時(shí),把對(duì)一般化類的引用嵌套在它里面。例如人語(yǔ)言并不直接支持類或?qū)ο蟮母拍?,程序員只4我們說(shuō)選用面向?qū)ο笳Z(yǔ)言還是非面向?qū)ο笳Z(yǔ)言,這只是一個(gè)表達(dá)方式的問(wèn)題,不是語(yǔ)言能力的問(wèn)題。從原理上說(shuō),使用任何一種通用語(yǔ)言都可以實(shí)現(xiàn)面向?qū)ο蟾拍?。在傳統(tǒng)的面向功能的方法學(xué)中,強(qiáng)調(diào)的是確定和分解系統(tǒng)功能,這種做法雖然是目標(biāo)的最直接的實(shí)現(xiàn)方式,但由于功能是軟件系統(tǒng)中最不穩(wěn)定、最容易變化的方面,因而獲得的程序往往難于維護(hù)和擴(kuò)充。OO方法開(kāi)發(fā)軟件,其結(jié)構(gòu)源于客觀世界穩(wěn)定的對(duì)象結(jié)構(gòu),與傳統(tǒng)軟件相比,軟件本身的內(nèi)部結(jié)構(gòu)發(fā)生了質(zhì)的變化,易重用性和易擴(kuò)充性都得到提高。圍繞對(duì)象來(lái)組織軟件系統(tǒng),可以自然地將現(xiàn)實(shí)世界模型映射到軟件結(jié)構(gòu)中。因此,使用面向?qū)ο笳Z(yǔ)言,實(shí)現(xiàn)面向?qū)ο蟾拍睿h(yuǎn)比使用非面向?qū)ο笳Z(yǔ)言方便。當(dāng)然,方便性也并不是決定選擇何種語(yǔ)言的關(guān)鍵因素。我們說(shuō)選用面向?qū)ο笳Z(yǔ)言還是非面向?qū)ο笳Z(yǔ)言,這5選擇程序設(shè)計(jì)語(yǔ)言的關(guān)鍵因素,是語(yǔ)言的一致的表達(dá)能力、可重用性及可維護(hù)性。面向?qū)ο笳Z(yǔ)言刻畫客觀系統(tǒng)較為自然,它具有:①識(shí)認(rèn)性,系統(tǒng)中的基本構(gòu)件可識(shí)認(rèn)為一組可識(shí)別的離散對(duì)象;②類別性,系統(tǒng)具有相同數(shù)據(jù)結(jié)構(gòu)與行為的所有對(duì)象可組成一類;③多態(tài)性,對(duì)象具有惟一的靜態(tài)類型和多個(gè)可能的動(dòng)態(tài)類型;④繼承性,在基于層次關(guān)系的不同類中共享數(shù)據(jù)和操作等特點(diǎn)。因此,能夠更完整、更準(zhǔn)確地表達(dá)問(wèn)題域語(yǔ)義的面向?qū)ο笳Z(yǔ)言的語(yǔ)法是非常重要的,這將會(huì)對(duì)系統(tǒng)帶來(lái)下述幾個(gè)重要優(yōu)點(diǎn)。選擇程序設(shè)計(jì)語(yǔ)言的關(guān)鍵因素,是語(yǔ)言的一致的表達(dá)6
1.一致的表示方法從前面章節(jié)的講述中可以知道,面向?qū)ο箝_(kāi)發(fā)基于不隨時(shí)間變化的、一致的表示方法。這種表示方法應(yīng)該從問(wèn)題域到OOA,從OOA到OOD,最后從OOD到面向?qū)ο缶幊?OOP),始終穩(wěn)定不變。一致的表示方法既有利于在軟件開(kāi)發(fā)過(guò)程中始終使用統(tǒng)一的概念,也有利于編程人員理解軟件的各種配置成分。我們以“自動(dòng)飲料售貨機(jī)”為例,說(shuō)明面向?qū)ο箝_(kāi)發(fā)基于不隨時(shí)間變化的、一致的表示方法。對(duì)于“自動(dòng)飲料售貨機(jī)”這一實(shí)例,在問(wèn)題域、OOA、OOD或是OOP的各個(gè)階段所用到的概念都是一致的、不變的。如:退幣桿、找零、熄燈、投幣口、投幣、飲料、飲料倒出等,這對(duì)于用戶、分析人員、編程人員、測(cè)試人員、維護(hù)人員來(lái)說(shuō),無(wú)疑是有很大的幫助的。1.一致的表示方法7
2.可重用性軟件的可重用性的好壞對(duì)于提高軟件產(chǎn)品的質(zhì)量和軟件開(kāi)發(fā)效率意義重大。為了能帶來(lái)可觀的商業(yè)利益,必須在更廣泛的范圍中運(yùn)用重用機(jī)制,而不是僅僅在程序設(shè)計(jì)這個(gè)層次上進(jìn)行重用。因此,在OOA、OOD直到OOP中都顯式地表示問(wèn)題域語(yǔ)義,其意義是十分深遠(yuǎn)的。隨著時(shí)間的推移,軟件開(kāi)發(fā)組織既可能重用它在某個(gè)問(wèn)題域內(nèi)的OOA結(jié)果,也可能重用相應(yīng)的OOD和OOP結(jié)果。2.可重用性8我們?nèi)砸浴白詣?dòng)飲料售貨機(jī)”為例,說(shuō)明可重用性對(duì)于提高軟件產(chǎn)品的質(zhì)量和軟件開(kāi)發(fā)效率意義重大。假設(shè)該“自動(dòng)飲料售貨機(jī)”可提供汽水、洛神、紅茶、可樂(lè)、奶昔等五種飲料,有關(guān)這五種飲料所實(shí)施的操作是相同的,因此,可以構(gòu)造一個(gè)飲料類,然后由該類構(gòu)造汽水、洛神、紅茶、可樂(lè)、奶昔等五種不同的對(duì)象。這對(duì)于提高軟件開(kāi)發(fā)質(zhì)量和軟件開(kāi)發(fā)效率具有重要的意義。我們?nèi)砸浴白詣?dòng)飲料售貨機(jī)”為例,說(shuō)明可重用性對(duì)9
3.可維護(hù)性軟件維護(hù)是一件極為復(fù)雜的事情,在軟件的開(kāi)發(fā)成本中約占到70%左右。為了降低維護(hù)成本,盡管人們反復(fù)強(qiáng)調(diào)保持文檔與源程序一致的必要性,但是,在實(shí)際工作中很難做到交付兩類不同的文檔,并使它們保持彼此完全一致。特別是考慮到進(jìn)度、預(yù)算、能力和人員等限制因素時(shí),做到兩類文檔完全一致幾乎是不可能的。因此,維護(hù)人員最終面對(duì)的往往只有源程序本身。3.可維護(hù)性10以ATM(自動(dòng)取款機(jī))系統(tǒng)為例,說(shuō)明在程序內(nèi)部表達(dá)問(wèn)題域語(yǔ)義對(duì)維護(hù)工作的意義。假設(shè)在維護(hù)該系統(tǒng)時(shí)沒(méi)有合適的文檔資料可供參閱,于是維護(hù)人員人工瀏覽程序或使用軟件工具掃描程序,記下或打印出程序顯式陳述的問(wèn)題域語(yǔ)義,維護(hù)人員看到“ATM”、“賬戶”和“現(xiàn)金兌換卡”等,這對(duì)維護(hù)人員理解所要維護(hù)的軟件將有很大幫助。因此,在選擇編程語(yǔ)言時(shí),應(yīng)該考慮的首要因素,是在供選擇的語(yǔ)言中哪個(gè)語(yǔ)言能最好地表達(dá)問(wèn)題域語(yǔ)義。以ATM(自動(dòng)取款機(jī))系統(tǒng)為例,說(shuō)明在程序內(nèi)部1111.1.2面向?qū)ο笳Z(yǔ)言的技術(shù)特點(diǎn)面向?qū)ο笳Z(yǔ)言借鑒了20世紀(jì)50年代誕生的人工智能語(yǔ)言LISP,引入了動(dòng)態(tài)綁定的概念和交互式開(kāi)發(fā)環(huán)境的思想;始于20世紀(jì)60年代的離散事件模擬語(yǔ)言SIMULA67,引入了類的概念和繼承機(jī)制;形成于20世紀(jì)70年代的Smalltalk語(yǔ)言。面向?qū)ο笳Z(yǔ)言發(fā)展有兩大方向,一是純面向?qū)ο蟮恼Z(yǔ)言,如Smalltalk、EIFFEL、Java等語(yǔ)言;另一類是混合型面向?qū)ο笳Z(yǔ)言,也就是在過(guò)程語(yǔ)言或其他語(yǔ)言中增加了類、繼承等面向?qū)ο髾C(jī)制,如C++、Objective_C等語(yǔ)言。就兩種形式的面向?qū)ο笳Z(yǔ)言比較而言,純面向?qū)ο笳Z(yǔ)言更加適合面向?qū)ο蠓椒ㄑ芯亢涂焖僭偷膶?shí)現(xiàn);而混合型面向?qū)ο笳Z(yǔ)言則更加注重于提高系統(tǒng)的運(yùn)行速度,使傳統(tǒng)使用結(jié)構(gòu)化編程方式的程序員容易接受面向?qū)ο笏枷搿?1.1.2面向?qū)ο笳Z(yǔ)言的技術(shù)特點(diǎn)12面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言以對(duì)象為中心,對(duì)象是程序運(yùn)行時(shí)的基本成分。面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言中提供了類、繼承等機(jī)制。面向?qū)ο蟮某绦蛟O(shè)計(jì)即為設(shè)計(jì)類及由類構(gòu)造程序的方法和過(guò)程,用計(jì)算機(jī)對(duì)象模擬現(xiàn)實(shí)世界。成熟的面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言通常都提供豐富的類庫(kù)和強(qiáng)有力的開(kāi)發(fā)環(huán)境。面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言以對(duì)象為中心,對(duì)象是程序13
1.支持類與對(duì)象概念的機(jī)制面向?qū)ο笳Z(yǔ)言都允許用戶動(dòng)態(tài)創(chuàng)建對(duì)象,并且可以用指針引用動(dòng)態(tài)創(chuàng)建的對(duì)象。允許動(dòng)態(tài)創(chuàng)建對(duì)象,就意味著系統(tǒng)必須處理內(nèi)存管理問(wèn)題,如果不及時(shí)釋放不再需要的對(duì)象所占用的內(nèi)存,動(dòng)態(tài)存儲(chǔ)分配就有可能耗盡內(nèi)存,出現(xiàn)內(nèi)存不足的問(wèn)題。通常,對(duì)這類問(wèn)題的解決方法有兩種,一種是由語(yǔ)言的運(yùn)行機(jī)制自動(dòng)管理內(nèi)存,即提供自動(dòng)回收“垃圾”的機(jī)制;另一種是由程序員編寫釋放內(nèi)存的代碼。自動(dòng)管理內(nèi)存不僅方便而且安全,但是必須采用先進(jìn)的垃圾收集算法才能減少開(kāi)銷。某些面向?qū)ο蟮恼Z(yǔ)言(如C++)允許程序員定義析構(gòu)函數(shù)(Destructor)。每當(dāng)一個(gè)對(duì)象超出范圍或被顯式刪除時(shí),就自動(dòng)調(diào)用析構(gòu)函數(shù)。這種機(jī)制使得程序員能夠方便地構(gòu)造和喚醒釋放內(nèi)存的操作,卻又不是采用垃圾收集機(jī)制。1.支持類與對(duì)象概念的機(jī)制14
2.實(shí)現(xiàn)整體-部分結(jié)構(gòu)的機(jī)制實(shí)現(xiàn)整體-部分結(jié)構(gòu)的機(jī)制有兩種方法,一種是使用指針實(shí)現(xiàn)整體-部分結(jié)構(gòu),另一種是使用獨(dú)立的關(guān)聯(lián)對(duì)象實(shí)現(xiàn)整體-部分結(jié)構(gòu)。一般來(lái)說(shuō),通過(guò)增加內(nèi)部指針可以方便地實(shí)現(xiàn)關(guān)聯(lián),使用指針是最容易的實(shí)現(xiàn)方法。但是,大多數(shù)現(xiàn)有的面向?qū)ο笳Z(yǔ)言并不顯式支持獨(dú)立的關(guān)聯(lián)對(duì)象。2.實(shí)現(xiàn)整體-部分結(jié)構(gòu)的機(jī)制15
3.實(shí)現(xiàn)一般-特殊結(jié)構(gòu)的機(jī)制實(shí)現(xiàn)一般-特殊結(jié)構(gòu)的機(jī)制,包括實(shí)現(xiàn)繼承的機(jī)制和解決名字沖突的機(jī)制。所謂解決名字沖突,是指在支持多重繼承的語(yǔ)言中,處理在多個(gè)基類中可能出現(xiàn)的重名問(wèn)題。通常,有些語(yǔ)言拒絕接受有名字沖突的程序,另一些語(yǔ)言提供了解決沖突的協(xié)議。無(wú)論使用何種語(yǔ)言,程序員都應(yīng)該盡力避免出現(xiàn)名字沖突。3.實(shí)現(xiàn)一般-特殊結(jié)構(gòu)的機(jī)制164.實(shí)現(xiàn)屬性和服務(wù)的機(jī)制實(shí)現(xiàn)屬性的機(jī)制應(yīng)該著重考慮的幾個(gè)因素:支持實(shí)例連接的機(jī)制;屬性的可見(jiàn)性控制;對(duì)屬性值的約束。對(duì)于實(shí)現(xiàn)服務(wù)的機(jī)制來(lái)說(shuō),主要應(yīng)該考慮下列因素:支持消息連接的機(jī)制;控制服務(wù)可見(jiàn)性的機(jī)制;動(dòng)態(tài)聯(lián)編。所謂動(dòng)態(tài)聯(lián)編,是指應(yīng)用系統(tǒng)在運(yùn)行過(guò)程中,當(dāng)需要執(zhí)行一個(gè)特定服務(wù)的時(shí)候,選擇(或聯(lián)編)實(shí)現(xiàn)該服務(wù)的適當(dāng)算法的能力。動(dòng)態(tài)聯(lián)編機(jī)制使得程序員在向?qū)ο蟀l(fā)送消息時(shí)擁有較大自由,在發(fā)送消息前,無(wú)須知道接收消息的對(duì)象當(dāng)時(shí)屬于哪個(gè)類。4.實(shí)現(xiàn)屬性和服務(wù)的機(jī)制17
5.類型檢查按照編譯時(shí)進(jìn)行類型檢查的嚴(yán)格程度,程序設(shè)計(jì)語(yǔ)言可以分為三種類型:弱類型、強(qiáng)類型和混合型。弱類型:語(yǔ)言僅要求每個(gè)變量或?qū)傩噪`屬于一個(gè)對(duì)象。強(qiáng)類型:語(yǔ)法規(guī)定每個(gè)變量或?qū)傩员仨殰?zhǔn)確地屬于某個(gè)特定的類。面向?qū)ο笳Z(yǔ)言包含不同類型的語(yǔ)言,例如,Smalltalk實(shí)際上是一種無(wú)類型語(yǔ)言(所有變量都是未指定類的對(duì)象);C++則是強(qiáng)類型語(yǔ)言?;旌闲驼Z(yǔ)言:為了提高操作的效率,甚至允許屬性值不是對(duì)象而是某種預(yù)定義的基本類型數(shù)據(jù)(如整數(shù)、浮點(diǎn)數(shù)等),如C++,Objective_C等。5.類型檢查18強(qiáng)類型語(yǔ)言主要有兩個(gè)優(yōu)點(diǎn):有利于在編譯時(shí)發(fā)現(xiàn)程序錯(cuò)誤;增加了優(yōu)化的可能性。通常使用強(qiáng)類型編譯型語(yǔ)言開(kāi)發(fā)軟件產(chǎn)品,使用弱類型解釋型語(yǔ)言快速開(kāi)發(fā)原型。一般來(lái)說(shuō),強(qiáng)類型語(yǔ)言有助于提高軟件的可靠性和運(yùn)行效率,現(xiàn)代的程序語(yǔ)言都是強(qiáng)類型的,大多數(shù)理論支持強(qiáng)類型檢查。強(qiáng)類型語(yǔ)言主要有兩個(gè)優(yōu)點(diǎn):有利于在編譯時(shí)發(fā)現(xiàn)19
6.類庫(kù)目前,基本所有的面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言都提供一個(gè)實(shí)用的類庫(kù)。某些語(yǔ)言本身并沒(méi)有規(guī)定提供什么樣的類庫(kù),而是由實(shí)現(xiàn)這種語(yǔ)言的編譯系統(tǒng)自行提供類庫(kù)。有了類庫(kù),程序員可以重用許多軟構(gòu)件,不必重新編寫,這為實(shí)現(xiàn)軟件重用帶來(lái)很大方便。類庫(kù)中通常包含實(shí)現(xiàn)通用數(shù)據(jù)結(jié)構(gòu)的類,例如,動(dòng)態(tài)數(shù)組、表、隊(duì)列、棧和樹(shù)等,通常把這些類稱為包容類。類庫(kù)中還包含了實(shí)現(xiàn)各種關(guān)聯(lián)的類。更完整的類庫(kù)通常還提供了接口類和圖形庫(kù)。接口類是獨(dú)立于具體設(shè)備的(例如,輸入/輸出流),圖形庫(kù)是用于實(shí)現(xiàn)窗口系統(tǒng)的用戶界面類的一個(gè)相對(duì)獨(dú)立的庫(kù)。6.類庫(kù)20
7.效率某些早期的面向?qū)ο笳Z(yǔ)言是解釋型的而不是編譯型的。許多人認(rèn)為這些語(yǔ)言的主要缺點(diǎn)是效率低。當(dāng)今的面向?qū)ο笳Z(yǔ)言都擁有完整類庫(kù),類庫(kù)中提供了更高效的算法和更好的數(shù)據(jù)結(jié)構(gòu),與非面向?qū)ο笳Z(yǔ)言相比,能得到更快運(yùn)行的代碼。例如,庫(kù)中已經(jīng)提供了算法先進(jìn)、代碼可靠的一類數(shù)據(jù)結(jié)構(gòu),程序員再不必編寫像實(shí)現(xiàn)哈希表或平衡樹(shù)算法的代碼了,因此,提高了編程效率和運(yùn)行效率。7.效率21面向?qū)ο笳Z(yǔ)言在運(yùn)行時(shí)使用動(dòng)態(tài)聯(lián)編實(shí)現(xiàn)多態(tài)性,這似乎需要在運(yùn)行時(shí)查找繼承樹(shù),以得到定義給定操作的類。這也是人們認(rèn)為面向?qū)ο笳Z(yǔ)言效率低的另一個(gè)理由。當(dāng)今的絕大多數(shù)面向?qū)ο笳Z(yǔ)言都優(yōu)化了這個(gè)查找過(guò)程,從而實(shí)現(xiàn)了高效率查找。只要在程序運(yùn)行時(shí)始終保持類結(jié)構(gòu)不變,就能在子類中存儲(chǔ)各個(gè)操作的正確入口點(diǎn),從而使得動(dòng)態(tài)聯(lián)編成為查找哈希表的高效過(guò)程,不會(huì)由于繼承樹(shù)深度加大或類中定義的操作數(shù)增加而降低效率。面向?qū)ο笳Z(yǔ)言在運(yùn)行時(shí)使用動(dòng)態(tài)聯(lián)編實(shí)現(xiàn)多態(tài)性,22
8.永久保存對(duì)象在一個(gè)程序都對(duì)數(shù)據(jù)進(jìn)行處理時(shí),希望數(shù)據(jù)能夠長(zhǎng)時(shí)間保存下來(lái),以備后用。保存數(shù)據(jù)需要提供某種保存數(shù)據(jù)的方法。長(zhǎng)期保存數(shù)據(jù)主要有兩個(gè)原因:①為實(shí)現(xiàn)在不同程序之間傳遞數(shù)據(jù),需要保存數(shù)據(jù);②為恢復(fù)被中斷了的程序的運(yùn)行,首先需要保存數(shù)據(jù)。8.永久保存對(duì)象23對(duì)于不同面向?qū)ο笳Z(yǔ)言,長(zhǎng)期保存數(shù)據(jù)的方法也不同。有些面向?qū)ο笳Z(yǔ)言(例如C++)沒(méi)有提供直接存儲(chǔ)對(duì)象的機(jī)制,這些語(yǔ)言的用戶必須自己管理對(duì)象的輸入/輸出,或者購(gòu)買面向?qū)ο蟮臄?shù)據(jù)庫(kù)管理系統(tǒng)。有些面向?qū)ο笳Z(yǔ)言(例如Smalltalk)把當(dāng)前的執(zhí)行狀態(tài)完整地保存在磁盤上。還有一些面向?qū)ο笳Z(yǔ)言提供了訪問(wèn)磁盤對(duì)象的輸入/輸出操作。對(duì)于不同面向?qū)ο笳Z(yǔ)言,長(zhǎng)期保存數(shù)據(jù)的方法也不24通過(guò)在類庫(kù)中增加對(duì)象存儲(chǔ)管理功能(例如EIFFEL語(yǔ)言采用的策略),可以在開(kāi)發(fā)環(huán)境中提供對(duì)象存儲(chǔ)管理功能,而且還不改變語(yǔ)言定義或不增加關(guān)鍵字。然后,可以從“可存儲(chǔ)的類”中派生出需要永久保存的對(duì)象,該對(duì)象自然繼承了對(duì)象存儲(chǔ)管理功能。如果能使程序設(shè)計(jì)語(yǔ)言語(yǔ)法與對(duì)象存儲(chǔ)管理語(yǔ)法實(shí)現(xiàn)無(wú)間隙集成,則是最理想的。通過(guò)在類庫(kù)中增加對(duì)象存儲(chǔ)管理功能(例如EIFF25
9.類模板在實(shí)際的應(yīng)用系統(tǒng)開(kāi)發(fā)中,經(jīng)常用函數(shù)、類等軟件元素處理不同類型的數(shù)據(jù)(對(duì)象),但是,對(duì)它們的數(shù)據(jù)元素所進(jìn)行的基本操作都是相同的。例如,對(duì)于一個(gè)向量(一維數(shù)組)類來(lái)說(shuō),不論是整型向量,浮點(diǎn)型向量,還是其他任何類型的向量,針對(duì)它的數(shù)據(jù)元素所進(jìn)行的基本操作都是相同的(例如,插入、刪除、檢索等)。在這種情況下,如果程序語(yǔ)言提供一種能抽象出這類共性的機(jī)制,則對(duì)減少冗余和提高可重用性大有好處。9.類模板26所謂參數(shù)化類,就是使用一個(gè)或多個(gè)類型去參數(shù)化一個(gè)類的機(jī)制,有了這種機(jī)制,程序員就可以先定義一個(gè)參數(shù)化的類模板(即在類定義中包含以參數(shù)形式出現(xiàn)的一個(gè)或多個(gè)類型),然后把數(shù)據(jù)類型作為參數(shù)傳遞進(jìn)來(lái),從而把這個(gè)類模板應(yīng)用在不同的應(yīng)用程序中,或用在同一應(yīng)用程序的不同部分。EIFFEL語(yǔ)言中就有參數(shù)化類,C++語(yǔ)言也提供了類模板。VisualBasic和VisualC++提供了函數(shù)模板和類模板。所謂參數(shù)化類,就是使用一個(gè)或多個(gè)類型去參數(shù)化27
10.開(kāi)發(fā)環(huán)境在軟件工程學(xué)中,方法和工具之間是相互依賴的關(guān)系,方法是工具研制的先導(dǎo),工具是方法的實(shí)在體現(xiàn)。軟件開(kāi)發(fā)環(huán)境是指在計(jì)算機(jī)的基本軟件基礎(chǔ)上,為了支持軟件開(kāi)發(fā)而提供的一組工具軟件系統(tǒng)。軟件工具和軟件工程環(huán)境對(duì)軟件生產(chǎn)率有很大影響。由于面向?qū)ο蟪绦蛑欣^承關(guān)系和動(dòng)態(tài)聯(lián)編等引入的特殊復(fù)雜性,面向?qū)ο笳Z(yǔ)言所提供的軟件工具或開(kāi)發(fā)環(huán)境就顯得尤為重要了。一般來(lái)說(shuō),面向?qū)ο笳Z(yǔ)言所提供的開(kāi)發(fā)環(huán)境,至少應(yīng)該包括下列一些最基本的軟件工具:編輯程序、編譯程序或解釋程序、瀏覽工具和調(diào)試器等。10.開(kāi)發(fā)環(huán)境28編譯程序或解釋程序是最基本、最重要的軟件工具。編譯與解釋的差別主要是速度和效率不同。利用解釋程序解釋執(zhí)行用戶的源程序,雖然速度慢、效率低,但調(diào)試比較方便、靈活。編譯型語(yǔ)言具有良好的優(yōu)化功能,并且生成目標(biāo)代碼效率很高,適于用來(lái)開(kāi)發(fā)正式的軟件產(chǎn)品。有些面向?qū)ο笳Z(yǔ)言(例如Objective_C)不但提供了編譯程序,還提供了解釋工具,這樣給軟件開(kāi)發(fā)人員帶來(lái)很大方便。編譯程序或解釋程序是最基本、最重要的軟件工具29有些面向?qū)ο笳Z(yǔ)言雖然提供編譯程序,但是,源程序到目標(biāo)代碼翻譯是間接的。它先把用戶源程序翻譯成一種中間語(yǔ)言程序,然后再把中間語(yǔ)言程序翻譯成目標(biāo)代碼。像這類的編譯程序,就很有可能使調(diào)試器不能理解原始的源程序。因此,使用調(diào)試器時(shí),首先應(yīng)該弄清楚它是針對(duì)原始的面向?qū)ο笤闯绦?,還是針對(duì)中間代碼進(jìn)行調(diào)試的。如果是針對(duì)中間代碼進(jìn)行調(diào)試的,則會(huì)給調(diào)試人員帶來(lái)許多不便。除此之外,查看屬性值和分析消息連接也是面向?qū)ο蟮恼{(diào)試器應(yīng)該具備的功能。在開(kāi)發(fā)大型系統(tǒng)的時(shí)候,還可能需要系統(tǒng)構(gòu)造工具和變動(dòng)控制工具。因此應(yīng)該考慮語(yǔ)言本身是否提供了這種工具,或者該語(yǔ)言能否與現(xiàn)有的這類工具很好地集成起來(lái)。有些面向?qū)ο笳Z(yǔ)言雖然提供編譯程序,但是,源程序3011.1.3選擇面向?qū)ο笳Z(yǔ)言總體來(lái)說(shuō),在使用面向?qū)ο蟮能浖_(kāi)發(fā)過(guò)程中,OO語(yǔ)言明顯優(yōu)于非OO語(yǔ)言,因此,除了在很特殊的應(yīng)用領(lǐng)域,如:對(duì)程序的執(zhí)行時(shí)間和使用空間都有很嚴(yán)格限制的情況;需要產(chǎn)生任意的甚至非法的指令序列;體系結(jié)構(gòu)特殊的微處理器等。開(kāi)發(fā)人員一般應(yīng)該選擇面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言,但是,目前面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)種類繁多,究竟應(yīng)該選擇何種語(yǔ)言更利于系統(tǒng)開(kāi)發(fā)和維護(hù)呢?在充分考慮到程序設(shè)計(jì)語(yǔ)言特點(diǎn)(如應(yīng)用領(lǐng)域、算法與計(jì)算的復(fù)雜性、數(shù)據(jù)結(jié)構(gòu)的復(fù)雜性、效率等)的同時(shí),還應(yīng)該著重考慮以下一些實(shí)際因素。11.1.3選擇面向?qū)ο笳Z(yǔ)言31
1.未來(lái)能否占主導(dǎo)地位語(yǔ)言在未來(lái)能否占主導(dǎo)地位,是否具有很強(qiáng)的生命力,對(duì)于軟件生存期具有相當(dāng)重要的作用。因?yàn)?,軟件投入運(yùn)行后,其維護(hù)和功能擴(kuò)充是經(jīng)常性的工作,如果在若干年以后,你所使用的面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言仍占主導(dǎo)地位,那么,你所開(kāi)發(fā)的產(chǎn)品在若干年后仍然具有很強(qiáng)的生命力。否則,若干年后,其維護(hù)或功能擴(kuò)充就很難實(shí)施了,你所開(kāi)發(fā)的產(chǎn)品就會(huì)自動(dòng)退役。1.未來(lái)能否占主導(dǎo)地位32究竟如何來(lái)選擇呢?通常情況下,就是依據(jù)目前該語(yǔ)言占有的市場(chǎng)份額,以及專業(yè)書刊和學(xué)術(shù)會(huì)議上所做的分析、評(píng)價(jià)。這樣,人們往往能夠?qū)ξ磥?lái)哪種面向?qū)ο笳Z(yǔ)言將占據(jù)主導(dǎo)地位做出預(yù)測(cè)。當(dāng)然,最終決定選用哪種面向?qū)ο笳Z(yǔ)言的實(shí)際因素,往往是諸如成本之類的經(jīng)濟(jì)因素而不是技術(shù)因素。究竟如何來(lái)選擇呢?通常情況下,就是依據(jù)目前該33
2.可重用性采用面向?qū)ο蠓椒ㄩ_(kāi)發(fā)軟件的基本目的,是通過(guò)重用提高軟件質(zhì)量和軟件生產(chǎn)率,增強(qiáng)系統(tǒng)的可維護(hù)性。面向?qū)ο笳Z(yǔ)言的主要優(yōu)點(diǎn)是能夠最完整、最準(zhǔn)確地表達(dá)問(wèn)題域語(yǔ)義,因此,在開(kāi)發(fā)系統(tǒng)時(shí),應(yīng)該優(yōu)先選用面向?qū)ο笳Z(yǔ)言。2.可重用性34
3.類庫(kù)和開(kāi)發(fā)環(huán)境語(yǔ)言、開(kāi)發(fā)環(huán)境和類庫(kù)是決定可重用性的三個(gè)因素??芍赜眯猿艘蕾囉诿嫦?qū)ο蟪绦蛘Z(yǔ)言本身以外,同時(shí)還依賴于開(kāi)發(fā)環(huán)境優(yōu)劣和類庫(kù)內(nèi)容的豐富程度。只有語(yǔ)言、開(kāi)發(fā)環(huán)境和類庫(kù)這三個(gè)因素綜合起來(lái),才能共同決定可重用性??疾槌绦蛘Z(yǔ)言的時(shí)候,不但應(yīng)該考查是否提供了類庫(kù),更重要的是考查類庫(kù)中提供了哪些有價(jià)值的類。隨著類庫(kù)的日益成熟和豐富,會(huì)給開(kāi)發(fā)應(yīng)用系統(tǒng)帶來(lái)很大的方便,需要開(kāi)發(fā)人員自己編寫的代碼將越來(lái)越少,以致會(huì)有事半功倍或更高的效率。3.類庫(kù)和開(kāi)發(fā)環(huán)境35目前較為流行的OO程序設(shè)計(jì)語(yǔ)言和工具大致可以分為兩類,一類是傳統(tǒng)OO語(yǔ)言和工具:Smalltalk、C++、ObjectPascal、Java等;另一類是高級(jí)OO語(yǔ)言(OO-4GL)和工具:VisualBasic、PowerBuilder、Delphi、PowerObjects、Developer/2000、VisualFoxpro、Javascript等。用戶在選擇具體的語(yǔ)言作為開(kāi)發(fā)工具時(shí),除要考慮上述的幾個(gè)方面外,還應(yīng)該考慮的其他因素有:對(duì)用戶學(xué)習(xí)面向?qū)ο蠓治?、設(shè)計(jì)和編碼技術(shù)所能提供的培訓(xùn)服務(wù);在使用這個(gè)面向?qū)ο笳Z(yǔ)言期間能提供的技術(shù)支持;能提供給開(kāi)發(fā)人員使用的開(kāi)發(fā)工具、開(kāi)發(fā)平臺(tái);對(duì)機(jī)器性能和內(nèi)存的需求;集成已有軟件的容易程度;軟件的規(guī)模;軟件的可移植性;軟件的應(yīng)用領(lǐng)域等。目前較為流行的OO程序設(shè)計(jì)語(yǔ)言和工具大致可以36程序是軟件設(shè)計(jì)的自然結(jié)果,程序的質(zhì)量主要取決于設(shè)計(jì)的質(zhì)量,根據(jù)設(shè)計(jì)的要求選擇了程序設(shè)計(jì)語(yǔ)言之后,編程風(fēng)格在很大程度上影響著程序的可讀性、可測(cè)試性和可維護(hù)性。保證程序質(zhì)量的重要方法是有良好的程序設(shè)計(jì)風(fēng)格。對(duì)面向?qū)ο髮?shí)現(xiàn)來(lái)說(shuō),良好的程序設(shè)計(jì)風(fēng)格也是非常重要的,它不僅能夠減少系統(tǒng)維護(hù)或擴(kuò)充所帶來(lái)的系統(tǒng)開(kāi)銷,而且更有助于在新項(xiàng)目或工程中重用已有的程序代碼。因此,良好的面向?qū)ο蟪绦蛟O(shè)計(jì)風(fēng)格,既要遵循傳統(tǒng)的結(jié)構(gòu)化程序設(shè)計(jì)風(fēng)格和準(zhǔn)則,同時(shí)也要遵循為適應(yīng)面向?qū)ο蠓椒ㄋ赜械母拍?例如,繼承性)而必需的一些新的風(fēng)格和準(zhǔn)則。11.2面向?qū)ο蟮某绦驅(qū)崿F(xiàn)特征程序是軟件設(shè)計(jì)的自然結(jié)果,程序的質(zhì)量主要取決3711.2.1提高可重用性提高軟件的可重用性是面向?qū)ο蠓椒ǖ囊粋€(gè)主要目標(biāo)。軟件重用是指在兩次或多次不同的軟件開(kāi)發(fā)過(guò)程中重復(fù)使用相同或相似軟件元素的過(guò)程。軟件元素包括程序代碼、測(cè)試用例、設(shè)計(jì)文檔、設(shè)計(jì)過(guò)程、需求分析甚至知識(shí)領(lǐng)域等多個(gè)層次。在編碼階段主要考慮代碼重用的問(wèn)題,代碼級(jí)的重用是最簡(jiǎn)單,也是最流行的,是迄今為止研究最深入、應(yīng)用最廣泛的重用技術(shù)。傳統(tǒng)上,代碼級(jí)重用部件的主體是子程序(函數(shù)或過(guò)程)?,F(xiàn)在,由于基于對(duì)象和面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言及相應(yīng)開(kāi)發(fā)環(huán)境的發(fā)展,代碼級(jí)重用部件的內(nèi)容更加豐富,不僅包括結(jié)構(gòu)化程序設(shè)計(jì)語(yǔ)言中的函數(shù)或過(guò)程,同時(shí)也包括面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言中的程序包和類。11.2.1提高可重用性38一般說(shuō)來(lái),代碼重用可分為兩種形式,一種是本項(xiàng)目?jī)?nèi)的代碼重用,稱為內(nèi)部重用;另一種是新項(xiàng)目重用已有項(xiàng)目的代碼,稱為外部重用。內(nèi)部重用主要是找出本項(xiàng)目設(shè)計(jì)中相同或相似的部分,然后利用繼承機(jī)制共享它們。要做到外部重用,即一個(gè)項(xiàng)目重用另一項(xiàng)目的代碼,就要求開(kāi)發(fā)人員必須具有重用的設(shè)計(jì)思想,做到反復(fù)考慮,精心設(shè)計(jì)。雖然為實(shí)現(xiàn)外部重用與內(nèi)部重用需要考慮的范圍不同,但是有助于實(shí)現(xiàn)這兩類重用的程序設(shè)計(jì)準(zhǔn)則卻是相同的。下面介紹主要的準(zhǔn)則。一般說(shuō)來(lái),代碼重用可分為兩種形式,一種是本39
1.提高方法的內(nèi)聚,減小方法的規(guī)模一個(gè)方法(即服務(wù))應(yīng)該只完成單個(gè)功能,這樣的方法是高內(nèi)聚的。如果某個(gè)方法涉及兩個(gè)或多個(gè)不相關(guān)的功能或規(guī)模大的方法,則應(yīng)該把它分解成幾個(gè)更小的方法。
2.保持方法的一致性實(shí)現(xiàn)代碼重用的一個(gè)重要因素是應(yīng)該保持方法的一致性。一般來(lái)說(shuō),功能相似的方法應(yīng)該有一致的名字、參數(shù)特征(包括參數(shù)個(gè)數(shù)、類型和次序)、返回值類型、使用條件及出錯(cuò)條件等。這樣有助于實(shí)現(xiàn)代碼重用。1.提高方法的內(nèi)聚,減小方法的規(guī)模40
3.把策略與實(shí)現(xiàn)分開(kāi)方法從所完成的功能來(lái)看有兩種類型:策略方法和實(shí)現(xiàn)方法。策略方法負(fù)責(zé)做出決策,提供變?cè)?,并且管理全局資源;實(shí)現(xiàn)方法只負(fù)責(zé)完成具體的操作,但卻沒(méi)有執(zhí)行這個(gè)操作的決定權(quán),也不知道為什么執(zhí)行這個(gè)操作。策略方法不直接完成計(jì)算或?qū)崿F(xiàn)復(fù)雜的算法,只是檢查系統(tǒng)運(yùn)行狀態(tài),并處理出錯(cuò)情況。該方法通常緊密依賴于具體應(yīng)用,這類方法易編寫、易理解。3.把策略與實(shí)現(xiàn)分開(kāi)41實(shí)現(xiàn)方法僅僅針對(duì)具體數(shù)據(jù)完成特定處理,通常用于實(shí)現(xiàn)復(fù)雜的算法。實(shí)現(xiàn)方法既不制定決策,也不管理全局資源。實(shí)現(xiàn)方法如果在執(zhí)行過(guò)程中發(fā)現(xiàn)錯(cuò)誤,只返回執(zhí)行狀態(tài)而不處理出錯(cuò)情況。由于實(shí)現(xiàn)方法是自含式算法,與具體應(yīng)用相對(duì)獨(dú)立,因此,容易在其他應(yīng)用系統(tǒng)中重用,具有較高的可重用性。在編程時(shí)分清策略方法和實(shí)現(xiàn)方法,不要把它們放在同一個(gè)方法中。應(yīng)該把算法的核心部分放在一個(gè)單獨(dú)的具體實(shí)現(xiàn)方法中。為此需要從策略方法中提取出具體參數(shù),作為調(diào)用實(shí)現(xiàn)方法的變?cè)?,才能提高方法可重用性。?shí)現(xiàn)方法僅僅針對(duì)具體數(shù)據(jù)完成特定處理,通常用于42
4.采用全面覆蓋技術(shù)在編程時(shí),對(duì)系統(tǒng)全面考慮,寫出覆蓋整個(gè)系統(tǒng)所有可能的方法。而不能僅僅針對(duì)當(dāng)前需要的功能寫方法。例如,如果在當(dāng)前應(yīng)用中需要寫一個(gè)獲取表中第一個(gè)元素的方法,則至少還應(yīng)該為獲取表中最后一個(gè)元素再寫一個(gè)方法。一個(gè)方法不僅能處理正常值,而且還能夠?qū)Ξ惓G闆r(如空值、極限值及界外值等)作出有意義的響應(yīng)。4.采用全面覆蓋技術(shù)43
5.降低方法的耦合度降低方法與外界的耦合程度的一項(xiàng)主要措施是在方法中盡可能少使用或不使用全局信息。5.降低方法的耦合度44
6.充分地利用繼承機(jī)制使用繼承機(jī)制可實(shí)現(xiàn)共享和提高重用性,是面向?qū)ο蟪绦蛟O(shè)計(jì)的主要途徑。(1)使用子過(guò)程。把公共的代碼分離出來(lái),構(gòu)成一個(gè)被其他方法調(diào)用的公用方法,是實(shí)現(xiàn)代碼復(fù)用最常用、最簡(jiǎn)單的方法。通??梢栽诨愔卸x這個(gè)公用方法,供派生類中的方法調(diào)用。6.充分地利用繼承機(jī)制45(2)分解因子。提高相似類代碼可重用性的另一個(gè)有效途徑,是從不同類的相似方法中分解出公共代碼和不同的代碼(即因子)。把公共代碼作為公用方法,定義在一個(gè)抽象基類(額外的)中;把不同的因子作為名字相同而算法不同的方法,定義在不同類中,并被這個(gè)公用方法調(diào)用。把這種分解與面向?qū)ο笳Z(yǔ)言提供的多態(tài)性機(jī)制結(jié)合起來(lái),抽象基類中定義的公用方法可由派生類來(lái)繼承,在新子類中只需編寫其特有的代碼,由于增添新子類編寫的代碼減少了,顯然為增添新子類所需付出的工作量也就明顯降低了。(2)分解因子。提高相似類代碼可重用性的另46(3)使用委派。當(dāng)確實(shí)存在一般-特殊關(guān)系時(shí),利用繼承關(guān)系,子類可以繼承父類的所有方法和屬性。但是,當(dāng)邏輯上不存在一般-特殊關(guān)系時(shí),為重用已有的代碼,可以利用委派機(jī)制。要恰當(dāng)?shù)厥褂美^承機(jī)制,否則會(huì)降低程序的可理解性、可修改性和可擴(kuò)充性。(3)使用委派。當(dāng)確實(shí)存在一般-特殊關(guān)系47(4)把重用代碼封裝在類中。解決同一類應(yīng)用問(wèn)題時(shí),程序員往往希望重用其他方法編寫的程序代碼。那么就將被重用的代碼封裝在類中,這樣使用起來(lái)比較安全,也是程序員應(yīng)該提倡的編程風(fēng)格。例如,如果開(kāi)發(fā)一個(gè)應(yīng)用數(shù)學(xué)系統(tǒng)時(shí),發(fā)現(xiàn)有現(xiàn)成的實(shí)現(xiàn)迭代法的商品軟件包,程序員想重用這個(gè)算法,于是先定義一個(gè)迭代法類,然后把這個(gè)商品軟件包的功能封裝在該類中即可。(4)把重用代碼封裝在類中。解決同一類應(yīng)用問(wèn)4811.2.2提高可擴(kuò)充性前面所述的提高可重用性的準(zhǔn)則,同樣能提高程序的可擴(kuò)充性。下面將介紹有助于提高程序的可擴(kuò)充性的面向?qū)ο蟪绦蛟O(shè)計(jì)準(zhǔn)則。
1.封裝實(shí)現(xiàn)策略為了提高類中數(shù)據(jù)結(jié)構(gòu)或算法可修改性,應(yīng)該把類中描述屬性的數(shù)據(jù)結(jié)構(gòu)以及修改屬性的算法等實(shí)現(xiàn)策略封裝起來(lái),只提供公有的接口供外界訪問(wèn)。11.2.2提高可擴(kuò)充性49
2.方法的功能應(yīng)該單一一個(gè)方法應(yīng)該高內(nèi)聚低耦合,包含對(duì)象模型中的有限內(nèi)容。如果用一個(gè)方法遍歷多條關(guān)聯(lián)鏈,將使方法過(guò)分復(fù)雜,既降低了可理解性,又影響了可修改性和可擴(kuò)充性。
3.避免使用多分支語(yǔ)句在實(shí)施系統(tǒng)開(kāi)發(fā)過(guò)程中,可以利用DO-CASE語(yǔ)句測(cè)試對(duì)象的內(nèi)部狀態(tài),避免使用多分支語(yǔ)句來(lái)根據(jù)對(duì)象類型選擇應(yīng)有的行為,否則在增添新類時(shí)將不得不修改原有的代碼。一般來(lái)說(shuō),應(yīng)該合理地利用多態(tài)性機(jī)制,根據(jù)對(duì)象當(dāng)前類型,自動(dòng)決定應(yīng)有的行為。2.方法的功能應(yīng)該單一50
4.精心選擇和定義公有方法公有方法是對(duì)外公用的接口,私有方法是僅在類內(nèi)使用的方法,通常利用私有方法來(lái)實(shí)現(xiàn)公有方法。一般來(lái)說(shuō),公有方法的修改代價(jià)要比私有方法大得多,因?yàn)閷?duì)公有方法的修改常常會(huì)引起許多其他類的修改,而私有方法的刪除、增加或修改所涉及的面要小得多(僅在類內(nèi)),因此代價(jià)也比較小。為提高可修改性,降低維護(hù)成本,必須精心選擇和定義公有方法。4.精心選擇和定義公有方法5111.2.3提高健壯性提高健壯性,也是程序員在編寫實(shí)現(xiàn)方法的代碼時(shí)應(yīng)該考慮的一個(gè)重要方面。通常需要在健壯性與效率之間做出適當(dāng)?shù)恼壑?。健壯性?duì)任何一個(gè)實(shí)用軟件都是不可忽略的質(zhì)量指標(biāo)。遵守下述準(zhǔn)則將有助于提高健壯性。
1.增強(qiáng)系統(tǒng)的容錯(cuò)功能系統(tǒng)應(yīng)該具備容錯(cuò)功能,即具有處理用戶操作錯(cuò)誤的能力。當(dāng)用戶操作失誤或輸入數(shù)據(jù)出錯(cuò)時(shí),不會(huì)引起程序運(yùn)行中斷,更不應(yīng)該造成“死機(jī)”,而應(yīng)該對(duì)操作進(jìn)行檢查,發(fā)現(xiàn)了的錯(cuò)誤,必須給出有關(guān)的提示信息,并允許用戶再次輸入或正常退出。11.2.3提高健壯性52
2.檢查參數(shù)的合法性對(duì)軟件系統(tǒng)中所使用的方法或過(guò)程,尤其是公有方法或過(guò)程,應(yīng)該著重檢查其參數(shù)的合法性,不能因?yàn)橛脩粼谑褂霉蟹椒ɑ蜻^(guò)程時(shí),違反參數(shù)的約束條件而引發(fā)程序運(yùn)行中斷或造成系統(tǒng)“死機(jī)”現(xiàn)象。2.檢查參數(shù)的合法性53
3.不要預(yù)先確定限制條件預(yù)先確定限制條件對(duì)所開(kāi)發(fā)的系統(tǒng)往往會(huì)產(chǎn)生一些不良的后果。特別是在設(shè)計(jì)階段,往往很難準(zhǔn)確地預(yù)測(cè)出應(yīng)用系統(tǒng)中使用的數(shù)據(jù)結(jié)構(gòu)的最大容量需求。當(dāng)系統(tǒng)中使用的數(shù)據(jù)結(jié)構(gòu)的容量大于預(yù)先確定的限制條件時(shí),系統(tǒng)有可能引發(fā)一連串的問(wèn)題。因此不應(yīng)該預(yù)先確定限制條件。如果有必要和可能的條件下,則應(yīng)該使用動(dòng)態(tài)內(nèi)存分配機(jī)制來(lái)創(chuàng)建數(shù)據(jù)結(jié)構(gòu),當(dāng)然,該數(shù)據(jù)結(jié)構(gòu)是未預(yù)先確定限制條件的。3.不要預(yù)先確定限制條件54
4.先測(cè)試后優(yōu)化為了提高健壯性,往往需要增加大量的代碼,這就或多或少地影響了系統(tǒng)的執(zhí)行效率。因此,就需要在效率與健壯性之間做出合理的折衷。一般來(lái)說(shuō),首先根據(jù)應(yīng)用程序的特點(diǎn),確定需要著重測(cè)試的部分(例如,最壞情況出現(xiàn)的次數(shù)及處理時(shí)間等),進(jìn)行測(cè)試。然后為提高性能,確定著重優(yōu)化的關(guān)鍵部分。此外在選擇算法時(shí),要綜合考慮內(nèi)存需求、速度以及實(shí)現(xiàn)的簡(jiǎn)易程度等因素,選擇出適當(dāng)?shù)乃惴ā?.先測(cè)試后優(yōu)化5511.3面向?qū)ο鬁y(cè)試11.3.1OO軟件的單元測(cè)試在面向?qū)ο蟮能浖_(kāi)發(fā)中,“封裝”導(dǎo)致了類和對(duì)象的定義,這意味著類和類的實(shí)例(對(duì)象)包裝了屬性(數(shù)據(jù))和處理這些數(shù)據(jù)的操作(也稱為方法或服務(wù))。其核心是“對(duì)象”,不存在傳統(tǒng)軟件開(kāi)發(fā)中的“單元”(或者說(shuō)單元的概念改變了)。也就是說(shuō),封裝起來(lái)的類和對(duì)象是最小的可測(cè)試單元。一個(gè)類可以包含一組不同的操作,而一個(gè)特定的操作也可能定義在一組不同的類中。因此,面向?qū)ο蟮能浖膯卧獪y(cè)試與傳統(tǒng)測(cè)試方法不一樣,它的含義發(fā)生了很大變化。11.3面向?qū)ο鬁y(cè)試11.3.1OO軟件的單元測(cè)試56面向?qū)ο蟮能浖膯卧獪y(cè)試,不是獨(dú)立地測(cè)試單個(gè)操作,而是把所有操作都看成類的一部分,全面地測(cè)試類和對(duì)象所封裝的屬性和操縱這些屬性的操作整體。具體地說(shuō),在OO的單元測(cè)試中不僅要發(fā)現(xiàn)類的所有操作中存在的問(wèn)題,還要考查一個(gè)類與其他的類協(xié)同工作時(shí)可能出現(xiàn)的錯(cuò)誤。現(xiàn)以實(shí)例說(shuō)明:在一個(gè)類層次中,操作A在超類中定義并被一組子類繼承,每個(gè)子類都可使用操作A,但是A調(diào)用于類中定義的操作并處理子類的私有屬性。由于在不同的子類中使用操作A的環(huán)境有所不同,因此有必要在每個(gè)子類的語(yǔ)境中測(cè)試操作A。這就是說(shuō),當(dāng)測(cè)試面向?qū)ο筌浖r(shí),傳統(tǒng)的單元測(cè)試方法是不可用的,我們不能再獨(dú)立地對(duì)操作A進(jìn)行測(cè)試。面向?qū)ο蟮能浖膯卧獪y(cè)試,不是獨(dú)立地測(cè)試單個(gè)操5711.3.2OO軟件的集成測(cè)試傳統(tǒng)的集成測(cè)試是采用自頂向下或自底向上或二者混合的兩頭逼近策略,通過(guò)用漸增方式集成功能模塊進(jìn)行的測(cè)試。但是由于面向?qū)ο蟪绦驔](méi)有層次的控制結(jié)構(gòu),相互調(diào)用的功能也是分散在不同的類中,類通過(guò)消息的相互作用申請(qǐng)和提供服務(wù),所以這種集成測(cè)試的策略就沒(méi)有意義了。此外,由于面向?qū)ο蟪绦蚓哂袆?dòng)態(tài)性,程序的控制流往往難以確定,因此只能做基于黑盒方法的集成測(cè)試。OO集成測(cè)試主要關(guān)注于系統(tǒng)的結(jié)構(gòu)和內(nèi)部的相互作用。面向?qū)ο筌浖募蓽y(cè)試有兩種方法。11.3.2OO軟件的集成測(cè)試58
1.基于線程的測(cè)試(Thread-basedTesting)基于線程的測(cè)試是指把響應(yīng)系統(tǒng)的一個(gè)輸入或一個(gè)事件所需要的一組類集成起來(lái)進(jìn)行測(cè)試。應(yīng)當(dāng)分別集成并測(cè)試每個(gè)線程,同時(shí)為了避免產(chǎn)生副作用再進(jìn)行回歸測(cè)試。1.基于線程的測(cè)試(Thread-based59
2.基于使用的測(cè)試(Use-basedTesting)基于使用的測(cè)試首先測(cè)試幾乎不使用服務(wù)器類的那些類(稱為獨(dú)立類),把獨(dú)立類都測(cè)試完之后,接著測(cè)試使用獨(dú)立類的最下層的類(稱為依賴類)。然后,根據(jù)依賴類的使用關(guān)系,從下到上一個(gè)層次一個(gè)層次地持續(xù)進(jìn)行測(cè)試,直至把整個(gè)軟件系統(tǒng)測(cè)試完為止。除了上述兩種測(cè)試方法,集群測(cè)試是面向?qū)ο筌浖蓽y(cè)試的一個(gè)步驟。為了檢查一群相互協(xié)作的類,用精心設(shè)計(jì)的測(cè)試用例,力圖發(fā)現(xiàn)協(xié)作錯(cuò)誤。通過(guò)研究對(duì)象模型可以確定協(xié)作類。為減少測(cè)試工作的工作量,在進(jìn)行集成測(cè)試時(shí),可參考類關(guān)系圖或?qū)嶓w關(guān)系圖,確定不需要被重復(fù)測(cè)試的部分,從而優(yōu)化測(cè)試用例,使測(cè)試能夠達(dá)到一定的標(biāo)準(zhǔn)。2.基于使用的測(cè)試(Use-basedT6011.3.3OO軟件的確認(rèn)測(cè)試與系統(tǒng)測(cè)試通過(guò)對(duì)OO軟件單元測(cè)試和集成測(cè)試,僅能確認(rèn)軟件開(kāi)發(fā)的功能是正確的,但是不能確認(rèn)在實(shí)際運(yùn)行時(shí),它是否滿足用戶要求,是否大量存在與實(shí)際使用條件下的各種應(yīng)用相矛盾的錯(cuò)誤,為此,在完成上述測(cè)試活動(dòng)后,還必須經(jīng)過(guò)規(guī)范的確認(rèn)測(cè)試和系統(tǒng)測(cè)試。面向?qū)ο筌浖拇_認(rèn)測(cè)試或系統(tǒng)測(cè)試,與傳統(tǒng)的確認(rèn)測(cè)試一樣,通過(guò)設(shè)計(jì)測(cè)試用例,主要檢查用戶界面和用戶可識(shí)別的輸出,不再考慮類之間相互連接的細(xì)節(jié)。測(cè)試人員應(yīng)該認(rèn)真研究動(dòng)態(tài)模型和描述系統(tǒng)行為的腳本,為系統(tǒng)的輸入信息設(shè)計(jì)出錯(cuò)處理的通路,模擬錯(cuò)誤的數(shù)據(jù)和軟件界面可能發(fā)生的錯(cuò)誤,設(shè)計(jì)出合理的測(cè)試用例。11.3.3OO軟件的確認(rèn)測(cè)試與系統(tǒng)測(cè)試6111.3.4設(shè)計(jì)測(cè)試用例目前,面向?qū)ο筌浖臏y(cè)試用例的設(shè)計(jì)方法,還處于研究、發(fā)展階段。1993年,Berard提出了指導(dǎo)OO軟件測(cè)試用例設(shè)計(jì)的方法,其要點(diǎn)如下:●每一個(gè)測(cè)試用例都要有一個(gè)惟一的標(biāo)識(shí),并與被測(cè)試的一個(gè)或幾個(gè)類相關(guān)聯(lián)起來(lái);●每個(gè)測(cè)試用例都要陳述測(cè)試目的;●對(duì)每個(gè)測(cè)試用例要有相應(yīng)的測(cè)試步驟,包括被測(cè)對(duì)象的特定狀態(tài),所使用的消息和操作,可能產(chǎn)生的錯(cuò)誤及測(cè)試需要的外部環(huán)境。●與傳統(tǒng)軟件測(cè)試(測(cè)試用例的設(shè)計(jì)由軟件的輸入—處理—輸出或單個(gè)模塊的算法細(xì)節(jié)驅(qū)動(dòng))不同,面向?qū)ο鬁y(cè)試關(guān)注于設(shè)計(jì)適當(dāng)?shù)牟僮餍蛄幸詸z查類的狀態(tài)。11.3.4設(shè)計(jì)測(cè)試用例62
1.OO概念對(duì)測(cè)試用例設(shè)計(jì)的影響封裝性和繼承性是類的重要特性,這給面向?qū)ο蟮能浖_(kāi)發(fā)帶來(lái)很多好處,同時(shí)它又對(duì)面向?qū)ο蟮能浖y(cè)試帶來(lái)負(fù)面影響。類的屬性和操作是被封裝的,而測(cè)試需要了解對(duì)象的詳細(xì)狀態(tài)。同時(shí),需要考慮當(dāng)改變數(shù)據(jù)成員的結(jié)構(gòu)時(shí),是否影響了類的對(duì)外接口,是否導(dǎo)致相應(yīng)外界必須改動(dòng)。例如,強(qiáng)制的類型轉(zhuǎn)換會(huì)破壞數(shù)據(jù)的封裝性,請(qǐng)看下面的這段程序:1.OO概念對(duì)測(cè)試用例設(shè)計(jì)的影響63classHd{private:inta=1;char*h="Hd";}classVb{public:intb=2;char*v="Vb";}Hdp;Vb*q=(Vb*)&p;…classHd…64則其中,p的數(shù)據(jù)成員可以通過(guò)q被隨意訪問(wèn)。此外,繼承不會(huì)減少對(duì)子類的測(cè)試,相反,會(huì)使測(cè)試過(guò)程更加復(fù)雜化。因此,繼承也給測(cè)試用例的設(shè)計(jì)速度帶來(lái)負(fù)面影響。當(dāng)父類與子類的環(huán)境不同時(shí),父類的測(cè)試用例對(duì)子類沒(méi)有什么使用價(jià)值,必須為子類設(shè)計(jì)新的測(cè)試用例。則其中,p的數(shù)據(jù)成員可以通過(guò)q被隨意訪問(wèn)。65在設(shè)計(jì)面向?qū)ο蟮臏y(cè)試用例時(shí)應(yīng)注意以下三點(diǎn)。(1)繼承的成員函數(shù)需要測(cè)試。對(duì)于在父類中已經(jīng)測(cè)試過(guò)的成員函數(shù),根據(jù)具體情況仍需在子類中重新測(cè)試。一般在下述兩種情況下要對(duì)成員函數(shù)重新進(jìn)行測(cè)試:●繼承的成員函數(shù)在子類中有所改動(dòng);●成員函數(shù)調(diào)用了改動(dòng)過(guò)的成員函數(shù)。在設(shè)計(jì)面向?qū)ο蟮臏y(cè)試用例時(shí)應(yīng)注意以下三點(diǎn)。66(2)子類的測(cè)試用例可以參照父類。例如,有兩個(gè)不同的成員函數(shù)的定義如下:father::B()中定義為if(value<0)message("less");elseif(value==0)message("equal"); elsemessage("more");son::B()中定義為 if(value<0)message("less"); elseif(value==0)message("Itisequal"); else {message("more"); if(value==99)message("Luck");}在原有的測(cè)試上,對(duì)son::B()的測(cè)試只需作如下改動(dòng):將value==0的測(cè)試結(jié)果期望改動(dòng),并增加value==99這一條件的測(cè)試。(2)子類的測(cè)試用例可以參照父類。例如,有兩67(3)設(shè)計(jì)測(cè)試用例時(shí),不但要設(shè)計(jì)確認(rèn)類功能滿足的輸入,而且還應(yīng)有意識(shí)地設(shè)計(jì)一些被禁止的例子,確認(rèn)類是否有不合法的行為產(chǎn)生。(3)設(shè)計(jì)測(cè)試用例時(shí),不但要設(shè)計(jì)確認(rèn)類功能68
2.類測(cè)試用例設(shè)計(jì)類測(cè)試是類生存期中的初始測(cè)試階段。類一般是一些單獨(dú)的部件,可以用于不同的應(yīng)用軟件中。這就要求每個(gè)類都必須是可靠的,并且不需要了解任何實(shí)現(xiàn)細(xì)節(jié)就能復(fù)用。類的測(cè)試既可以使用傳統(tǒng)的白盒測(cè)試方法,也可以使用黑盒測(cè)試方法。一般來(lái)說(shuō),在設(shè)計(jì)測(cè)試用例時(shí),可參照下列步驟:(1)根據(jù)OOD分析結(jié)果,選定檢測(cè)的類,并仔細(xì)分出類的狀態(tài)和相應(yīng)的行為,以及成員函數(shù)間傳遞的消息和輸入輸出的界定。2.類測(cè)試用例設(shè)計(jì)69(2)確定覆蓋標(biāo)準(zhǔn)。(3)利用結(jié)構(gòu)關(guān)系圖確定待測(cè)試類的所有關(guān)聯(lián)。(4)構(gòu)造測(cè)試用例,確認(rèn)使用什么輸入來(lái)激發(fā)類的狀態(tài),使用類的什么服務(wù),期望產(chǎn)生什么行為。(2)確定覆蓋標(biāo)準(zhǔn)。70下面介紹兩種常用的類測(cè)試用例設(shè)計(jì)方法。1)基于故障的測(cè)試用例設(shè)計(jì)基于故障的測(cè)試(Fault-basedTesting)與傳統(tǒng)的錯(cuò)誤推測(cè)法類似,通過(guò)對(duì)OOA/OOD模型的分析,首先推測(cè)軟件中可能有的錯(cuò)誤,然后設(shè)計(jì)出最可能發(fā)現(xiàn)這些錯(cuò)誤的測(cè)試用例。例如,軟件工程師經(jīng)常在問(wèn)題的邊界處犯錯(cuò)誤,因此,在測(cè)試(計(jì)算平方根)操作(該操作在輸入為負(fù)數(shù)時(shí)返回出錯(cuò)信息)時(shí),應(yīng)該著重檢查邊界情況:一個(gè)接近零的負(fù)數(shù)和零本身。其中“零本身”用于檢查程序員是否犯了如下錯(cuò)誤:下面介紹兩種常用的類測(cè)試用例設(shè)計(jì)方法。71把語(yǔ)句if(x>=0)calculate=sqr(x);誤寫成if(x>0)calculate=sqr(x);再如:程序中將if(strncmp(str1,str2,strlen(str1)))誤寫成if(strncmp(str1,str2,strlen(str2)))那么如果在測(cè)試用例中使用的數(shù)據(jù)str1和str2長(zhǎng)度相同,就無(wú)法檢測(cè)出錯(cuò)誤。為了推測(cè)出軟件中可能有的錯(cuò)誤,測(cè)試人員應(yīng)該認(rèn)真研究分析模型和設(shè)計(jì)模型,還得依靠測(cè)試人員的經(jīng)驗(yàn)和直覺(jué)。如果推測(cè)得比較準(zhǔn)確,則使用基于故障的測(cè)試方法能夠用較少的工作量發(fā)現(xiàn)大量錯(cuò)誤,否則不然。把語(yǔ)句if(x>=0)calculate=sqr(x)722)基于用例的測(cè)試用例設(shè)計(jì)基于故障的測(cè)試用例有一個(gè)很突出的缺點(diǎn):當(dāng)功能描述是錯(cuò)誤的或子系統(tǒng)間交互存在錯(cuò)誤時(shí),基于故障的測(cè)試用例就無(wú)法發(fā)現(xiàn)錯(cuò)誤。而基于用例的測(cè)試用例更關(guān)心的是用戶想做什么而不是軟件想做什么,通過(guò)用例獲取用戶要完成的功能,并以此為依據(jù)設(shè)計(jì)所涉及的各個(gè)類的測(cè)試用例。更具體地說(shuō),先搞清楚用戶想實(shí)現(xiàn)哪些功能?然后去尋找要完成的這些功能,需要哪些類參與,從功能出發(fā),對(duì)所確定的這些類及其子類分別設(shè)計(jì)類測(cè)試用例。2)基于用例的測(cè)試用例設(shè)計(jì)73
3.類間測(cè)試用例設(shè)計(jì)在集成面向?qū)ο笙到y(tǒng)階段,必須對(duì)類間協(xié)作進(jìn)行測(cè)試,因此測(cè)試用例的設(shè)計(jì)變得更加復(fù)雜。通??梢詮腛OA的類—關(guān)系模型和類—行為模型導(dǎo)出類間測(cè)試用例。測(cè)試類協(xié)作可以使用隨機(jī)測(cè)試方法和劃分測(cè)試方法,以及基于情景的測(cè)試和行為測(cè)試來(lái)完成。3.類間測(cè)試用例設(shè)計(jì)74(1)多個(gè)類的劃分測(cè)試方法。多個(gè)類的劃分測(cè)試方法有三種:基于狀態(tài)的劃分,基于屬性的劃分和基于功能的劃分。根據(jù)類操作改變類狀態(tài)的能力來(lái)劃分類操作,稱為基于狀態(tài)的劃分法;根據(jù)類操作使用的屬性來(lái)劃分類操作,稱為基于屬性的劃分法;根據(jù)類操作所完成的功能來(lái)劃分類操作,稱為基于功能的劃分法。另外,多類測(cè)試還應(yīng)該包括那些通過(guò)發(fā)送給協(xié)作類的消息而被調(diào)用的操作。根據(jù)與特定類的接口來(lái)劃分類操作又是一種劃分測(cè)試方法。(1)多個(gè)類的劃分測(cè)試方法。多個(gè)類的劃分測(cè)試75(2)從行為模型導(dǎo)出測(cè)試用例。動(dòng)態(tài)行為模型是由幾個(gè)狀態(tài)轉(zhuǎn)換圖組成的。根據(jù)類的狀態(tài)圖,可以設(shè)計(jì)出測(cè)試該類以及類間的動(dòng)態(tài)行為的測(cè)試用例。同時(shí),為了保證該類的所有行為都能被測(cè)試,還可以利用狀態(tài)圖設(shè)計(jì)更多測(cè)試用例。面向?qū)ο蠓椒▽W(xué)把分析、設(shè)計(jì)和實(shí)現(xiàn)很自然地聯(lián)系在一起了。雖然面向?qū)ο笤O(shè)計(jì)原則上不依賴于特定的實(shí)現(xiàn)環(huán)境,但是實(shí)現(xiàn)結(jié)果和實(shí)現(xiàn)成本卻在很大程度上取決于實(shí)現(xiàn)環(huán)境。因此,直接支持面向?qū)ο笤O(shè)計(jì)范型的面向?qū)ο蟪绦蛘Z(yǔ)言、開(kāi)發(fā)環(huán)境及類庫(kù),對(duì)于面向?qū)ο髮?shí)現(xiàn)來(lái)說(shuō)是非常重要的。(2)從行為模型導(dǎo)出測(cè)試用例。動(dòng)態(tài)行為模型7611.4組件技術(shù)簡(jiǎn)介11.4.1組件的概念及特點(diǎn)1.組件(Component)的概念組件就像我們?nèi)粘I钪杏玫降钠嚵慵蛴?jì)算機(jī)零件。例如:我們的手指就是人體的組件,假若缺少了一個(gè)指頭,則人體就不再是完整的實(shí)體,所以手指是構(gòu)成完整人體的基本組成部分,是不可缺少的?!敖M件”一詞只是用來(lái)指明整體(thewhole)與部分(thepart)之間的關(guān)系。例如:一間教室是一個(gè)整體,而教室是一棟教學(xué)樓的組成部分,所以教室是教學(xué)樓的組件。同理,一所學(xué)校是一個(gè)整體,而學(xué)校里的教學(xué)樓則是學(xué)校的組件,如圖11.1所示。11.4組件技術(shù)簡(jiǎn)介11.4.1組件的概念及特點(diǎn)77圖11.1組件示意圖11.1組件示意78
2.組件的特點(diǎn)(1)面向用戶。組件應(yīng)用可視、非程序化開(kāi)發(fā)工具建立應(yīng)用系統(tǒng)模型。組件開(kāi)發(fā)工具由圖形用戶界面支持,不要求使用者具備計(jì)算機(jī)編程能力,并且這種支持貫穿從組件開(kāi)發(fā)直到最終應(yīng)用系統(tǒng)開(kāi)發(fā)的全過(guò)程。(2)適應(yīng)性。組件應(yīng)具有全面、個(gè)性化、可調(diào)節(jié)的適應(yīng)能力。由于用戶所屬行業(yè)、規(guī)模和生產(chǎn)類型的多樣化,以及企業(yè)組織和業(yè)務(wù)流程經(jīng)常性的變化,因此要求軟件供應(yīng)商或開(kāi)發(fā)者所提供的軟件能適應(yīng)企業(yè)個(gè)性化的要求。2.組件的特點(diǎn)79(3)對(duì)業(yè)務(wù)邏輯的封裝。對(duì)業(yè)務(wù)邏輯封裝的規(guī)劃,確定了組件的邊界和接口特性。良好的規(guī)劃可以使組件和其功能與某一具體的應(yīng)用系統(tǒng)之間相對(duì)獨(dú)立,組件可以獨(dú)立開(kāi)發(fā)和分開(kāi)測(cè)試。(4)開(kāi)放性。組件不依賴于用戶的類型和規(guī)模,可以在多數(shù)據(jù)庫(kù)系統(tǒng)、多操作系統(tǒng)平臺(tái)上運(yùn)行。系統(tǒng)中所有的單元均不依賴于某一種數(shù)據(jù)庫(kù)系統(tǒng)。例如,借助于開(kāi)發(fā)工具所開(kāi)發(fā)的組件和應(yīng)用系統(tǒng)中,數(shù)據(jù)可以在異構(gòu)數(shù)據(jù)庫(kù)之間進(jìn)行轉(zhuǎn)換。(3)對(duì)業(yè)務(wù)邏輯的封裝。對(duì)業(yè)務(wù)邏輯封裝的規(guī)劃80(5)連續(xù)性。在整個(gè)開(kāi)發(fā)過(guò)程中,由開(kāi)發(fā)工具實(shí)現(xiàn)企業(yè)和應(yīng)用系統(tǒng)開(kāi)發(fā)之間的聯(lián)系。從企業(yè)設(shè)計(jì)到過(guò)程組織和數(shù)據(jù)組織,直到最終應(yīng)用系統(tǒng)的每一個(gè)步驟,使用者都是由相應(yīng)的開(kāi)發(fā)工具支持的。由開(kāi)發(fā)工具開(kāi)發(fā)的組件可以被多次重用和組合,所以使用者只需要精通較少的基本單元,如一個(gè)數(shù)據(jù)登錄界面可以被用于一個(gè)任務(wù)的輸入,也可以被用于查看所有過(guò)程的信息或?qū)?shù)據(jù)表格內(nèi)容的快速瀏覽。(5)連續(xù)性。在整個(gè)開(kāi)發(fā)過(guò)程中,由開(kāi)發(fā)工具實(shí)81(6)可重用性。組件化開(kāi)發(fā)有利于軟件企業(yè)的經(jīng)驗(yàn)和技術(shù)的積累。組件可以很好地重用,使軟件企業(yè)或開(kāi)發(fā)商大大減少后續(xù)開(kāi)發(fā)、改進(jìn)和功能擴(kuò)充所需的投入和費(fèi)用。組件開(kāi)發(fā)技術(shù)使業(yè)務(wù)邏輯封裝在規(guī)劃好的組件單元中,當(dāng)面對(duì)不同用戶需求時(shí),只需更改相應(yīng)的組件,通過(guò)事先定義好的組件產(chǎn)品,很快完成系統(tǒng)集成。此外,使用組件管理可以方便系統(tǒng)版本的升級(jí)。當(dāng)現(xiàn)有系統(tǒng)不能滿足要求時(shí),一般只要對(duì)現(xiàn)有系統(tǒng)進(jìn)行再開(kāi)發(fā),而不必拋棄現(xiàn)有系統(tǒng)重新開(kāi)發(fā)。(6)可重用性。組件化開(kāi)發(fā)有利于軟件企業(yè)82(7)工具支持。為了簡(jiǎn)化組件的開(kāi)發(fā)和應(yīng)用,使用者必須由軟件工具支持?!裨O(shè)計(jì)模板——用于信息模型和企業(yè)模型設(shè)計(jì)。●工具支持——用于組件的非程序化開(kāi)發(fā)、轉(zhuǎn)換和適應(yīng)。●目錄化——用于組件庫(kù)和組件的分類。為了組件的重用,僅僅將組件集合到一個(gè)目錄中是不夠的,重要的是對(duì)組件進(jìn)行分類,這樣便于開(kāi)發(fā)人員在開(kāi)發(fā)時(shí)選用合適的組件。(7)工具支持。為了簡(jiǎn)化組件的開(kāi)發(fā)和應(yīng)用,8311.4.2組件分類及開(kāi)發(fā)工具1.組件的分類1)按功能來(lái)分(1)核心組件——應(yīng)用系統(tǒng)開(kāi)發(fā)中基本的、必不可少的組成單元,如數(shù)據(jù)表格組件、數(shù)據(jù)登錄界面組件、算法組件等。(2)輔助組件——為了擴(kuò)展和增強(qiáng)應(yīng)用系統(tǒng)的功能而開(kāi)發(fā)的組件。它不是每一個(gè)應(yīng)用系統(tǒng)所必需的,可以根據(jù)用戶的要求安裝或擴(kuò)展,如決策支持系統(tǒng)(DSS)組件、模擬支持系統(tǒng)(SSS)組件、Internet組件等。11.4.2組件分類及開(kāi)發(fā)工具842)按組成來(lái)分(1)基本組件——每一個(gè)組件中只含有一個(gè)組件,如一個(gè)數(shù)據(jù)表格及一個(gè)數(shù)據(jù)登錄界面組件。(2)組合組件——由兩個(gè)或兩個(gè)以上的基本組件組成的組件,也可稱為部件,如一個(gè)算法組件中常常包含兩個(gè)或更多的基本組件。2)按組成來(lái)分853)按組件開(kāi)發(fā)工具所生成的結(jié)果來(lái)分(1)企業(yè)系統(tǒng)設(shè)計(jì)組件(USE組件)——主要功能為建立企業(yè)組織結(jié)構(gòu)模型。(2)業(yè)務(wù)過(guò)程計(jì)劃組件(GPP組件)——主要功能為創(chuàng)建企業(yè)業(yè)務(wù)流程模型。(3)數(shù)據(jù)庫(kù)表格組件(DBF組件)——主要功能為創(chuàng)建各種數(shù)據(jù)庫(kù)表格。3)按組件開(kāi)發(fā)工具所生成的結(jié)果來(lái)分86(4)算法組件(MTH組件)——主要功能是進(jìn)行各種算法運(yùn)算,進(jìn)行數(shù)據(jù)處理。(5)數(shù)據(jù)登錄界面組件(MSK組件)——主要功能為創(chuàng)建各種數(shù)據(jù)表格界面,完成數(shù)據(jù)的錄入、輸出、更改、刪除。(6)輔助功能組件——主要功能是實(shí)施各種輔助功能,如可視化、模擬等。(4)算法組件(MTH組件)——主要功能是87
2.組件開(kāi)發(fā)工具組件技術(shù)應(yīng)用的前提是具有一定數(shù)量的組件或組件庫(kù),而組件本身也是需要開(kāi)發(fā)的。組件開(kāi)發(fā)工具是組件開(kāi)發(fā)的前提,目前尚未形成被廣泛接受的通用標(biāo)準(zhǔn)的開(kāi)發(fā)工具,但是先進(jìn)的軟件開(kāi)發(fā)工具至少應(yīng)具備如下的特點(diǎn):(1)應(yīng)用面向?qū)ο蟮募夹g(shù)(OO技術(shù));(2)應(yīng)用第四代程序設(shè)計(jì)語(yǔ)言(4GL)設(shè)計(jì);(3)采用關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)(RDBMS);(4)具有圖形用戶界面(GUI),不要求應(yīng)用系統(tǒng)開(kāi)發(fā)人員和使用者具備程序設(shè)計(jì)語(yǔ)言的能力;(5)支持Internet和Intranet。2.組件開(kāi)發(fā)工具8811.4.3組件開(kāi)發(fā)原則與組件管理1.組件開(kāi)發(fā)原則為了適應(yīng)后續(xù)模型開(kāi)發(fā)和最終應(yīng)用系統(tǒng)開(kāi)發(fā)的可重用性和可柔性組件的要求,在應(yīng)用組件開(kāi)發(fā)中應(yīng)該注意以下幾個(gè)方面的原則:(1)通用性原則——組件開(kāi)發(fā)時(shí)應(yīng)該充分考慮到應(yīng)用系統(tǒng)開(kāi)發(fā)中的通用性要求。如在數(shù)據(jù)庫(kù)表格組件的開(kāi)發(fā)中,表格的結(jié)構(gòu)、數(shù)據(jù)的定義等應(yīng)該盡可能滿足應(yīng)用系統(tǒng)開(kāi)發(fā)時(shí)的通用性要求。11.4.3組件開(kāi)發(fā)原則與組件管理89(2)廣義性原則——應(yīng)用系統(tǒng)開(kāi)發(fā)應(yīng)具有不同功能、不同種類的組件,以滿足不同用戶類型、不同生產(chǎn)方式和不同用戶規(guī)模的用戶個(gè)性化要求。(3)標(biāo)準(zhǔn)化原則——由于所使用的開(kāi)發(fā)工具不同,要做到組件的完全標(biāo)準(zhǔn)化是不可能的。這里的“標(biāo)準(zhǔn)化”是指在采用同一開(kāi)發(fā)工具的前提下,開(kāi)發(fā)的組件盡可能符合一個(gè)統(tǒng)一的標(biāo)準(zhǔn)。(4)較高的柔性原則——在推薦模型和應(yīng)用系統(tǒng)開(kāi)發(fā)過(guò)程中,組件既可以直接被重用,也可以在進(jìn)行適當(dāng)修改后被重用。(2)廣義性原則——應(yīng)用系統(tǒng)開(kāi)發(fā)應(yīng)具有不同90(5)結(jié)構(gòu)簡(jiǎn)潔原則——組件應(yīng)該具備簡(jiǎn)潔的結(jié)構(gòu),以便在推薦模型開(kāi)發(fā)和應(yīng)用系統(tǒng)開(kāi)發(fā)中引用和進(jìn)行適應(yīng)性改造,同時(shí)方便組件管理。(6)功能、參數(shù)的清晰描述——對(duì)組件的功能和參數(shù)應(yīng)盡可能給予清楚的描述,以便于管理。(7)友好的用戶界面。(5)結(jié)構(gòu)簡(jiǎn)潔原則——組件應(yīng)該具備簡(jiǎn)潔的結(jié)912.組件的管理1)組件管理的目的由于一個(gè)應(yīng)用系統(tǒng)的開(kāi)發(fā)過(guò)程中將會(huì)使用大量的組件,因此,組件管理是應(yīng)用組件技術(shù)開(kāi)發(fā)應(yīng)用系統(tǒng)的一個(gè)不可忽視的方面。組件管理的目的在于建立統(tǒng)一、完整的組件檔案,在開(kāi)發(fā)過(guò)程中給予開(kāi)發(fā)人員以引導(dǎo),有助于開(kāi)發(fā)人員方便、快捷、正確地選用組件,同時(shí)也便于系統(tǒng)的維護(hù)。組件管理可借助于組件管理工具軟件——組件管理器進(jìn)行管理。組件管理器可以對(duì)組件進(jìn)行文本化和可視化管理。2.組件的管理922)組件管理的內(nèi)容根據(jù)組件自身的特點(diǎn)和組件管理的目的,組件管理的內(nèi)容至少應(yīng)該包括:①可視化組件的種類、名稱、參數(shù)定義。②對(duì)組件的圖形化描述。③組件的分類、文本化和目錄化。④組件的轉(zhuǎn)換和變更。2)組件管理的內(nèi)容9311.4.4應(yīng)用組件技術(shù)開(kāi)發(fā)應(yīng)用系統(tǒng)1.推薦模型開(kāi)發(fā)推薦模型開(kāi)發(fā)的目標(biāo)是應(yīng)用先進(jìn)的信息技術(shù),融合先進(jìn)的管理理論和眾多成功企業(yè)的最佳業(yè)務(wù)實(shí)踐,向用戶推薦滿足用戶需求的開(kāi)發(fā)模型,以便用戶參考。推薦模型仍以組件為基礎(chǔ),可以看作是組件的有機(jī)組合。為了開(kāi)發(fā)出能夠滿足用戶需求的推薦模型,在開(kāi)發(fā)推薦模型過(guò)程中可以對(duì)組件不斷地進(jìn)行修改。11.4.4應(yīng)用組件技術(shù)開(kāi)發(fā)應(yīng)用系統(tǒng)94一個(gè)優(yōu)秀的推薦模型應(yīng)該包括:組織模型、過(guò)程模型、數(shù)據(jù)模型和功能模型。(1)組織模型——提供了根據(jù)不同用戶功能和任務(wù)抽象出的組織結(jié)構(gòu)模型。(2)過(guò)程模型——根據(jù)離散型、流程型、混合型和服務(wù)型用戶的不同特點(diǎn)所建立的業(yè)務(wù)過(guò)程處理模型。(3)數(shù)據(jù)模型——建立整個(gè)業(yè)務(wù)處理過(guò)程中全部數(shù)據(jù)的處理模型。(4)功能模型——為系統(tǒng)內(nèi)不同用戶提供了實(shí)際業(yè)務(wù)過(guò)程處理的操作界面。一個(gè)優(yōu)秀的推薦模型應(yīng)該包括:組織模型、過(guò)程模95
2.應(yīng)用組件技術(shù)開(kāi)發(fā)應(yīng)用系統(tǒng)1)用組件技術(shù)開(kāi)發(fā)應(yīng)用系統(tǒng)的開(kāi)發(fā)步驟(1)基本組件開(kāi)發(fā)——開(kāi)發(fā)人員應(yīng)用開(kāi)發(fā)工具開(kāi)發(fā)各種不同功能的基本組件,并將所開(kāi)發(fā)的組件存儲(chǔ)到組件庫(kù)中,以便實(shí)施統(tǒng)一的管理。(2)推薦模型的開(kāi)發(fā)——結(jié)合先進(jìn)管理理論和一些成功的開(kāi)發(fā)實(shí)例,應(yīng)用組件構(gòu)造待開(kāi)發(fā)系統(tǒng)的推薦模型。(3)應(yīng)用系統(tǒng)的開(kāi)發(fā)——根據(jù)用戶的不同特點(diǎn),在系統(tǒng)推薦模型的基礎(chǔ)上,進(jìn)行一系列的修改、調(diào)整,最終形成應(yīng)用系統(tǒng)。2.應(yīng)用組件技術(shù)開(kāi)發(fā)應(yīng)用系統(tǒng)962)應(yīng)用組件技術(shù)開(kāi)發(fā)應(yīng)用系統(tǒng)模型圖11.2應(yīng)用組件技術(shù)開(kāi)發(fā)應(yīng)用系統(tǒng)模型2)應(yīng)用組件技術(shù)開(kāi)發(fā)應(yīng)用系統(tǒng)模型圖11.2應(yīng)用組件技術(shù)97組件技術(shù)無(wú)疑給應(yīng)用系統(tǒng)的開(kāi)發(fā)者帶來(lái)了方便,但組件技術(shù)的發(fā)展還很不成熟,還沒(méi)有一個(gè)統(tǒng)一的規(guī)范,這給開(kāi)發(fā)又帶來(lái)不便。因此,在實(shí)施軟件開(kāi)發(fā)的過(guò)程中,應(yīng)綜合考慮各個(gè)方面的因素來(lái)選擇軟件開(kāi)發(fā)方法。組件技術(shù)無(wú)疑給應(yīng)用系統(tǒng)的開(kāi)發(fā)者帶來(lái)了方便,但98第11章面向?qū)ο髮?shí)現(xiàn)11.1面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言11.2面向?qū)ο蟮某绦驅(qū)崿F(xiàn)特征11.3面向?qū)ο鬁y(cè)試11.4組件技術(shù)簡(jiǎn)介第11章面向?qū)ο髮?shí)現(xiàn)11.1面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言9911.1面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言11.1.1面向?qū)ο笳Z(yǔ)言的優(yōu)點(diǎn)編碼相對(duì)軟件生命期的各個(gè)階段來(lái)說(shuō)是最容易的,所以為數(shù)較多的初級(jí)程序員均可參加這一階段的工作。但是在軟件生命期中,程序是經(jīng)常需要被閱讀的,例如設(shè)計(jì)測(cè)試用例、排錯(cuò)、修改、功能擴(kuò)充等都需要程序員或其他人員閱讀程序??梢赃@樣說(shuō),在軟件開(kāi)發(fā)過(guò)程中,讀程序的時(shí)間比寫程序的時(shí)間還要多,因此,如何能夠更完整、更準(zhǔn)確地表達(dá)問(wèn)題域語(yǔ)義,使所開(kāi)發(fā)出的程序易于閱讀,使所開(kāi)發(fā)的系統(tǒng)具有很強(qiáng)的可重用性和可維護(hù)性,選擇一種什么樣的語(yǔ)言作為開(kāi)發(fā)工具就顯得尤為重要。11.1面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言11.1.1面向?qū)ο笳Z(yǔ)100面向?qū)ο笤O(shè)計(jì)的結(jié)果要轉(zhuǎn)換為計(jì)算機(jī)系統(tǒng)可以識(shí)別的代碼,既可以用面向?qū)ο笳Z(yǔ)言,也可以用非面向?qū)ο笳Z(yǔ)言實(shí)現(xiàn)。設(shè)計(jì)階段設(shè)計(jì)的對(duì)象和關(guān)聯(lián)最終都必須用具體的編程語(yǔ)言或數(shù)據(jù)庫(kù)實(shí)現(xiàn)。使用OO語(yǔ)言來(lái)實(shí)現(xiàn)OO設(shè)計(jì)相對(duì)來(lái)說(shuō)比較容易,因?yàn)檎Z(yǔ)言的結(jié)構(gòu)與設(shè)計(jì)的構(gòu)造是相似的,OO語(yǔ)言支持對(duì)象、多態(tài)性和繼承性。使用非OO語(yǔ)言需要特別注意和規(guī)定保留程序的OO結(jié)構(gòu),OO概念可以映射到非OO語(yǔ)言結(jié)構(gòu)中,這只是一個(gè)表達(dá)方式的問(wèn)題,不是語(yǔ)言能力的問(wèn)題,因?yàn)榫幊陶Z(yǔ)言最終要轉(zhuǎn)換為機(jī)器語(yǔ)言,但OO語(yǔ)言良好的風(fēng)格尤為突出。由于語(yǔ)言本身充分支持面向?qū)ο蟾拍畹膶?shí)現(xiàn),因此,編譯程序可以自動(dòng)把面向?qū)ο蟾拍钣成涞侥繕?biāo)程序中。使用非面向?qū)ο笳Z(yǔ)言編寫面向?qū)ο蟪绦?,則必須由程序員自己把面向?qū)ο蟾拍钣成涞侥繕?biāo)程序中。面向?qū)ο笤O(shè)計(jì)的結(jié)果要轉(zhuǎn)換為計(jì)算機(jī)系統(tǒng)可以識(shí)101例如人語(yǔ)言并不直接支持類或?qū)ο蟮母拍睿绦騿T只能在結(jié)構(gòu)中定義變量和相應(yīng)的函數(shù)(事實(shí)上,不能直接在結(jié)構(gòu)中定義函數(shù)而是要利用指針間接定義)。所有非面向?qū)ο笳Z(yǔ)言都不支持一般到特殊結(jié)構(gòu)的實(shí)現(xiàn),使用這類語(yǔ)言編程時(shí)要么完全回避繼承的概念,要么在聲明特殊化類時(shí),把對(duì)一般化類的引用嵌套在它里面。例如人語(yǔ)言并不直接支持類或?qū)ο蟮母拍?,程序員只102我們說(shuō)選用面向?qū)ο笳Z(yǔ)言還是非面向?qū)ο笳Z(yǔ)言,這只是一個(gè)表達(dá)方式的問(wèn)題,不是語(yǔ)言能力的問(wèn)題。從原理上說(shuō),使用任何一種通用語(yǔ)言都可以實(shí)現(xiàn)面向?qū)ο蟾拍?。在傳統(tǒng)的面向功能的方法學(xué)中,強(qiáng)調(diào)的是確定和分解系統(tǒng)功能,這種做法雖然是目標(biāo)的最直接的實(shí)現(xiàn)方式,但由于功能是軟件系統(tǒng)中最不穩(wěn)定、最容易變化的方面,因而獲得的程序往往難于維護(hù)和擴(kuò)充。OO方法開(kāi)發(fā)軟件,其結(jié)構(gòu)源于客觀世界穩(wěn)定的對(duì)象結(jié)構(gòu),與傳統(tǒng)軟件相比,軟件本身的內(nèi)部結(jié)構(gòu)發(fā)生了質(zhì)的變化,易重用性和易擴(kuò)充性都得到提高。圍繞對(duì)象來(lái)組織軟件系統(tǒng),可以自然地將現(xiàn)實(shí)世界模型映射到軟件結(jié)構(gòu)中。因此,使用面向?qū)ο笳Z(yǔ)言,實(shí)現(xiàn)面向?qū)ο蟾拍?,遠(yuǎn)比使用非面向?qū)ο笳Z(yǔ)言方便。當(dāng)然,方便性也并不是決定選擇何種語(yǔ)言的關(guān)鍵因素。我們說(shuō)選用面向?qū)ο笳Z(yǔ)言還是非面向?qū)ο笳Z(yǔ)言,這103選擇程序設(shè)計(jì)語(yǔ)言的關(guān)鍵因素,是語(yǔ)言的一致的表達(dá)能力、可重用性及可維護(hù)性。面向?qū)ο笳Z(yǔ)言刻畫客觀系統(tǒng)較為自然,它具有:①識(shí)認(rèn)性,系統(tǒng)中的基本構(gòu)件可識(shí)認(rèn)為一組可識(shí)別的離散對(duì)象;②類別性,系統(tǒng)具有相同數(shù)據(jù)結(jié)構(gòu)與行為的所有對(duì)象可組成一類;③多態(tài)性,對(duì)象具有惟一的靜態(tài)類型和多個(gè)可能的動(dòng)態(tài)類型;④繼承性,在基于層次關(guān)系的不同類中共享數(shù)據(jù)和操作等特點(diǎn)。因此,能夠更完整、更準(zhǔn)確地表達(dá)問(wèn)題域語(yǔ)義的面向?qū)ο笳Z(yǔ)言的語(yǔ)法是非常重要的,這將會(huì)對(duì)系統(tǒng)帶來(lái)下述幾個(gè)重要優(yōu)點(diǎn)。選擇程序設(shè)計(jì)語(yǔ)言的關(guān)鍵因素,是語(yǔ)言的一致的表達(dá)104
1.一致的表示方法從前面章節(jié)的講述中可以知道,面向?qū)ο箝_(kāi)發(fā)基于不隨時(shí)間變化的、一致的表示方法。這種表示方法應(yīng)該從問(wèn)題域到OOA,從OOA到OOD,最后從OOD到面向?qū)ο缶幊?OOP),始終穩(wěn)定不變。一致的表示方法既有利于在軟件開(kāi)發(fā)過(guò)程中始終使用統(tǒng)一的概念,也有利于編程人員理解軟件的各種配置成分。我們以“自動(dòng)飲料售貨機(jī)”為例,說(shuō)明面向?qū)ο箝_(kāi)發(fā)基于不隨時(shí)間變化的、一致的表示方法。對(duì)于“自動(dòng)飲料售貨機(jī)”這一實(shí)例,在問(wèn)題域、OOA、OOD或是OOP的各個(gè)階段所用到的概念都是一致的、不變的。如:退幣桿、找零、熄燈、投幣口、投幣、飲料、飲料倒出等,這對(duì)于用戶、分析人員、編程人員、測(cè)試人員、維護(hù)人員來(lái)說(shuō),無(wú)疑是有很大的幫助的。1.一致的表示方法105
2.可重用性軟件的可重用性的好壞對(duì)于提高軟件產(chǎn)品的質(zhì)量和軟件開(kāi)發(fā)效率意義重大。為了能帶來(lái)可觀的商業(yè)利益,必須在更廣泛的范圍中運(yùn)用重用機(jī)制,而不是僅僅在程序設(shè)計(jì)這個(gè)層次上進(jìn)行重用。因此,在OOA、OOD直到OOP中都顯式地表示問(wèn)題域語(yǔ)義,其意義是十分深遠(yuǎn)的。隨著時(shí)間的推移,軟件開(kāi)發(fā)組織既可能重用它在某個(gè)問(wèn)題域內(nèi)的OOA結(jié)果,也可能重用相應(yīng)的OOD和OOP結(jié)果。2.可重用性106我們?nèi)砸浴白詣?dòng)飲料售貨機(jī)”為例,說(shuō)明可重用性對(duì)于提高軟件產(chǎn)品的質(zhì)量和軟件開(kāi)發(fā)效率意義重大。假設(shè)該“自動(dòng)飲料售貨機(jī)”可提供汽水、洛神、紅茶、可樂(lè)、奶昔等五種飲料,有關(guān)這五種飲料所實(shí)施的操作是相同的,因此,可以構(gòu)造一個(gè)飲料類,然后由該類構(gòu)造汽水、洛神、紅茶、可樂(lè)、奶昔等五種不同的對(duì)象。這對(duì)于提高軟件開(kāi)發(fā)質(zhì)量和軟件開(kāi)發(fā)效率具有重要的意義。我們?nèi)砸浴白詣?dòng)飲料售貨機(jī)”為例,說(shuō)明可重用性對(duì)107
3.可維護(hù)性軟件維護(hù)是一件極為復(fù)雜的事情,在軟件的開(kāi)發(fā)成本中約占到70%左右。為了降低維護(hù)成本,盡管人們反復(fù)強(qiáng)調(diào)保持文檔與源程序一致的必要性,但是,在實(shí)際工作中很難做到交付兩類不同的文檔,并使它們保持彼此完全一致。特別是考慮到進(jìn)度、預(yù)算、能力和人員等限制因素時(shí),做到兩類文檔完全一致幾乎是不可能的。因此,維護(hù)人員最終面對(duì)的往往只有源程序本身。3.可維護(hù)性108以ATM(自動(dòng)取款機(jī))系統(tǒng)為例,說(shuō)明在程序內(nèi)部表達(dá)問(wèn)題域語(yǔ)義對(duì)維護(hù)工作的意義。假設(shè)在維護(hù)該系統(tǒng)時(shí)沒(méi)有合適的文檔資料可供參閱,于是維護(hù)人員人工瀏覽程序或使用軟件工具掃描程序,記下或打印出程序顯式陳述的問(wèn)題域語(yǔ)義,維護(hù)人員看到“ATM”、“賬戶”和“現(xiàn)金兌換卡”等,這對(duì)維護(hù)人員理解所要維護(hù)的軟件將有很大幫助。因此,在選擇編程語(yǔ)言時(shí),應(yīng)該考慮的首要因素,是在供選擇的語(yǔ)言中哪個(gè)語(yǔ)言能最好地表達(dá)問(wèn)題域語(yǔ)義。以ATM(自動(dòng)取款機(jī))系統(tǒng)為例,說(shuō)明在程序內(nèi)部10911.1.2面向?qū)ο笳Z(yǔ)言的技術(shù)特點(diǎn)面向?qū)ο笳Z(yǔ)言借鑒了20世紀(jì)50年代誕生的人工智能語(yǔ)言LISP,引入了動(dòng)態(tài)綁定的概念和交互式開(kāi)發(fā)環(huán)境的思想;始于20世紀(jì)60年代的離散事件模擬語(yǔ)言SIMULA67,引入了類的概念和繼承機(jī)制;形成于20世紀(jì)70年代的Smalltalk語(yǔ)言。面向?qū)ο笳Z(yǔ)言發(fā)展有兩大方向,一是純面向?qū)ο蟮恼Z(yǔ)言,如Smalltalk、EIFFEL、Java等語(yǔ)言;另一類是混合型面向?qū)ο笳Z(yǔ)言,也就是在過(guò)程語(yǔ)言或其他語(yǔ)言中增加了類、繼承等面向?qū)ο髾C(jī)制,如C++、Objective_C等語(yǔ)言。就兩種形式的面向?qū)ο笳Z(yǔ)言比較而言,純面向?qū)ο笳Z(yǔ)言更加適合面向?qū)ο蠓椒ㄑ芯亢涂焖僭偷膶?shí)現(xiàn);而混合型面向?qū)ο笳Z(yǔ)言則更加注重于提高系統(tǒng)的運(yùn)行速度,使傳統(tǒng)使用結(jié)構(gòu)化編程方式的程序員容易接受面向?qū)ο笏枷搿?1.1.2面向?qū)ο笳Z(yǔ)言的技術(shù)特點(diǎn)110面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言以對(duì)象為中心,對(duì)象是程序運(yùn)行時(shí)的基本成分。面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言中提供了類、繼承等機(jī)制。面向?qū)ο蟮某绦蛟O(shè)計(jì)即為設(shè)計(jì)類及由類構(gòu)造程序的方法和過(guò)程,用計(jì)算機(jī)對(duì)象模擬現(xiàn)實(shí)世界。成熟的面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言通常都提供豐富的類庫(kù)和強(qiáng)有力的開(kāi)發(fā)環(huán)境。面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言以對(duì)象為中心,對(duì)象是程序111
1.支持類與對(duì)象概念的機(jī)制面向?qū)ο笳Z(yǔ)言都允許用戶動(dòng)態(tài)創(chuàng)建對(duì)象,并且可以用指針引用動(dòng)態(tài)創(chuàng)建的對(duì)象。允許動(dòng)態(tài)創(chuàng)建對(duì)象,就意味著系統(tǒng)必須處理內(nèi)存管理問(wèn)題,如果不及時(shí)釋放不再需要的對(duì)象所占用的內(nèi)存,動(dòng)態(tài)存儲(chǔ)分配就有可能耗盡內(nèi)存,出現(xiàn)內(nèi)存不足的問(wèn)題。通常,對(duì)這類問(wèn)題的解決方法有兩種,一種是由語(yǔ)言的運(yùn)行機(jī)制自動(dòng)管理內(nèi)存,即提供自動(dòng)回收“垃圾”的機(jī)制;另一種是由程序員編寫釋放內(nèi)存的代碼。自動(dòng)管理內(nèi)存不僅方便而且安全,但是必須采用先進(jìn)的垃圾收集算法才能減少開(kāi)銷。某些面向?qū)ο蟮恼Z(yǔ)言(如C++)允許程序員定義析構(gòu)函數(shù)(Destructor)。每當(dāng)一個(gè)對(duì)象超出范圍或被顯式刪除時(shí),就自動(dòng)調(diào)用析構(gòu)函數(shù)。這種機(jī)制使得程序
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年河北邯鄲成安縣公開(kāi)選聘農(nóng)村黨務(wù)(村務(wù))工作者72人備考題庫(kù)附答案
- 2025年河北衡水市婦幼保健院第四季度就業(yè)見(jiàn)習(xí)人員招聘5人備考題庫(kù)附答案
- 2025年甘肅省蘭州市皋蘭縣蘭鑫鋼鐵集團(tuán)招聘176人筆試備考試題附答案
- 2025年齊齊哈爾克東縣公益性崗位人員招聘46人備考題庫(kù)附答案
- 2025年11月四川西南石油大學(xué)考核招聘高層次人才35人備考題庫(kù)附答案
- 2026北京大學(xué)應(yīng)屆畢業(yè)生招聘4人(三)筆試模擬試題及答案解析
- 2026上半年黑龍江科技大學(xué)招聘博士教師66人筆試備考試題及答案解析
- 醫(yī)護(hù)科室年度工作總結(jié)【演示文檔課件】
- 2026固原市選聘人民政府行政復(fù)議委員會(huì)專家委員筆試參考題庫(kù)及答案解析
- 2026中工國(guó)際工程股份有限公司社會(huì)招聘筆試備考試題及答案解析
- 福州古厝課件
- 2026年鞍山職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)技能考試題庫(kù)參考答案詳解
- 眩暈護(hù)理的研究方向與趨勢(shì)
- 2025年新公開(kāi)選拔中小學(xué)校長(zhǎng)筆試試題與答案
- 2025年度吊燈市場(chǎng)調(diào)研:時(shí)尚美觀、風(fēng)格多樣及餐廳客廳需求
- 北京市西城區(qū)2024-2025學(xué)年六年級(jí)上學(xué)期期末英語(yǔ)試題
- 福建農(nóng)林大學(xué)研究生學(xué)位論文格式的統(tǒng)一要求(2025年修訂)
- 基坑回填安全措施方案
- 地下管線保護(hù)拆除方案
- 廣西萬(wàn)昌宏畜牧養(yǎng)殖場(chǎng)環(huán)境影響報(bào)告書
- 機(jī)電工程項(xiàng)目驗(yàn)收標(biāo)準(zhǔn)及流程
評(píng)論
0/150
提交評(píng)論