軟件開發(fā)前沿技術(shù)_第1頁
軟件開發(fā)前沿技術(shù)_第2頁
軟件開發(fā)前沿技術(shù)_第3頁
軟件開發(fā)前沿技術(shù)_第4頁
軟件開發(fā)前沿技術(shù)_第5頁
已閱讀5頁,還剩40頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、軟件工程前沿開發(fā)技術(shù)經(jīng)過近四十年的發(fā)展,軟件工程在支持軟件系統(tǒng)工程化開發(fā)方面取得了令人矚目的成績(jī),提出了大量的理論、方法、技術(shù)和工具,但是近年來的研究和實(shí)踐表明軟件危機(jī)依然存在,軟件開發(fā)仍然存在成本高、質(zhì)量得不到保證、進(jìn)度和成本難以控制等方面的問題,許多 軟件項(xiàng)目被迫延期甚至取消。與此同時(shí),隨著網(wǎng)絡(luò)技術(shù)(尤其是 Internet 技術(shù))的不斷發(fā)展, 部署在網(wǎng)絡(luò)基礎(chǔ)上的軟件系統(tǒng)的規(guī)模和復(fù)雜性越來越高,并表現(xiàn)出諸如持續(xù)性、自適應(yīng)性、交互性、動(dòng)態(tài)性、開放性、異構(gòu)性等特點(diǎn)。因此,如何支持這類復(fù)雜系統(tǒng)的開發(fā)、緩解和消除現(xiàn)階段的軟件危機(jī)是當(dāng)前軟件工程面臨的一項(xiàng)重要挑戰(zhàn)。為了迎接上述挑戰(zhàn),近年來軟件 工程領(lǐng)

2、域的一些學(xué)者提出了許多新的方法和技術(shù),包括:敏捷軟件開發(fā)(Agile Software Development)、極限編程(Extreme Programming,XP)、測(cè)試驅(qū)動(dòng)的開發(fā)(Test-Driven Development,TDD)、面向 Agent 的軟件開發(fā)(Agent-Oriented Development)、面向方面的 編程(Aspect-Oriented Programming,AOP)、模型驅(qū)動(dòng)體系結(jié)構(gòu)(Model-Driven Architecture, MDA)等等。與傳統(tǒng)的軟件工程方法相比較,這些方法和技術(shù)為軟件工程實(shí)踐提供了新的 思路,已在許多軟件工程實(shí)踐中取

3、得了積極的效果。 1 敏捷軟件開發(fā) 軟件工程一直以來都面臨著一個(gè)共同的問題,即如何迅速、高效地開發(fā)軟件系統(tǒng),適應(yīng)用戶需求的快速變化,確保軟件系統(tǒng)的質(zhì)量,控制軟件開發(fā)成本。傳統(tǒng)軟件開發(fā)方法強(qiáng)調(diào)軟件開發(fā)需遵循嚴(yán)格的過程模型以及以此為基礎(chǔ)的開發(fā)計(jì)劃,并且在軟件開發(fā)過程中需產(chǎn)生大量的規(guī)范化文檔,這一思想和方法很難應(yīng)對(duì)快速、靈活和低成本軟件開發(fā)所帶來的一系列問題。自二十世紀(jì)九十年代以來,軟件工程領(lǐng)域涌現(xiàn)出了一批新的軟件開發(fā)方法。這些方法主張軟件開發(fā)只編寫少量文檔、以用戶為中心、主動(dòng)適應(yīng)需求變化。這些方法被稱為敏捷軟件 開發(fā),其代表性的成果是極限編程。 1.1 敏捷思想 至今人們已提出了幾十種軟件開發(fā)方法

4、,根據(jù)這些方法在對(duì)軟件開發(fā)所提出的要求和約束等方面的差異,現(xiàn)有的軟件開發(fā)方法大致可分為兩類:重型軟件開發(fā)方法和輕型軟件開發(fā)方法。重型軟件開發(fā)方法一般具有嚴(yán)格和詳盡的軟件開發(fā)過程,軟件開發(fā)需產(chǎn)生大量的文檔。輕型軟件開發(fā)方法則強(qiáng)調(diào)軟件開發(fā)過程的簡(jiǎn)潔性和靈活性,軟件開發(fā)只需編寫少量的文檔。 敏捷軟件開發(fā)是一類輕型的軟件開發(fā)方法,它 提供了一組思想和策略來指導(dǎo)軟件系統(tǒng)的快速開發(fā)并響應(yīng)用戶需求的變化。不同于已有的其它軟件開發(fā)方法,該方法對(duì)軟件開發(fā)具有 以下四個(gè)方面的基本認(rèn)識(shí):(1)較之于過程和工具,應(yīng)更加重視人和交互的價(jià)值;( 2)較之于面面俱到的文檔,應(yīng)更加重視可運(yùn)行軟件的價(jià)值;( 3)較之于合同談判

5、,應(yīng)更加重視客戶 合作的價(jià)值;( 4)較之于遵循計(jì)劃,應(yīng)更加重視響應(yīng)用戶需求變化的價(jià)值12。 敏捷軟件開發(fā)方法認(rèn)為人是軟件開發(fā)中最為重要的因素,軟件開發(fā)應(yīng)堅(jiān)持以人為本;優(yōu)秀的軟件開發(fā)團(tuán)隊(duì)離不開人員之間良好的溝通與合作,相比較而言團(tuán)隊(duì)的合作與溝通能力比單純的編程能力更為重要,改善人員之間的交流與合作將有助于提升團(tuán)隊(duì)的軟件開發(fā)水平;應(yīng)根據(jù)軟件開發(fā)團(tuán)隊(duì)的特點(diǎn)選擇合適的軟件開發(fā)過程;在軟件開發(fā)工具的選擇方面,敏捷 軟件開發(fā)主張從使用小工具開始,只有當(dāng)小工具不能滿足要求時(shí)才考慮選擇和使用功能強(qiáng)大的 工具。 一直以來,人們將文檔視為是對(duì)軟件開發(fā)各個(gè)階段成果進(jìn)行記錄、促進(jìn)人員之間進(jìn)行交流的重要媒介和工具,也

6、是軟件開發(fā)和維護(hù)的主要依據(jù)。然而,編制過多的文檔不僅會(huì)耗費(fèi)大量時(shí)間和精力,而且當(dāng)用戶需求變化時(shí)難以實(shí)現(xiàn)文檔與代碼的同步,這勢(shì)必會(huì)影響軟件系 統(tǒng)的開發(fā)和維護(hù)。敏捷軟件開發(fā)方法提倡在軟件開發(fā)過程中只編寫少量短小精煉的文檔。 成功的軟件開發(fā)不應(yīng)單純依賴于合同條款和工作說明,而應(yīng) 將用戶和軟件開發(fā)團(tuán)隊(duì)緊密地結(jié)合在一起,讓用戶積極參與軟件開發(fā)并提供持續(xù)不斷、頻繁的反饋信息。在軟件開發(fā)過程中,用戶需求總會(huì)發(fā)生變化,這是由于用戶需求難以一次性完全捕獲,開發(fā)人員和用戶對(duì)于需求的認(rèn)識(shí)會(huì)不斷地調(diào)整。此外,用戶的業(yè)務(wù)本身也可能會(huì)動(dòng)態(tài)地發(fā)生變化。在復(fù)雜軟件系統(tǒng)的開發(fā)過程中,響應(yīng)用戶需求變化的能力常常決定著軟件項(xiàng)目的成

7、敗。為了適應(yīng)用戶需求的變化,敏捷軟件開發(fā)認(rèn)為軟件開發(fā)計(jì)劃不應(yīng)考慮的太遠(yuǎn),不要進(jìn)行過于周密、詳細(xì)的計(jì)劃,只應(yīng)覆蓋短期的工作任務(wù),對(duì)于中長(zhǎng)期的任務(wù)只需有一個(gè)粗略的規(guī)劃即可,要保留計(jì)劃 的充分靈活性,并根據(jù)需求的變化適時(shí)地調(diào)整計(jì)劃。 在上述思想的指導(dǎo)下,敏捷軟件開發(fā)提出了以下十二條原則來指導(dǎo)軟件系統(tǒng)的開發(fā)1。 (1) 盡早和持續(xù)地交付有價(jià)值的軟件,以使用戶滿意。 敏捷軟件開發(fā)最關(guān)心的是軟件系統(tǒng)的交付。諸多軟件工程實(shí)踐表明,初期交付軟件系統(tǒng)中包含的功能越少,最終交付軟件系統(tǒng)的質(zhì)量就越高;軟件產(chǎn)品交付的越頻繁,最終軟件產(chǎn)品的質(zhì)量就越高。盡早的交付可以讓軟件開發(fā)團(tuán)隊(duì)盡快獲得成就感,提升軟件開發(fā)團(tuán)隊(duì)的激情和

