內容簡介
《重構(Ruby版)》是一本專門為職業Ruby程式設計師編寫的重構指導。它的目標是向你展示如何以一種既受到嚴格控制又高效的方式進行重構。你將學習到不在代碼中引入bug並能按部就班改進結構的重構方式。《重構(Ruby版)》的主要內容:第1章指出重構是什麼;第2章討論進行重構的理由;第3章指出需要進行重構的信號;第4章討論測試在重構中扮演的重要角色;第5章~第12章介紹了重構花名冊,它包含了在重構領域裡到目前為止的成果。當需要進行某項任務時,這份花名冊可以手把手地提醒我們安全的做法。
《重構(Ruby版)》的目標讀者是專業的Ruby程式設計師、資深設計師和架構師。
作者簡介
Jay Fields 是DRW Trading公司的一名軟體程式設計師,也是一位研討會的常客。Jay對發現和成熟化創新式解決方案總是抱有激情。
Shane Harvie 在美國、印度和澳大利亞等國的敏捷公司中從事軟體開發工作。現就職於芝加哥的DRW Trading公司。
Martin Fowler 是ThoughtWorks公司的首席科學家,他是一位作家、演說家和諮詢師,經常在軟體開發活動中發表演講。他關注的是企業軟體設計——諸如什麼能產生良好的設計,而良好的設計,而良好的設計有需要哪些實踐等。他是面向對象技術、重構、模式、敏捷方法論、領域建模、統一建模語言(UML)和極限編程的先行者。他在ThoughtWorks公司工作了十年,這是一家非常出色的系統開發和諮詢公司。
圖書目錄
譯者序
序
前言
致謝
第1章 重構初體驗
1.1 起點
1.1.1 Movie
1.1.2 Rental
1.1.3 Customer
1.1.4 對起始程式的評價
1.2 重構第一步
1.3 Statement方法的分解和再組合
1.3.1 移動Amount的計算
1.3.2 提煉常客積分的計算
1.3.3 移除臨時變數
1.4 用多態替換價格代碼中的條件邏輯
1.5 小結
第2章 重構的基本原理
2.1 重構的起源
2.2 重構的定義
2.3 重構的理由
2.3.1 重構可以改進軟體的設計
2.3.2 重構讓軟體變得易於理解
2.3.3 重構可以幫助你發現bug
2.3.4 重構可以幫助你更快地編程
2.4 重構的時機
2.4.1 事不過三
2.4.2 在添加功能時重構
2.4.3 在需要修復bug時重構
2.4.4 在進行代碼複審時重構
2.4.5 為了更好地理解而重構(或者說,向著同一個目標進行重構)
2.5 為什麼重構能起作用
2.6 我怎么跟經理說
2.7 抽象和重構
2.8 重構的問題
2.8.1 改變接口
2.8.2 資料庫
2.8.3 難以重構的設計變化
2.8.4 什麼時候不應該重構
2.9 重構和設計
2.10 竹籃打水一場空
2.11 重構和性能
2.12 最佳化薪資系統
第3章 代碼里的壞味道
3.1 重複代碼
3.2 方法過長
3.3 類太大
3.4 參數列表太長
3.5 發散型變化
3.6 霰彈型修改
3.7 特性依賴
3.8 數據泥團
3.9 基本類型偏執
3.10 case語句
3.11 平行繼承體系
3.12 冗贅類
3.13 純臆測的泛化
3.14 臨時欄位
3.15 訊息鏈
3.16 中間人
3.17 過分親密
3.18 異曲同工的類
3.19 不完善的類庫
3.20 數據類
3.21 被拒絕的遺贈
3.22 注釋
3.23 狂熱的元編程
3.24 脫節的API
3.25 不斷重複的樣板文本
第4章 構建測試
4.1 自我測試代碼的價值
4.2 Test∷Unit測試框架
4.3 程式設計師測試和質量保證測試
4.4 添加更多的測試
第5章 重構花名冊
5.1 重構的格式
5.2 查找引用
第6章 組織方法
6.1 提煉方法
6.1.1 動機
6.1.2 手法
6.1.3 示例:沒有局部變數
6.1.4 示例:使用局部變數
6.1.5 示例:重新給局部變數賦值
6.2 內聯化方法
6.2.1 動機
6.2.2 手法
6.3 內聯化臨時變數
6.3.1 動機
6.3.2 手法
6.4 使用查詢替換臨時變數
6.4.1 動機
6.4.2 手法
6.4.3 示例
6.5 使用鏈式調用替換臨時變數
6.5.1 動機
6.5.2 手法
6.5.3 示例
6.6 引入解釋性變數
6.6.1 動機
6.6.2 手法
6.6.3 示例
6.6.4 採用提煉方法的手法
6.7 分解臨時變數
6.7.1 動機
6.7.2 手法
6.7.3 示例
6.8 移除對參數賦值
6.8.1 動機
6.8.2 手法
6.8.3 示例
6.9 使用方法對象替換方法
6.9.1 動機
6.9.2 手法
6.9.3示例
6.10 替換算法
6.10.1 動機
6.10.2 手法
6.11 使用集合閉包方法替換循環
6.11.1 動機
6.11.2 手法
6.11.3 示例
6.12 提煉環繞方法
6.12.1 動機
6.12.2 手法
6.12.3 示例
6.13 引入類標註
6.13.1 動機
6.13.2 手法
6.13.3 示例
6.14 引入命名參數
6.14.1 動機
6.14.2 手法
6.14.3 示例1:命名全部參數
6.14.4 示例2:只命名可選參數
6.15 移除命名參數
6.15.1 動機
6.15.2 手法
6.15.3 示例
6.16 移除未使用的默認參數
6.16.1 動機
6.16.2 手法
6.16.3 示例
6.17 動態方法定義
6.17.1 動機
6.17.2 手法
6.17.3 示例:通過def_each來定義相似的方法
6.17.4 instance_exec方法
6.17.5 示例:用類標註來定義實例方法
6.17.6 示例:通過擴展一個動態定義的模組來定義方法
6.18 使用動態方法定義替換動態接收器
6.18.1 動機
6.18.2 手法
6.18.3 示例:不用method_missing進行動態委託
6.18.4 示例:使用自定義數據來定義方法
6.19 隔離動態接收器
6.19.1 動機
6.19.2 手法
6.19.3 示例
6.20 把計算從運行時移到解析時
6.20.1 動機
6.20.2 手法
第7章 在對象之間移動特性
7.1 移動方法
7.1.1 動機
7.1.2 手法
7.1.3 示例
7.2 移動欄位
7.2.1 動機
7.2.2 手法
7.2.3 示例
7.2.4 示例:使用自封裝
7.3 提煉類
7.3.1 動機
7.3.2 手法
7.3.3 示例
7.4 內聯化類
7.4.1 動機
7.4.2 手法
7.4.3 示例
7.5 隱藏委託
7.5.1 動機
7.5.2 手法
7.5.3 示例
7.6 移除中間人
7.6.1 動機
7.6.2 手法
7.6.3 示例
第8章 組織數據
8.1 自封裝欄位
8.1.1 動機
8.1.2 手法
8.1.3 示例
8.2 使用對象替換數據值
8.2.1 動機
8.2.2 手法
8.2.3 示例
8.3 將值對象改為引用對象
8.3.1 動機
8.3.2 手法
8.3.3 示例
8.4 將引用對象改為值對象
8.4.1 動機
8.4.2 手法
8.4.3 示例
8.5 使用對象替換數組
8.5.1 動機
8.5.2 手法
8.5.3 示例
8.5.4 使用Deprecation進行重構
8.6 使用對象替換Hash
8.6.1 動機
8.6.2 手法
8.6.3 示例
8.7 將單向關聯改為雙向關聯
8.7.1 動機
8.7.2 手法
8.7.3 示例
8.8 將雙向關聯改為單向關聯
8.8.1 動機
8.8.2 手法
8.8.3 示例
8.9 使用符號常數代替魔法數
8.9.1 動機
8.9.2 手法
8.10 封裝集合
8.10.1 動機
8.10.2 手法
8.10.3 示例
8.10.4 將行為移入類里
8.11 使用數據類替換記錄
8.11.1 動機
8.11.2 手法
8.12 使用多態替換類型碼
8.12.1 動機
8.12.2 移除條件邏輯
8.12.3 手法
8.12.4 示例
8.13 使用模組擴展替換類型碼
8.13.1 動機
8.13.2 手法
8.13.3 示例
8.14 使用狀態或策略模式替換類型碼
8.14.1 動機
8.14.2 手法
8.14.3 示例
8.15 使用欄位替換子類
8.15.1 動機
8.15.2 手法
8.15.3 示例
8.16 惰性初始化的屬性
8.16.1 動機
8.16.2 手法
8.16.3 以II=為例
8.16.4 以instance-variable_defined?為例
8.17 及早初始化的屬性
8.17.1 動機
8.17.2 討論
8.17.3 手法
8.17.4 示例
第9章 簡化條件表達式
9.1 分解條件語句
9.1.1 動機
9.1.2 手法
9.1.3 示例
9.2 重組條件語句
9.2.1 動機
9.2.2 示例:使用“0r”賦值替換=三元操作符
9.2.3 示例:使用顯式返回替換條件語句
9.3 合併條件表達式
9.3.1 動機
9.3.2 手法
9.3.3 示例:Ors
9.3.4 示例:Ands
9.4 合併重複的條件片段
9.4.1 動機
9.4.2 手法
9.4.3 示例
9.5 移除控制位
9.5.1 動機
9.5.2 手法
9.5.3 示例:使用break替換簡單的控制位
9.5.4 示例:返回控制位的結果
9.6 使用守衛子句替換嵌套條件語句
……
第10章 簡化方法調用
第11章 處理通用化
第12章 大型重構
第13章 總結
參考文獻
重構手法列表