第1部分引言與系統工程。這部分由前3章構成,它提供了觀察軟件生命周期行為的視角。尤其是,它覆蓋了軟件過程模型、方法學的概念、過程與方法的區別以及系統工程。
第2部分分析和體系結構設計。這部分介紹了計劃階段的行為,包括需求提取、領域建模和架構設計。
第3部分交互式系統的建模和設計。這部分主要處理建模與交互系統設計問題,共包括6章。這6章介紹了如何根據需求識別出用例、如何對參與者系統交互以及對象交互行為進行建模和設計、如何應用職責分配模式、如何得到作為設計藍本的設計類框圖,以及如何設計用戶交互界面。
第4部分其他類型系統的建模和設計。這部分包括3章,每章介紹一種類型系統的建模與設計。具體來說,第13章介紹事件驅動系統的建模與設計;第14章介紹遷移系統的建模與設計;第15章介紹基于業務規則的系統的建模與設計。
第5部分應用情景特定模式。這部分由兩章構成,主要介紹如何應用情景特定模式。其中使用了一個案例分析,即狀態圖編輯器的設計來幫助理解這個過程。
第6部分實現和質量保證。這部分包括3章,包括實現時要考慮的問題、軟件質量保證的概念和行為以及軟件測試。
第7部分維護和配置管理。這部分包括兩章,內容覆蓋了軟件維護與軟件配置管理。
第8部分項目管理和軟件安全。本書的*后一部分由兩章構成,一章介紹軟件項目管理,另一章介紹軟件安全,包括涉及安全軟件系統的建模與設計的生命周期行為。
本書介紹了建模與設計、UML、模式、基于測試的軟件開發、質量保證、配置管理、全生命周期的敏捷原理。作者講述步驟清晰,深入淺出,在理論介紹過程中提供了大量實例,便于讀者理解、實踐。內容包含過去十年間軟件工程發展的很多方面,既有在美國以及全球的大學和公司里講授的課程,也有行業內外軟件工程項目的應用素材。從面向對象方法學出發,對軟件工程進行重新演繹,全面、系統、清晰地介紹了面向對象軟件工程的基本概念、原理、方法和工具,通過實例說明了面向對象軟件開發的整個過程,是一部值得推薦的經典之作。
譯者序計算機已經滲透到社會生活的方方面面。計算機之所以能夠被廣泛使用,其背后的推動力就是市場經濟。但是,實際上是軟件在指揮著計算機按照人們想要的方式在工作。軟件或者說計算機程序由成千上萬條指令構成,這些指令指揮著計算機進行復雜的運算并且控制計算機硬件設備的運行。近些年對于計算機軟件的需求快速增長。為了能夠滿足軟件開發工程師或系統分析師的工作需求,學習軟件工程的相關知識是非常必要的。軟件工程關注三個環節(軟件開發過程、軟件質量保證和軟件項目管理)的行為,這些行為貫穿于軟件生命周期中,并同時發生;而面向對象的軟件工程(objectoriented software engineering, OOSE)是軟件工程的一個專門學科。OOSE將世界和各種系統看作是由相互聯系和相互作用的對象構成。在20世紀80年代,C 的迅速傳播激起了對引導OO軟件開發工作的開發方法的需求。提出了三個有影響的、在軟件業內被廣泛使用的OO軟件開發方法,即Booch框圖、對象建模技術(Object Modeling Technique, OMT)和用例工程。業界很快發現使用不同的方法將設計和實現的系統集成起來是一個非常大的挑戰,原因就是不同的方法使用不同的建模概念和標記。為了解決這個問題,對象管理組織(Object Management Group, OMG)采用統一建模語言(Unified Modeling Language, UML)作為OMG標準。UML是一個框圖的集合,這些框圖用于給一個OO系統的方方面面進行建模和設計。UML框圖用于需求分析階段來幫助開發團隊理解線性系統的業務流程,也作為設計說明的一部分用于設計階段。本書大量展示了UML框圖。感謝德克薩斯大學阿靈頓分校的David C. Kung先生。敏捷過程、設計模式以及測試驅動的開發(testdriven development, TDD)激發了他寫本書的巨大興趣。敏捷過程強調團隊合作、為改變而設計、對軟件系統的每個小增量進行快速部署,以及與客戶和用戶共同開發。設計模式是對常見設計問題的有效解決方案,設計模式促進了軟件重用并增進了團隊溝通。總之,本文主要關注將UML、設計模式、OO軟件測試、TDD集成起來的敏捷統一方法學。軟件是你的作品,需要用心血去創作。我們可以用編程語言來準確反映我們的思想,我們應該做得更好,也可以做得更好。只要遵循科學的方法學,一定可以創作出好的軟件作品。本書由邢穎翻譯,牟永敏統稿。由于譯者水平有限,譯文中的不當之處在所難免,真誠希望廣大讀者和同行不吝賜教,我們將不勝感激。
譯者2016年11月面向對象軟件工程序言序言背景計算機被廣泛應用于人類社會的方方面面,它與基于其運行的應用軟件一起發揮了很多不同的作用。因此,軟件工程師的崗位需求也在井噴式增長。2006年3月的Money雜志將軟件工程師評為美國最好的50個工作崗位的第一名。根據美國勞工統計局(Bureau of Labor Statistics, BLS)20102020預測,應用程序開發工程師崗位將從520 800增長到664 500(27.6%),而系統分析師的崗位將從544 400增長到664 800(22.1%)。為了能夠滿足對應用程序開發工程師或系統分析師的要求,接受軟件工程方面的教育是非常有必要的。但是根據BLS發布的數據,2006年在軟件工程領域只授予了160個學士學位和600個碩士學位,而在計算機科學領域則授予了10 289個學士學位和4512個碩士學位。因此,在軟件工程人才的需求和供給之間有巨大的鴻溝,尤其是研究生。很多人都不清楚軟件工程的研究范圍以及它到底有什么用途,這門學科也經常被誤解。許多媒體似乎將軟件工程定義為寫Java程序。有的學生認為軟件工程包括與軟件相關的一切。另外一些人則認為軟件工程就是畫UML框圖,這個我們后面會提到。多年前,在第一節面向對象的軟件工程(objectoriented software engineering, OOSE)課后,一位學生對我說: 教授,你應該知道這門課對于我來說很容易,因為我們以前都畫過太多的UML圖了。學期末,那個學生又來找我,他說: 教授,我想說我們很努力地學習,但我們學的是OO設計。這門課并不是我想象的畫UML圖。所以到底什么是軟件工程呢?作為一門學科,它包含為了明顯提高軟件的生產率和質量,同時降低成本和投放到市場的時間所需的工程過程、方法、質量保證和項目管理研究、教育及應用。OOSE是軟件工程的一個分支,其特點是將世界和系統看成是相關聯系和相互作用的獨特視角。20世紀80年代C 語言的出現標志著OOSE時代的到來。從那時起,軟件產品開始了其前所未有的世界范圍的增長,并因統一建模語言(unified modeling language, UML)和統一過程(unified process, UP)的產生以及世界范圍的應用而進一步加速增長。嚴格來說,軟件過程描述了一些階段以及在各個階段應該做什么。它不會(詳細)定義在每個階段如何實施各種行為。類似UML這樣的建模語言會定義用于交流和記錄分析及設計思路的標記、語法和語義。UML和UP都很好,也很必需,但是還不夠。這是因為還沒有介紹如何產生畫UML圖的分析和設計思路。動機為了填補上文提到的鴻溝,我們需要一個方法學,或者稱之為食譜。與過程不同,方法學是對于一些步驟的詳細描述,或者是如何實施一些行為使得初學者也可以學習從而生成并部署所需的軟件系統。沒有方法學,一名剛入門的軟件工程師可能會花費數年在職的訓練才能學會OO設計、實現和測試技巧。寫本書的動機也包括作者被敏捷過程、設計模式以及測試驅動的開發(testdriven development, TDD)所激發的巨大興趣。敏捷過程強調團隊合作、為改變而設計、對軟件系統的每個小增量進行快速部署,以及與客戶和用戶共同開發。設計模式是對常見設計問題的有效解決方案。設計模式促進了軟件重用并增進了團隊溝通。TDD鼓勵可測試的軟件,并需要在軟件實現前產生測試腳本從而使得軟件可以立刻被測試,經常被測試。這類似開發一個游樂場的思路。整個過程包括如下階段: 計劃、公共支持、分析設計、籌措資金、畫施工圖紙、施工、采購設備、安裝設備、試運行、剪彩。但是,光了解整個過程是不夠的。開發團隊必須知道如何實施各階段的行為。例如,計劃行為包括產生初步概念、可行性分析、總體規劃。主題公園團隊必須知道如何實施這些行為。分析設計行為包括從利益相關者那里獲取需求、實地調查、公園布局設計、公園不同區域主題設計、建模從而研究布局設計和主題、進行總體規劃。與描述不同階段行為的過程不同,一套方法學詳細描述了一些步驟,或者是如何實施這些行為。游樂場的開發是一個數年的項目,且花費達數十億美元。投資者希望公園越早產生收益越好,但是如果按照上述方法開發,投資者必須一直等到公園完工。由于傳統過程所施加的約束,總體規劃一旦結束就不能被輕易修改。而一旦公園完工,如果公園不能滿足利益相關者的期待,則其改變的代價很大。敏捷開發旨在解決這些問題。使用敏捷開發,主題公園初步需求被迅速獲取,并允許在開發過程中進行演化。然后從中提取出游樂和娛樂設施的需求,并將其認真歸類。生成計劃來在相對短的時期內開發和部署這些分類設施,即小增量的快速部署。因此,不同于一刀切的總體規劃,開發過程每次只設計和部署一類設施。在這些設施部署好并投入運營后,就尋求反饋,并與利益相關者制訂出關于開發計劃、預算和時間表的需求變化,即聯合開發。另外,應用架構設計模式來提高公園對改變的適應能力和質量,也即為改變而設計。強調團隊合作是因為團隊之間以及團隊成員之間有效的協作能夠確保這些設施按時無縫地開發和部署。敏捷過程有一些優點: 投資者能較早獲得收益,因為這些設施能按照計劃投入運營而且是可行的;由于少量的設施是同時開發和部署的,可以容易改正錯誤并進行改變。總之,本文主要關注將UML、設計模式、OO軟件測試、TDD集成起來的敏捷統一方法學。本書中的方法學叫做統一方法學,因為它使用UML作為建模語言并遵循敏捷統一過程。當然這并不意味著對于所有項目都將其他方法統一起來或被當成一個統一方法使用。讀者本書的讀者為計算機科學或軟件工程的學生,以及軟件開發的專門人士。本書尤其適合作為高年級本科生的基礎教材,以及研究生課程和IT業專業培訓課程的入門教材。本書包含過去十年間的很多內容,既有在美國以及全球的大學和公司里講授的課程,也有行業內外軟件工程項目的應用素材。這些素材讓我能夠近距離觀察學生和軟件工程師如何應用UP、UML、設計模式和TDD,以及他們所面對的困難。他們的反饋讓我能夠持續更新本書的內容。組織本書有24章,被分為以下8個部分:第1部分引言與系統工程。這部分由前3章構成,它提供了觀察軟件生命周期行為的視角。尤其是,它覆蓋了軟件過程模型、方法學的概念、過程與方法的區別以及系統工程。第2部分分析和體系結構設計。這部分介紹了計劃階段的行為,包括需求提取、領域建模和架構設計。第3部分交互式系統的建模和設計。這部分主要處理建模與交互系統設計問題,共包括6章。這6章介紹了如何根據需求識別出用例、如何對參與者系統交互以及對象交互行為進行建模和設計、如何應用職責分配模式、如何得到作為設計藍本的設計類框圖,以及如何設計用戶交互界面。第4部分其他類型系統的建模和設計。這部分包括3章,每章介紹一種類型系統的建模與設計。具體來說,第13章介紹事件驅動系統的建模與設計;第14章介紹遷移系統的建模與設計;第15章介紹基于業務規則的系統的建模與設計。第5部分應用情景特定模式。這部分由兩章構成,主要介紹如何應用情景特定模式。其中使用了一個案例分析,即狀態圖編輯器的設計來幫助理解這個過程。第6部分實現和質量保證。這部分包括3章,包括實現時要考慮的問題、軟件質量保證的概念和行為以及軟件測試。第7部分維護和配置管理。這部分包括兩章,內容覆蓋了軟件維護與軟件配置管理。第8部分項目管理和軟件安全。本書的最后一部分由兩章構成,一章介紹軟件項目管理,另一章介紹軟件安全,包括涉及安全軟件系統的建模與設計的生命周期行為。本書素材可以滿足若干軟件工程課程的需求,例如:1. 第1~3部分與第6~8部分的一些主題對于面向對象的軟件工程(OOSE)或軟件工程課程的入門,都是一個很好的組合。既可以作為大學本科的課程,也可以作為入門的研究生課程。2. 第2部分和第5部分以及其他部分的部分章節可以構成軟件設計模式的課程。建議將上述OOSE課程作為這門課的先修課。但是可能有些國外的學生沒學過OOSE這門課,在這種情況下,建議先使用2~4周的時間大概了解一下第2和第3部分介紹的方法,因為這些方法為應用模式提供了框架。3. 第6和第7這兩部分可以以很多種方式講授。它們可以形成一門課質量保證、測試和維護。也可以當成兩門課來教,分別是軟件質量保證,以及軟件測試和維護。當然也可以作為三門課來教,分別是軟件質量保證、軟件測試和軟件維護。4. 第13~15章和第19~20章以及其他章的部分模式可以形成關于建模、設計、復雜系統的驗證與確認這門課。5. 第1和第6~8這幾部分以及其他部分的部分章節可以形成軟件項目管理這門課。6. 最后,第1部分和第2部分以及第24章加上其他章節的部分模式和主題可以構成軟件安全概論這門課程。教員可以增加素材使得課程內容更加豐富。在網站http://www.mhhe.com/kung上可以找到教學輔助素材,包括PowerPoint教學幻燈片、隨堂測試題和測試生成軟件、測試問題的數據庫、課程描述及要點、實驗手冊,以及軟件工具。尤其對于沒上過這門課的新教師來說,這些教學工具可以幫助減少備課的時間和工作量。致謝我想感謝我的眾多學生,他們的提問、反饋、熱情,以及將課程內容應用于實際項目的努力都在不斷激勵我。學生們也閱讀和使用本書以及教學素材。他們提供給我寶貴的反饋和改進的建議。有些人實地參加到了本書中某些方法的設計和實現中。有些人參加到了評估本書方法效果的實驗中。很多人畢業后繼續將本書方法應用于行業內,并和我分享他們的寶貴經歷。我想感謝我的女兒Jacquelyn Kung幫我編輯草稿的部分章節。感謝McGrawHill環球出版社的工程和計算機科學部的Raghu Srinivasan提供給我寶貴的改進建議和對出版流程的指導。感謝評論家們提出的意見和建議。這些意見和建議對于本書的結構組織、內容顯示以及很多方面都有極大的幫助。在漫長的寫作過程中,我的妻子Cindy Kung和很多學術界及業內的同事都給予我持續的鼓勵和無私的幫助,在此也對他們表示感謝。
都志輝2012年8月于清華園
目錄
第1部分引言與系統工程
第1章引言3
1.1什么是軟件工程3
1.2為什么要用軟件工程4
1.3軟件生命周期行為5
1.3.1軟件開發過程5
1.3.2軟件質量保證8
1.3.3軟件項目管理9
1.4面向對象的軟件工程10
1.4.1面向對象的建模和設計
語言10
1.4.2面向對象的開發
過程10
1.4.3面向對象的開發
方法11
1.4.4OO會取代傳統的
方法嗎11
1.5軟件工程和計算機科學11
小結12
深入閱讀12
章節復習問題13
練習13
第2章軟件過程和方法14
2.1系統開發的挑戰14
2.2軟件過程15
2.3瀑布模型的優勢和問題16
2.4軟件開發是一個險惡問題16
2.5軟件過程模型17
2.5.1原型過程18
2.5.2演化過程18
2.5.3螺旋模型18
2.5.4統一過程19
2.5.5個人軟件過程20
2.5.6團隊軟件過程24
2.5.7敏捷過程26
2.6軟件開發方法30
2.6.1過程和方法的區別30
2.6.2方法的好處31
2.6.3結構化方法32
2.6.4經典的面向對象
方法32
2.7敏捷方法32
2.7.1動態系統開發
方法(DSDM)34
2.7.2Scrum35
2.7.3特征驅動的開發35
2.7.4極限編程36
2.7.5敏捷還是計劃驅動36
2.8本書中的過程和方法一覽37
小結41
深入閱讀41
章節復習問題42
練習42
第3章系統工程43
3.1什么是系統43
3.2什么是系統工程44
3.3系統需求定義47
3.3.1識別業務需求47
3.3.2定義系統需求48
3.4系統結構設計48
3.4.1系統分解49
3.4.2需求分配51
3.4.3結構設計圖52
3.4.4子系統功能和接口規
格說明55
3.5子系統開發56
3.5.1面向對象的上下文圖56
3.5.2面向對象的上下文圖
的用途57
3.5.3工程團隊的協作58
3.6系統集成、測試和部署58
3.7系統配置管理58
小結60
深入閱讀60
章節復習問題60
練習60
第2部分分析和體系結構設計
第4章獲取軟件需求65
4.1什么是需求獲取65
4.2獲取需求的重要性67
4.3獲取需求的挑戰67
4.4需求的類型68
4.5獲取需求的步驟69
4.5.1收集信息70
4.5.2構建分析模型73
4.5.3獲取需求和約束74
4.5.4需求規格標準77
4.5.5進行可行性研究77
4.5.6審查需求規格說
明書77
4.6應用敏捷原則79
4.7需求管理和工具80
小結81
深入閱讀81
章節復習問題81
練習82
第5章領域建模84
5.1什么是領域建模84
5.2為什么要進行領域建模85
5.3面向對象和類圖85
5.3.1外延定義和意向
定義85
5.3.2類和對象86
5.3.3對象和屬性87
5.3.4關聯88
5.3.5多重性和角色89
5.3.6聚合90
5.3.7繼承90
5.3.8繼承和多態91
5.3.9關聯類91
5.4領域建模的步驟93
5.4.1收集應用領域信息94
5.4.2頭腦風暴94
5.4.3對頭腦風暴結果
分類95
5.4.4領域模型可視化98
5.4.5領域建模審查
清單102
5.5綜合103
5.6領域建模的方針105
5.7應用敏捷原則106
5.8領域建模的工具支持107
小結108
深入閱讀109
章節復習問題109
練習109
第6章架構設計111
6.1什么是架構設計111
6.2架構設計的重要性112
6.3架構設計過程112
6.3.1確定架構設計
目標113
6.3.2確定系統類型114
6.3.3應用架構樣式117
6.3.4進行定制的架構
設計124
6.3.5明確子系統功能和
接口124
6.3.6審查架構設計125
6.4架構樣式和包圖125
6.5應用軟件設計準則126
6.5.1什么是軟件設計
準則127
6.5.2為改變而設計127
6.5.3關注點分離128
6.5.4信息隱藏129
6.5.5高內聚129
6.5.6低耦合129
6.5.7保持簡單和直接130
6.6架構設計的方針131
6.7架構設計和設計模式131
6.8應用敏捷原則132
小結132
深入閱讀132
章節復習問題133
練習133
第3部分交互式系統的建模和設計
第7章從需求獲取用例137
7.1什么是參與者137
7.2什么是用例138
7.3業務過程、操作和活動138
7.4從需求獲取用例的步驟140
7.4.1識別用例140
7.4.2明確用例范圍146
7.4.3用例上下文可
視化147
7.4.4檢查用例規約151
7.4.5將用例分配給
迭代152
7.5導出用例的方針153
7.6應用敏捷原則155
7.7用例建模的工具支持155
小結157
深入閱讀157
章節復習問題157
練習158
第8章參與者系統交互建模159
8.1什么是參與者系統交互
建模159
8.2參與者系統交互建模的
重要性160
8.3參與者系統交互建模的
步驟160
8.3.1初始化一個兩列
的表161
8.3.2明確參與者系統交互
的步驟161
8.3.3檢查參與者系統交互
規約161
8.4明確可替換的流162
8.5使用用戶界面原型163
8.6不要顯示異常處理166
8.7用例的先決條件和后置
條件166
8.8包含其他用例167
8.9用其他用例繼續167
8.10常見問題168
8.11應用敏捷原則170
小結170
深入閱讀171
章節復習問題171
練習171
第9章對象交互建模172
9.1什么是對象交互建模172
9.2UML順序圖173
9.2.1概念和表示法173
9.2.2展示類的實例173
9.2.3順序圖說明174
9.2.4順序圖用于分析和
設計176
9.2.5正確使用表示
方法178
9.3對象交互建模的步驟179
9.3.1收集業務過程的
信息180
9.3.2識別非普通步驟180
9.3.3為非普通步驟書寫
場景181
9.3.4構建場景表183
9.3.5怎么寫場景183
9.3.6從場景表得到順
序圖188
9.3.7對象交互建模檢查
清單194
9.4應用敏捷原則195
9.5對象交互建模的工具支持197
小結197
深入閱讀197
章節復習問題197
練習198
第10章應用職責分配模式199
10.1什么是設計模式199
10.2為什么要用設計模式200
10.3情景特定模式和職責分配
模式200
10.4模式規約201
10.5控制器模式202
10.5.1激勵示例202
10.5.2什么是控制器204
10.5.3應用控制器
模式204
10.5.4控制器的類型206
10.5.5跟蹤記錄用例
狀態 206
10.5.6臃腫的控制器207
10.5.7比較不同的
設計208
10.5.8何時應用控制器
模式209
10.5.9使用控制器的
方針210
10.6專家模式210
10.6.1信息專家210
10.6.2應用專家模式211
10.6.3包含不止一個對象
的專家模式212
10.6.4何時應用專家
模式213
10.6.5使用專家模式的
方針213
10.7創建者模式213
10.7.1什么是創建者213
10.7.2應用創建者
模式214
10.7.3創建者模式的
優勢215
10.7.4何時應用創建者
模式215
小結216
深入閱讀216
章節復習問題216
練習217
第11章獲取設計類圖219
11.1什么是設計類圖220
11.2設計類圖的用途220
11.3獲取設計類圖的步驟221
11.3.1識別類221
11.3.2識別方法222
11.3.3識別屬性224
11.3.4類之間的關系226
11.3.5識別關系226
11.3.6設計類圖檢查
清單228
11.4用包圖組織類228
11.5應用敏捷原則230
11.6設計類圖的工具支持231
小結231
深入閱讀231
章節復習問題231
練習231
第12章用戶接口設計232
12.1什么是用戶接口設計232
12.2用戶接口設計為什么
重要233
12.3圖形用戶接口組件234
12.3.1容器組件235
12.3.2輸入、輸出和信息
展示組件235
12.3.3使用GUI組件的
方針237
12.4用戶接口設計過程237
12.4.1案例研究: 為狀態
圖編輯器設計用戶
接口238
12.4.2識別系統主要顯示
方式238
12.4.3生成布局設計
草圖240
12.4.4明確交互行為242
12.4.5構建原型242
12.4.6用戶評估用戶接口
設計243
12.4.7用戶接口設計檢查
清單244
12.5設計用戶支持功能245
12.6用戶接口設計的方針245
12.7應用敏捷原則247
12.8用戶接口設計的工具
支持247
小結248
深入閱讀248
章節復習問題248
練習249
第4部分其他類型系統的建模和設計
第13章事件驅動系統的對象狀態
建模253
13.1什么是對象狀態建模253
13.2為什么要進行對象狀態
建模254
13.3基本定義254
13.4對象狀態建模的步驟255
13.4.1收集和分類狀態
行為信息256
13.4.2構建領域模型來
展示上下文258
13.4.3構建狀態遷移表260
13.4.4狀態遷移表的
用途261
13.4.5將狀態遷移表轉換
為分析狀態圖262
13.4.6將分析狀態圖轉換
為設計狀態圖264
13.4.7狀態建模檢查
清單265
13.5狀態模式265
13.5.1約定的方法265
13.5.2什么是狀態
模式266
13.5.3應用狀態模式266
13.6實時系統的建模與設計269
13.6.1轉換圖式270
13.6.2定時狀態機271
13.6.3中斷處理272
13.7應用敏捷原則273
13.8對象狀態建模的工具
支持274
小結274
深入閱讀275
章節復習問題275
練習275
第14章轉換型系統的活動建模278
14.1什么是活動建模278
14.2為什么使用活動建模279
14.3活動建模: 技術背景279
14.3.1流程圖280
14.3.2佩特里網280
14.3.3數據流圖281
14.4UML活動圖282
14.5活動建模的步驟283
14.5.1識別活動和工
作流284
14.5.2產生一個初步活
動圖286
14.5.3引入條件分支、分叉
和連接287
14.5.4精煉復雜的活動287
14.5.5活動建模審核檢
查表288
14.6與其他圖之間的關系288
14.7應用敏捷原則289
14.8活動建模的工具支持289
小結289
深入閱讀290
章節復習問題290
練習290
第15章基于規則的系統的建模與
設計291
15.1什么是決策表292
15.2決策表的用處293
15.3系統化的決策表構造293
15.4漸進式決策表構造294
15.5檢查所需的屬性295
15.6決策表合并296
15.7根據決策表生成代碼296
15.8應用解釋器模式297
15.8.1定義業務規則
語法297
15.8.2在類圖中表示
規則298
15.8.3構建解析器和變量
查找上下文299
15.8.4解釋業務規則299
15.8.5動態更新規則300
15.8.6解釋方法的
優點300
15.9在測試驅動開發中使用
決策表300
15.10決策樹301
15.11應用敏捷原則301
小結302
深入閱讀302
章節復習問題302
練習303第5部分應用情景特定模式
第16章應用模式來設計狀態圖
編輯器307
16.1應用模型的過程308
16.2案例研究: 狀態圖編
輯器310
16.3處理復雜的結構311
16.3.1表示遞歸的整體
部分結構311
16.3.2使用策略提供布局
選擇315
16.3.3用迭代器訪問復雜
的結構316
16.3.4通過訪問者分析復
雜的結構317
16.3.5通過備忘錄存儲和
恢復對象狀態320
16.4創建和構造復雜的對象321
16.4.1創建系列產品321
16.4.2構建大型的復雜
對象324
16.4.3通過享元重用
對象326
16.5圖形用戶界面的設計和
顯示327
16.5.1跟蹤編輯狀態327
16.5.2響應編輯事件328
16.5.3轉換接口330
16.5.4提供上下文相關的
幫助333
16.5.5使用裝飾增強顯示
能力335
16.6應用敏捷原則338
小結338
深入閱讀338
章節復習問題339
練習339第17章應用模式來設計持久性
框架340
17.1直接訪問數據庫會出現的
問題340
17.2通過橋隱藏持久存儲341
17.3將數據庫請求封裝為
命令344
17.4用遠程代理隱藏網絡
訪問348
17.5用模板方法共享通用
代碼351
17.6通過工廠方法檢索不同
的對象353
17.7用原型減少類的數量355
17.8應用敏捷原則358
小結358
深入閱讀358
章節復習問題358
練習358
第6部分實現和質量保證
第18章實現方面的考慮363
18.1編碼標準363
18.1.1什么是編碼
標準363
18.1.2為什么要建立
編碼標準367
18.1.3代碼審查清單367
18.1.4編碼標準實施
準則367
18.2組織實現部件369
18.3根據設計生成代碼370
18.3.1實現類和接口370
18.3.2從順序圖到方法
代碼骨架370
18.3.3實現關聯關系371
18.4給團隊成員分配任務372
18.5結對編程372
18.6測試驅動開發373
18.6.1測試驅動開發的
工作流程373
18.6.2測試驅動開發的
優點375
18.6.3潛在問題375
18.7應用敏捷原則376
18.8對實現的工具支持376
小結376
深入閱讀377
章節復習問題377
練習377
第19章軟件質量保證379
19.1軟件質量保證的益處379
19.2軟件質量屬性379
19.3質量測量和度量381
19.3.1質量測量和度量的
實用性382
19.3.2常規質量度量382
19.3.3對面向對象軟件
重用傳統度量387
19.3.4面向對象質量
度量387
19.4軟件驗證與確認技術389
19.4.1審查389
19.4.2走查390
19.4.3同行審查391
19.5生命周期中的驗證和
確認392
19.6軟件質量保證功能393
19.6.1過程和標準的
定義394
19.6.2質量管理396
19.6.3過程改進397
19.7應用敏捷原則398
19.8SQA的工具支持399
小結399
深入閱讀400
章節復習問題400
練習400
第20章軟件測試401
20.1什么是軟件測試402
20.2為什么進行軟件測試402
20.3傳統的黑盒測試403
20.3.1功能性測試: 一個
例子403
20.3.2等價類劃分404
20.3.3邊界值分析405
20.3.4因果分析407
20.4傳統的白盒測試407
20.4.1基路徑測試408
20.4.2圈復雜度409
20.4.3流圖測試覆蓋
準則409
20.4.4測試循環410
20.4.5數據流測試411
20.4.6數據流測試的覆蓋
準則412
20.4.7過程間數據流
測試412
20.5測試覆蓋率413
20.6一個通用的軟件測試
過程413
20.7面向對象的軟件測試415
20.7.1基于用例的
測試415
20.7.2用ClassBench進行
對象狀態測試416
20.7.3測試類的層次
結構418
20.7.4測試異常處理
能力419
20.8測試Web應用程序420
20.8.1Web應用程序測試
的面向對象模型420
20.8.2使用面向對象模型進
行靜態分析421
20.8.3使用面向對象模型生
成測試用例421
20.8.4用httpUnit進行Web
應用程序測試422
20.9非功能性需求的測試422
20.9.1性能和壓力
測試422
20.9.2安全測試423
20.9.3測試用戶界面423
20.10生命周期中的軟件測試424
20.11回歸測試426
20.12什么時候停止
測試426
20.13應用敏捷原則427
20.14測試的工具支持427
小結427
深入閱讀428
章節復習問題428
練習428
第7部分維護和配置管理
第21章軟件維護433
21.1什么是軟件維護433
21.2軟件變化的因素434
21.3系統演化的雷曼定律434
21.4軟件維護的類型435
21.5軟件維護過程和活動435
21.5.1維護過程模型436
21.5.2理解程序437
21.5.3變更識別和
分析437
21.5.4配置變更控制439
21.5.5變更實施、測試和
交付440
21.6逆向工程440
21.6.1逆向工程工作流
440
21.6.2逆向工程的用途
440
21.6.3逆向工程: 案例
研究441
21.7軟件再工程441
21.7.1再工程的目標441
21.7.2軟件再工程的
過程442
21.7.3軟件再工程: 案例
研究443
21.8軟件維護的模式444
21.8.1用外觀模式簡化
客戶端接口444
21.8.2用中介者模式簡化
組件交互445
21.8.3軟件維護的
模式445
21.9應用敏捷原則449
21.10軟件維護的工具支持449
小結450
深入閱讀450
章節復習問題450
練習450
第22章軟件配置管理452
22.1軟件生命周期的基準452
22.2什么是軟件配置管理453
22.3為什么需要軟件配置
管理454
22.4軟件配置管理的功能454
22.4.1軟件配置識別455
22.4.2軟件配置變更
控制456
22.4.3軟件配置審核457
22.4.4軟件配置狀態的
審計458
22.5敏捷項目中的配置管理458
22.6軟件配置管理工具458
小結460
深入閱讀460
章節復習問題460
練習461
第8部分項目管理和軟件安全
第23章軟件項目管理465
23.1項目組織466
23.1.1項目形式466
23.1.2團隊結構467
23.2工作量評估方法468
23.2.1功能點方法468
23.2.2COCOMO Ⅱ模型
469
23.2.3Delphi評估方法
474
23.2.4敏捷評估474
23.3項目計劃和調度476
23.3.1PERT圖476
23.3.2Gantt圖和人員
分配477
23.3.3敏捷規劃478
23.4風險管理479
23.4.1風險識別479
23.4.2風險分析和優先級
劃分480
23.4.3風險管理規劃482
23.4.4風險解決和監控
482
23.5過程改進482
23.6應用敏捷原則484
23.7項目管理的工具支持484
小結485
深入閱讀485
章節復習問題486
練習486
第24章軟件安全488
24.1什么是軟件安全489
24.2安全要求489
24.3安全軟件設計原則490
24.4安全軟件設計模式491
24.5軟件安全的7個最佳
實踐493
24.6通過攻擊樹進行風險
分析494
24.7生命周期中的軟件安
全性494
24.7.1規劃階段的安全
495
24.7.2迭代階段的安全
501
24.8應用敏捷原則503
24.9軟件安全的工具支持504
小結504
深入閱讀505
章節復習問題505
練習506
附錄A個人軟件過程: 估計、規劃和
質量保證507
A.1PSP中的工作量估計507
A.2PSP中的軟件質量保證508
A.3設計和質量508
附錄BJava技術510
B.1使用數據庫連接510
B.1.1什么是數據庫連接
510
B.1.2設置數據源510
B.1.3從程序中訪問數據庫
511
B.2使用Swing512
B.2.1用JFrame創建主
窗口512
B.2.2利用布局管理器
來布局組件513
B.2.3使用動作監聽器
處理按鈕事件515
B.2.4實現繪圖功能515
B.3使用JSP517
B.3.1什么是JSP517
B.3.2JSP工作流517
B.3.3用JSP容器安裝Web
服務器518
B.3.4使用JSP518
附錄C軟件工具521
C.1NetBeans521
C.2使用JUnit522
C.3在NetBeans中運行
JUnit525
C.4Emma覆蓋工具525
C.5Cobertura覆蓋工具526
C.6使用HttpUnit測試Web
應用程序527
C.6.1配置IDE以使用
HttpUnit527
C.6.2在HttpUnit中實現
測試用例528
C.7在NetBeans中使用cvs和
Subversion529
C.7.1創建CVS遠程存
儲庫529
C.7.2在NetBeans中安裝
Subversion530
C.7.3從存儲庫檢出文件
531
C.7.4編輯源和查看變更
533
C.7.5查看文件狀態533
C.7.6比較文件版本534
C.7.7合并存儲庫中的
更改534
C.7.8解決沖突534
C.7.9更新本地副本534
C.7.10提交本地文件到
存儲庫535
C.7.11導入文件到存儲庫
535
附錄D項目概要536
D.1汽車租賃系統536
D.2國家貿易展覽服務系統536
D.3海外留學管理系統537
D.4UML類圖編輯器539
D.5無線電通信模擬器540
D.6對象狀態測試環境541
參考文獻543