8、效率,盡早從用戶處獲取對(duì)需求、過程、產(chǎn)品等反饋信息。持續(xù)性的交付可以讓軟件開發(fā)團(tuán)隊(duì)保持勝利感和成就感,持續(xù)獲取用戶的反饋信息,及時(shí)調(diào)整項(xiàng)目實(shí)施的方向和優(yōu)先級(jí)。 該原則主張迭代性的軟件開發(fā),并強(qiáng)調(diào)每一次迭代都選擇對(duì)用戶最有價(jià)值的功能作為本次迭代的任務(wù),迭代周期不宜太長(zhǎng)。每次 迭代結(jié)束以后,就向用戶交付一個(gè)可運(yùn)行的、實(shí)現(xiàn) 部分需求的軟件產(chǎn)品。 (2) 即使到了軟件開發(fā)后期,也歡迎用戶需求的變化。 需求不斷變化和調(diào)整是軟件工程化開發(fā)的一個(gè)重要特點(diǎn)。敏捷軟件開發(fā)方法的實(shí)踐者不應(yīng)懼怕變化,而應(yīng)適應(yīng)用戶需求的變化,從而為用戶創(chuàng)造競(jìng)爭(zhēng)優(yōu)勢(shì)。為了支持用戶需求的變化,敏捷軟件開發(fā)所生成的軟件結(jié)構(gòu)應(yīng)具有足夠的靈活

9、性,以便在需求變化時(shí)能以最小的代價(jià)迅速地做出調(diào)整。因此,敏捷軟件開發(fā)主張采用模式、迭代和重構(gòu)等技術(shù),以適應(yīng)用戶需 求的變化,獲得軟件結(jié)構(gòu)的靈活性。 (3) 不斷交付可運(yùn)行的軟件系統(tǒng),交付周期可以從幾周到幾個(gè)月。 敏捷軟件開發(fā)主張軟件開發(fā)團(tuán)隊(duì)?wèi)?yīng)經(jīng)常性地向用戶交付可運(yùn)行的軟件系統(tǒng),而不是大量的文檔或者計(jì)劃。交付的周期要適宜,太長(zhǎng)易使用戶失去耐性,軟件開發(fā)團(tuán)隊(duì)也無法從用 戶處及時(shí)獲得反饋信息;過短會(huì)使用戶難以接受持續(xù)不斷的軟件產(chǎn)品版本。 (4) 在整個(gè)軟件項(xiàng)目開發(fā)期間,用戶和開發(fā)人員最好能每天一起工作。 為了使軟件開發(fā)過程保持“敏捷”性,開發(fā)人員應(yīng)及時(shí)從用戶處獲得各種反饋信息,因 此需要用戶與軟件開

10、發(fā)人員一起工作,以便在需要的時(shí)候及時(shí)給予反饋。 (5) 由積極主動(dòng)的人來承擔(dān)項(xiàng)目開發(fā),給他們提供所需環(huán)境和支持,信任他們的能力。 在影響軟件項(xiàng)目的諸多因素中,人是其中最為重要的因素。因此參與軟件項(xiàng)目的人應(yīng)積 極主動(dòng),并要為它們參與軟件開發(fā)創(chuàng)造良好的環(huán)境和條件。 (6) 團(tuán)隊(duì)內(nèi)部最有效的信息傳遞方式是面對(duì)面的交談。 敏捷軟件開發(fā)主張軟件開發(fā)團(tuán)隊(duì)人員之間采用面對(duì)面交談的方式來進(jìn)行溝通,文檔不作 為人員之間交流的默認(rèn)方式,只有在萬不得已的情況下,才去編寫文檔。 (7) 將可運(yùn)行的軟件作為衡量軟件開發(fā)進(jìn)度的首要衡量標(biāo)準(zhǔn)。 所謂可運(yùn)行的軟件是指完成了用戶的部分或全部需求,并經(jīng)過測(cè)試,可在目標(biāo)環(huán)境下運(yùn)行的

11、軟件系統(tǒng)。不同于其它的軟件開發(fā)方法,敏捷軟件開發(fā)不是根據(jù)所處的軟件開發(fā)階段、已編寫的文檔數(shù)目或者已完成的代碼數(shù)量來衡量軟件開發(fā)進(jìn)度,而是基于可運(yùn)行的軟 件系統(tǒng)實(shí)現(xiàn)了多少軟件需求來衡量軟件開發(fā)進(jìn)度。 (8) 可持續(xù)性的開發(fā),出資方、開發(fā)方和用戶方應(yīng)當(dāng)保持長(zhǎng)期、恒定的開發(fā)速度。 對(duì)于許多軟件項(xiàng)目而言,軟件開發(fā)是一個(gè)長(zhǎng)期的過程。敏捷軟件開發(fā)主張軟件開發(fā)團(tuán)隊(duì)根據(jù)自身的特點(diǎn)選擇合適、恒定的軟件開發(fā)速度。不應(yīng)盲目追求高速,軟件開發(fā)速度過快可 能使軟件開發(fā)人員陷入疲憊狀態(tài),可能會(huì)出現(xiàn)一些短期行為,以致于給軟件項(xiàng)目留下隱患。 (9) 關(guān)注優(yōu)秀的技能和良好的設(shè)計(jì)會(huì)增強(qiáng)敏捷性。 敏捷的一個(gè)重要體現(xiàn)是響應(yīng)變化的能力

12、。良好的設(shè)計(jì)是提高軟件系統(tǒng)應(yīng)變能力的關(guān)鍵。因此,軟件開發(fā)人員必須從一開始就努力做好設(shè)計(jì),并在整個(gè)項(xiàng)目開發(fā)期間不斷審查和改進(jìn)設(shè)計(jì)。所有的軟件開發(fā)人員都應(yīng)致力于編寫高質(zhì)量的代碼,不要為了追求短期目標(biāo)而降低 工作質(zhì)量,將改進(jìn)的工作留到以后再做。 (10) 簡(jiǎn)單化。 這里所說的簡(jiǎn)單化是指軟件開發(fā)工作應(yīng)著眼于當(dāng)前欲解決的問題,不要把問題想的太復(fù)雜(如去預(yù)測(cè)將來可能出現(xiàn)的問題),并采用最為簡(jiǎn)單的方法去解決它,不要試圖去構(gòu)建 那些華而不實(shí)的系統(tǒng)。 (11) 最好的架構(gòu)、需求和設(shè)計(jì)出自于自組織的團(tuán)隊(duì)。 敏捷團(tuán)隊(duì)?wèi)?yīng)當(dāng)是自組織的,以適應(yīng)需求的變化。軟件開發(fā)任務(wù)不是從外部直接分配到團(tuán)隊(duì)成員,而是交給軟件開發(fā)團(tuán)隊(duì),然

13、后再由團(tuán)隊(duì)自行決定任務(wù)應(yīng)當(dāng)怎樣完成。軟件項(xiàng)目開發(fā)不是劃分成若干部分然后交給相應(yīng)的成員全權(quán)負(fù)責(zé),所有成員對(duì)于軟件項(xiàng)目的所有部分 都有權(quán)參與。 (12) 軟件開發(fā)團(tuán)隊(duì)?wèi)?yīng)定期就如何提高工作效率的問題進(jìn)行反思,并進(jìn)行相應(yīng)的調(diào)整。 敏捷軟件開發(fā)方法不是一成不變的,敏捷本身即含有適時(shí)調(diào)整的意思。隨著項(xiàng)目的推進(jìn),軟件開發(fā)團(tuán)隊(duì)?wèi)?yīng)不斷地對(duì)其組織方式、規(guī)則、關(guān)系等方面進(jìn)行反思,并對(duì)這些方面進(jìn) 行調(diào)整,以便不斷優(yōu)化團(tuán)隊(duì)結(jié)構(gòu)、提高軟件開發(fā)效率。 1.2 敏捷軟件開發(fā)特點(diǎn) 敏捷思想對(duì)軟件開發(fā)提出了新的理解和認(rèn)識(shí)。它沒有深?yuàn)W的理論,也沒有引入新的概念和特有的技術(shù),只是將經(jīng)過數(shù)十年檢驗(yàn)的一組軟件工程準(zhǔn)則有機(jī)地結(jié)合在一起,確

