第1 章 軟件開發這個職業 1
1.1 人類製作軟件已經有多久的曆史瞭 1
1.2 軟件開發是一種什麼樣的活動 2
1.3 軟件開發缺少瞭什麼 4
1.4 誰說瞭算 6
1.5 獨特性 6
第2 章 從衣櫥到探月 8
2.1 軟件開發中的模式和專業化 8
2.2 Andrea 的衣櫥 9
2.3 探月 13
2.3.1 因素的連鎖變化 16
2.3.2 不同的因素導緻不同的設計 16
2.3.3 還有更多環境因素 17
2.3.4 成本和獲益 18
2.3.5 火星探險 18
2.4 模式的價值 19
2.5 小結 20
第3 章 軟件開發的本質 21
3.1 失敗率過高 21
3.2 成功的定義 22
3.3 Standish Group 23
3.4 做瞭錯誤的事情 24
3.5 做事的方式錯瞭 25
3.6 隨著時間的推移,軟件開發也有所改善 27
3.7 一個原因:土木工程的類比 27
3.8 放棄希望 29
3.9 有時等待和拖延也是必要的 30
3.10 橋是硬的,軟件是軟的 30
3.11 我們在變化的海洋中遊泳 31
3.12 接受變化 31
3.13 擁抱變化 32
3.14 利用變化 32
3.15 更好的類比:不斷演進的係統 34
3.16 小結 37
第4 章 代碼的演進:初級階段 38
4.1 用對象結構來代替過程邏輯 38
4.2 麵嚮對象和模式的起源 39
4.3 一個示例:簡單條件和Proxy 模式 40
4.4 下一步:多路徑條件選擇 43
4.5 為什麼要采用對象結構 45
4.6 從多個條件中選擇一個 46
4.7 小結 46
第5 章 使用和發現模式 48
5.1 根據上下文進行設計:我做的另一個木匠活 48
5.2 模式引齣瞭另一個看問題的角度 55
5.3 模式提供瞭一種討論設計的語言 55
5.4 本書中的模式 56
5.5 小結 56
第6 章 軟件開發金字塔 58
6.1 構成專業的元素 58
6.2 一種形象的錶示 60
6.3 小結 60
第7 章 注重軟件質量 61
7.1 封裝 62
7.2 內聚 62
7.2.1 方法內聚 63
7.2.2 視角層的內聚 65
7.2.3 類內聚 66
7.2.4 內聚到何種程度纔足夠 67
7.3 耦閤 67
7.3.1 有意耦閤與意外耦閤 68
7.3.2 耦閤類型 69
7.4 冗餘 73
7.5 可測試性 77
7.6 可讀性 78
7.7 軟件的病癥 79
7.7.1 內聚性較差的信號 79
7.7.2 意外耦閤或不閤邏輯耦閤的信號 80
7.7.3 冗餘的信號 81
7.8 小結 81
第8 章 注重原則和智慧結晶 83
8.1 使用與創建分離 83
8.1.1 Fowler 的三層視角 83
8.1.2 另一種視角 84
8.1.3 使用的視角 85
8.1.4 一個單獨的視角:創建 86
8.1.5 最後考慮構造細節 87
8.1.6 迴到現實 88
8.2 開閉原則 89
8.2.1 類級的開閉原則 90
8.2.2 方法級的開閉原則 91
8.3 依賴倒置原則 92
8.4 GoF 的建議 93
8.4.1 設計方法的接口 93
8.4.2 設計類的接口 94
8.4.3 GoF:優先使用對象聚閤而非類繼承 95
8.5 GoF:在設計中思考什麼應該變化並封裝會發生變化的概念 98
8.6 小結 100
第9 章 注重實踐 101
9.1 統一編碼風格 101
9.1.1 注釋 102
9.1.2 命名類、方法和變量 103
9.1.3 編碼標準的好處 104
9.2 意圖導嚮編程 105
9.3 封裝構造函數 107
9.3.1 原則與實踐 110
9.3.2 做齣決定 110
9.4 公共性—可變性分析 111
9.5 實踐與自由 114
9.6 小結 115
第10 章 注重紀律:單元測試 116
10.1 測試的經濟學 116
10.1.1 單元測試 117
10.1.2 先寫測試 119
10.2 JUnit 框架 120
10.2.1 JUnit 基礎知識 121
10.2.2 JUnit 示例 122
10.2.3 Rule.java:先編碼,再測試 122
10.2.4 RuleContainer.java:先測試,再編碼 128
10.2.5 消除冗餘:@Before和@After 135
10.2.6 自動化批量測試 137
10.2.7 異常和單元測試 139
10.3 模擬對象 141
10.3.1 MockObject 框架 142
10.3.2 僞對象 145
10.3.3 依賴注入和Endo-Testing技巧 146
10.3.4 Endo-Testing 147
10.4 小結 148
第11 章 注重紀律:重構 149
11.1 重構質量糟糕的代碼 150
11.2 重構質量優秀的代碼 151
11.3 結構變化與功能變化 152
11.4 重構可幫助你做齣選擇 153
11.5 模式可以成為重構的目標 154
11.6 避免重構:預構 154
11.7 重構技巧 155
11.8 重構遺留代碼 162
11.9 小結 164
第12 章 測試驅動開發 165
12.1 何謂測試驅動開發 165
12.1.1 測試驅動與先寫測試 165
12.1.2 從單元測試的角度來設計 166
12.2 測試與質量 167
12.2.1 測試與內聚 167
12.2.2 測試與耦閤 168
12.2.3 測試與冗餘 169
12.3 測試驅動開發與模式 169
12.3.1 Strategy 模式 169
12.3.2 烏龜站在烏龜上,一直嚮下 170
12.3.3 模擬對象/模擬烏龜 171
12.4 模擬對象 172
12.5 模擬烏龜 174
12.6 測試Decorator 模式 174
12.7 小結 178
第13 章 模式與因素 179
13.1 在演進的設計中做決策 179
13.2 Christopher Apexander 與他所提齣的“因素” 180
13.2.1 信號處理器示例 180
13.2.2 PKZip 示例 184
13.2.3 測試與因素 186
13.3 更多選擇,更多因素 187
13.4 小結 190
第14 章 浮現式設計:案例分析 191
14.1 問題領域:MWave 公司 191
14.2 團隊 192
14.3 最簡單的能夠正常運作的設計 194
14.4 新需求:更復雜的機器 196
14.5 順便介紹一下 198
14.6 更多好消息 199
14.7 小結:設計是一次漫長而奇特的旅行 200
第15 章 結束語:展望2020 年 202
附錄A 演進路徑 204
附錄B 示例中用到的模式簡介 213
附錄C 有用幻覺之原理 274
參考書目 279
· · · · · · (
收起)