出版時間:2010 出版社:人民郵電出版社 作者:Martin Fowler 頁數(shù):428 譯者:熊節(jié)
Tag標簽:無
前言
第一次聽到“重構”這個詞,是在2001年10月。在當時,它的思想足以令我感到震撼。軟件自有其美感所在。軟件工程希望建立完美的需求與設計,按照既有的規(guī)范編寫標準劃一的代碼,這是結構的美;快速迭代和RAD顛覆“全知全能”的神話,用近乎刀劈斧砍(crack)的方式解決問題,在混沌的循環(huán)往復中實現(xiàn)需求,這是解構的美;而Kent Beck與Martin Fowler兩人站在一起,以XP那敏捷而又嚴謹?shù)姆椒ㄕ撗堇[了重構的美——我不知道是誰最初把refactoring一詞翻譯為“重構”,或許無心插柳,卻成了點睛之筆。 我一直是設計模式的愛好者。曾經(jīng)在我的思想中,軟件開發(fā)應該有一個“理想國”——當然,在這個理想國維持著完美秩序的,不是哲學家,而是模式。設計模式給我們的,不僅僅是一些具體問題的解決方案,更有追求完美“理型”的渴望。但是,Joshua Kerievsky在那篇著名的《模式與XP》(收錄于《極限編程研究》一書)中明白地指出:在設計前期使用模式常常導致過度工程(over-engineering)。這是一個殘酷的現(xiàn)實,單憑對完美的追求無法寫出實用的代碼,而“實用”是軟件壓倒一切的要素。從一篇《停止過度工程》開始,Kerievsky撰寫了“Refactoring to Patterns”系列文章。這位猶太人用他民族性的睿智頭腦,敏銳地發(fā)現(xiàn)了軟件的后結構主義道路。而讓設計模式在飛速變化的網(wǎng)絡時代重新閃現(xiàn)光輝的,又是重構的力量。 在一篇流傳甚廣的帖子里,有人把《重構》與《設計模式》并列為“Java行業(yè)的圣經(jīng)”。在我看來這種并列其實并不準確。實際上,盡管我如此喜愛這本《重構》,但自從完成翻譯之后,就再也沒有讀過它。不,不是因為我已經(jīng)對它爛熟于心,而是因為重構已經(jīng)變成了我的另一種生活方式,變成了我每天的“面包與黃油”,變成了我們整個團隊的空氣與水,以至于無需再到書中尋找任何“神諭”。而《設計模式》,我倒是放在手邊時常翻閱,因為總是記得不那么真切。
內容概要
本書清晰地揭示了重構的過程,解釋了重構的原理和最佳實踐方式,并給出了何時以及何地應該開始挖掘代碼以求改善。書中給出了70多個可行的重構,每個重構都介紹了一種經(jīng)過驗證的代碼變換手法的動機和技術。本書提出的重構準則將幫助你一次一小步地修改你的代碼,從而減少了開發(fā)過程中的風險。 本書適合軟件開發(fā)人員、項目管理人員等閱讀,也可作為高等院校計算機及相關專業(yè)師生的參考讀物。
作者簡介
作者:(美國)福勒(Martin Fowler) 譯者:熊節(jié)Martin Fowler,世界軟件開發(fā)大師,在面向對象分析設計、UML、模式、XP和重構等領域都有卓越貢獻,現(xiàn)為著名軟件開發(fā)咨詢公司ThoughtWorks的首席科學家。他的多部著作《分析模式》、《UML精粹》和《企業(yè)應用架構模式》等都已經(jīng)成為膾炙人口的經(jīng)典。熊節(jié),ThoughtWorks中國公司的高級咨詢師、架構師和項目經(jīng)理,在大型企業(yè)應用及互聯(lián)網(wǎng)應用的架構和管理方面擁有豐富經(jīng)驗。作為敏捷方法學顧問和重構專家,他擁有在各種技術平臺、編程語言、軟件形態(tài)的項目中實施重構的豐富經(jīng)驗,并曾主持極具挑戰(zhàn)性的超大規(guī)模電信軟件系列重構工作。
書籍目錄
Chapter 1:Refactoring,a First Example 重構,第一個例子 The Starting Point 起點 The First Step in Refactoring 重構第一步 Decomposing and Redistributing the Statement Method 分解并重組slalemenl方法 Replacing the Conditional Logic on Price Code with Polymorphism 用多態(tài)代替價格條件邏輯代碼 Final Thoughts 結語 Chapter 2:Principles in Refactoring 重構原則 Defining Refactoring 何謂重構 Why Should You Refactor? 為何重構 When Should You Refactor? 何時重構 What Do I Tell My Manager? 怎樣說服經(jīng)理 Problems with Refactoring 重構的問題 Refactoring and Design 重構與設計 Refactoring and Performance 重構與性能 Where Did Refactoring Come From? 重構的起源 Chapter 3:Bad Smells in Code(by Kent Beck and Martin Fowler) 代碼壞昧 Duplicated Code 重復代碼 Long Method 過長方法 Large Class 過長類 Long Parameter List 過長參數(shù)列表 Divergent Change 發(fā)散式變化 Shotgun Surgery 霰彈式修改 Feature Envy 特性依戀 Data Clumps 數(shù)據(jù)泥團 Primitive Obsession 基本類型偏執(zhí) Switch Statements switch語句 Parallel Inheritance Hierarchies 平行繼承體系 Lazy Class 冗余類 Speculative Generality 理論上的一般性 Temporary Field 臨時字段 Message Chains 消息鏈 Middle Man 中間人 Inappropriate Intimacy 過度親密 Alternative Classes with Different Interfaces 接口不同的等效類 Incomplete Library Class 不完整的庫類 Data Class 數(shù)據(jù)類 Refused Bequest 拒絕繼承 Comments 注釋過多 Chapter 4:Building Tests 構建測試 The Value of Self-testing Code 自測試代碼的重要性 The JUnit Testing Framework Junit測試框架 Adding More Tests 添加更多測試 Chapter 5:Toward a Catalog of Refactorings 重構目錄 Format of the Refactorings 重構描述的格式 Finding References 尋找引用 How Mature Are These Refactorings? 這些重構的成熟度如何 Chapter 6:Composing Methods 組合方法 Extract Method 提取方法 Inline Method 內聯(lián)方法 Inline Temp 內聯(lián)臨時變量 *Replace Temp with Query 用查詢方法代替臨時變量 Introduce Explaining Variable 引入解釋性變量 Split Temporary Variable 分離臨時變量 *Remove Assignments to Parameters 去除參數(shù)賦值 Replace Method with Method Object 用方法對象代替方法 Substitute Algorithm 替換算法 Chapter 7:Moving Features Between Objects 在對象之間移動特性 *Move Method 移動方法 Move Field 移動字段 Extract Class 提取類 Inline Class 內聯(lián)類 Hide Delegate 隱藏委托類 Remove Middle Man 去除中間人 Introduce Foreign Method 引入外加方法 *Introduce Local Extension 引入本地擴展類 Chapter 8:Organizing Data 組織數(shù)據(jù) Self Encapsulate Field 自封裝字段 Replace Data Value with Object 用對象代替數(shù)據(jù)值 Change Value to Reference 將值對象改為引用對象 Change Reference to Value 將引用對象改為值對象 Replace Array with Object 用對象代替數(shù)組 Duplicate Observed Data 重復被觀察數(shù)據(jù) *Change Unidirectional Associationto Bidirectional 將單向關聯(lián)改為雙向 Change Bidirectional Association to Unidirectional 將雙向關聯(lián)改為單向 *Replace Magic Number with Symbolic Constant 用字面常量代替魔數(shù) Encapsulate Field 封裝字段 Encapsulate Collection 封裝集合 Replace Record with Data Class 用數(shù)據(jù)類代替記錄 *ReplaceType Code with Class 用類代替類型碼 Replace Type Code with Subclasses 用子類代替類型碼 Replace Type Code with State/Strategy用State/Strategy 代替類型碼 Replace Subclass with Fields 用字段代替子類 Chapter 9:Simplifying Conditional Expressions 簡化條件語句 Decompose Conditional 分解條件語句 Consolidate Conditional Expression 合并條件語句 Consolidate Duplicate Conditional Fragments 合并重復的條件片段 Remove Control Flag 去除控制標志 Replace Nested Conditional with Guard Clauses 用守衛(wèi)語句代替嵌套條件語句 Replace Conditional with Polymorphism 用多態(tài)代替條件語句 Introduce Null Object 引入Null對象 Introduce Assertion 引入斷言 Chapter 10:Making Method Calls Simpler 簡化方法調用 Rename Method 重命名方法 Add Parameter 添加參數(shù) Remove Parameter 去除參數(shù) Separate query from Modifier 將查詢方法與修改方法分離 Parameterize Method 參數(shù)化方法 Replace Parameter with Explicit Methods 用顯式方法代替參數(shù) Preserve Whole Object 保持對象完整 Replace Parameter with Method 用方法代替參數(shù) Introduce Parameter Object 引入?yún)?shù)對象 Remove Setting Method 去除設置方法 Hide Method 隱藏方法 Replace Constructor with Factory Method 用工廠方法代替構造器 Encapsulate Downcast 封裝向下轉型 Replace Error Code with Exception 用異常代替錯誤碼 Replace Exception with Test 用測試代替異?!hapter 11:Dealing with Generalization 處理泛化關系 Pull Up Field 上移字段 Pull UP Method 上移方法 Pull Up Constructor Body 上移構造器主體 Push Down Method 下移方法 Push Down Field 下移字段 Extract Subclass 提取子類 Extract Superclass 提取超類 Extract Interface 提取接口 Collapse Hierarchy 合并繼承層次 Form Template Method 形成Template Method Replace Inheritance with Delegation 用委托代替繼承 Replace Delegation with Inheritance 用繼承代替委托 Chapter 12:Big Refactorings(by Kent Beck and Martin Fowler) 大型重構 Tease Apart Inheritance 分解繼承層次 Convert Procedural Design to Objects 將過程式設計轉換為面向對象 Separate Domain from Presentation 將領域邏輯與表現(xiàn)分離 Extract Hierarchy 提取繼承層次 Chapter 13:Refactoring,Reuse,and Reality(by William Opdyke) 重構,復用與現(xiàn)實 A Reality Check 現(xiàn)實的檢驗 Whv Are Developers Reluctant to Refactor Their Programs? 開發(fā)人員為何不愿重構程序 A Reality Check(Revisited) 再談現(xiàn)實的檢驗 Resources and References for Refactoring 重構的資源和參考文獻 Implications Regarding Software Reuse and Technology Transfer 對軟件復用與技術傳播的意義 A Final Note 結語 References 參考文獻 Chapter 14:Refactoring Tools(by Don Roberts and John Brant) 重構工具 Refactoring with a Tool 使用工具重構 Technical Criteria for a Refactoring Tool 重構工具的技術標準 Practical Criteria for a Refactoring Tool 重構工具的實用標準 Wrap Up 結語 Chapter 15:Putting It All Together(by Kent Beck) 集大成 References參考文獻 List of Soundbites 要點列表 Updates 更新內容 Index 索引
章節(jié)摘錄
插圖:現(xiàn)在,重構的處境也是如此。我們知道重構的好處,我們知道重構可以給我們的工作帶來立竿見影的改變。但是我們還沒有獲得足夠的經(jīng)驗,我們還看不到它的局限性。這一節(jié)比我希望的要短。暫且如此吧。隨著更多人學會重構技巧,我們也將對它有更多了解。對你而言這意味著:雖然我堅決認為你應該嘗試一下重構,獲得它所提供的利益,但與此同時,你也應該時時監(jiān)控其過程,注意尋找重構可能引入的問題。請讓我們知道你所遭遇的問題。隨著對重構的了解日益增多,我們將找出更多解決辦法,并清楚知道哪些問題是真正難以解決的。數(shù)據(jù)庫重構經(jīng)常出問題的一個領域就是數(shù)據(jù)庫。絕大多數(shù)商用程序都與它們背后的數(shù)據(jù)庫結構緊密耦合在一起,這也是數(shù)據(jù)庫結構如此難以修改的原因之一。另一個原因是數(shù)據(jù)遷移(migration)。就算你非常小心地將系統(tǒng)分層,將數(shù)據(jù)庫結構和對象模型間的依賴降至最低,但數(shù)據(jù)庫結構的改變還是讓你不得不遷移所有數(shù)據(jù),這可能是件漫長而煩瑣的工作。在非對象數(shù)據(jù)庫中,解決這個問題的辦法之一就是:在對象模型和數(shù)據(jù)庫模型之間插入一個分隔層,這就可以隔離兩個模型各自的變化。升級某一模型時無需同時升級另一模型,只需升級上述的分隔層即可。這樣的分隔層會增加系統(tǒng)復雜度,但可以給你帶來很大的靈活度。如果你同時擁有多個數(shù)據(jù)庫,或如果數(shù)據(jù)庫模型較為復雜使你難以控制,那么即使不進行重構,這分隔層也是很重要的。你無需一開始就插入分隔層,可以在發(fā)現(xiàn)對象模型變得不穩(wěn)定時再產(chǎn)生它,這樣你就可以為你的改變找到最好的平衡點。對開發(fā)者而言,對象數(shù)據(jù)庫既有幫助也有妨礙。某些面向對象數(shù)據(jù)庫提供不同版本的對象之間的自動遷移功能,這減少了數(shù)據(jù)遷移時的工作量,但還是會損失一定時間。如果各數(shù)據(jù)庫之間的數(shù)據(jù)遷移并非自動進行,你就必須自行完成遷移工作,這個工作量可是很大的。這種情況下你必須更加留神類中的數(shù)據(jù)結構變化。你仍然可以放心將類的行為轉移過去,但轉移字段時就必須格外小心。數(shù)據(jù)尚未被轉移前你就得先運用訪問函數(shù)造成“數(shù)據(jù)已經(jīng)轉移”的假象。一旦你確定知道數(shù)據(jù)應該放在何處,就可以一次性地將數(shù)據(jù)遷移過去。
編輯推薦
重構,一言以蔽之,就是在不改變外部行為的前提下,有條不紊地改善代碼。多年前,正是《重構:改善既有代碼的設計》原版的出版,使重構終于從編程高手們的小圈子走出,成為眾多普通程序員日常開發(fā)工作中不可或缺的一部分?!吨貥?改善既有代碼的設計》也因此成為與《設計模式》齊名的經(jīng)典著作,被譯為中、德、俄、日等眾多語言,在世界范圍內暢銷不衰?!吨貥?改善既有代碼的設計》凝聚了軟件開發(fā)社區(qū)專家多年摸索而獲得的寶貴經(jīng)驗,擁有不因時光流逝而磨滅的價值。今天,無論是重構本身,業(yè)界對重構的理解,還是開發(fā)工具對重構的支持力度,都與《重構:改善既有代碼的設計》最初出版時不可同日而語,但書中所蘊涵的意味和精華,依然值得反復咀嚼,而且往往能夠常讀常新。
圖書封面
圖書標簽Tags
無
評論、評分、閱讀與下載