版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、主講:劉悅主講:劉悅Software EngineeringSoftware Engineering軟件工程軟件工程第第12章章 面向?qū)ο髮?shí)現(xiàn)面向?qū)ο髮?shí)現(xiàn)2 - 2回顧回顧n第11章 面向?qū)ο笤O(shè)計(jì)n面向?qū)ο笤O(shè)計(jì)的準(zhǔn)則n啟發(fā)規(guī)則n軟件重用n系統(tǒng)分解n設(shè)計(jì)類(lèi)中的服務(wù)n設(shè)計(jì)關(guān)聯(lián)n設(shè)計(jì)優(yōu)化2 - 3本章目標(biāo)本章目標(biāo)? 了解面向?qū)ο缶幊陶Z(yǔ)言選擇的原則了解面向?qū)ο缶幊陶Z(yǔ)言選擇的原則?掌握掌握面向?qū)ο缶幊堂嫦驅(qū)ο缶幊虘?yīng)該遵循的規(guī)格應(yīng)該遵循的規(guī)格 ? 了解面向?qū)ο鬁y(cè)試策略和方法了解面向?qū)ο鬁y(cè)試策略和方法2 - 4主要內(nèi)容主要內(nèi)容面向?qū)ο髮?shí)現(xiàn)的任務(wù)程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)風(fēng)格測(cè)試策略設(shè)計(jì)測(cè)試用例2 - 5內(nèi)容線索內(nèi)
2、容線索面向?qū)ο髮?shí)現(xiàn)的任務(wù)面向?qū)ο髮?shí)現(xiàn)的任務(wù)程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)風(fēng)格測(cè)試策略設(shè)計(jì)測(cè)試用例2 - 6面向?qū)ο髮?shí)現(xiàn)的任務(wù)面向?qū)ο髮?shí)現(xiàn)的任務(wù)面向?qū)ο髮?shí)現(xiàn)主要包括兩項(xiàng)工作把面向?qū)ο笤O(shè)計(jì)結(jié)果翻譯成用某種程序語(yǔ)言書(shū)寫(xiě)的面向?qū)ο蟪绦驕y(cè)試并調(diào)試面向?qū)ο蟮某绦? - 7內(nèi)容線索內(nèi)容線索面向?qū)ο髮?shí)現(xiàn)的任務(wù)程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)語(yǔ)言面向?qū)ο笳Z(yǔ)言的優(yōu)點(diǎn)面向?qū)ο笳Z(yǔ)言的優(yōu)點(diǎn)面向?qū)ο笳Z(yǔ)言的技術(shù)特點(diǎn)面向?qū)ο笳Z(yǔ)言的技術(shù)特點(diǎn)選擇面向?qū)ο笳Z(yǔ)言選擇面向?qū)ο笳Z(yǔ)言程序設(shè)計(jì)風(fēng)格測(cè)試策略設(shè)計(jì)測(cè)試用例2 - 8面向?qū)ο髮?shí)現(xiàn)語(yǔ)言的選擇面向?qū)ο髮?shí)現(xiàn)語(yǔ)言的選擇 面向?qū)ο笤O(shè)計(jì)的結(jié)果既可以用面向?qū)ο笳Z(yǔ)言、也可以用非面向?qū)ο笳Z(yǔ)言實(shí)現(xiàn)選擇編程語(yǔ)言的關(guān)鍵因素,是
3、語(yǔ)言的一致的表達(dá)能力、可重用性及可維護(hù)性2 - 9面向?qū)ο笳Z(yǔ)言的優(yōu)點(diǎn)面向?qū)ο笳Z(yǔ)言的優(yōu)點(diǎn)從面向?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ù)性2 - 10一致的表示方法一致的表示方法面向?qū)ο箝_(kāi)發(fā)基于不隨時(shí)間變化的、一致的表示方法從問(wèn)題域到OOA,從OOA到OOD,最后從OOD到面向?qū)ο缶幊?OOP),始終穩(wěn)定不變一致的表示方法既有利于在軟件開(kāi)發(fā)過(guò)程中始終使用統(tǒng)一的概念,也有利于維護(hù)人員理解軟件的各種配置成分2 - 11可重用性可重用性在OOA,OOD直到OOP中都顯式地表示問(wèn)題域語(yǔ)義,其意義:既可能重用它
4、在某個(gè)問(wèn)題域內(nèi)的OOA結(jié)果也可能重用相應(yīng)的OOD和OOP結(jié)果2 - 12可維護(hù)性可維護(hù)性在實(shí)際工作中很難做到交付兩類(lèi)不同的文檔,并使它們保持彼此完全一致特別是考慮到進(jìn)度、預(yù)算、能力和人員等限制因素時(shí),做到兩類(lèi)文檔完全一致幾乎是不可能的維護(hù)人員最終面對(duì)的往往只有源程序本身2 - 13實(shí)例實(shí)例n以ATM系統(tǒng)為例,說(shuō)明在程序內(nèi)部表達(dá)問(wèn)題域語(yǔ)義對(duì)維護(hù)工作的意義n假設(shè)在維護(hù)該系統(tǒng)時(shí)沒(méi)有合適的文檔資料可供參閱,于是維護(hù)人員人工瀏覽程序或使用軟件工具掃描程序,記下或打印出程序顯式陳述的問(wèn)題域語(yǔ)義,維護(hù)人員看到“ATM”、“賬戶”、“現(xiàn)金兌換卡”等,這對(duì)維護(hù)人員理解所要維護(hù)的軟件將有很大幫助n 因此,在選擇編
5、程語(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ū)ο蠓治?、設(shè)計(jì)的結(jié)果2 - 14面向?qū)ο笳Z(yǔ)言的技術(shù)特點(diǎn)面向?qū)ο笳Z(yǔ)言的技術(shù)特點(diǎn)面向?qū)ο笳Z(yǔ)言的形成借鑒了歷史上許多程序語(yǔ)言的特點(diǎn)兩大類(lèi)面向?qū)ο笳Z(yǔ)言純面向?qū)ο笳Z(yǔ)言混合型面向?qū)ο笳Z(yǔ)言2 - 15支持類(lèi)與對(duì)象概念的機(jī)制支持類(lèi)與對(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)存2 - 16 有兩種管理內(nèi)存的方法,一種是由語(yǔ)言的
6、運(yùn)行機(jī)制自動(dòng)管理內(nèi)存,即提供自動(dòng)回收“垃圾”的機(jī)制;另一種是由程序員編寫(xiě)釋放內(nèi)存的代碼。自動(dòng)管理內(nèi)存不僅方便而且安全,但是必須采用先進(jìn)的垃圾收集算法才能減少開(kāi)銷(xiāo)。某些面向?qū)ο蟮恼Z(yǔ)言允許程序員定義析構(gòu)函數(shù)(destructor)。每當(dāng)一個(gè)對(duì)象超出范圍或被顯式刪除時(shí),就自動(dòng)調(diào)用析構(gòu)函數(shù)。這種機(jī)制使得程序員能夠方便地構(gòu)造和喚醒釋放內(nèi)存的操作,卻又不是垃圾收集機(jī)制。支持類(lèi)與對(duì)象概念的機(jī)制支持類(lèi)與對(duì)象概念的機(jī)制2 - 17實(shí)現(xiàn)整體實(shí)現(xiàn)整體- -部分部分( (即聚集即聚集) )結(jié)構(gòu)的機(jī)制結(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ǔ)言并不顯式支
7、持獨(dú)立的關(guān)聯(lián)對(duì)象,在這種情況下,使用指針是最容易的實(shí)現(xiàn)方法,通過(guò)增加內(nèi)部指針可以方便地實(shí)現(xiàn)關(guān)聯(lián)2 - 18實(shí)現(xiàn)一般實(shí)現(xiàn)一般- -特殊特殊( (即泛化即泛化) )結(jié)構(gòu)的機(jī)制結(jié)構(gòu)的機(jī)制既包括實(shí)現(xiàn)繼承的機(jī)制也包括解決名字沖突的機(jī)制。所謂解決名字沖突,指的是處理在多個(gè)基類(lèi)中可能出現(xiàn)的重名問(wèn)題,這個(gè)問(wèn)題僅在支持多重繼承的語(yǔ)言中才會(huì)遇到。某些語(yǔ)言拒絕接受有名字沖突的程序,另一些語(yǔ)言提供了解決沖突的協(xié)議。不論使用何種語(yǔ)言,程序員都應(yīng)該盡力避免出現(xiàn)名字沖突。2 - 19實(shí)現(xiàn)屬性和服務(wù)的機(jī)制實(shí)現(xiàn)屬性和服務(wù)的機(jī)制對(duì)于實(shí)現(xiàn)屬性的機(jī)制應(yīng)該著重考慮以下幾個(gè)方面: 支持實(shí)例連接的機(jī)制;屬性的可見(jiàn)性控制;對(duì)屬性值的約束。對(duì)
8、于服務(wù)來(lái)說(shuō),主要應(yīng)該考慮下列因素: 支持消息連接(即表達(dá)對(duì)象交互關(guān)系)的機(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è)類(lèi)。2 - 20類(lèi)型檢查類(lèi)型檢查程序設(shè)計(jì)語(yǔ)言可以按照編譯時(shí)進(jìn)行類(lèi)型檢查的嚴(yán)格程度來(lái)分類(lèi)。如果語(yǔ)言僅要求每個(gè)變量或?qū)傩噪`屬于一個(gè)對(duì)象,則是弱類(lèi)型的;如果語(yǔ)法規(guī)定每個(gè)變量或?qū)傩员仨殰?zhǔn)確地屬于某個(gè)特定的類(lèi),則這樣的語(yǔ)言是強(qiáng)類(lèi)型的。面向?qū)ο笳Z(yǔ)言在這方面差異很大,例如,Smalltal
9、k實(shí)際上是一種無(wú)類(lèi)型語(yǔ)言(所有變量都是未指定類(lèi)的對(duì)象);C+和Eiffel則是強(qiáng)類(lèi)型語(yǔ)言。混合型語(yǔ)言(如C+, objective_C等)甚至允許屬性值不是對(duì)象而是某種預(yù)定義的基本類(lèi)型數(shù)據(jù)(如整數(shù),浮點(diǎn)數(shù)等),這可以提高操作的效率。2 - 21類(lèi)型檢查類(lèi)型檢查強(qiáng)類(lèi)型語(yǔ)言主要有兩個(gè)優(yōu)點(diǎn): 一是有利于在編譯時(shí)發(fā)現(xiàn)程序錯(cuò)誤,二是增加了優(yōu)化的可能性。通常使用強(qiáng)類(lèi)型編譯型語(yǔ)言開(kāi)發(fā)軟件產(chǎn)品,使用弱類(lèi)型解釋型語(yǔ)言快速開(kāi)發(fā)原型。總的說(shuō)來(lái),強(qiáng)類(lèi)型語(yǔ)言有助于提高軟件的可靠性和運(yùn)行效率,現(xiàn)代的程序語(yǔ)言理論支持強(qiáng)類(lèi)型檢查,大多數(shù)新語(yǔ)言都是強(qiáng)類(lèi)型的。2 - 22類(lèi)庫(kù)類(lèi)庫(kù) 大多數(shù)面向?qū)ο笳Z(yǔ)言都提供一個(gè)實(shí)用的類(lèi)庫(kù)。某些語(yǔ)言
10、本身并沒(méi)有規(guī)定提供什么樣的類(lèi)庫(kù),而是由實(shí)現(xiàn)這種語(yǔ)言的編譯系統(tǒng)自行提供類(lèi)庫(kù)。存在類(lèi)庫(kù),許多軟構(gòu)件就不必由程序員重頭編寫(xiě)了,這為實(shí)現(xiàn)軟件重用帶來(lái)很大方便。2 - 23類(lèi)庫(kù)類(lèi)庫(kù)類(lèi)庫(kù)中往往包含實(shí)現(xiàn)通用數(shù)據(jù)結(jié)構(gòu)(例如,動(dòng)態(tài)數(shù)組、表、隊(duì)列、棧、樹(shù)等等)的類(lèi),通常把這些類(lèi)稱為包容類(lèi)。在類(lèi)庫(kù)中還可以找到實(shí)現(xiàn)各種關(guān)聯(lián)的類(lèi)。更完整的類(lèi)庫(kù)通常還提供獨(dú)立于具體設(shè)備的接口類(lèi)(例如,輸入輸出流),此外,用于實(shí)現(xiàn)窗口系統(tǒng)的用戶界面類(lèi)也非常有用,它們構(gòu)成一個(gè)相對(duì)獨(dú)立的圖形庫(kù)。2 - 24效率效率許多人認(rèn)為面向?qū)ο笳Z(yǔ)言的主要缺點(diǎn)是效率低。產(chǎn)生這種印象的一個(gè)原因是,某些早期的面向?qū)ο笳Z(yǔ)言是解釋型的而不是編譯型的。事實(shí)上,使用擁有
11、完整類(lèi)庫(kù)的面向?qū)ο笳Z(yǔ)言,有時(shí)能比使用非面向?qū)ο笳Z(yǔ)言得到運(yùn)行更快的代碼。這是因?yàn)轭?lèi)庫(kù)中提供了更高效的算法和更好的數(shù)據(jù)結(jié)構(gòu),例如,程序員已經(jīng)無(wú)須編寫(xiě)實(shí)現(xiàn)哈希表或平衡樹(shù)算法的代碼了,類(lèi)庫(kù)中已經(jīng)提供了這類(lèi)數(shù)據(jù)結(jié)構(gòu),而且算法先進(jìn)、代碼精巧可靠。2 - 25效率效率認(rèn)為面向?qū)ο笳Z(yǔ)言效率低的另一個(gè)理由是,這種語(yǔ)言在運(yùn)行時(shí)使用動(dòng)態(tài)聯(lián)編實(shí)現(xiàn)多態(tài)性,這似乎需要在運(yùn)行時(shí)查找繼承樹(shù),以得到定義給定操作的類(lèi)。事實(shí)上,絕大多數(shù)面向?qū)ο笳Z(yǔ)言都優(yōu)化了這個(gè)查找過(guò)程,從而實(shí)現(xiàn)了高效率查找。只要在程序運(yùn)行時(shí)始終保持類(lèi)結(jié)構(gòu)不變,就能在子類(lèi)中存儲(chǔ)各個(gè)操作的正確入口點(diǎn),從而使得動(dòng)態(tài)聯(lián)編成為查找哈希表的高效過(guò)程,不會(huì)由于繼承樹(shù)深度加大或類(lèi)
12、中定義的操作數(shù)增加而降低效率。2 - 26持久保存對(duì)象持久保存對(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ù)2 - 27參數(shù)化類(lèi)參數(shù)化類(lèi)所謂參數(shù)化類(lèi),就是使用一個(gè)或多個(gè)類(lèi)型去參數(shù)化一個(gè)類(lèi)的機(jī)制有了這種機(jī)制,程序員就可以先定義一個(gè)參數(shù)化的類(lèi)模板(即在類(lèi)定義中包含以參數(shù)形式出現(xiàn)的一個(gè)或多個(gè)類(lèi)型)然后把數(shù)據(jù)類(lèi)型作為參數(shù)傳遞進(jìn)來(lái),從而把這個(gè)類(lèi)模板應(yīng)用在不同的應(yīng)用程序中,或用在同一應(yīng)用程序的不同部分2 -
13、 28開(kāi)發(fā)環(huán)境開(kāi)發(fā)環(huán)境面向?qū)ο笳Z(yǔ)言所提供的軟件工具或開(kāi)發(fā)環(huán)境至少應(yīng)該包括下列一些最基本的軟件工具編輯程序編譯程序或解釋程序?yàn)g覽工具調(diào)試器(debugger)等2 - 29選擇面向?qū)ο笳Z(yǔ)言選擇面向?qū)ο笳Z(yǔ)言n 開(kāi)發(fā)人員在選擇面向?qū)ο笳Z(yǔ)言時(shí),還應(yīng)該著重考慮以下一些實(shí)際因素將來(lái)能否占主導(dǎo)地位可重用性類(lèi)庫(kù)和開(kāi)發(fā)環(huán)境其他因素2 - 30內(nèi)容線索內(nèi)容線索面向?qū)ο髮?shí)現(xiàn)的任務(wù)程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)風(fēng)格程序設(shè)計(jì)風(fēng)格提高可重用性提高可重用性提高可擴(kuò)充性提高可擴(kuò)充性提高健壯性提高健壯性測(cè)試策略設(shè)計(jì)測(cè)試用例2 - 31良好的程序設(shè)計(jì)風(fēng)格良好的程序設(shè)計(jì)風(fēng)格良好的程序設(shè)計(jì)風(fēng)格對(duì)保證程序質(zhì)量的十分重要明顯減少維護(hù)或擴(kuò)充的開(kāi)銷(xiāo)有
14、助于在新項(xiàng)目中重用已有的程序代碼良好的面向?qū)ο蟪绦蛟O(shè)計(jì)風(fēng)格包括傳統(tǒng)的程序設(shè)計(jì)風(fēng)格準(zhǔn)則適應(yīng)面向?qū)ο蠓椒ㄋ赜械母拍疃仨氉裱囊恍┬聹?zhǔn)則2 - 32提高可重用性提高可重用性 提高方法的內(nèi)聚一個(gè)方法(即服務(wù))應(yīng)該只完成單個(gè)功能。如果某個(gè)方法涉及兩個(gè)或多個(gè)不相關(guān)的功能,則應(yīng)該把它分解成幾個(gè)更小的方法減小方法的規(guī)模應(yīng)該減小方法的規(guī)模,如果某個(gè)方法規(guī)模過(guò)大(代碼長(zhǎng)度超過(guò)一頁(yè)紙可能就太大了),則應(yīng)該把它分解成幾個(gè)更小的方法2 - 33提高可重用性提高可重用性 保持方法的一致性保持方法的一致性,有助于實(shí)現(xiàn)代碼重用。一般說(shuō)來(lái),功能相似的方法應(yīng)該有一致的名字、參數(shù)特征(包括參數(shù)個(gè)數(shù)、類(lèi)型和次序)、返回值類(lèi)型、使
15、用條件及出錯(cuò)條件等把策略與實(shí)現(xiàn)分開(kāi)從所完成的功能看,有兩種不同類(lèi)型的方法。一類(lèi)方法負(fù)責(zé)做出決策,提供變?cè)⑶夜芾砣仲Y源,可稱為策略方法。另一類(lèi)方法負(fù)責(zé)完成具體的操作,但卻并不做出是否執(zhí)行這個(gè)操作的決定,也不知道為什么執(zhí)行這個(gè)操作,可稱為實(shí)現(xiàn)方法2 - 34提高可重用性提高可重用性 全面覆蓋 如果輸入條件的各種組合都可能出現(xiàn),則應(yīng)該針對(duì)所有組合寫(xiě)出方法,而不能僅僅針對(duì)當(dāng)前用到的組合情況寫(xiě)方法。例如,如果在當(dāng)前應(yīng)用中需要寫(xiě)一個(gè)方法,以獲取表中第一個(gè)元素,則至少還應(yīng)該為獲取表中最后一個(gè)元素再寫(xiě)一個(gè)方法此外,一個(gè)方法不應(yīng)該只能處理正常值,對(duì)空值、極限值及界外值等異常情況也應(yīng)該能夠作出有意義的響應(yīng)2
16、 - 35提高可重用性提高可重用性 盡量不使用全局信息應(yīng)該盡量降低方法與外界的耦合程度,不使用全局信息是降低耦合度的一項(xiàng)主要措施利用繼承機(jī)制在面向?qū)ο蟪绦蛑?,使用繼承機(jī)制是實(shí)現(xiàn)共享和提高重用程度的主要途徑調(diào)用子過(guò)程最簡(jiǎn)單的做法是把公共的代碼分離出來(lái),構(gòu)成一個(gè)被其他方法調(diào)用的公用方法。可以在基類(lèi)中定義這個(gè)公用方法,供派生類(lèi)中的方法調(diào)用2 - 36提高可重用性提高可重用性 圖圖12.1 通過(guò)調(diào)用公用方法實(shí)現(xiàn)代碼重用通過(guò)調(diào)用公用方法實(shí)現(xiàn)代碼重用2 - 37提高可重用性提高可重用性 分解因子有時(shí)提高相似類(lèi)代碼可重用性的一個(gè)有效途徑,是從不同類(lèi)的相似方法中分解出不同的“因子”(即不同的代碼),把余下的代
17、碼作為公用方法中的公共代碼,把分解出的因子作為名字相同算法不同的方法,放在不同類(lèi)中定義,并被這個(gè)公用方法調(diào)用2 - 38提高可重用性提高可重用性 圖圖12.2 12.2 通過(guò)因子分解實(shí)現(xiàn)代碼重用通過(guò)因子分解實(shí)現(xiàn)代碼重用2 - 39提高可重用性提高可重用性 使用委托繼承關(guān)系的存在意味著子類(lèi)“即是”父類(lèi),因此,父類(lèi)的所有方法和屬性應(yīng)該都適用于子類(lèi)。僅當(dāng)確實(shí)存在一般-特殊關(guān)系時(shí),使用繼承才是恰當(dāng)?shù)?。繼承機(jī)制使用不當(dāng)將造成程序難于理解、修改和擴(kuò)充當(dāng)邏輯上不存在一般-特殊關(guān)系時(shí),為重用已有的代碼,可以利用委托機(jī)制2 - 40提高可重用性提高可重用性把代碼封裝在類(lèi)中程序員往往希望重用用其他方法編寫(xiě)的、解決
18、同一類(lèi)應(yīng)用問(wèn)題的程序代碼。重用這類(lèi)代碼的一個(gè)比較安全的途徑,是把被重用的代碼封裝在類(lèi)中2 - 41提高可擴(kuò)充性提高可擴(kuò)充性封裝實(shí)現(xiàn)策略不要用一個(gè)方法遍歷多條關(guān)聯(lián)鏈避免使用多分支語(yǔ)句精心確定公有方法2 - 42提高健壯性提高健壯性 預(yù)防用戶的操作錯(cuò)誤檢查參數(shù)的合法性不要預(yù)先確定限制條件先測(cè)試后優(yōu)化2 - 43內(nèi)容線索內(nèi)容線索面向?qū)ο髮?shí)現(xiàn)的任務(wù)程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)風(fēng)格測(cè)試策略測(cè)試策略面向?qū)ο蟮膯卧獪y(cè)試面向?qū)ο蟮膯卧獪y(cè)試面向?qū)ο蟮募蓽y(cè)試面向?qū)ο蟮募蓽y(cè)試面向?qū)ο蟮拇_認(rèn)測(cè)試面向?qū)ο蟮拇_認(rèn)測(cè)試設(shè)計(jì)測(cè)試用例2 - 44面向?qū)ο蟮膯卧獪y(cè)試面向?qū)ο蟮膯卧獪y(cè)試 當(dāng)考慮面向?qū)ο蟮能浖r(shí),單元的概念改變了。“封裝
19、”導(dǎo)致了類(lèi)和對(duì)象的定義,這意味著類(lèi)和類(lèi)的實(shí)例(對(duì)象)包裝了屬性(數(shù)據(jù))和處理這些數(shù)據(jù)的操作(也稱為方法或服務(wù))?,F(xiàn)在,最小的可測(cè)試單元是封裝起來(lái)的類(lèi)和對(duì)象。一個(gè)類(lèi)可以包含一組不同的操作,而一個(gè)特定的操作也可能存在于一組不同的類(lèi)中。因此,對(duì)于面向?qū)ο蟮能浖?lái)說(shuō),單元測(cè)試的含義發(fā)生了很大變化2 - 45面向?qū)ο蟮膯卧獪y(cè)試面向?qū)ο蟮膯卧獪y(cè)試測(cè)試面向?qū)ο筌浖r(shí),不能再孤立地測(cè)試單個(gè)操作,而應(yīng)該把操作作為類(lèi)的一部分來(lái)測(cè)試。例如,假設(shè)有一個(gè)類(lèi)層次,操作X在超類(lèi)中定義并被一組子類(lèi)繼承,每個(gè)子類(lèi)都使用操作X,但是,X調(diào)用子類(lèi)中定義的操作并處理子類(lèi)的私有屬性。由于在不同的子類(lèi)中使用操作X的環(huán)境有微妙的差別,因此
20、有必要在每個(gè)子類(lèi)的語(yǔ)境中測(cè)試操作X。這就說(shuō)明,當(dāng)測(cè)試面向?qū)ο筌浖r(shí),傳統(tǒng)的單元測(cè)試方法是不適用的,不能再在“真空”中(即孤立地)測(cè)試單個(gè)操作。2 - 46面向?qū)ο蟮募蓽y(cè)試面向?qū)ο蟮募蓽y(cè)試因?yàn)樵诿嫦驅(qū)ο蟮能浖胁淮嬖趯哟蔚目刂平Y(jié)構(gòu),傳統(tǒng)的自頂向下或自底向上的集成策略就沒(méi)有意義了。此外,由于構(gòu)成類(lèi)的各個(gè)成分彼此間存在直接或間接的交互,一次集成一個(gè)操作到類(lèi)中(傳統(tǒng)的漸增式集成方法)通常是不現(xiàn)實(shí)的面向?qū)ο筌浖募蓽y(cè)試主要有下述兩種不同的策略:2 - 47面向?qū)ο蟮募蓽y(cè)試面向?qū)ο蟮募蓽y(cè)試基于線程的測(cè)試(thread based testing) 這種策略把響應(yīng)系統(tǒng)的一個(gè)輸入或一個(gè)事件所需要的那
21、些類(lèi)集成起來(lái)。分別集成并測(cè)試每個(gè)線程,同時(shí)應(yīng)用回歸測(cè)試以保證沒(méi)有產(chǎn)生副作用 基于使用的測(cè)試(use based testing) 這種方法首先測(cè)試幾乎不使用服務(wù)器類(lèi)的那些類(lèi)(稱為獨(dú)立類(lèi)),把獨(dú)立類(lèi)都測(cè)試完之后,再測(cè)試使用獨(dú)立類(lèi)的下一個(gè)層次的類(lèi)(稱為依賴類(lèi))。對(duì)依賴類(lèi)的測(cè)試一個(gè)層次一個(gè)層次地持續(xù)進(jìn)行下去,直至把整個(gè)軟件系統(tǒng)構(gòu)造完為止2 - 48面向?qū)ο蟮募蓽y(cè)試面向?qū)ο蟮募蓽y(cè)試在測(cè)試面向?qū)ο蟮能浖^(guò)程中,應(yīng)該注意發(fā)現(xiàn)不同的類(lèi)之間的協(xié)作錯(cuò)誤。集群測(cè)試(cluster testing)是面向?qū)ο筌浖蓽y(cè)試的一個(gè)步驟。在這個(gè)測(cè)試步驟中,用精心設(shè)計(jì)的測(cè)試用例檢查一群相互協(xié)作的類(lèi)(通過(guò)研究對(duì)象模型可以
22、確定協(xié)作類(lèi)),這些測(cè)試用例力圖發(fā)現(xiàn)協(xié)作錯(cuò)誤2 - 49面向?qū)ο蟮拇_認(rèn)測(cè)試面向?qū)ο蟮拇_認(rèn)測(cè)試在確認(rèn)測(cè)試或系統(tǒng)測(cè)試層次,不再考慮類(lèi)之間相互連接的細(xì)節(jié)。和傳統(tǒng)的確認(rèn)測(cè)試一樣,面向?qū)ο筌浖拇_認(rèn)測(cè)試也集中檢查用戶可見(jiàn)的動(dòng)作和用戶可識(shí)別的輸出。為了導(dǎo)出確認(rèn)測(cè)試用例,測(cè)試人員應(yīng)該認(rèn)真研究動(dòng)態(tài)模型和描述系統(tǒng)行為的腳本,以確定最可能發(fā)現(xiàn)用戶交互需求錯(cuò)誤的情景2 - 50面向?qū)ο蟮拇_認(rèn)測(cè)試面向?qū)ο蟮拇_認(rèn)測(cè)試當(dāng)然,傳統(tǒng)的黑盒測(cè)試方法也可用于設(shè)計(jì)確認(rèn)測(cè)試用例,但是,對(duì)于面向?qū)ο蟮能浖?lái)說(shuō),主要還是根據(jù)動(dòng)態(tài)模型和描述系統(tǒng)行為的腳本來(lái)設(shè)計(jì)確認(rèn)測(cè)試用例2 - 51內(nèi)容線索內(nèi)容線索面向?qū)ο髮?shí)現(xiàn)的任務(wù)程序設(shè)計(jì)語(yǔ)言程序設(shè)計(jì)風(fēng)格
23、測(cè)試策略設(shè)計(jì)測(cè)試用例設(shè)計(jì)測(cè)試用例測(cè)試類(lèi)的方法測(cè)試類(lèi)的方法集成測(cè)試方法集成測(cè)試方法2 - 52測(cè)試類(lèi)的方法測(cè)試類(lèi)的方法軟件測(cè)試從“小型測(cè)試”開(kāi)始,逐步過(guò)渡到“大型測(cè)試”對(duì)面向?qū)ο蟮能浖?lái)說(shuō),小型測(cè)試著重測(cè)試單個(gè)類(lèi)和類(lèi)中封裝的方法測(cè)試單個(gè)類(lèi)的方法主要有隨機(jī)測(cè)試劃分測(cè)試基于故障的測(cè)試2 - 53隨機(jī)測(cè)試隨機(jī)測(cè)試下面通過(guò)銀行應(yīng)用系統(tǒng)的例子,簡(jiǎn)要地說(shuō)明這種測(cè)試方法。該系統(tǒng)的account(賬戶)類(lèi)有下列操作: open(打開(kāi)),setup(建立),deposit(存款),withdraw(取款),balance(余額),summarize(清單),creditLimit(透支限額)和close(關(guān)閉)。
24、上列每個(gè)操作都可以應(yīng)用于account類(lèi)的實(shí)例,但是,該系統(tǒng)的性質(zhì)也對(duì)操作的應(yīng)用施加了一些限制,例如,必須在應(yīng)用其他操作之前先打開(kāi)賬戶,在完成了全部操作之后才能關(guān)閉賬戶。即使有這些限制,可做的操作也有許多種排列方法。一個(gè)account類(lèi)實(shí)例的最小行為歷史包括下列操作:2 - 54隨機(jī)測(cè)試隨機(jī)測(cè)試 opensetupdepositwithdrawclose這就是對(duì)account類(lèi)的最小測(cè)試序列。但是,在下面的序列中可能發(fā)生許多其他行為: opensetupdepositdeposit|withdraw|balance|summarize|creditLimitnwithdrawclose 從上列
25、序列可以隨機(jī)地產(chǎn)生一系列不同的操作序列,例如: 測(cè)試用例#r1:opensetupdepositdepositbalancesummarizewithdrawclose 測(cè)試用例#r2:opensetupdepositwithdrawdepositbalancecreditLimitwithdrawclose 執(zhí)行上述這些及另外一些隨機(jī)產(chǎn)生的測(cè)試用例,可以測(cè)試類(lèi)實(shí)例的不同生存歷史。2 - 55劃分測(cè)試劃分測(cè)試與測(cè)試傳統(tǒng)軟件時(shí)采用等價(jià)劃分方法類(lèi)似,采用劃分測(cè)試(partition testing)方法可以減少測(cè)試類(lèi)時(shí)所需要的測(cè)試用例的數(shù)量。首先,把輸入和輸出分類(lèi),然后設(shè)計(jì)測(cè)試用例以測(cè)試劃分出的每
26、個(gè)類(lèi)別。下面介紹劃分類(lèi)別的方法2 - 56基于狀態(tài)的劃分基于狀態(tài)的劃分這種方法根據(jù)類(lèi)操作改變類(lèi)狀態(tài)的能力來(lái)劃分類(lèi)操作。再一次考慮account類(lèi),狀態(tài)操作包括deposit和withdraw,而非狀態(tài)操作有balance, summarize和creditLimit。設(shè)計(jì)測(cè)試用例,以分別測(cè)試改變狀態(tài)的操作和不改變狀態(tài)的操作2 - 57基于狀態(tài)的劃分基于狀態(tài)的劃分例如,用這種方法可以設(shè)計(jì)出如下的測(cè)試用例:#p1:opensetupdepositdepositwithdrawwithdrawclose#p2:opensetupdepositsummarizecreditLimitwithdrawc
27、lose 測(cè)試用例#P1改變狀態(tài),而測(cè)試用例#P2測(cè)試不改變狀態(tài)的操作(在最小測(cè)試序列中的操作除外)2 - 58基于屬性的劃分基于屬性的劃分這種方法根據(jù)類(lèi)操作使用的屬性來(lái)劃分類(lèi)操作。對(duì)于account類(lèi)來(lái)說(shuō),可以使用屬性balance來(lái)定義劃分,從而把操作劃分成3個(gè)類(lèi)別:使用balance的操作修改balance的操作不使用也不修改balance的操作,然后,為每個(gè)類(lèi)別設(shè)計(jì)測(cè)試序列2 - 59基于功能的劃分基于功能的劃分這種方法根據(jù)類(lèi)操作所完成的功能來(lái)劃分類(lèi)操作例如可以把a(bǔ)ccount類(lèi)中的操作分類(lèi)為初始化操作(open,setup),計(jì)算操作(deposit, withdraw),查詢操作(
28、balance, summarize,creditLimit)和終止操作(close)然后為每個(gè)類(lèi)別設(shè)計(jì)測(cè)試序列2 - 60基于故障的測(cè)試基于故障的測(cè)試基于故障的測(cè)試(fault based testing)與傳統(tǒng)的錯(cuò)誤推測(cè)法類(lèi)似,也是首先推測(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ò)誤:2 - 61 把語(yǔ)句if(x=0)calculate_square_root( )
29、; 誤寫(xiě)成if(x0)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ù)的效果好基于故障的測(cè)試基于故障的測(cè)試2 - 62集成測(cè)試方法集成測(cè)試方法n開(kāi)始集成面向?qū)ο笙到y(tǒng)以后,測(cè)試用例的設(shè)計(jì)變得更加復(fù)雜。在這個(gè)測(cè)試階段,必須對(duì)類(lèi)間協(xié)作進(jìn)行測(cè)試。為了舉例說(shuō)明設(shè)計(jì)類(lèi)間測(cè)試用例的方法,我們擴(kuò)充前面引入的銀行系統(tǒng)的例子,使它包含圖12.3所示的類(lèi)和協(xié)作。圖中箭頭方向代表
30、消息的傳遞方向,箭頭線上的標(biāo)注給出了作為由消息所蘊(yùn)含的協(xié)作的結(jié)果而調(diào)用的操作n和測(cè)試單個(gè)類(lèi)相似,測(cè)試類(lèi)協(xié)作可以使用隨機(jī)測(cè)試方法和劃分測(cè)試方法,以及基于情景的測(cè)試和行為測(cè)試來(lái)完成2 - 63集成測(cè)試方法集成測(cè)試方法多類(lèi)測(cè)試 Kirani和Tsai建議使用下列步驟,以生成多個(gè)類(lèi)的隨機(jī)測(cè)試用例: 1.對(duì)每個(gè)客戶類(lèi),使用類(lèi)操作符列表來(lái)生成一系列隨機(jī)測(cè)試序列。這些操作符向服務(wù)器類(lèi)實(shí)例發(fā)送消息。 2.對(duì)所生成的每個(gè)消息,確定協(xié)作類(lèi)和在服務(wù)器對(duì)象中的對(duì)應(yīng)操作符。 3.對(duì)服務(wù)器對(duì)象中的每個(gè)操作符(已經(jīng)被來(lái)自客戶對(duì)象的消息調(diào)用),確定傳遞的消息。 4.對(duì)每個(gè)消息,確定下一層被調(diào)用的操作符,并把這些操作符結(jié)合進(jìn)測(cè)
31、試序列中。2 - 64集成測(cè)試方法集成測(cè)試方法 為了說(shuō)明怎樣用上述步驟生成多個(gè)類(lèi)的隨機(jī)測(cè)試用例,考慮Bank類(lèi)相對(duì)于ATM類(lèi)(見(jiàn)圖12.3)的操作序列: verifyAcctverifyPIN(verifyPolicywithdrawReq)|depositReq|acctInfoREQn 對(duì)Bank類(lèi)的隨機(jī)測(cè)試用例可能是: 測(cè)試用例#r3:verifyAcctverifyPINdepositReq 2 - 65集成測(cè)試方法集成測(cè)試方法 為了考慮在上述這個(gè)測(cè)試中涉及的協(xié)作者,需要考慮與測(cè)試用例#r3中的每個(gè)操作相關(guān)聯(lián)的消息。Bank必須和ValidationInfo協(xié)作以執(zhí)行verifyAcc
32、t和verifyPIN,Bank還必須和Account協(xié)作以執(zhí)行depositReq。因此,測(cè)試上面提到的協(xié)作的新測(cè)試用例是: 測(cè)試用例#r4:verifyAcctBankvalidAcctValidationInfoverifyPINBankvalidPINvalidationInfodepositReqdepositaccount2 - 66集成測(cè)試方法集成測(cè)試方法 多個(gè)類(lèi)的劃分測(cè)試方法類(lèi)似于單個(gè)類(lèi)的劃分測(cè)試方法。但是,對(duì)于多類(lèi)測(cè)試來(lái)說(shuō),應(yīng)該擴(kuò)充測(cè)試序列以包括那些通過(guò)發(fā)送給協(xié)作類(lèi)的消息而被調(diào)用的操作。另一種劃分測(cè)試方法,根據(jù)與特定類(lèi)的接口來(lái)劃分類(lèi)操作。如圖12.3所示,Bank類(lèi)接收來(lái)自A
33、TM類(lèi)和Cashier類(lèi)的消息,因此,可以通過(guò)把Bank類(lèi)中的方法劃分成服務(wù)于ATM的和服務(wù)于Cashier的兩類(lèi)來(lái)測(cè)試它們。還可以用基于狀態(tài)的劃分,進(jìn)一步精化劃分。2 - 67集成測(cè)試方法集成測(cè)試方法 圖圖12.3 銀行系統(tǒng)的類(lèi)銀行系統(tǒng)的類(lèi)-協(xié)作圖協(xié)作圖2 - 68集成測(cè)試方法集成測(cè)試方法從動(dòng)態(tài)模型導(dǎo)出測(cè)試用例 在本書(shū)第9章中已經(jīng)講過(guò),怎樣用狀態(tài)轉(zhuǎn)換圖作為表示類(lèi)的動(dòng)態(tài)行為的模型。類(lèi)的狀態(tài)圖可以幫助我們導(dǎo)出測(cè)試該類(lèi)(及與其協(xié)作的那些類(lèi))的動(dòng)態(tài)行為的測(cè)試用例。圖12.4給出了前面討論過(guò)的account類(lèi)的狀態(tài)圖,從圖可見(jiàn),初始轉(zhuǎn)換經(jīng)過(guò)了empty acct和setup acct這兩個(gè)狀態(tài),而類(lèi)實(shí)
34、例的大多數(shù)行為發(fā)生在working acct狀態(tài)中,最終的withdraw和close使得account類(lèi)分別向nonworking acct狀態(tài)和dead acct狀態(tài)轉(zhuǎn)換。2 - 69集成測(cè)試方法集成測(cè)試方法 圖圖12.4 account類(lèi)的狀態(tài)轉(zhuǎn)換圖類(lèi)的狀態(tài)轉(zhuǎn)換圖2 - 70集成測(cè)試方法集成測(cè)試方法 設(shè)計(jì)出的測(cè)試用例應(yīng)該覆蓋所有狀態(tài),也就是說(shuō),操作序列應(yīng)該使得account類(lèi)實(shí)例遍歷所有允許的狀態(tài)轉(zhuǎn)換: 測(cè)試用例#s1:opensetupAccntdeposit(initial)withdraw(final)close 應(yīng)該注意,上面列出的序列與12.4.1節(jié)討論的最小測(cè)試序列相同。向最小序列中加入附加的測(cè)試序列,可以得出其他測(cè)試用例: 測(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 混凝土及鋼筋工程冬季施工方案
- 二零二五年鋼筋加工廠員工勞動(dòng)合同模板2篇
- 2024年深圳職業(yè)技術(shù)學(xué)院高職單招職業(yè)技能測(cè)驗(yàn)歷年參考題庫(kù)(頻考版)含答案解析
- 二零二五年畜禽糞便處理與資源化利用合作協(xié)議3篇
- 2024年海南職業(yè)技術(shù)學(xué)院高職單招職業(yè)技能測(cè)驗(yàn)歷年參考題庫(kù)(頻考版)含答案解析
- 星銳時(shí)代廣場(chǎng)二期開(kāi)盤(pán)全新
- 九年級(jí)歷史上冊(cè)第四單元封建時(shí)代的亞洲國(guó)家第12課阿拉伯帝國(guó)課件1新人教版
- 四年級(jí)語(yǔ)文上冊(cè)第一單元習(xí)作一個(gè)好地方習(xí)題課件新人教版
- 二零二五年度集裝箱運(yùn)輸拖車(chē)運(yùn)輸保險(xiǎn)合同2篇
- SMT車(chē)間管理課程
- 老年人譫妄中西醫(yī)結(jié)合診療專(zhuān)家共識(shí)
- 團(tuán)餐食品安全年度匯報(bào)
- 華西解剖學(xué)課件緒論和骨學(xué)總論
- 2024平安保險(xiǎn)測(cè)評(píng)題庫(kù)
- 膀胱癌診斷治療指南
- 窗簾方案模板
- 僵尸企業(yè)注銷(xiāo)工作總結(jié)范文
- 人教版五年級(jí)上冊(cè)數(shù)學(xué)脫式計(jì)算練習(xí)200題及答案
- 網(wǎng)站性能優(yōu)化與改進(jìn)方案
- 80四川省內(nèi)江市2023-2024學(xué)年八年級(jí)上學(xué)期期末考試歷史試題
- 不飽和聚酯樹(shù)脂工藝流程圖
評(píng)論
0/150
提交評(píng)論