編輯推薦
軟件工程領(lǐng)域的超級(jí)經(jīng)典巨著,與另一巨著《設(shè)計(jì)模式》并稱"軟工雙雄",全美銷量超過(guò)100000冊(cè),亞馬遜書店五星書。
在本書中,作者M(jìn)artin Fowler充分展示了何處可能需要重構(gòu),以及如何將不好的設(shè)計(jì)改造為良好的設(shè)計(jì)。
當(dāng)對(duì)象技術(shù)成為老生常談之后——尤其在Java編程語(yǔ)言之中,新的問(wèn)題也在軟件開(kāi)發(fā)社區(qū)中浮現(xiàn)了出來(lái)。缺乏經(jīng)驗(yàn)的開(kāi)發(fā)人員完成了大量粗劣設(shè)計(jì),獲得的程序不但缺乏效率,也難以維護(hù)和擴(kuò)展。漸漸地,軟件系統(tǒng)專家發(fā)現(xiàn),與這些沿襲下來(lái)的、質(zhì)量不佳的程序共處,是多么艱難。對(duì)象專家運(yùn)用許多技術(shù)來(lái)改善既有程序的結(jié)構(gòu)完美性與性能,已有數(shù)年之久。
內(nèi)容簡(jiǎn)介
Martin Fowler和本書另幾位作者清楚揭示了重構(gòu)過(guò)程,他們?yōu)槊嫦驅(qū)ο筌浖_(kāi)發(fā)所做的貢獻(xiàn),難以衡量。本書解釋重構(gòu)的原理(principles)和最佳實(shí)踐方式(best practices),并指出何時(shí)何地你應(yīng)該開(kāi)始挖掘你的代碼以求改善。
本書的核心是一份完整的重構(gòu)名錄(catalog of refactoring),其中每一項(xiàng)都介紹一種經(jīng)過(guò)實(shí)證的代碼變換手法(code transformation)的動(dòng)機(jī)和技術(shù)。某些項(xiàng)目如Extract Method和Move Field看起來(lái)可能很淺顯,但不要掉以輕心,因?yàn)槔斫膺@類技術(shù)正是有條不紊地進(jìn)行重構(gòu)的關(guān)鍵。本書所提的這些重構(gòu)準(zhǔn)則將幫助你一次一小步地修改你的代碼,這就減少了過(guò)程中的風(fēng)險(xiǎn)。很快你就會(huì)把這些重構(gòu)準(zhǔn)則和其名稱加入自己的開(kāi)發(fā)詞典中,并且朗朗上口。
作者簡(jiǎn)介
Martin Fowler是一位獨(dú)立咨詢顧問(wèn),他運(yùn)用對(duì)象技術(shù)解決企業(yè)問(wèn)題已經(jīng)超過(guò)十年。他的顧問(wèn)領(lǐng)域包括健康管理、金融貿(mào)易,以及法人財(cái)務(wù)。他的客戶包括Chrysler,Citibank,UK National Health Service,AndersenConsulting,NetscapeCommunications。此外Fowler也是objects、UML、patterns技術(shù)的一位合格講師,他是《AnalysisPatterns》和《UMLDistilled》的作者。
作者:(美國(guó))福勒(Martin Fowler) Martin Fowler,世界軟件開(kāi)發(fā)大師,在面向?qū)ο蠓治鲈O(shè)計(jì)、UML、模式、XP和重構(gòu)等領(lǐng)域都有卓越貢獻(xiàn),現(xiàn)為著名軟件開(kāi)發(fā)咨詢公司ThoughtWorks的首席科學(xué)家。他的多部著作《分析模式》、《UML精粹》和《企業(yè)應(yīng)用架構(gòu)模式》等都已經(jīng)成為膾炙人口的經(jīng)典。
譯者:熊節(jié)
熊節(jié),ThoughtWorks中國(guó)公司的高級(jí)咨詢師、架構(gòu)師和項(xiàng)目經(jīng)理,在大型企業(yè)應(yīng)用及互聯(lián)網(wǎng)應(yīng)用的架構(gòu)和管理方面擁有豐富經(jīng)驗(yàn)。作為敏捷方法學(xué)顧問(wèn)和重構(gòu)專家,他擁有在各種技術(shù)平臺(tái)、編程語(yǔ)言、軟件形態(tài)的項(xiàng)目中實(shí)施重構(gòu)的豐富經(jīng)驗(yàn),并曾主持極具挑戰(zhàn)性的超大規(guī)模電信軟件系列重構(gòu)工作。
目錄
第1章 重構(gòu),第一個(gè)案例1
1.1 起點(diǎn)1
1.2 重構(gòu)的第一步7
1.3 分解并重組statement()8
1.4 運(yùn)用多態(tài)取代與價(jià)格相關(guān)的條件邏輯34
1.5 結(jié)語(yǔ)52
第2章 重構(gòu)原則53
2.1 何謂重構(gòu)53
2.2 為何重構(gòu)55
2.3 何時(shí)重構(gòu)57
2.4 怎么對(duì)經(jīng)理說(shuō)60
2.5 重構(gòu)的難題62
2.6 重構(gòu)與設(shè)計(jì)66
2.7 重構(gòu)與性能69
2.8 重構(gòu)起源何處71
第3章 代碼的壞味道75
3.1 DuplicatedCode(重復(fù)代碼)76
3.2 LongMethod(過(guò)長(zhǎng)函數(shù))76
3.3 LargeClass(過(guò)大的類)78
3.4 LongParameterList(過(guò)長(zhǎng)參數(shù)列)78
3.5 DivergentChange(發(fā)散式變化)79
3.6 ShotgunSurgery(霰彈式修改)80
3.7 FeatureEnvy(依戀情結(jié))80
3.8 DataClumps(數(shù)據(jù)泥團(tuán))81
3.9 PrimitiveObsession(基本類型偏執(zhí))81
3.10 SwitchStatements(switch驚悚現(xiàn)身)82
3.11 ParallelInheritanceHierarchies(平行繼承體系)83
3.12 LazyClass(冗贅類)83
3.13 SpeculativeGenerality(夸夸其談未來(lái)性)83
3.14 TemporaryField(令人迷惑的暫時(shí)字段)84
3.15 MessageChains(過(guò)度耦合的消息鏈)84
3.16 MiddleMan(中間人)85
3.17 InappropriateIntimacy(狎昵關(guān)系)85
3.18 AlternativeClasseswithDifferentInterfaces(異曲同工的類)85
3.19 IncompleteLibraryClass(不完美的庫(kù)類)86
3.20 DataClass(純稚的數(shù)據(jù)類)86
3.21 RefusedBequest(被拒絕的遺贈(zèng))87
3.22 Comments(過(guò)多的注釋)87
第4章 構(gòu)筑測(cè)試體系89
4.1 自測(cè)試代碼的價(jià)值89
4.2 JUnit測(cè)試框架91
4.3 添加更多測(cè)試97
第5章 重構(gòu)列表103
5.1 重構(gòu)的記錄格式103
5.2 尋找引用點(diǎn)105
5.3 這些重構(gòu)手法有多成熟106
第6章 重新組織函數(shù)109
6.1 ExtractMethod(提煉函數(shù))110
6.2 InlineMethod(內(nèi)聯(lián)函數(shù))117
6.3 InlineTemp(內(nèi)聯(lián)臨時(shí)變量)119
6.4 ReplaceTempwithQuery(以查詢?nèi)〈R時(shí)變量)120
6.5 IntroduceExplainingVariable(引入解釋性變量)124
6.6 SplitTemporaryVariable(分解臨時(shí)變量)128
6.7 RemoveAssignmentstoParameters(移除對(duì)參數(shù)的賦值)131
6.8 ReplaceMethodwithMethodObject(以函數(shù)對(duì)象取代函數(shù))135
6.9 SubstituteAlgorithm(替換算法)139
第7章 在對(duì)象之間搬移特性141
7.1 MoveMethod(搬移函數(shù))142
7.2 MoveField(搬移字段)146
7.3 ExtractClass(提煉類)149
7.4 InlineClass(將類內(nèi)聯(lián)化)154
7.5 HideDelegate(隱藏“委托關(guān)系”)157
7.6 RemoveMiddleMan(移除中間人)160
7.7 IntroduceForeignMethod(引入外加函數(shù))162
7.8 IntroduceLocalExtension(引入本地?cái)U(kuò)展)164
第8章 重新組織數(shù)據(jù)169
8.1 SelfEncapsulateField(自封裝字段)171
8.2 ReplaceDataValuewithObject(以對(duì)象取代數(shù)據(jù)值)175
8.3 ChangeValuetoReference(將值對(duì)象改為引用對(duì)象)179
8.4 ChangeReferencetoValue(將引用對(duì)象改為值對(duì)象)183
8.5 ReplaceArraywithObject(以對(duì)象取代數(shù)組)186
8.6 DuplicateObservedData(復(fù)制“被監(jiān)視數(shù)據(jù)”)189
8.7 ChangeUnidirectionalAssociationtoBidirectional(將單向關(guān)聯(lián)改為雙向關(guān)聯(lián))197
8.8 ChangeBidirectionalAssociationtoUnidirectional(將雙向關(guān)聯(lián)改為單向關(guān)聯(lián))200
8.9 ReplaceMagicNumberwithSymbolicConstant(以字面常量取代魔法數(shù))204
8.10 EncapsulateField(封裝字段)206
8.11 EncapsulateCollection(封裝集合)208
8.12 ReplaceRecordwithDataClass(以數(shù)據(jù)類取代記錄)217
8.13 ReplaceTypeCodewithClass(以類取代類型碼)218
8.14 ReplaceTypeCodewithSubclasses(以子類取代類型碼)223
8.15 ReplaceTypeCodewithState/Strategy(以State/Strategy取代類型碼)227
8.16 ReplaceSubclasswithFields(以字段取代子類)232
第9章 簡(jiǎn)化條件表達(dá)式237
9.1 DecomposeConditional(分解條件表達(dá)式)238
9.2 ConsolidateConditionalExpression(合并條件表達(dá)式)240
9.3 ConsolidateDuplicateConditionalFragments(合并重復(fù)的條件片段)243
9.4 RemoveControlFlag(移除控制標(biāo)記)245
9.5 ReplaceNestedConditionalwithGuardClauses(以衛(wèi)語(yǔ)句取代嵌套條件表達(dá)式)250
9.6 ReplaceConditionalwithPolymorphism(以多態(tài)取代條件表達(dá)式)255
9.7 IntroduceNullObject(引入Null對(duì)象)260
9.8 IntroduceAssertion(引入斷言)267
第10章 簡(jiǎn)化函數(shù)調(diào)用271
10.1 RenameMethod(函數(shù)改名)273
10.2 AddParameter(添加參數(shù))275
10.3 RemoveParameter(移除參數(shù))277
10.4 SeparateQueryfromModifier(將查詢函數(shù)和修改函數(shù)分離)279
10.5 ParameterizeMethod(令函數(shù)攜帶參數(shù))283
10.6 ReplaceParameterwithExplicitMethods(以明確函數(shù)取代參數(shù))285
10.7 PreserveWholeObject(保持對(duì)象完整)288
10.8 ReplaceParameterwithMethods(以函數(shù)取代參數(shù))292
10.9 IntroduceParameterObject(引入?yún)?shù)對(duì)象)295
10.10 RemoveSettingMethod(移除設(shè)值函數(shù))300
10.11 HideMethod(隱藏函數(shù))303
10.12 ReplaceConstructorwithFactoryMethod(以工廠函數(shù)取代構(gòu)造函數(shù))304
10.13 EncapsulateDowncast(封裝向下轉(zhuǎn)型)308
10.14 ReplaceErrorCodewithException(以異常取代錯(cuò)誤碼)310
10.15 ReplaceExceptionwithTest(以測(cè)試取代異常)315
第11章 處理概括關(guān)系319
11.1 PullUpField(字段上移)320
11.2 PullUpMethod(函數(shù)上移)322
11.3 PullUpConstructorBody(構(gòu)造函數(shù)本體上移)325
11.4 PushDownMethod(函數(shù)下移)328
11.5 PushDownField(字段下移)329
11.6 ExtractSubclass(提煉子類)330
……
第12章 大型重構(gòu)359
第13章 重構(gòu),復(fù)用與現(xiàn)實(shí)379
第14章 重構(gòu)工具401
第15章 總結(jié)409
參考書目413
要點(diǎn)列表417
索引419