14、保這些軟 件工程準(zhǔn)則相互支持并能夠得到有效執(zhí)行,從而促進(jìn)當(dāng)前軟件工程所面臨的問題的解決。 敏捷意味著輕盈、靈巧、無過多的負(fù)擔(dān)、能夠迅速響應(yīng)變化。根據(jù)敏捷軟件開發(fā)的指導(dǎo) 思想和實(shí)踐原則,敏捷軟件開發(fā)具有以下幾個(gè)方面的特點(diǎn)。 小 敏捷軟件開發(fā)主張軟件開發(fā)過程只需生成少量的軟件文檔,每個(gè)文檔的規(guī)模要?。卉浖_發(fā)應(yīng)該迭代進(jìn)行,每次迭代要實(shí)現(xiàn)的軟件功能需求的數(shù)量和規(guī)模要小,從而確保每次迭代 的周期要小。 簡(jiǎn) 敏捷軟件開發(fā)建議軟件開發(fā)過程中所采用的技術(shù)、所使用的工具以及每次迭代要解決的問題要盡可能的簡(jiǎn)單;軟件開發(fā)人員在每次迭代中只關(guān)注當(dāng)前欲實(shí)現(xiàn)的功能需求,而不要 考慮將來的問題,從而使得軟件開發(fā)人員能夠聚

15、焦關(guān)注點(diǎn),簡(jiǎn)化問題的解決。 快 為了快速響應(yīng)變化、盡快從用戶處獲得反饋信息,敏捷軟件開發(fā)要求軟件開發(fā)人員盡快地給用戶提交有價(jià)值的軟件產(chǎn)品,快速地對(duì)軟件產(chǎn)品進(jìn)行迭代和更新,以向用戶持續(xù)地交付不斷完善的軟件產(chǎn)品。這里所說的軟件產(chǎn)品是指可運(yùn)行的軟件系統(tǒng),而不是軟件文 檔。 變 敏捷軟件開發(fā)允許用戶需求的動(dòng)態(tài)變化,主張要以變應(yīng)變,尤其是開發(fā)團(tuán)隊(duì)?wèi)?yīng)該是自組織的,軟件系統(tǒng)的設(shè)計(jì)應(yīng)能夠有效地支持用戶需求的變化,在整個(gè)軟件開發(fā)過程中項(xiàng)目開發(fā)團(tuán)隊(duì)?wèi)?yīng)不斷檢討軟件開發(fā)方法、技術(shù)、管理和工具等方面的不足和局限,以便對(duì)它們進(jìn) 行不斷的改進(jìn)和優(yōu)化。 體 按照敏捷軟件開發(fā)思想,軟件開發(fā)人員和用戶應(yīng)融為一體,形成一個(gè)團(tuán)隊(duì);敏

16、捷軟件開發(fā)非常強(qiáng)調(diào)構(gòu)成團(tuán)隊(duì)的各個(gè)成員的素質(zhì),包括能力、技能、工作的積極性和主動(dòng)性;此外敏捷軟件開發(fā)還鼓勵(lì)個(gè)體之間的交流,并強(qiáng)調(diào)這種交流是以交談為主,而不是以文檔為媒介。 從總體上看,敏捷軟件開發(fā)方法與其它一些重型的軟件開發(fā)方法有以下三個(gè)方面的本質(zhì)差別。首先,敏捷軟件開發(fā)強(qiáng)調(diào)方法本身的適應(yīng)性,針對(duì)變化不斷進(jìn)行優(yōu)化和調(diào)整,主動(dòng)適應(yīng)變化;而重型軟件開發(fā)方法以預(yù)測(cè)性和計(jì)劃性為主,傾向于預(yù)先制定詳細(xì)的計(jì)劃,通過該計(jì)劃來指導(dǎo)軟件項(xiàng)目的實(shí)施,并期望軟件開發(fā)過程與計(jì)劃之間的偏差越少越好。其次,敏捷軟件開發(fā)強(qiáng)調(diào)以人為本,認(rèn)為軟件開發(fā)是面向人的而不是面向過程的,要求讓軟件開發(fā)所需的各種方法、技術(shù)、工具和過程等適應(yīng)

17、人,而不是讓人去適應(yīng)它們;而重型軟件開發(fā)方法試圖定義一種廣泛適用的軟件開發(fā)過程并通過團(tuán)隊(duì)來執(zhí)行該軟件開發(fā)過程,從而來指導(dǎo)軟件系統(tǒng)的開發(fā)。第三,敏捷軟件開發(fā)重點(diǎn)關(guān)注和強(qiáng)調(diào)可運(yùn)行的軟件系統(tǒng),弱化了文檔在軟件開發(fā) 中的作用;而重型軟件開發(fā)方法則非常重視軟件文檔的撰寫和管理。 敏捷軟件開發(fā)的上述特點(diǎn)使得它更加適合于小規(guī)模軟件開發(fā)團(tuán)隊(duì),因?yàn)檫^多的軟件開發(fā)人員勢(shì)必會(huì)使得軟件開發(fā)人員之間的交流變得非常復(fù)雜;同時(shí)也使它更加適合于需求易變的 軟件系統(tǒng)的開發(fā),從而充分發(fā)揮該方法的技術(shù)優(yōu)勢(shì)。 1.3 支持敏捷軟件開發(fā)的技術(shù)和管理手段 敏捷軟件開發(fā)的基本思想和實(shí)踐原則為軟件系統(tǒng)的開發(fā)提供了一組高層的策略,它們明 確了

18、實(shí)現(xiàn)敏捷軟件開發(fā)的目標(biāo)和要求,因而需要相應(yīng)技術(shù)和管理手段的支持。 從技術(shù)的角度來看,敏捷思想和原則對(duì)軟件系統(tǒng)的開發(fā)提出了以下一組要求:盡快開發(fā)出可運(yùn)行的軟件系統(tǒng);當(dāng)用戶需求改變時(shí)應(yīng)迅速地響應(yīng)變化;獲得良好的軟件設(shè)計(jì),以便當(dāng)需求變化時(shí)對(duì)軟件設(shè)計(jì)進(jìn)行不斷的調(diào)整和優(yōu)化;保證軟件系統(tǒng)的質(zhì)量;提高敏捷軟件開發(fā)的效率等等?,F(xiàn)階段軟件工程領(lǐng)域有以下一組技術(shù)可以有效地滿足上述要求,支持敏捷軟件 開發(fā)。 測(cè)試驅(qū)動(dòng)開發(fā) 測(cè)試驅(qū)動(dòng)開發(fā)要求軟件開發(fā)人員在編寫程序代碼之前,先確定和編寫好測(cè)試?;蛘哒f,軟件開發(fā)人員首先要思考如何對(duì)某個(gè)功能進(jìn)行測(cè)試,設(shè)計(jì)好相應(yīng)的測(cè)試用例,編寫好相關(guān)的測(cè)試代碼,然后編寫相應(yīng)的程序代碼以通過軟

19、件測(cè)試。這一技術(shù)支持軟件系統(tǒng)功能 的逐步實(shí)現(xiàn),有助于保證任何程序代碼都是可測(cè)試的,從而確保軟件系統(tǒng)的質(zhì)量。本章 7.2 節(jié)將詳細(xì)介紹測(cè)試驅(qū)動(dòng)開發(fā)技術(shù)。 敏捷設(shè)計(jì) 敏捷軟件開發(fā)對(duì)軟件系統(tǒng)的設(shè)計(jì)提出了更高的要求。為了支持用戶需求的動(dòng)態(tài)變化以及由此而引發(fā)的對(duì)軟件設(shè)計(jì)的持續(xù)調(diào)整和優(yōu)化,軟件系統(tǒng)的設(shè)計(jì)應(yīng)易于改動(dòng)和調(diào)整,具有穩(wěn)固 性、可理解性、簡(jiǎn)單性、干凈性和簡(jiǎn)潔性等特點(diǎn)。 針對(duì)這一要求,Robert C.Martin 提出一組支持敏捷軟件開發(fā)的設(shè)計(jì)原則3,包括:(1) 單一職責(zé)原則,要求每個(gè)模塊只承擔(dān)一個(gè)職責(zé),減少引起模塊變化的因素,提高模塊的內(nèi) 聚度;(2)開放封閉原則,擴(kuò)展時(shí)無需更改模塊的源代碼和可

