圖書簡介
在這本獨一無二的書中,本書作者向您介紹如何利用重構改進現有代碼的設計,使之變得更有效和更具生產力。它提供了實用方法,所以您可以快速學會如何使用重構工具和功能來管理和修改代碼。本書還介紹了如何進行單元測試、重構模式和重構升級原有的Visual Basic 代碼。
在學習本書的過程中,將從頭開始構建原型應用程式。然後,利用重構技術將代碼轉換為正確設計的、企業級的應用程式。本書作者將手把手地教您每個過程,同時提供了專家級的編碼技巧。然後,可以將這些信息套用到由於公司擴張、策略改變或類似業務決策所引起的實際情形中。
目錄
第Ⅰ部分重構的介紹
第1章重構的全面介紹 3
1.1重構的快速瀏覽 3
1.1.1重構過程 4
1.1.2軟體行業現狀概述 5
1.2重構過程的詳細介紹 7
1.2.1代碼味道的使用 7
1.2.2代碼的轉換 7
1.2.3重構的優點 9
1.2.4澄清一些常見的誤解 11
1.3VisualBasic和重構 13
1.3.1VisualBasic的發展史
和遺留問題 13
1.3.2VisualBasic的演變 14
1.3.3通過重構處理遺留的問題 15
1.4小結 16
第2章重構的初體驗 17
2.1CaloriesCalculator樣本
應用程式 17
2.1.1CaloriesCalculator
應用程式 18
2.1.2需求的增長:計算
理想的體重 20
2.1.3需求的增長:保存病人
的數據 22
2.2運用中的重構 23
2.2.1將BtnCalculate_Click
方法分解 24
2.2.2發現新的類 27
2.2.3限制Patient類的接口 30
2.2.4將條件邏輯放到
Patient類中 32
2.2.5創建Patient類的層次結構 35
2.3保存功能的實現 41
2.3.1保存數據 41
2.3.2實現顯示病人歷史
信息的功能 49
2.4CaloriesCalculator
重構過的版本 53
2.5小結 55
第3章組建重構的工具箱 57
3.1使用自動化的重構工具 58
3.1.1JetBrains提供的ReSharper 58
3.1.2WholeTomato提供的
VisualAssistX 59
3.1.3DeveloperExpress
提供的Refactor!Pro 59
3.1.4從Refactor!開始入手 59
3.1.5進一步探討VB用戶
界面的Refactor! 61
3.1.6快速瀏覽:可供
使用的重構 65
3.2單元測試的基本內容:
測試的護具 66
3.2.1單元測試架構的出現 67
3.2.2NUnit的初體驗 69
3.2.3NUnit的安裝 69
3.2.4第一個測試的實現 71
3.2.5測試驅動的方法 78
3.2.6需要考慮的其他測試工具 79
3.3關於版本控制的一些問題 81
3.4小結 81
第4章Rent-a-Wheels套用
程式的原型 83
4.1會見客戶 84
4.1.1會見經理 84
4.1.2會見前台接待員 85
4.1.3會見停車場的服務人員 85
4.1.4會見維護人員 86
4.2採取Rent-a-Wheels項目
中最初的步驟 86
4.2.1參與者和用例 86
4.2.2汽車的狀態 88
4.2.3首次擬定主要的套用
程式視窗 90
4.2.4Rent-a-Wheels開發
團隊的會議 90
4.3讓原型運轉 91
4.3.1檢查資料庫模型 91
4.3.2檢查VisualBasic的代碼 93
4.4快速而高效的VB編程方法 96
4.4.1資料庫驅動的設計 97
4.4.2基於GUI的應用程式 97
4.4.3事件驅動的編程 97
4.4.4快速應用程式開發(RAD) 98
4.4.5複製/貼上作為代碼
重用的機制 98
4.5通過重構過程從原型
進入到交付 99
4.6小結 99
第Ⅱ部分VB重構的初步知識
第5章Chameleon語言:從靜態
弱類型化到動態強類型化 103
5.1OptionExplicit和
OptionStrict的.NET影響 104
5.2在不嚴格的代碼中設定
OptionExplicitOn 105
5.2.1理解SetOption
ExplicitOn重構 105
5.2.2將Rent-a-Wheels代碼
重構成顯式的形式 108
5.3在不嚴格的代碼中設定
OptionStrictOn 109
5.3.1一個有點人為的隨意的
VB代碼示例 109
5.3.2通過新變數的定義來
解決變數的複雜用法 112
5.3.3推斷變數的類型 115
5.3.4通過類型轉換函式將
所有內容整合在一起 118
5.3.5方法、欄位、屬性和
其他成員的處理 120
5.3.6將SetOptionStrictOn
重構運用到Rent-a-Wheels
應用程式中 125
5.4靜態類型化對動態類型化
及其與VisualBasic的關係 127
5.4.1VisualBasic6及其之前
版本中的後期綁定 128
5.4.2鴨子類型化 129
5.4.3在檔案層次上重設動態
行為或靜態行為 130
5.4.4為動態代碼提供一個
靜態類型化的封裝器 131
5.5激活顯式而嚴格的
編譯器選項 133
5.5.1在ProjectProperties
視窗中設定選項 134
5.5.2更改VisualBasic編譯器
的默認行為 135
5.5.3在源檔案中設定選項 135
5.5.4使用項模板來設定選項 136
5.6小結 137
第6章錯誤處理:以一些簡單的
步驟從傳統風格步入到
結構化風格 139
6.1傳統的錯誤處理和結構化
的錯誤處理 140
6.1.1傳統的(非結構化的)
錯誤處理 140
6.1.2結構化的錯誤處理 142
6.2結構化錯誤處理的好處 145
6.2.1結構化的代碼和
非結構化的代碼 145
6.2.2作為類型而不是數字
出現的異常 145
6.2.3錯誤過濾 146
6.2.4Finally代碼塊 146
6.2.5.NET的互操作性 147
6.3用Try-Catch-Finally取代
OnError構造 147
6.3.1理解關鍵字When 149
6.3.2用Try-Catch-Finally替換
OnError的重構步驟 150
6.3.3用Try-Catch-Finally構造
替換OnErrorGoto標籤 151
6.3.4用Try-Catch-Finally構造替
換OnErrorResumeNext 154
6.4用異常類型替換錯誤代碼 155
6.4.1用異常類型替換系統
錯誤代碼 158
6.4.2用異常類型來替換
自定義的錯誤代碼 159
6.5Rent-a-Wheels應用程式
中的錯誤處理 160
6.6小結 162
第7章基本的代碼衛生:消除無
用代碼、降低作用域、使
用顯式導入以及刪除不用
的引用 165
7.1刪除無用代碼 166
7.1.1無用代碼的類型 167
7.1.2無用代碼常見的來源 168
7.2降低過度曝光的元素的
作用域和訪問級別 171
7.2.1作用域和訪問級別 173
7.2.2過度曝光常見的來源 174
7.2.3處理過度曝光的問題 178
7.3使用顯式導入 179
7.4刪除未使用的程式集引用 183
7.5Rent-a-Wheels應用程式
中的基本衛生 184
7.6小結 185
第Ⅲ部分標準重構轉換的
初步介紹
第8章從問題域到代碼:消除差距 189
8.1理解問題域 190
8.1.1第1步:收集信息 190
8.1.2第2步:就辭彙表達成
一致意見 191
8.1.3第3步:描述互動作用 192
8.1.4第4步:建立原型 193
8.2命名的指導原則 193
8.2.1大寫風格 194
8.2.2簡單的命名指導原則 195
8.2.3順暢地傳遞信息:選擇
正確的單詞 196
8.2.4Rename重構 197
8.3發布接口和公有接口 200
8.3.1自包含的應用程式與
可重用的模組 200
8.3.2修改公有接口 203
8.3.3Refactor!中的SafeRename
重構 206
8.4Rent-a-Wheels應用程式中
的Rename和SafeRename
重構 208
8.5小結 209
第9章對重複代碼進行方法提取 211
9.1保持封裝代碼和隱藏
細節的原因 211
9.2信息和實現的隱藏 212
9.3分解方法 214
9.3.1周長計算——長方法的
一個示例 215
9.3.2提取周長計算的代碼 217
9.3.3提取計算半徑的代碼 220
9.3.4提取WaitforUsertoClose
代碼 220
9.3.5提取讀取坐標的代碼 220
9.3.6Refactor!中的Extract
Method重構 223
9.4重複代碼的味道 225
9.4.1重複代碼的來源 226
9.4.2複製/貼上編程 227
9.5幻數 228
9.6Rent-a-Wheels應用程式中的
ExtractMethod和
ReplaceMagicLiteral重構 230
9.7小結 231
第10章方法合併與方法
提取的技術 233
10.1臨時變數的處理 233
10.1.1MoveDeclarationNear
Reference重構 234
10.1.2MoveInitializationto
Declaration重構 237
10.1.3SplitTemporaryVariable
重構 238
10.1.4InlineTemp重構 242
10.1.5ReplaceTempwithQuery
重構 244
10.2方法重組的試探 247
10.3方法重組與Rent-a-Wheels 247
10.3.1刪除Rent-a-Wheels
中的重複 249
10.3.2Rent-a-Wheels中的幻數、
注釋以及事件處理盲區 251
10.4小結 255
第Ⅳ部分高級重構
第11章發現對象 259
11.1面向對象編程的快速回顧 259
11.1.1到底什麼是對象 260
11.1.2封裝與對象 260
11.1.3Refactor!中的
EncapsulateField重構 261
11.1.4對象狀態的保持 263
11.1.5類 264
11.1.6對象標識 265
11.1.7作為基本構建塊的對象 266
11.1.8根對象 266
11.1.9對象的生存期和
垃圾回收 267
11.1.10訊息 268
11.2類的設計 268
11.2.1類是名詞,操作是動詞 271
11.2.2類、責任和協作者 275
11.2.3實體和關係 283
11.3發現隱藏的類 284
11.3.1處理資料庫驅動的設計 285
11.3.2從過程化設計到面向
對象設計的轉移 288
11.3.3保持域、表示和
持久化分離 294
11.3.4發現對象和Rent-a-Wheels
應用程式 300
11.4小結 306
第12章面向對象的高級概念和
相關的重構 309
12.1繼承、多態性和泛型 309
12.1.1繼承 310
12.1.2多態性 315
12.1.3泛型 318
12.2繼承的誤用以及重構
解決方案 319
12.2.1誤用繼承的組合和
其他誤用情形 322
12.2.2繼承的重構——
列印系統的舉例 327
12.3泛型的使用 345
12.4Rent-a-Wheels應用程式中
的繼承和泛型 348
12.4.1提取超類 348
12.4.2運用泛型 349
12.4.3提取數據對象
提供者的類 349
12.5小結 354
第13章大規模的代碼組織 355
13.1命名空間 355
13.1.1命名指導原則與
命名空間的組織 355
13.1.2嵌套的命名空間 356
13.1.3修改根命名空間的名稱 356
13.1.4使用導入語句 357
13.2程式集 358
13.2.1二進制重用 358
13.2.2命名空間組織的
指導原則 360
13.2.3依賴性方面的考慮 364
13.3VisualBasic項目檔案的
結構組織 370
13.3.1Refactor!中的
MoveTypetoFile重構 371
13.3.2部分類 373
13.3.3繼承窗體 373
13.3.4抽象窗體的繼承 374
13.3.5將抽象窗體的工作
委託給窗體輔助類 375
13.4Rent-a-Wheels中命名空間
的組織與Windows
窗體繼承 377
13.4.1通過抽象窗體輔助
模式的應用程式來提
取父管理窗體 377
13.4.2命名空間和
程式集的重組 384
13.5小結 386
第Ⅴ部分重構的運用
第14章重構成模式 389
14.1到底什麼是設計模式 389
14.1.1設計模式的定義 390
14.1.2模式的分類 391
14.1.3模式的元素 391
14.1.4權衡設計模式的利弊 392
14.1.5模式的使用 392
14.2設計模式的示例:
AbstractFactory 392
14.2.1名稱 393
14.2.2問題 393
14.2.3解決方案 402
14.2.4後果 405
14.3DependencyInjection模式 407
14.3.1問題 407
14.3.2解決方案 410
14.3.3基於構造函式注入與
基於屬性注入 410
14.3.4應該注入什麼服務實現 411
14.3.5後果 412
14.3.6重構成DI 415
14.4重構成模式以及
Rent-a-Wheels應用程式 415
14.4.1消除.NET架構中所
提供的重複功能的代碼 415
14.4.2通過依賴注入向
GUI類中注入Data類 416
14.4.3CRUD持久化模式 418
14.5小結 418
第15章LINQ和VB2008的
其他增強功能 421
15.1局部變數的類型推斷 421
15.2XML生產能力的增強 422
15.2.1XML字面量 422
15.2.2通過XML軸屬性
導航XML 426
15.2.3將XML字面量
提取到Refactor!中
的資源中 426
15.3通過LINQ查詢對象 427
15.3.1舊示例換“新顏” 430
15.3.2LINQtoSQL的對象/
關係映射 433
15.3.3LINQ和Rent-a-Wheels
應用程式 436
15.4小結 445
第16章VB遺留代碼的未來 447
16.1是否需要遷移 448
16.1.1遷移不可能是百分
之百自動進行的 448
16.1.2VB6和VB.NET
代碼可以互操作 449
16.1.3遷移工具和庫 450
16.2初步的VB6重構 451
16.2.1打破整體化 452
16.2.2條件編譯的處理 453
16.3將被遷移的代碼放到測試
護具中 453
16.3.1引入功能測試護具 454
16.3.2實現功能測試護具 454
16.4遺留代碼的升級 457
16.4.1靜態嚴格類型化 458
16.4.2將設計從過程式設計
移到面向對象設計
的範例中 458
16.4.3引入繼承 459
16.4.4利用參數化的構造函式 460
16.4.5將泛型容器用於額外
的類型安全 460
16.4.6異常處理的升級 462
16.4.7XML注釋的實現 462
16.4.8釋放.NET中的資源 462
16.5小結 463
附錄ARefactor!揭密 465
附錄BRent-a-Wheels原型的內部機理和相互聯繫 467