第一部分 修改機理第1章 修改軟件 1.1 修改軟件的四個起因 1.1.1 添加特性和修正bug 1.1.2 改善設計 1.1.3 優(yōu)化 1.1.4 綜合起來 1.2 危險的修改第2章 帶著反饋工作 2.1 什么是單元測試 2.2 高層測試 2.3 測試覆蓋 2.4 遺留代碼修改算法 2.4.1 確定修改點 2.4.2 找出測試點 2.4.3 解依賴 2.4.4 編寫測試 2.4.5 改動和重構 2.4.6 其他內容第3章 感知和分離 3.1 偽裝成合作者 3.1.1 偽對象 3.1.2 偽對象的兩面性 3.1.3 偽對象手法的核心理念 3.1.4 仿對象第4章 接縫模型 4.1 一大段文本 4.2 接縫 4.3 接縫類型 4.3.1 預處理期接縫 4.3.2 連接期接縫 4.3.3 對象接縫第5章 工具 5.1 自動化重構工具 5.2 仿對象 5.3 單元測試用具 5.3.1 JUnit 5.3.2 CppUnitLite 5.3.3 NUnit 5.3.4 其他xUnit框架 5.4 一般測試用具 5.4.1 集成測試框架 5.4.2 Fitnesse第二部分 修改代碼的技術第6章 時間緊迫,但必須修改 6.1 新生方法 6.2 新生類 6.3 外覆方法 6.4 外覆類 6.5 小結第7章 漫長的修改 7.1 理解代碼 7.2 時滯 7.3 解依賴 7.4 小結第8章 添加特性 8.1 測試驅動開發(fā) 8.1.1 編寫一個失敗測試用例 8.1.2 讓它通過編譯 8.1.3 讓測試通過 8.1.4 消除重復 8.1.5 編寫一個失敗測試用例 8.1.6 讓它通過編譯 8.1.7 讓測試通過 8.1.8 消除重復代碼 8.1.9 編寫一個失敗測試用例 8.1.10 讓它通過編譯 8.1.11 讓測試通過 8.1.12 消除重復 8.2 差異式編程 8.3 小結第9章 無法將類放入測試用具中 9.1 令人惱火的參數 9.2 隱藏依賴 9.3 構造塊 9.4 惱人的全局依賴 9.5 可怕的包含依賴 9.6 “洋蔥”參數 9.7 化名參數第10章 無法在測試用具中運行方法 10.1 隱藏的方法 10.2 “有益的”語言特性 10.3 無法探知的副作用第11章 修改時應當測試哪些方法 11.1 推測代碼修改所產生的影響 11.2 前向推測 11.3 影響的傳播 11.4 進行影響推測的工具 11.5 從影響分析當中學習 11.6 簡化影響結構示意圖第12章 在同一地進行多處修改,是否應該將相關的所有類都解依賴 12.1 攔截點 12.1.1 簡單的情形 12.1.2 高層攔截點 12.2 通過匯點來判斷設計的好壞 12.3 匯點的陷阱第13章 修改時應該怎樣寫測試 13.1 特征測試 13.2 刻畫類 13.3 目標測試 13.4 編寫特征測試的啟發(fā)式方法第14章 棘手的庫依賴問題第15章 到處都是API調用第16章 對代碼的理解不足 16.1 注記/草圖 16.2 清單標注 16.2.1 職責分離 16.2.2 理解方法結構 16.2.3 方法提取 16.2.4 理解你的修改產生的影響 16.3 草稿式重構 16.4 刪除不用的代碼第17章 應用毫無結構可言 17.1 講述系統的故事 17.2 Naked CRC 17.3 反省你們的交流或討論第18章 測試代碼礙手礙腳 18.1 類命名約定 18.2 測試代碼放在哪兒第19章 對非面向對象的項目,如何安全地對它進行修改 19.1 一個簡單的案例 19.2 一個棘手的案例 19.3 添加新行為 19.4 利用面向對象的優(yōu)勢 19.5 一切都是面向對象第20章 處理大類 20.1 職責識別 20.2 其他技術 20.3 繼續(xù)前進 20.3.1 戰(zhàn)略 20.3.2 戰(zhàn)術 20.4 類提取之后第21章 需要修改大量相同的代碼第22章 要修改一個巨型方法,卻沒法為它編寫測試 22.1 巨型方法的種類 22.1.1 項目列表式方法 22.1.2 鋸齒狀方法 22.2 利用自動重構支持來對付巨型方法 22.3 手動重構的挑戰(zhàn) 22.3.1 引入感知變量 22.3.2 只提取你所了解的 22.3.3 依賴收集 22.3.4 分解出方法對象 22.4 策略 22.4.1 主干提取 22.4.2 序列發(fā)現 22.4.3 優(yōu)先提取到當前類中 22.4.4 小塊提取 22.4.5 時刻準備重新提取第23章 降低修改的風險 23.1 超感編輯 23.2 單一目標的編輯 23.3 簽名保持 23.4 依靠編譯器第24章 當你感到絕望時第三部分 解依賴技術第25章 解依賴技術 25.1 參數適配 25.2 分解出方法對象 25.3 定義補全 25.4 封裝全局引用 25.5 暴露靜態(tài)方法 25.6 提取并重寫調用 25.7 提取并重寫工廠方法 25.8 提取并重寫獲取方法 25.9 實現提取 25.9.1 步驟 25.9.2 一個更復雜的例子 25.10 接口提取 25.11 引入實例委托 25.12 引入靜態(tài)設置方法 25.13 連接替換 25.14 參數化構造函數 25.15 數化方法 25.16 樸素化參數 25.17 特性提升 25.18 依賴下推 25.19 換函數為函數指針 25.20 以獲取方法替換全局引用 25.21 子類化并重寫方法 25.22 替換實例變量 25.23 模板重定義 25.24 文本重定義附錄重構術語表索引