20、執(zhí)行代碼,要盡可能利用抽象 類,以體現(xiàn)軟件設(shè)計(jì)的靈活性和可重用性;(3)依賴倒置原則,抽象不應(yīng)該依賴細(xì)節(jié),細(xì)節(jié) 應(yīng)依賴于抽象;(4)接口隔離原則,接口中的方法都是有意義的,否則就要相互分離等等。 模式運(yùn)用 充分利用各種模式,包括體系結(jié)構(gòu)模式和設(shè)計(jì)模式來進(jìn)行軟件系統(tǒng)的設(shè)計(jì),以支持軟 件系統(tǒng)的可重用性和應(yīng)對(duì)用戶需求的變化。 快速原型技術(shù) 快速原型技術(shù)有助于迅速生成軟件系統(tǒng)的原型,并以此為媒介支持軟件開發(fā)人員和用戶之間的交流和溝通,促使軟件開發(fā)人員關(guān)注于用戶的需求,適應(yīng)用戶需求的動(dòng)態(tài)變化,幫助 軟件開發(fā)人員盡快從用戶處及時(shí)獲得反饋信息。 MDA MDA 強(qiáng)調(diào)將軟件系統(tǒng)的功能規(guī)約與實(shí)現(xiàn)這些功能的技術(shù)和

21、平臺(tái)相分離,它區(qū)分兩類不 同的軟件系統(tǒng)模型:平臺(tái)無關(guān)的模型和平臺(tái)相關(guān)的模型,并通過模型映射在不同模型之間建 立橋梁,從而有助于保護(hù)用戶的業(yè)務(wù)模型,促進(jìn)軟件系統(tǒng)的快速開發(fā)和部署。 CASE 工具 目前已有許多支持敏捷軟件開發(fā)的軟件工具,包括由 Microtool 公司研發(fā)的 Actif Exetreme,它支持敏捷過程管理;由 Ideogramic 公司開發(fā)的 Ideogramic UML,它支持針對(duì) 敏捷過程的UML建模;由Borland公司開發(fā)的Together Tool Set,它支持敏捷開發(fā)和極限編 程中的諸多活動(dòng)等等。 從管理的角度來看,敏捷思想和原則對(duì)軟件系統(tǒng)的開發(fā)提出了以下一組要求

22、:管理好用戶的需求;確保軟件過程支持持續(xù)性的交付軟件系統(tǒng);管理好軟件開發(fā)團(tuán)隊(duì);支持軟件開發(fā)人員和用戶之間的交流、合作以及問題的及時(shí)反饋;以人為本,充分 發(fā)揮人的積極性和主動(dòng)性;保證軟件開發(fā)速度的穩(wěn)定性和持續(xù)性;不斷改進(jìn)和優(yōu)化軟件開發(fā)團(tuán)隊(duì)等等。為了應(yīng)對(duì) 這些要求,基于敏捷軟件開發(fā)方法的軟件項(xiàng)目應(yīng)遵循以下的管理方法。 軟件過程模型的選擇 基于敏捷軟件開發(fā)方法的軟件項(xiàng)目組應(yīng)選擇那些支持漸進(jìn)、迭代開發(fā)的軟件過程模型, 如迭代模型、螺旋模型、Rup 和快速原型等。 團(tuán)隊(duì)建設(shè) 基于敏捷軟件開發(fā)方法的軟件項(xiàng)目開發(fā)團(tuán)隊(duì)?wèi)?yīng)充分發(fā)揮人的主體作用,將用戶作為軟件開發(fā)團(tuán)隊(duì)中的成員,并與軟件開發(fā)人員一起工作和交流;為軟

23、件開發(fā)團(tuán)隊(duì)提供良好的交流環(huán)境,如擁有共同的辦公區(qū)間和時(shí)間,基于網(wǎng)絡(luò)的虛擬環(huán)境;支持團(tuán)隊(duì)成員,尤其是開發(fā)人員 和用戶之間的雙向交流和溝通。 需求管理 盡管用戶需求在整個(gè)軟件開發(fā)過程中是動(dòng)態(tài)變化的,但是每次迭代欲實(shí)現(xiàn)的用戶需求應(yīng)該是穩(wěn)定的,所生成的需求文檔應(yīng)處于受控狀態(tài),與項(xiàng)目計(jì)劃、產(chǎn)品和活動(dòng)相一致,并作為開展軟件開發(fā)工作的基礎(chǔ)。軟件開發(fā)人員通過和用戶的充分和持續(xù)性交流,支持需求確認(rèn) 和評(píng)審。 軟件項(xiàng)目計(jì)劃 軟件開發(fā)人員和用戶一起參與計(jì)劃的制定,包括估算規(guī)模和進(jìn)度、確定人員分工;項(xiàng)目計(jì)劃的制定者應(yīng)參照用戶需求來制定軟件項(xiàng)目計(jì)劃,包括系統(tǒng)應(yīng)當(dāng)滿足哪些需求、應(yīng)當(dāng)首先滿足哪些需求、每次發(fā)布的版本應(yīng)完成多

24、少功能才會(huì)對(duì)用戶的業(yè)務(wù)有所改善等等。軟件項(xiàng)目計(jì)劃不應(yīng)過細(xì),應(yīng)保留一定的靈活性。同時(shí)每次迭代要量力而行,確保要實(shí)現(xiàn)的系統(tǒng)功能不要太多。多個(gè)迭代欲實(shí)現(xiàn)的系統(tǒng)功能和迭代周期要大致相當(dāng),防止軟件開發(fā)周期的劇烈變化,支持穩(wěn)定和可持續(xù)的軟件開發(fā)。此外,每次迭代的軟件開發(fā)周期要適中,不宜過長(zhǎng)否則 用戶會(huì)失去耐心,無法及時(shí)得到反饋;也不宜過短,否則用戶難以消化,同樣影響反饋。 跟蹤監(jiān)督 在對(duì)敏捷軟件開發(fā)項(xiàng)目的跟蹤和監(jiān)督過程中,軟件項(xiàng)目管理人員要特別關(guān)注以下的軟件 風(fēng)險(xiǎn):(1)對(duì)規(guī)模和工作量的估算過于樂觀,該軟件風(fēng)險(xiǎn)將影響項(xiàng)目的周期性迭代;(2)軟 件開發(fā)人員和用戶之間的溝通不善,該軟件風(fēng)險(xiǎn)將可能導(dǎo)致軟件需求得

25、不到用戶的認(rèn)可和 確認(rèn);(3)需求定義不清晰和不明確,該軟件風(fēng)險(xiǎn)將可能導(dǎo)致需求不清,所開發(fā)的軟件系統(tǒng) 和用戶要求不一致;(4)項(xiàng)目組成員不能有效地在一起工作,該軟件風(fēng)險(xiǎn)將可能導(dǎo)致軟件開 發(fā)效率和軟件項(xiàng)目組敏捷度的下降;(5)任務(wù)的分配和人員的技能不匹配,該軟件風(fēng)險(xiǎn)將導(dǎo) 致軟件開發(fā)不能做到以人為本;(6)軟件設(shè)計(jì)低劣,該軟件風(fēng)險(xiǎn)將可能導(dǎo)致所開發(fā)的軟件系 統(tǒng)無法適應(yīng)用戶需求的不斷變化和調(diào)整等等。 1.4 極限編程 極限編程是由 Kent Beck 提出的一種特殊的敏捷軟件開發(fā)方法345,它提出了更加 具體和實(shí)際的指導(dǎo)方法以支持軟件系統(tǒng)的敏捷開發(fā)。極限編程將其核心思想歸結(jié)為四條:( 1) 交流,極限

26、編程強(qiáng)調(diào)交流對(duì)于軟件系統(tǒng)開發(fā)的重要性,但是它側(cè)重于基于口頭(而不是文檔、 報(bào)表和計(jì)劃)的交流;(2)反饋,極限編程主張通過持續(xù)、明確的反饋來獲得軟件的狀態(tài), 它對(duì)于軟件項(xiàng)目的成功實(shí)施是至關(guān)重要的;(3)簡(jiǎn)單,極限編程主張用最簡(jiǎn)單的技術(shù)來解決 當(dāng)前的問題;(4)勇氣,極限編程強(qiáng)調(diào)快速開發(fā)并在必要時(shí)具有重新進(jìn)行開發(fā)的信心。在此 基礎(chǔ)上,極限編程定義了五條指導(dǎo)性原則和十二條必須遵循的核心準(zhǔn)則。按照 極限編程創(chuàng)始 人 Kent Beck 的觀點(diǎn),極限編程并沒有引入任何新的概念,它的創(chuàng)新之處在于:將經(jīng)過數(shù)十 年檢驗(yàn)的準(zhǔn)則結(jié)合在一起,確保這些準(zhǔn)則相互支持并能夠得到有效執(zhí)行。 n 指導(dǎo)原則 極限編程的四條價(jià)

