第十二章 面向?qū)ο髮?shí)現(xiàn)課件_第1頁(yè)
第十二章 面向?qū)ο髮?shí)現(xiàn)課件_第2頁(yè)
第十二章 面向?qū)ο髮?shí)現(xiàn)課件_第3頁(yè)
第十二章 面向?qū)ο髮?shí)現(xiàn)課件_第4頁(yè)
第十二章 面向?qū)ο髮?shí)現(xiàn)課件_第5頁(yè)
已閱讀5頁(yè),還剩63頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第十二章、面向?qū)ο髮?shí)現(xiàn)第十二章面向?qū)ο髮?shí)現(xiàn)面向?qū)ο髮?shí)現(xiàn)面向?qū)ο髮?shí)現(xiàn)主要包括兩項(xiàng)工作:把面向?qū)ο笤O(shè)計(jì)結(jié)果,翻譯成用某種程序語(yǔ)言書(shū)寫的面向?qū)ο蟪绦颍粶y(cè)試并調(diào)試面向?qū)ο蟮某绦颉?第十二章面向?qū)ο髮?shí)現(xiàn)面向?qū)ο髮?shí)現(xiàn)面向?qū)ο蟪绦虻馁|(zhì)量基本上由面向?qū)ο笤O(shè)計(jì)的質(zhì)量決定,但是,所采用的程序語(yǔ)言的特點(diǎn)和程序設(shè)計(jì)風(fēng)格也將對(duì)程序的可靠性、可重用性及可維護(hù)性產(chǎn)生深遠(yuǎn)影響。目前,軟件測(cè)試仍然是保證軟件可靠性的主要措施,對(duì)于面向?qū)ο蟮能浖?lái)說(shuō),情況也是如此。面向?qū)ο鬁y(cè)試的目標(biāo),也是用盡可能低的測(cè)試成本發(fā)現(xiàn)盡可能多的軟件錯(cuò)誤。但是,面向?qū)ο蟪绦蛑刑赜械姆庋b、繼承和多態(tài)等機(jī)制,也給面向?qū)ο鬁y(cè)試帶來(lái)一些新特點(diǎn),增加了測(cè)試和調(diào)試的難度。必須在實(shí)踐中努力探索適合于面向?qū)ο筌浖母行У臏y(cè)試方法。3第十二章面向?qū)ο髮?shí)現(xiàn)主要內(nèi)容結(jié)構(gòu)12.1程序設(shè)計(jì)語(yǔ)言12.2程序設(shè)計(jì)風(fēng)格12.3測(cè)試策略12.4設(shè)計(jì)測(cè)試用例12.5小結(jié)4第十二章面向?qū)ο髮?shí)現(xiàn)面向?qū)ο蟮恼Z(yǔ)言面向?qū)ο笤O(shè)計(jì)的結(jié)果既可以用面向?qū)ο笳Z(yǔ)言、也可以用非面向?qū)ο笳Z(yǔ)言實(shí)現(xiàn)。使用面向?qū)ο笳Z(yǔ)言時(shí),由于語(yǔ)言本身充分支持面向?qū)ο蟾拍畹膶?shí)現(xiàn),因此,編譯程序可以自動(dòng)把面向?qū)ο蟾拍钣成涞侥繕?biāo)程序中。使用非面向?qū)ο笳Z(yǔ)言編寫面向?qū)ο蟪绦?,則必須由程序員自己把面向?qū)ο蟾拍钣成涞侥繕?biāo)程序中。所有非面向?qū)ο笳Z(yǔ)言都不支持一般-特殊結(jié)構(gòu)的實(shí)現(xiàn),使用這類語(yǔ)言編程時(shí)要么完全回避繼承的概念,要么在聲明特殊化類時(shí),把對(duì)一般化類的引用嵌套在它里面。5第十二章面向?qū)ο髮?shí)現(xiàn)面向?qū)ο蟮恼Z(yǔ)言到底應(yīng)該選用面向?qū)ο笳Z(yǔ)言還是非面向?qū)ο笳Z(yǔ)言,關(guān)鍵不在于語(yǔ)言功能強(qiáng)弱。從原理上說(shuō),使用任何一種通用語(yǔ)言都可以實(shí)現(xiàn)面向?qū)ο蟾拍?。?dāng)然,使用面向?qū)ο笳Z(yǔ)言,實(shí)現(xiàn)面向?qū)ο蟾拍?,遠(yuǎn)比使用非面向?qū)ο笳Z(yǔ)言方便,但是,方便性也并不是決定選擇何種語(yǔ)言的關(guān)鍵因素。選擇編程語(yǔ)言的關(guān)鍵因素,是語(yǔ)言的一致的表達(dá)能力、可重用性及可維護(hù)性。6第十二章面向?qū)ο髮?shí)現(xiàn)面向?qū)ο蟮恼Z(yǔ)言從面向?qū)ο笥^點(diǎn)看來(lái),能夠更完整、更準(zhǔn)確地表達(dá)問(wèn)題域語(yǔ)義的面向?qū)ο笳Z(yǔ)言的語(yǔ)法是非常重要的,因?yàn)檫@會(huì)帶來(lái)下述幾個(gè)重要優(yōu)點(diǎn):一致的表示方法可重用性可維護(hù)性7第十二章面向?qū)ο髮?shí)現(xiàn)一致的表示方法從前面章節(jié)的講述中可以知道,面向?qū)ο箝_(kāi)發(fā)基于不隨時(shí)間變化的、一致的表示方法。這種表示方法應(yīng)該從問(wèn)題域到OOA,從OOA到OOD,最后從OOD到面向?qū)ο缶幊?OOP),始終穩(wěn)定不變。一致的表示方法既有利于在軟件開(kāi)發(fā)過(guò)程中始終使用統(tǒng)一的概念,也有利于維護(hù)人員理解軟件的各種配置成分。8第十二章面向?qū)ο髮?shí)現(xiàn)可重用性為了能帶來(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é)果。9第十二章面向?qū)ο髮?shí)現(xiàn)可維護(hù)性盡管人們反復(fù)強(qiáng)調(diào)保持文檔與源程序一致的必要性,但是,在實(shí)際工作中很難做到交付兩類不同的文檔,并使它們保持彼此完全一致。特別是考慮到進(jìn)度、預(yù)算、能力和人員等限制因素時(shí),做到兩類文檔完全一致幾乎是不可能的。因此,維護(hù)人員最終面對(duì)的往往只有源程序本身。10第十二章面向?qū)ο髮?shí)現(xiàn)舉例以ATM系統(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ǔ)義。一般說(shuō)來(lái),應(yīng)該盡量選用面向?qū)ο笳Z(yǔ)言來(lái)實(shí)現(xiàn)面向?qū)ο蠓治觥⒃O(shè)計(jì)的結(jié)果。11第十二章面向?qū)ο髮?shí)現(xiàn)面向?qū)ο笳Z(yǔ)言的技術(shù)特點(diǎn)面向?qū)ο笳Z(yǔ)言的形成過(guò)程在選擇面向?qū)ο笳Z(yǔ)言時(shí)應(yīng)該著重考察的一些技術(shù)特點(diǎn):支持類與對(duì)象概念的機(jī)制實(shí)現(xiàn)整體-部分結(jié)構(gòu)的機(jī)制實(shí)現(xiàn)一般-特殊結(jié)構(gòu)的機(jī)制實(shí)現(xiàn)屬性和服務(wù)的機(jī)制類型檢查類庫(kù)效率持久保存對(duì)象參數(shù)化類(模板機(jī)制)開(kāi)發(fā)環(huán)境12第十二章面向?qū)ο髮?shí)現(xiàn)面向?qū)ο笳Z(yǔ)言的形成過(guò)程面向?qū)ο笳Z(yǔ)言的形成借鑒了歷史上許多程序語(yǔ)言的特點(diǎn),從中吸取了豐富的營(yíng)養(yǎng)。當(dāng)今的面向?qū)ο笳Z(yǔ)言,從20世紀(jì)50年代誕生的LISP語(yǔ)言中引進(jìn)了動(dòng)態(tài)聯(lián)編的概念和交互式開(kāi)發(fā)環(huán)境的思想,從20世紀(jì)60年代推出的SIMULA語(yǔ)言中引進(jìn)了類的概念和繼承機(jī)制,此外,還受到20世紀(jì)70年代末期開(kāi)發(fā)的Modula_2語(yǔ)言和Ada語(yǔ)言中數(shù)據(jù)抽象機(jī)制的影響。20世紀(jì)80年代以來(lái),面向?qū)ο笳Z(yǔ)言像雨后春筍一樣大量涌現(xiàn),形成了兩大類面向?qū)ο笳Z(yǔ)言。一類是純面向?qū)ο笳Z(yǔ)言,如Smalltalk和Eiffel等語(yǔ)言。另一類是混合型面向?qū)ο笳Z(yǔ)言,也就是在過(guò)程語(yǔ)言的基礎(chǔ)上增加面向?qū)ο髾C(jī)制,如C++等語(yǔ)言。純面向?qū)ο笳Z(yǔ)言著重支持面向?qū)ο蠓椒ㄑ芯亢涂焖僭偷膶?shí)現(xiàn),而混合型面向?qū)ο笳Z(yǔ)言的目標(biāo)則是提高運(yùn)行速度和使傳統(tǒng)程序員容易接受面向?qū)ο笏枷?。成熟的面向?qū)ο笳Z(yǔ)言通常都提供豐富的類庫(kù)和強(qiáng)有力的開(kāi)發(fā)環(huán)境。13第十二章面向?qū)ο髮?shí)現(xiàn)支持類與對(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)存。有兩種管理內(nèi)存的方法,一種是由語(yǔ)言的運(yùn)行機(jī)制自動(dòng)管理內(nèi)存,即提供自動(dòng)回收“垃圾”的機(jī)制;另一種是由程序員編寫釋放內(nèi)存的代碼。自動(dòng)管理內(nèi)存不僅方便而且安全,但是必須采用先進(jìn)的垃圾收集算法才能減少開(kāi)銷。14第十二章面向?qū)ο髮?shí)現(xiàn)實(shí)現(xiàn)整體部分結(jié)構(gòu)的機(jī)制一般說(shuō)來(lái),有兩種實(shí)現(xiàn)方法,分別使用指針和獨(dú)立的關(guān)聯(lián)對(duì)象實(shí)現(xiàn)整體-部分結(jié)構(gòu)。大多數(shù)現(xiàn)有的面向?qū)ο笳Z(yǔ)言并不顯式支持獨(dú)立的關(guān)聯(lián)對(duì)象,在這種情況下,使用指針是最容易的實(shí)現(xiàn)方法,通過(guò)增加內(nèi)部指針可以方便地實(shí)現(xiàn)關(guān)聯(lián)。15第十二章面向?qū)ο髮?shí)現(xiàn)實(shí)現(xiàn)一般特殊結(jié)構(gòu)的機(jī)制既包括實(shí)現(xiàn)繼承的機(jī)制也包括解決名字沖突的機(jī)制。所謂解決名字沖突,指的是處理在多個(gè)基類中可能出現(xiàn)的重名問(wèn)題,這個(gè)問(wèn)題僅在支持多重繼承的語(yǔ)言中才會(huì)遇到。某些語(yǔ)言拒絕接受有名字沖突的程序,另一些語(yǔ)言提供了解決沖突的協(xié)議。不論使用何種語(yǔ)言,程序員都應(yīng)該盡力避免出現(xiàn)名字沖突。16第十二章面向?qū)ο髮?shí)現(xiàn)實(shí)現(xiàn)屬性和服務(wù)的機(jī)制對(duì)于實(shí)現(xiàn)屬性的機(jī)制應(yīng)該著重考慮以下幾個(gè)方面:支持實(shí)例連接的機(jī)制;屬性的可見(jiàn)性控制;對(duì)屬性值的約束。對(duì)于服務(wù)來(lái)說(shuō),主要應(yīng)該考慮下列因素:支持消息連接(即表達(dá)對(duì)象交互關(guān)系)的機(jī)制;控制服務(wù)可見(jiàn)性的機(jī)制;動(dòng)態(tài)聯(lián)編。17第十二章面向?qū)ο髮?shí)現(xiàn)類型檢查程序設(shè)計(jì)語(yǔ)言可以按照編譯時(shí)進(jìn)行類型檢查的嚴(yán)格程度來(lái)分類。如果語(yǔ)言僅要求每個(gè)變量或?qū)傩噪`屬于一個(gè)對(duì)象,則是弱類型的;如果語(yǔ)法規(guī)定每個(gè)變量或?qū)傩员仨殰?zhǔn)確地屬于某個(gè)特定的類,則這樣的語(yǔ)言是強(qiáng)類型的。面向?qū)ο笳Z(yǔ)言在這方面差異很大,例如,Smalltalk實(shí)際上是一種無(wú)類型語(yǔ)言(所有變量都是未指定類的對(duì)象);C++和Eiffel則是強(qiáng)類型語(yǔ)言。有利于在編譯時(shí)發(fā)現(xiàn)程序錯(cuò)誤;增加了優(yōu)化的可能性.混合型語(yǔ)言(如C++,Objective_C等)甚至允許屬性值不是對(duì)象而是某種預(yù)定義的基本類型數(shù)據(jù)(如整數(shù),浮點(diǎn)數(shù)等),這可以提高操作的效率。18第十二章面向?qū)ο髮?shí)現(xiàn)類庫(kù)大多數(shù)面向?qū)ο笳Z(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ù)通常還提供獨(dú)立于具體設(shè)備的接口類(例如,輸入輸出流),此外,用于實(shí)現(xiàn)窗口系統(tǒng)的用戶界面類也非常有用,它們構(gòu)成一個(gè)相對(duì)獨(dú)立的圖形庫(kù)。19第十二章面向?qū)ο髮?shí)現(xiàn)效率許多人認(rèn)為面向?qū)ο笳Z(yǔ)言的主要缺點(diǎn)是效率低。產(chǎn)生這種印象的一個(gè)原因是,某些早期的面向?qū)ο笳Z(yǔ)言是解釋型的而不是編譯型的。事實(shí)上,使用擁有完整類庫(kù)的面向?qū)ο笳Z(yǔ)言,有時(shí)能比使用非面向?qū)ο笳Z(yǔ)言得到運(yùn)行更快的代碼。這是因?yàn)轭悗?kù)中提供了更高效的算法和更好的數(shù)據(jù)結(jié)構(gòu),例如,程序員已經(jīng)無(wú)須編寫實(shí)現(xiàn)哈希表或平衡樹(shù)算法的代碼了,類庫(kù)中已經(jīng)提供了這類數(shù)據(jù)結(jié)構(gòu),而且算法先進(jìn)、代碼精巧可靠。20第十二章面向?qū)ο髮?shí)現(xiàn)持久保存對(duì)象任何應(yīng)用程序都對(duì)數(shù)據(jù)進(jìn)行處理,如果希望數(shù)據(jù)能夠不依賴于程序執(zhí)行的生命期而長(zhǎng)時(shí)間保存下來(lái),則需要提供某種保存數(shù)據(jù)的方法。希望長(zhǎng)期保存數(shù)據(jù)主要出于以下兩個(gè)原因:為實(shí)現(xiàn)在不同程序之間傳遞數(shù)據(jù),需要保存數(shù)據(jù);為恢復(fù)被中斷了的程序的運(yùn)行,首先需要保存數(shù)據(jù)。一些面向?qū)ο笳Z(yǔ)言,沒(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ì)象的輸入輸出操作。21第十二章面向?qū)ο髮?shí)現(xiàn)參數(shù)化類所謂參數(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ǔ)言也提供了類模板。22第十二章面向?qū)ο髮?shí)現(xiàn)開(kāi)發(fā)環(huán)境軟件工具和軟件工程環(huán)境對(duì)軟件生產(chǎn)率有很大影響。由于面向?qū)ο蟪绦蛑欣^承關(guān)系和動(dòng)態(tài)聯(lián)編等引入的特殊復(fù)雜性,面向?qū)ο笳Z(yǔ)言所提供的軟件工具或開(kāi)發(fā)環(huán)境就顯得尤其重要了。至少應(yīng)該包括下列一些最基本的軟件工具:編輯程序,編譯程序或解釋程序,瀏覽工具,調(diào)試器(debugger)等。23第十二章面向?qū)ο髮?shí)現(xiàn)選擇面向?qū)ο笳Z(yǔ)言開(kāi)發(fā)人員在選擇面向?qū)ο笳Z(yǔ)言時(shí),還應(yīng)該著重考慮以下一些實(shí)際因素:將來(lái)能否占主導(dǎo)地位可重用性類庫(kù)和開(kāi)發(fā)環(huán)境其他因素24第十二章面向?qū)ο髮?shí)現(xiàn)程序設(shè)計(jì)風(fēng)格良好的面向?qū)ο蟪绦蛟O(shè)計(jì)風(fēng)格,既包括傳統(tǒng)的程序設(shè)計(jì)風(fēng)格準(zhǔn)則,也包括為適應(yīng)面向?qū)ο蠓椒ㄋ赜械母拍睿ɡ纾^承性)而必須遵循的一些新準(zhǔn)則。提高可重用性提高可擴(kuò)充性提高健壯性25第十二章面向?qū)ο髮?shí)現(xiàn)提高可重用性軟件重用有多個(gè)層次,在編碼階段主要涉及代碼重用問(wèn)題。一般說(shuō)來(lái),代碼重用有兩種:本項(xiàng)目?jī)?nèi)的代碼重用:主要是找出設(shè)計(jì)中相同或相似的部分,然后利用繼承機(jī)制共享它們。新項(xiàng)目重用舊項(xiàng)目的代碼。26第十二章面向?qū)ο髮?shí)現(xiàn)提高可重用性的準(zhǔn)則提高方法的內(nèi)聚如果某個(gè)方法涉及兩個(gè)或多個(gè)不相關(guān)的功能,則應(yīng)該把它分解成幾個(gè)更小的方法。減小方法的規(guī)模如果某個(gè)方法規(guī)模過(guò)大,則應(yīng)該把它分解成幾個(gè)更小的方法。保持方法的一致性功能相似的方法應(yīng)該有一致的名字、參數(shù)特征(包括參數(shù)個(gè)數(shù)、類型和次序)、返回值類型、使用條件及出錯(cuò)條件等。27第十二章面向?qū)ο髮?shí)現(xiàn)提高可重用性的準(zhǔn)則把策略與實(shí)現(xiàn)分開(kāi)策略方法:負(fù)責(zé)做出決策,提供變?cè)?,并且管理全局資源。策略方法應(yīng)該檢查系統(tǒng)運(yùn)行狀態(tài),并處理出錯(cuò)情況,它們并不直接完成計(jì)算或?qū)崿F(xiàn)復(fù)雜的算法。實(shí)現(xiàn)方法:負(fù)責(zé)完成具體的操作,但卻并不做出是否執(zhí)行這個(gè)操作的決定,也不知道為什么執(zhí)行這個(gè)操作。實(shí)現(xiàn)方法僅僅針對(duì)具體數(shù)據(jù)完成特定處理,通常用于實(shí)現(xiàn)復(fù)雜的算法。28第十二章面向?qū)ο髮?shí)現(xiàn)提高可重用性的準(zhǔn)則全面覆蓋如果輸入條件的各種組合都可能出現(xiàn),則應(yīng)該針對(duì)所有組合寫出方法,而不能僅僅針對(duì)當(dāng)前用到的組合情況寫方法。此外,一個(gè)方法不應(yīng)該只能處理正常值,對(duì)空值、極限值及界外值等異常情況也應(yīng)該能夠作出有意義的響應(yīng)。盡量不使用全局信息應(yīng)該盡量降低方法與外界的耦合程度,不使用全局信息是降低耦合度的一項(xiàng)主要措施。29第十二章面向?qū)ο髮?shí)現(xiàn)提高可重用性的準(zhǔn)則利用繼承機(jī)制調(diào)用子過(guò)程最簡(jiǎn)單的做法是把公共的代碼分離出來(lái),構(gòu)成一個(gè)被其他方法調(diào)用的公用方法。可以在基類中定義這個(gè)公用方法,供派生類中的方法調(diào)用。分解因子從不同類的相似方法中分解出不同的“因子”(即不同的代碼),把余下的代碼作為公用方法中的公共代碼。把分解出的因子作為名字相同算法不同的方法,放在不同類中定義,并被這個(gè)公用方法調(diào)用。30第十二章面向?qū)ο髮?shí)現(xiàn)提高可重用性的準(zhǔn)則利用繼承機(jī)制使用委托當(dāng)邏輯上不存在一般-特殊關(guān)系時(shí),為重用已有的代碼,可以利用委托機(jī)制把代碼封裝在類中程序員往往希望重用用其他方法編寫的,解決同一類應(yīng)用問(wèn)題的程序代碼。重用這類代碼的一個(gè)比較安全的途徑,是把被重用的代碼封裝在類中。31第十二章面向?qū)ο髮?shí)現(xiàn)提高可擴(kuò)充性的準(zhǔn)則封裝實(shí)現(xiàn)策略應(yīng)該把類的實(shí)現(xiàn)策略(包括描述屬性的數(shù)據(jù)結(jié)構(gòu)、修改屬性的算法等)封裝起來(lái),對(duì)外只提供公有的接口,否則將降低今后修改數(shù)據(jù)結(jié)構(gòu)或算法的自由度。不要用一個(gè)方法遍歷多條關(guān)聯(lián)鏈一個(gè)方法應(yīng)該只包含對(duì)象模型中的有限內(nèi)容。違反這條準(zhǔn)則將導(dǎo)致方法過(guò)分復(fù)雜,既不易理解,也不易修改擴(kuò)充。32第十二章面向?qū)ο髮?shí)現(xiàn)提高可擴(kuò)充性的準(zhǔn)則避免使用多分支語(yǔ)句一般說(shuō)來(lái),可以利用DOCASE語(yǔ)句測(cè)試對(duì)象的內(nèi)部狀態(tài),但是不要根據(jù)對(duì)象類型選擇應(yīng)有的行為。應(yīng)該合理地利用多態(tài)性機(jī)制,根據(jù)對(duì)象當(dāng)前類型,自動(dòng)決定應(yīng)有的行為。精心確定公有方法修改公有方法的代價(jià)通常都比較高。為提高可修改性,降低維護(hù)成本,必須精心選擇和定義公有方法。33第十二章面向?qū)ο髮?shí)現(xiàn)提高健壯性的準(zhǔn)則預(yù)防用戶的操作錯(cuò)誤當(dāng)用戶在輸入數(shù)據(jù)時(shí)發(fā)生錯(cuò)誤,不應(yīng)該引起程序運(yùn)行中斷,更不應(yīng)該造成“死機(jī)”。任何一個(gè)接收用戶輸人數(shù)據(jù)的方法,對(duì)其接收到的數(shù)據(jù)必須進(jìn)行檢查,即使發(fā)現(xiàn)了非常嚴(yán)重的錯(cuò)誤,也應(yīng)該給出恰當(dāng)?shù)奶崾拘畔?,并?zhǔn)備再次接收用戶的輸入。34第十二章面向?qū)ο髮?shí)現(xiàn)提高健壯性的準(zhǔn)則檢查參數(shù)的合法性對(duì)公有方法,尤其應(yīng)該著重檢查其參數(shù)的合法性,因?yàn)橛脩粼谑褂霉蟹椒〞r(shí)可能違反參數(shù)的約束條件。不要預(yù)先確定限制條件在設(shè)計(jì)階段,往往很難準(zhǔn)確地預(yù)測(cè)出應(yīng)用系統(tǒng)中使用的數(shù)據(jù)結(jié)構(gòu)的最大容量需求。因此不應(yīng)該預(yù)先設(shè)定限制條件。如果有必要和可能,則應(yīng)該使用動(dòng)態(tài)內(nèi)存分配機(jī)制,創(chuàng)建未預(yù)先設(shè)定限制條件的數(shù)據(jù)結(jié)構(gòu)。35第十二章面向?qū)ο髮?shí)現(xiàn)提高健壯性的準(zhǔn)則先測(cè)試后優(yōu)化為在效率與健壯性之間做出合理的折衷,應(yīng)該在為提高效率而進(jìn)行優(yōu)化之前,先測(cè)試程序的性能。經(jīng)過(guò)測(cè)試,合理地確定為提高性能應(yīng)該著重優(yōu)化的關(guān)鍵部分。36第十二章面向?qū)ο髮?shí)現(xiàn)面向?qū)ο鬁y(cè)試一般說(shuō)來(lái),對(duì)面向?qū)ο筌浖臏y(cè)試可分為下列四個(gè)層次進(jìn)行:算法層測(cè)試類中定義的每個(gè)方法,基本上相當(dāng)于傳統(tǒng)軟件測(cè)試中的單元測(cè)試。類層測(cè)試封裝在同一個(gè)類中的所有方法與屬性之間的相互作用。37第十二章面向?qū)ο髮?shí)現(xiàn)面向?qū)ο鬁y(cè)試主題層測(cè)試一組協(xié)同工作的類-&-對(duì)象之間的相互作用,大體上相當(dāng)于傳統(tǒng)軟件測(cè)試中的子系統(tǒng)測(cè)試。系統(tǒng)層把各個(gè)子系統(tǒng)組裝成完整的面向?qū)ο筌浖到y(tǒng),在組裝過(guò)程中同時(shí)進(jìn)行測(cè)試。38第十二章面向?qū)ο髮?shí)現(xiàn)面向?qū)ο鬁y(cè)試設(shè)計(jì)測(cè)試方案的傳統(tǒng)技術(shù),例如,邏輯覆蓋、等價(jià)劃分、邊界值分析和錯(cuò)誤推測(cè)等方法,仍然可以作為測(cè)試類中每個(gè)方法的主要技術(shù)。面向?qū)ο鬁y(cè)試的主要目標(biāo),也是用盡可能低的測(cè)試成本和盡可能少的測(cè)試方案,發(fā)現(xiàn)盡可能多的錯(cuò)誤。但是,面向?qū)ο蟪绦蛑刑赜械姆庋b、繼承和多態(tài)等機(jī)制,也給面向?qū)ο鬁y(cè)試帶來(lái)一些新特點(diǎn),增加了測(cè)試和調(diào)試的難度。39第十二章面向?qū)ο髮?shí)現(xiàn)面向?qū)ο鬁y(cè)試在測(cè)試類的實(shí)現(xiàn)時(shí),測(cè)試人員面對(duì)的已不再是一段順序執(zhí)行的代碼,傳統(tǒng)的測(cè)試方法也不再完全適用了。傳統(tǒng)測(cè)試方法:選定一組輸入數(shù)據(jù),交給待測(cè)程序處理,通過(guò)比較實(shí)際輸出結(jié)果和預(yù)期輸出結(jié)果,判斷程序是否有錯(cuò)。在測(cè)試類的實(shí)現(xiàn)時(shí),應(yīng)該從各種可能的啟動(dòng)操作的次序組合中,選出最可能發(fā)現(xiàn)屬性和操作錯(cuò)誤的若干種情況,著重進(jìn)行測(cè)試。40第十二章面向?qū)ο髮?shí)現(xiàn)面向?qū)ο鬁y(cè)試在傳統(tǒng)的程序中,重用不影響測(cè)試過(guò)程。傳統(tǒng)程序中的重用無(wú)非是從已有的程序中復(fù)制一段代碼,放到當(dāng)前的程序中,或者調(diào)用標(biāo)準(zhǔn)的庫(kù)函數(shù)。但是面向?qū)ο蟪绦蛑械睦^承和多態(tài)(包括重載)機(jī)制,卻給測(cè)試過(guò)程帶來(lái)了新特點(diǎn),對(duì)于子類往往需要展開(kāi)來(lái)測(cè)試。41第十二章面向?qū)ο髮?shí)現(xiàn)12.4設(shè)計(jì)測(cè)試用例目前,面向?qū)ο筌浖臏y(cè)試用例的設(shè)計(jì)方法,還處于研究、發(fā)展階段。與傳統(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)。42第十二章面向?qū)ο髮?shí)現(xiàn)12.4.1測(cè)試類的方法前面已經(jīng)講過(guò),軟件測(cè)試從“小型測(cè)試”開(kāi)始,逐步過(guò)渡到“大型測(cè)試”。對(duì)面向?qū)ο蟮能浖?lái)說(shuō),小型測(cè)試著重測(cè)試單個(gè)類和類中封裝的方法。測(cè)試單個(gè)類的方法主要有隨機(jī)測(cè)試、劃分測(cè)試和基于故障的測(cè)試等3種。43第十二章面向?qū)ο髮?shí)現(xiàn)1.隨機(jī)測(cè)試下面通過(guò)銀行應(yīng)用系統(tǒng)的例子,簡(jiǎn)要地說(shuō)明這種測(cè)試方法。該系統(tǒng)的account(賬戶)類有下列操作:open(打開(kāi)),setup(建立),deposit(存款),withdraw(取款),balance(余額),summarize(清單),creditLimit(透支限額)和close(關(guān)閉)。上列每個(gè)操作都可以應(yīng)用于account類的實(shí)例,但是,該系統(tǒng)的性質(zhì)也對(duì)操作的應(yīng)用施加了一些限制,例如,必須在應(yīng)用其他操作之前先打開(kāi)賬戶,在完成了全部操作之后才能關(guān)閉賬戶。即使有這些限制,可做的操作也有許多種排列方法。一個(gè)account類實(shí)例的最小行為歷史包括下列操作:

44第十二章面向?qū)ο髮?shí)現(xiàn)open·setup·deposit·withdraw·close這就是對(duì)account類的最小測(cè)試序列。但是,在下面的序列中可能發(fā)生許多其他行為:open·setup·deposit·[deposit|withdraw|balance|summarize|creditLimit]n·withdraw·close從上列序列可以隨機(jī)地產(chǎn)生一系列不同的操作序列,例如:測(cè)試用例#r1:open·setup·deposit·deposit·balance·summarize·withdraw·close45第十二章面向?qū)ο髮?shí)現(xiàn)測(cè)試用例#r2:open·setup·deposit·withdraw·deposit·balance·creditLimit·withdraw·close執(zhí)行上述這些及另外一些隨機(jī)產(chǎn)生的測(cè)試用例,可以測(cè)試類實(shí)例的不同生存歷史。2.劃分測(cè)試與測(cè)試傳統(tǒng)軟件時(shí)采用等價(jià)劃分方法類似,采用劃分測(cè)試(partitiontesting)方法可以減少測(cè)試類時(shí)所需要的測(cè)試用例的數(shù)量。首先,把輸入和輸出分類,然后設(shè)計(jì)測(cè)試用例以測(cè)試劃分出的每個(gè)類別。下面介紹劃分類別的方法。46第十二章面向?qū)ο髮?shí)現(xiàn)(1)基于狀態(tài)的劃分這種方法根據(jù)類操作改變類狀態(tài)的能力來(lái)劃分類操作。再一次考慮account類,狀態(tài)操作包括deposit和withdraw,而非狀態(tài)操作有balance,summarize和creditLimit。設(shè)計(jì)測(cè)試用例,以分別測(cè)試改變狀態(tài)的操作和不改變狀態(tài)的操作。例如,用這種方法可以設(shè)計(jì)出如下的測(cè)試用例:測(cè)試用例#p1:open·setup·deposit·deposit·withdraw·withdraw·close測(cè)試用例#p2:open·setup·deposit·summarize·creditLimit·withdraw·close47第十二章面向?qū)ο髮?shí)現(xiàn)測(cè)試用例#P1改變狀態(tài),而測(cè)試用例#P2測(cè)試不改變狀態(tài)的操作(在最小測(cè)試序列中的操作除外)。(2)基于屬性的劃分這種方法根據(jù)類操作使用的屬性來(lái)劃分類操作。對(duì)于account類來(lái)說(shuō),可以使用屬性balance來(lái)定義劃分,從而把操作劃分成3個(gè)類別:使用balance的操作;修改balance的操作;不使用也不修改balance的操作。然后,為每個(gè)類別設(shè)計(jì)測(cè)試序列。48第十二章面向?qū)ο髮?shí)現(xiàn)(3)基于功能的劃分這種方法根據(jù)類操作所完成的功能來(lái)劃分類操作。例如,可以把a(bǔ)ccount類中的操作分類為初始化操作(open,setup),計(jì)算操作(deposit,withdraw),查詢操作(balance,summarize,creditLimit)和終止操作(close)。然后為每個(gè)類別設(shè)計(jì)測(cè)試序列。49第十二章面向?qū)ο髮?shí)現(xiàn)3.基于故障的測(cè)試基于故障的測(cè)試(faultbasedtesting)與傳統(tǒng)的錯(cuò)誤推測(cè)法類似,也是首先推測(cè)軟件中可能有的錯(cuò)誤,然后設(shè)計(jì)出最可能發(fā)現(xiàn)這些錯(cuò)誤的測(cè)試用例。例如,軟件工程師經(jīng)常在問(wèn)題的邊界處犯錯(cuò)誤,因此,在測(cè)試SQRT(計(jì)算平方根)操作(該操作在輸入為負(fù)數(shù)時(shí)返回出錯(cuò)信息)時(shí),應(yīng)該著重檢查邊界情況:一個(gè)接近零的負(fù)數(shù)和零本身。其中“零本身”用于檢查程序員是否犯了如下錯(cuò)誤:50第十二章面向?qū)ο髮?shí)現(xiàn)把語(yǔ)句if(x>=0)calculate_square_root();誤寫成if(x>0)calculate_square_root();為了推測(cè)出軟件中可能有的錯(cuò)誤,應(yīng)該仔細(xì)研究分析模型和設(shè)計(jì)模型,而且在很大程度上要依靠測(cè)試人員的經(jīng)驗(yàn)和直覺(jué)。如果推測(cè)得比較準(zhǔn)確,則使用基于故障的測(cè)試方法能夠用相當(dāng)?shù)偷墓ぷ髁堪l(fā)現(xiàn)大量錯(cuò)誤;反之,如果推測(cè)不準(zhǔn),則這種方法的效果并不比隨機(jī)測(cè)試技術(shù)的效果好。51第十二章面向?qū)ο髮?shí)現(xiàn)12.4.2集成測(cè)試方法開(kāi)始集成面向?qū)ο笙到y(tǒng)以后,測(cè)試用例的設(shè)計(jì)變得更加復(fù)雜。在這個(gè)測(cè)試階段,必須對(duì)類間協(xié)作進(jìn)行測(cè)試。為了舉例說(shuō)明設(shè)計(jì)類間測(cè)試用例的方法,我們擴(kuò)充12.4.1小節(jié)引入的銀行系統(tǒng)的例子,使它包含圖12.3所示的類和協(xié)作。圖中箭頭方向代表消息的傳遞方向,箭頭線上的標(biāo)注給出了作為由消息所蘊(yùn)含的協(xié)作的結(jié)果而調(diào)用的操作。和測(cè)試單個(gè)類相似,測(cè)試類協(xié)作可以使用隨機(jī)測(cè)試方法和劃分測(cè)試方法,以及基于情景的測(cè)試和行為測(cè)試來(lái)完成。52第十二章面向?qū)ο髮?shí)現(xiàn)1.多類測(cè)試Kirani和Tsai建議使用下列步驟,以生成多個(gè)類的隨機(jī)測(cè)試用例。對(duì)每個(gè)客戶類,使用類操作符列表來(lái)生成一系列隨機(jī)測(cè)試序列。這些操作符向服務(wù)器類實(shí)例發(fā)送消息。對(duì)所生成的每個(gè)消息,確定協(xié)作類和在服務(wù)器對(duì)象中的對(duì)應(yīng)操作符。對(duì)服務(wù)器對(duì)象中的每個(gè)操作符(已經(jīng)被來(lái)自客戶對(duì)象的消息調(diào)用),確定傳遞的消息。對(duì)每個(gè)消息,確定下一層被調(diào)用的操作符,并把這些操作符結(jié)合進(jìn)測(cè)試序列中。53第十二章面向?qū)ο髮?shí)現(xiàn)為了說(shuō)明怎樣用上述步驟生成多個(gè)類的隨機(jī)測(cè)試用例,考慮Bank類相對(duì)于ATM類(見(jiàn)圖12.3)的操作序列:verifyAcct·verifyPIN·[(verifyPolicy·withdrawReq)|depositReq|acctInfoREQ]n對(duì)Bank類的隨機(jī)測(cè)試用例可能是:測(cè)試用例#r3:verifyAcct·verifyPIN·depositReq54第十二章面向?qū)ο髮?shí)現(xiàn)為了考慮在上述這個(gè)測(cè)試中涉及的協(xié)作者,需要考慮與測(cè)試用例#r3中的每個(gè)操作相關(guān)聯(lián)的消息。Bank必須和ValidationInfo協(xié)作以執(zhí)行verifyAcct和verifyPIN,Bank還必須和Account協(xié)作以執(zhí)行depositReq。因此,測(cè)試上面提到的協(xié)作的新測(cè)試用例是:測(cè)試用例#r4:verifyAcctBank·[validAcctValidationInfo]·verifyPINBank·[validPINvalidationInfo]·depositReq·[depositaccount]55第十二章面向?qū)ο髮?shí)現(xiàn)多個(gè)類的劃分測(cè)試方法類似于單個(gè)類的劃分測(cè)試方法(見(jiàn)12.4.1節(jié))。但是,對(duì)于多類測(cè)試來(lái)說(shuō),應(yīng)該擴(kuò)充測(cè)試序列以包括那些通過(guò)發(fā)送給協(xié)作類的消息而被調(diào)用的操作。另一種劃分測(cè)試方法,根據(jù)與特定類的接口來(lái)劃分類操作。如圖12.3所示,Bank類接收來(lái)自ATM類和Cashier類的消息,因此,可以通過(guò)把Bank類中的方法劃分成服務(wù)于ATM的和服務(wù)于Cashier的兩類來(lái)測(cè)試它們。還可以用基于狀態(tài)的劃分(見(jiàn)12.4.1節(jié)),進(jìn)一步精化劃分。56第十二章面向?qū)ο髮?shí)現(xiàn)圖12.3銀行系統(tǒng)的類-協(xié)作圖第十二章面向?qū)ο髮?shí)現(xiàn)2.從動(dòng)態(tài)模型導(dǎo)出測(cè)試用例在本書(shū)第9章中已經(jīng)講過(guò),怎樣用狀態(tài)轉(zhuǎn)換圖作為表示類的動(dòng)態(tài)行為的模型。類的狀態(tài)圖可以幫助我們導(dǎo)出測(cè)試該類(及與其協(xié)作的那些類)的動(dòng)態(tài)行為的測(cè)試用例。圖12.4給出了前面討論過(guò)的account類的狀態(tài)圖,從圖可見(jiàn),初始轉(zhuǎn)換經(jīng)過(guò)了emptyacct和setupacct這兩個(gè)狀態(tài),而類實(shí)例的大多數(shù)行為發(fā)生在workingacct狀態(tài)中,最終的withdraw和close使得account類分別向nonworkingacct狀態(tài)和deadacct狀態(tài)轉(zhuǎn)換。58第十二章面向?qū)ο髮?shí)現(xiàn)圖12.4account類的狀態(tài)轉(zhuǎn)換圖第十二章面向?qū)ο髮?shí)現(xiàn)設(shè)計(jì)出的測(cè)試用例應(yīng)該覆蓋所有狀態(tài),也就是說(shuō),操作序列應(yīng)該使得account類實(shí)例遍歷所有允許的狀態(tài)轉(zhuǎn)換:測(cè)試用例#s1:open·setupAccnt·deposit(initial)·withdraw(final)·close應(yīng)該注意,上面列出的序列與12.4.1節(jié)討論的最小測(cè)試序列相同。向最小序列中加入附加的

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論