27、值觀構(gòu)成了整個(gè)方法學(xué)的基礎(chǔ),在此基礎(chǔ)上極限編程引出了五條原 則作為行為與實(shí)踐的指南。 1. 快速反饋 極限編程要求軟件開發(fā)人員從用戶處迅速得到有關(guān)軟件系統(tǒng)的反饋情況,比如 軟件開發(fā)人員通過小步迭代迅速了解用戶的反應(yīng),以確認(rèn)當(dāng)前所做的開發(fā)工作是否滿足用戶的需求, 通過經(jīng)常性的自動(dòng)化測(cè)試和集成迅速了解軟件系統(tǒng)的運(yùn)行狀況。 2. 簡(jiǎn)單性假設(shè) 極限編程要求軟件開發(fā)人員只考慮當(dāng)前迭代所面臨的問題,無需考慮將來(如下一次迭 代)所面臨的問題,并且用簡(jiǎn)單的方法和技術(shù)來解決問題。 3. 逐步更改 極限編程要求通過一系列細(xì)微的修改來逐步解決問題和完善系統(tǒng),不要期望一次迭代就 開發(fā)出一個(gè)完整的軟件系統(tǒng)。 4. 支

28、持變化 極限編程要求在軟件開發(fā)過程歡迎用戶改變需求,支持用戶需求的動(dòng)態(tài)變化。 5. 高質(zhì)量的工作 極限編程要求采用諸如測(cè)試驅(qū)動(dòng)開發(fā)等技術(shù)高質(zhì)量地開展工作,確保所開發(fā)軟件系統(tǒng)的 質(zhì)量。 n 核心準(zhǔn)則 極限編程總結(jié)出了十二項(xiàng)核心準(zhǔn)則以指導(dǎo)軟件系統(tǒng)的開發(fā)。這些實(shí)踐在日常的軟件工程化開發(fā)大多為人們所采用,然而單獨(dú)采用某些準(zhǔn)則卻有可能會(huì)導(dǎo)致混亂,極限編程的獨(dú)特之 處在于將這些核心準(zhǔn)則有機(jī)結(jié)合在起來以達(dá)到最佳效用。 (1)計(jì)劃游戲(Planning Game) 計(jì)劃游戲旨在幫助軟件開發(fā)團(tuán)隊(duì)快速制定下一次迭代的軟件開發(fā)計(jì)劃。參與計(jì)劃游戲的人員包括軟件開發(fā)人員和業(yè)務(wù)人員。業(yè)務(wù)人員在計(jì)劃游戲中的職責(zé)包括:確定范

29、圍即系統(tǒng)應(yīng)當(dāng)滿足哪些需求、規(guī)定需求的優(yōu)先級(jí)即應(yīng)當(dāng)首先滿足哪些需求、劃分版本即每一次發(fā)布的版本應(yīng)當(dāng)完成那些功能才會(huì)對(duì)用戶的業(yè)務(wù)有所改善、規(guī)定發(fā)布日期等等。業(yè)務(wù)人員的計(jì)劃決策需要得到軟件開發(fā)人員的反饋和支持。軟件開發(fā)人員在計(jì)劃游戲中的職責(zé)包括:估算實(shí)現(xiàn)每項(xiàng)功能所需的時(shí)間、解釋業(yè)務(wù)人員的決策在技術(shù)上的影響如數(shù)據(jù)庫的選擇對(duì)軟件的影 響、制定日程安排、分配工作等等。 (2)隱喻(Metaphor) 隱喻是指使用一組與業(yè)務(wù)相關(guān)的術(shù)語來描述用戶需求,促使軟件開發(fā)人員和業(yè)務(wù)人員對(duì)系統(tǒng)達(dá)成共同和一致的理解。由于軟件開發(fā)人員、業(yè)務(wù)人員及用戶之間使用業(yè)務(wù)術(shù)語(而不是技術(shù)術(shù)語)進(jìn)行交流,因此該準(zhǔn)則有助于加強(qiáng)他們之間的

30、溝通和合作,及時(shí)從用戶處獲得反饋并支持用戶更好地參與到軟件項(xiàng)目之中。采用隱喻對(duì)軟件開發(fā)人員而言也存在挑戰(zhàn),即如何將用業(yè)務(wù)相關(guān)的術(shù)語所描述的用戶需求轉(zhuǎn)換成為軟件所應(yīng)俱備的功能。隱喻的 選擇應(yīng)該仔細(xì)、恰當(dāng),不好的隱喻不僅無益于軟件系統(tǒng)的開發(fā),而且還會(huì)帶來負(fù)面影響。 (3)小型發(fā)布 經(jīng)常性地給用戶發(fā)布能給他帶來業(yè)務(wù)價(jià)值的可運(yùn)行軟件系統(tǒng),每次發(fā)布的軟件系統(tǒng)僅提供少量的功能。小型發(fā)布不僅有助于縮短軟件開發(fā)周期,提高軟件開發(fā)小組對(duì)軟件開發(fā)進(jìn)度的估算能力和精度,而且由于每個(gè)小型發(fā)布包含了對(duì)用戶最有價(jià)值的核心功能,因而有助 于從用戶處獲得對(duì)軟件系統(tǒng)使用情況的真實(shí)反饋信息。 (4)簡(jiǎn)單設(shè)計(jì) 所謂簡(jiǎn)單是指程序代碼

31、能夠運(yùn)行所有的測(cè)試、沒有重復(fù)的邏輯、清晰地反映程序的意圖、包含盡可能少的類和方法。與大多數(shù)傳統(tǒng)軟件開發(fā)方法不同的是,極限編程要求只為當(dāng)前的需求做設(shè)計(jì),而不必考慮將來可能的需求。這樣做是基于以下幾個(gè)方面的考慮。首先,對(duì)未知的需求考慮過多勢(shì)必會(huì)影響軟件開發(fā)人員當(dāng)前的工作,增加軟件系統(tǒng)開發(fā)的復(fù)雜度。其次,未來的需求是不確定的,因此過多考慮未來需求將可能導(dǎo)致所開發(fā)的軟件系統(tǒng)包含 用戶不需要的功能,增加了不必要的成本和開銷。 (5)測(cè)試 極限編程要求測(cè)試應(yīng)在編寫代碼之前進(jìn)行,而不是等到開發(fā)結(jié)束后再安排一個(gè)專門的階段對(duì)軟件系統(tǒng)進(jìn)行測(cè)試。在簡(jiǎn)單設(shè)計(jì)之后,程序員首先編寫測(cè)試程序,當(dāng)測(cè)試程序完成之后再正式編寫待

32、開發(fā)軟件系統(tǒng)的程序代碼。測(cè)試程序是對(duì)代碼進(jìn)行重構(gòu)的基礎(chǔ),通過運(yùn)行測(cè)試程序,可以檢查重構(gòu)是否引入了新的錯(cuò)誤。在軟件測(cè)試過程中,每發(fā)現(xiàn)一個(gè)錯(cuò)誤,就增加一項(xiàng)新的測(cè)試,因而測(cè)試程序是不斷增長(zhǎng)的。實(shí)踐表明,采用極限編程的這種測(cè)試方 法能使軟件系統(tǒng)的質(zhì)量不斷得到提高。 (6)重構(gòu) 重構(gòu)是指在不改變程序代碼功能的前提下,改進(jìn)程序代碼的設(shè)計(jì),使程序代碼更加簡(jiǎn)單,更易于擴(kuò)展。極限編程通過重構(gòu)使軟件系統(tǒng)具有靈活的結(jié)構(gòu),易于接受變化。重構(gòu)是 一個(gè)持續(xù)的簡(jiǎn)化過程,適用于代碼的設(shè)計(jì)和測(cè)試,甚至對(duì)極限編程本身也可進(jìn)行重構(gòu)。 (7)結(jié)對(duì)編程 結(jié)對(duì)編程是指兩名程序員同時(shí)在一臺(tái)計(jì)算機(jī)上共同開展編程工作。極限編程要求所有程序代碼

33、都通過結(jié)對(duì)編程來完成。這種編程方式有以下幾個(gè)方面的優(yōu)點(diǎn)。首先,軟件開發(fā)過程中的每一項(xiàng)決定都至少由兩個(gè)人來共同完成,對(duì)系統(tǒng)的每一部分至少有兩個(gè)人熟悉,這可以降低人員流動(dòng)帶來的軟件風(fēng)險(xiǎn)。其次,在進(jìn)行結(jié)對(duì)編程過程中,操縱鍵盤的人員著眼于實(shí)現(xiàn)細(xì)節(jié),而另一人則可以從全局的角度進(jìn)行考慮,因而可以有效地分離關(guān)注視點(diǎn),有助于對(duì)軟件系統(tǒng)的開發(fā)進(jìn)行全面的考慮。第三,結(jié)對(duì)編程有助于在編碼的同時(shí)進(jìn)行代碼復(fù)審,有助于提高程序代碼的質(zhì)量。第四,參與結(jié)對(duì)編程的程序員之間相互討論,可以強(qiáng)化知識(shí)共 享。 (8)代碼集體擁有 代碼集體擁有是指開發(fā)小組的任何成員都可以查看并修改任何部分的代碼。代碼集體擁有與傳統(tǒng)的做法正好相反,它不

34、是將系統(tǒng)的模塊指定給專門的人員,而是要求任何人都有權(quán)修改任何模塊代碼。這樣一方面程序員需要對(duì)整個(gè)軟件系統(tǒng)負(fù)責(zé),另一方面也促進(jìn)了軟件開發(fā)團(tuán)隊(duì)對(duì)整個(gè)系統(tǒng)的了解。代碼集體擁有與結(jié)對(duì)編程、編碼標(biāo)準(zhǔn)等極限編程準(zhǔn)則是相輔 相成的,如果沒有這些準(zhǔn)則的支持而單獨(dú)采用代碼集體擁有,將使軟件項(xiàng)目陷入混亂。 (9)持續(xù)集成 不要等到所有軟件模塊完成之后再進(jìn)行軟件系統(tǒng)的集成,而是應(yīng)經(jīng)常性地進(jìn)行集成。軟件開發(fā)小組可指定一臺(tái)計(jì)算機(jī)作為集成機(jī)器,專門用于自動(dòng)化構(gòu)建程序,程序員每完成一個(gè)模塊,就將它加入到集成機(jī)器中。集成的周期應(yīng)當(dāng)盡可能短,可能是幾個(gè)小時(shí)或者幾 天(而不是幾周或幾個(gè)月)集成一次。 (10)每周工作 40 小時(shí)

35、 極限編程倡導(dǎo)質(zhì)量?jī)?yōu)先,不主張為了追求開發(fā)速度而片面延長(zhǎng)工作時(shí)間,即使程序員 自愿,也不提倡加班。所謂每周工作 40 小時(shí)并不是一個(gè)絕對(duì)標(biāo)準(zhǔn),它是指一個(gè)合適的工作 時(shí)間。極限編程認(rèn)為盡管加班可能增加產(chǎn)量,但卻無法確保工作質(zhì)量,軟件開發(fā)應(yīng)持續(xù)性 地保持恒定的速度。 (11)現(xiàn)場(chǎng)用戶 在軟件開發(fā)過程中,極限編程要求用戶代表在現(xiàn)場(chǎng)辦公,參與軟件開發(fā)的全過程,確 保軟件開發(fā)人員能夠及時(shí)得到反饋信息。 (12)編碼標(biāo)準(zhǔn) 編碼標(biāo)準(zhǔn)是關(guān)于程序代碼格式的一組約定。在軟件開發(fā)過程中,程序員遵循統(tǒng)一的編碼標(biāo)準(zhǔn),這有助于提高軟件系統(tǒng)的可理解性和可維護(hù)性。編碼標(biāo)準(zhǔn)是支持其它極限編程準(zhǔn)則的重要保證。比如,代碼集體擁有允

36、許每個(gè)軟件開發(fā)人員都可修改每個(gè)模塊的程序代碼, 如果沒有統(tǒng)一的編碼標(biāo)準(zhǔn),這種修改必將導(dǎo)致混亂。 2 測(cè)試驅(qū)動(dòng)開發(fā) 近年來,許多敏捷軟件開發(fā)方法都主張采用一種新的方式來開發(fā)軟件,在該方式中程序員首先依據(jù)待實(shí)現(xiàn)的功能來確定和編寫測(cè)試,然后根據(jù)測(cè)試來編寫程序代碼,該軟件開發(fā)方式被稱為測(cè)試驅(qū)動(dòng)開發(fā)。測(cè)試驅(qū)動(dòng)開發(fā)的支持者認(rèn)為這種軟件開發(fā)方式能夠編寫出更加簡(jiǎn)單、更易于理解和維護(hù)的程序代碼,有助于提高程序代碼的質(zhì)量,而且當(dāng)它與敏捷軟件開發(fā) 方法、極限編程和重構(gòu)技術(shù)等相結(jié)合時(shí),有助于獲得簡(jiǎn)單和健壯的軟件設(shè)計(jì)。 2.1 測(cè)試驅(qū)動(dòng)開發(fā)思想 測(cè)試是軟件開發(fā)過程中的一項(xiàng)重要活動(dòng),是發(fā)現(xiàn)軟件系統(tǒng)中的故障、確保軟件系統(tǒng)質(zhì)

37、量的一條重要途徑。在傳統(tǒng)的軟件工程實(shí)踐中,程序員首先編寫程序代碼,然后再對(duì)程序單元進(jìn)行測(cè)試,此時(shí)的測(cè)試通常稱為單元測(cè)試。經(jīng)過單元測(cè)試后的程序代碼再交給相關(guān)的測(cè)試人 員對(duì)它進(jìn)行集成測(cè)試、確認(rèn)測(cè)試和系統(tǒng)測(cè)試。 傳統(tǒng)的軟件測(cè)試方法往往會(huì)存在以下幾個(gè)方面的問題。 當(dāng)程序員編寫完程序代碼之后,由于進(jìn)度方面的壓力,往往沒有足夠的時(shí)間對(duì)程序 代碼進(jìn)行詳盡和充分的測(cè)試。如果測(cè)試不夠充分,那么程序代碼中就會(huì)遺留許多軟 件故障。 如果測(cè)試人員是基于其它相關(guān)的文檔(而不是程序代碼)來設(shè)計(jì)測(cè)試用例和編寫測(cè) 試代碼,那么當(dāng) 這些文檔與程序代碼不一致時(shí),對(duì)程序代碼進(jìn)行的測(cè)試就會(huì)存在諸 多問題,如設(shè)計(jì)的測(cè)試用例不正確、與程

38、序代碼不一致。 測(cè)試通常是在程序代碼編寫完成之后才進(jìn)行的,因而無法保證編寫程序和軟件測(cè)試 同步進(jìn)行。 對(duì)于許多程序員而言,他們更愿意編寫程序代碼,而不愿測(cè)試程序。因?yàn)榫帉懗绦?是一個(gè)創(chuàng)造和生產(chǎn)的過程,讓他們覺得有成就感;而測(cè)試通常被視為是一件乏味的 工作。 測(cè)試驅(qū)動(dòng)的軟件開發(fā)試圖克服傳統(tǒng)軟件測(cè)試(尤其是單元測(cè)試)存在的上述問題。所謂測(cè)試驅(qū)動(dòng)軟件開發(fā)是指在編寫程序代碼之前,首先確定和編寫好測(cè)試。也就是說,在明確要開發(fā)某個(gè)軟件功能后,程序員首先要思考如何對(duì)這個(gè)功能進(jìn)行測(cè)試,設(shè)計(jì)好相應(yīng)的測(cè)試用例并編寫好相關(guān)的測(cè)試代碼,然后 再編寫與該軟件功能相對(duì)應(yīng)的程序代碼,以運(yùn)行測(cè)試程序來 對(duì)程序代碼進(jìn)行測(cè)試。如

39、此循環(huán)反復(fù),及至實(shí)現(xiàn)軟件系統(tǒng)的全部功能。 測(cè)試驅(qū)動(dòng)開發(fā)的精髓在于:將軟件測(cè)試方案的設(shè)計(jì)工作提前到編寫程序代碼之前;從測(cè)試的角度來驗(yàn)證、分析和指導(dǎo)設(shè)計(jì);同時(shí)將測(cè)試方案當(dāng)作程序編碼的準(zhǔn)繩,有效地利用它來檢驗(yàn)程序編碼的每一個(gè)步驟,及時(shí)發(fā)現(xiàn)其中的問題,實(shí)現(xiàn)軟件開發(fā)的“小步快走”。測(cè)試驅(qū)811 動(dòng)開發(fā)的基本思路就是通過測(cè)試來推動(dòng)整個(gè)軟件系統(tǒng)的開發(fā)。它不純粹是一種測(cè)試技術(shù),而是代表了一種新的軟件開發(fā)方式。與傳統(tǒng)軟件開發(fā)方式相比較,測(cè)試驅(qū)動(dòng)開發(fā)具有以下特點(diǎn)。 根據(jù)測(cè)試來編寫代碼 測(cè)試驅(qū)動(dòng)開發(fā)強(qiáng)調(diào):要首先編寫出用于測(cè)試某項(xiàng)功能是否符合要求的測(cè)試項(xiàng)(包括測(cè)試代碼和測(cè)試用例等),然后再去編寫相應(yīng)的程序代碼來實(shí)現(xiàn)這

40、一功能。因此,它體現(xiàn)了一種 由測(cè)試來驅(qū)動(dòng)軟件開發(fā)的思想。 程序員設(shè)計(jì)并維護(hù)一組測(cè)試,編寫測(cè)試的目的不僅僅是為了測(cè)試程序代碼能否正常 工作,而且被用于定義程序代碼的內(nèi)涵。 在傳統(tǒng)軟件開發(fā)方式中,程序員要編寫和設(shè)計(jì)一組測(cè)試,其目的是要發(fā)現(xiàn)所編寫的程序代碼是否存在軟件故障。在測(cè)試驅(qū)動(dòng)開發(fā)方式中,程序員也要設(shè)計(jì)并維護(hù)一組測(cè)試。但是,程序員編寫該測(cè)試的目的是要將它作為待開發(fā)程序代碼的行為規(guī)約,利用它來引導(dǎo)程序代碼 的編寫,并最終來檢驗(yàn)所編寫的程序代碼是否遵循了該測(cè)試集所定義的行為規(guī)約。 例如,假設(shè)要編寫一個(gè)列表類 List。傳統(tǒng)的做法是先編寫完列表類的所有程序代碼(包 括其所有的屬性和方法),然后設(shè)計(jì)測(cè)

41、試用例和編寫測(cè)試代碼對(duì)它進(jìn)行測(cè)試。在測(cè)試驅(qū)動(dòng)開 發(fā)中,其過程正好相反。程序員首先要確定和設(shè)計(jì)一個(gè)測(cè)試,如空列表的長(zhǎng)度應(yīng)該為 0,并 編寫以下的測(cè)試代碼。 Public void testEmptyList() List emptyList = new List(); assertEquals(“The size of empty list should be 0”, 0, emptyList.size(); 程序員然后將測(cè)試作為列表類的一種行為規(guī)約來指導(dǎo)列表類程序代碼的編寫。根據(jù)上述 測(cè)試用例和測(cè)試代碼的描述,程序員首先要實(shí)現(xiàn)和編寫 List 類的方法 size()。對(duì)于任何空列 表而言,該方

42、法的返回值均為 0。 確保任何程序代碼都是可測(cè)試的 由于在測(cè)試驅(qū)動(dòng)開發(fā)中,程序員首先考慮的是如何測(cè)試軟件系統(tǒng)的功能(即確定和編寫測(cè)試),然后再考慮如何實(shí)現(xiàn)系統(tǒng)的功能(即編寫程序代碼)。因此,測(cè)試驅(qū)動(dòng)開發(fā)可以確保所有的程序代碼都是根據(jù)程序員所設(shè)計(jì)的測(cè)試集來編寫的,所編寫的任何程序代碼都是可測(cè) 試的。這有助于有效地發(fā)現(xiàn)程序代碼中的故障、提高軟件系統(tǒng)的質(zhì)量。 從本質(zhì)上看,測(cè)試驅(qū)動(dòng)開發(fā)的目標(biāo)是讓所編寫的程序代碼奏效(Work)和 潔凈( Clean), 即所謂的“Clean Code that Works”。所謂的奏效是指所編寫的程序代碼實(shí)現(xiàn)了軟件系統(tǒng)的功 能并通過了相應(yīng)的測(cè)試。所謂的潔凈是指軟件系統(tǒng)

43、的所有程序代碼均是按照測(cè)試驅(qū)動(dòng)的方式 來開發(fā)的,沒有無關(guān)的程序代碼。 一般的,測(cè)試驅(qū)動(dòng)開發(fā)應(yīng)遵循以下一組原則。(1)測(cè)試隔離,不同代碼的測(cè)試應(yīng)該相互 隔離。對(duì)某一代碼的測(cè)試只考慮此代碼本身,不要考慮其它的代碼細(xì)節(jié)。(2)任務(wù)聚焦,在 測(cè)試驅(qū)動(dòng)開發(fā)過程中,程序員往往需要實(shí)施多種不同形式的工作并進(jìn)行多次的迭代,比如設(shè)計(jì)測(cè)試用例、編寫測(cè)試代碼、編寫程序代碼、對(duì)代碼進(jìn)行重構(gòu)、運(yùn)行測(cè)試等等。在此情況下,程序員應(yīng)將注意力集中在當(dāng)前工作(即當(dāng)前欲完成的軟件功能),而不要考慮其它方面的內(nèi)容,無謂地增加工作的復(fù)雜度。(3)循序漸進(jìn),一個(gè)軟件模塊的功能很多,程序員應(yīng)該針對(duì) 軟件模塊的功能,設(shè)計(jì)相應(yīng)的測(cè)試,并形成測(cè)

44、試列表。然后根據(jù)測(cè)試列表不斷地完成相應(yīng)的測(cè)試用例、測(cè)試代碼和功能代碼,逐步完成整個(gè)軟件模塊的功能。這種循序漸進(jìn)的做法可以 防止疏漏,避免干擾其它工作。(4)測(cè)試驅(qū)動(dòng),要實(shí)現(xiàn)某個(gè)功能、編寫某個(gè)類,程序員首先 應(yīng)編寫相應(yīng)的測(cè)試代碼和設(shè)計(jì)相應(yīng)的測(cè)試用例,然后在此基礎(chǔ)上編寫程序代碼。(5)先寫斷 言,在編寫測(cè)試代碼時(shí),程序員應(yīng)首先編寫對(duì)功能代碼進(jìn)行判斷的斷言語句,然后再編寫相 應(yīng)的輔助語句。(6)及時(shí)重構(gòu),程序員在編碼和測(cè)試過程中應(yīng)對(duì)那些結(jié)構(gòu)不合理、重復(fù)的程 序代碼進(jìn)行重構(gòu),以獲得更好的軟件結(jié)構(gòu),消除冗余代碼。 與傳統(tǒng)的軟件編碼和測(cè)試方式相比較,測(cè)試驅(qū)動(dòng)開發(fā)具有以下的一組優(yōu)點(diǎn)。(1)編碼完 成后即完工

45、,在程序代碼編寫完成并通過測(cè)試之后,意味著編碼任務(wù)的完成。而在傳統(tǒng)的方 式中,由于編碼完成之后需要進(jìn)行單元測(cè)試,因而很難知道什么時(shí)候編碼任務(wù)結(jié)束。(2)易 于維護(hù),軟件系統(tǒng)與詳盡的測(cè)試集一起發(fā)布,有助于將來對(duì)程序進(jìn)行修改和擴(kuò)展,并且在開 發(fā)過程中及時(shí)對(duì)程序代碼進(jìn)行重構(gòu),提高了軟件系統(tǒng)的可維護(hù)性。(3)質(zhì)量保證,由于任何 程序代碼都經(jīng)過了測(cè)試,因而有助于有效發(fā)現(xiàn)程序代碼中的錯(cuò)誤,提高軟件系統(tǒng)的質(zhì)量。 2.2 支持測(cè)試驅(qū)動(dòng)開發(fā)的軟件工具 至今人們已經(jīng)開發(fā)了許多可支持測(cè)試驅(qū)動(dòng)開發(fā)的軟件工具,包括 cppUnit、csUnit、CUnit、 DUnit、DBUnit、JUnit、NDbUnit、OUn

46、it、PHPUnit、PyUnit、NUnit、VBUnit 等等。本節(jié) 介紹用 Java 進(jìn)行測(cè)試驅(qū)動(dòng)開發(fā)所使用的標(biāo)準(zhǔn)工具 JUnit,下節(jié)將詳細(xì)分析如何利用 JUnit 來 支持測(cè)試驅(qū)動(dòng)開發(fā)。 JUnit 是一個(gè)由 Erich Gamma 和 Kent Beck 二人共同開發(fā)的開源 Java 單元測(cè)試框架。 JUnit 框架提供了一組類來支持單元測(cè)試。通過繼承重用這些類,程序員可以方便的編寫測(cè) 試程序代碼,運(yùn)行測(cè)試程序以發(fā)現(xiàn)程序代碼中的故障。 JUnit 的主要類結(jié)構(gòu)如圖 1 所示。 Test 這是一個(gè)接口,所有測(cè)試類(包括 TestCase 和 TestSuite)必須實(shí)現(xiàn)該接口。Tes

47、t 提供了 兩個(gè)方法:countTestCases 方法用于計(jì)算一個(gè)測(cè)試將要運(yùn)行的測(cè)試用例的數(shù)目;run 方法用于 運(yùn)行一個(gè)測(cè)試并收集它的測(cè)試結(jié)果。 Assert 該類定義了軟件測(cè)試時(shí)要用到的各種方法。例如 assertEquals 方法用于判斷程序代碼的 運(yùn)行結(jié)果是否等同于預(yù)期結(jié)果;assertNull 和 assertNotNull 方法用于判斷對(duì)象是否為空等等。 TestCase TestCase 類實(shí)現(xiàn)了 Test 接口并繼承了 Assert 類,它是程序員在編寫測(cè)試程序時(shí)必須擴(kuò)展 的類。通過繼承,程序員可以方便的利用該類提供的方法對(duì)程序單元進(jìn)行測(cè)試。 TestSuite TestSu

48、ite 類實(shí)現(xiàn)了 Test 接口并提供了諸多方法來支持測(cè)試,當(dāng)程序員試圖將多個(gè)測(cè)試813 集中在一起進(jìn)行測(cè)試時(shí)必須擴(kuò)展該類。 junit.framework.Assert +assertEquals: void +assertNotNull: void +assertNull: void +assertSame: void +assertNotSame: void +fail: void +failNotEquals: void +failNotSame: void +failSame: void junit.framework.TestSuite +addTest: void +addTes

49、tSuite: void +countTestCases: int +run: void +runTest: void junit.framework.Test +countTestCase: int +run: void junit.framework.TestCase +countTestCase: int +run: void 圖 1. Junit 的主要類結(jié)構(gòu) 目前許多軟件開發(fā)工具和環(huán)境(如 Eclipse)集成了 JUnit 以支持軟件測(cè)試。下面通過一 個(gè)簡(jiǎn)單的例子,說明如何通過重用 JUnit 提供的上述類以及 JUnit 的圖形化界面來進(jìn)行單元 測(cè)試以發(fā)現(xiàn)程序代碼中的錯(cuò)誤。在該例

50、子中,程序員要編寫一個(gè)簡(jiǎn)單的計(jì)算器,它具有加法 和減法的兩個(gè)功能。該計(jì)算器的 Java 程序代碼如圖 2 所示。 public class Calculator public int add (int augend, int addend) return augend + addend; public int subtraction (int minuend, int subtrahend) return minuend - subtrahend ; 圖 2. 實(shí)現(xiàn)計(jì)算器的程序代碼類 Calculator.java 將上述程序代碼保存在 Calculator.java 的文件中,運(yùn)行 java

51、c Calculator.java 將該源程序代碼編譯為 Java 中間代碼 Calculator.class。根據(jù)上述代碼實(shí)現(xiàn)的功能,下面利用 JUnit 提供 的測(cè)試類 TestCase 編寫測(cè)試程序并設(shè)計(jì)相應(yīng)的測(cè)試用例。 import junit.framework.TestCase; public class TestSample extends TestCase public void testAdd() Calculator cal= new Calculator(); int result = cal.add(15 , 20); assertEquals(35, result);

52、 public void testSubtration() Calculator cal = new Calculator(); int result = cal.subtration(20, 15); assertEquals(5 , result); 圖 3. 對(duì) Calculator.java 進(jìn)行測(cè)試的程序代碼類 TestSample 上述測(cè)試程序的第一行代碼表示要 import JUnit 提供的 Java 類 TestCase。第 2 行程序定 義了一個(gè)測(cè)試類 TestSample 來對(duì) Calculator 類進(jìn)行測(cè)試,該類繼承了 TestCase 類。類 TestSample

53、有兩個(gè)方法 testAdd 和 testSubstration,分別用于測(cè)試計(jì)算器的加法和減法功能。 在這兩個(gè)方法中均有一個(gè)語句 assertEquals,用于判斷該語句中的兩個(gè)參數(shù)是否相等的。如 果相等則意味著通過對(duì)該功能的測(cè)試,否則測(cè)試不通過。 運(yùn)行 javac TestSample.java 以將該測(cè)試程序編譯為 Java 中間碼 TestSample.class,然后 輸 入 java junit.swingui.TestRunner TestSample 運(yùn)行 Junit 以測(cè)試 TestSample 類。 JUnit 將彈出 一個(gè)如圖 4 所示的窗口。該窗口下部的編輯框顯示了測(cè)試的

54、結(jié)果以及經(jīng)測(cè)試后發(fā)現(xiàn)的錯(cuò)誤和失敗信息,上部的測(cè)試狀態(tài)框用不同的顏色來表示測(cè)試是否通過。如果狀態(tài)框的顏色是綠色,說明測(cè)試通過,沒有錯(cuò)誤產(chǎn)生;如果是紅色的,則說明測(cè)試失敗,程序代碼中存在故障。 815 圖 4. JUnit 的圖形化界面 需要注意的是,按照 JUnit 的規(guī)定所有測(cè)試類必須繼承 junit.framework.TestCase 類;測(cè) 試類中的每個(gè)測(cè)試方法必須以 test 文字開頭,且是 public void 而且不能有參數(shù);在測(cè)試方 法中使用 assertEquals 等 TestCase 類所提供的斷言方法來判斷待測(cè)試程序的運(yùn)行結(jié)果是否與 預(yù)期的結(jié)果相一致。 如果想成批地運(yùn)行

55、測(cè)試用例,程序員必須利用JUnit所提供的addTestSuite方法。TestSuite 可以把一組測(cè)試集中在一起,并作為一個(gè)整體來運(yùn)行。在下面的程序代碼中,程序員首先創(chuàng) 建了一個(gè) TestSuite 對(duì)象,然后利用 TestSuite 提供的方法 addTestSuite 將測(cè)試類 TestSample.class 加入到測(cè)試集中。 816 import junit.framework.Test; import junit.framework.TestSuite; public class TestAll public static Test suite() TestSuite suite

56、 = new TestSuite("TestSuite Test"); suite.addTestSuite( TestSample.class); return suite; 圖 5. 成批測(cè)試的代碼實(shí)例 從總體上看,JUnit 具有以下特點(diǎn):(1)提供了一組 API,支持程序員編寫可重用的測(cè) 試代碼;(2)提供了多種方式(文本或者圖形界面)來顯示測(cè)試結(jié)果;(3)提供了單元測(cè)試 用例成批運(yùn)行的功能;(4)超輕量級(jí)而且使用簡(jiǎn)單;(5)整個(gè)框架設(shè)計(jì)良好,易于擴(kuò)展 。 2.3 測(cè)試驅(qū)動(dòng)開發(fā)過程 測(cè)試驅(qū)動(dòng)開發(fā)的思想非常樸素和簡(jiǎn)單,就是根據(jù)要實(shí)現(xiàn)的功能編寫測(cè)試,然后根據(jù)測(cè)試 來編寫

57、程序代碼,最后運(yùn)行程序代碼以通過測(cè)試。整個(gè)測(cè)試驅(qū)動(dòng)開發(fā)的過程如圖 6 所示。 選擇待開發(fā)的功能 編寫測(cè)試程序 編譯測(cè)試程序 完善和 修改代碼 運(yùn)行測(cè)試程序 重構(gòu)代碼運(yùn)行測(cè)試 沒通過 通過 修改代碼 沒通過 通過 通過 修改和優(yōu)化代碼 沒通過 圖 6. 測(cè)試驅(qū)動(dòng)開發(fā)過程 本節(jié)通過一個(gè)簡(jiǎn)單的案例分析來介紹測(cè)試驅(qū)動(dòng)開發(fā)的過程。該案例將開發(fā)一個(gè)機(jī)票查詢的功能模塊,它能夠幫助用戶查詢航班信息并將查詢的結(jié)果放置在一個(gè)航班列表中。因此,航班列表大致具有以下的功能:存放所查詢的航班信息;可以從航班列表中取出一個(gè)或者多個(gè)航班信息;計(jì)算航班信息列表的長(zhǎng)度等等。 步驟 1. 選擇待開發(fā)的功能 測(cè)試驅(qū)動(dòng)開發(fā)是一個(gè)迭代的過程。每一次迭代實(shí)現(xiàn)一個(gè)相對(duì)單一和獨(dú)立的功能。因此,在每次迭代開始之時(shí),程序員首先要選擇本次迭代欲實(shí)現(xiàn)的功能,并根據(jù)該功能設(shè)計(jì)相應(yīng)的測(cè)試用例。對(duì)系統(tǒng)功能的選擇應(yīng)遵循先簡(jiǎn)后繁的原則。針對(duì)航班信息列表的案例,程序員可以考慮先實(shí)現(xiàn)空列表,并根據(jù)這一功能設(shè)計(jì)測(cè)試用例,即當(dāng)一個(gè)航班列表剛被創(chuàng)建時(shí),它應(yīng) 該是一個(gè)空列表,列表中元素的個(gè)數(shù)應(yīng)該為 0。 步驟 2. 編寫測(cè)試程序 根據(jù)所選擇的功能以及針對(duì)該功能所設(shè)計(jì)的測(cè)試用例,編寫相應(yīng)的測(cè)試程序代碼

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論