《重構:改善既有代碼的設計》

《重構:改善既有代碼的設計》

《重構:改善既有代碼的設計》書中地揭示了重構的過程,解釋了重構的原理和最佳實踐方式,並給出了何時以及何地應該開始挖掘代碼以求改善。

基本信息

基本信息

《重構:改善既有代碼的設計》重構:改善既有代碼的設計

作者:(美)MartinFowler著
出版社:人民郵電出版社出版日期:2010-04
ISBN:711522170版次:1
包裝:平裝開本:小16開
頁數:428頁印張:1次

內容介紹

本書清晰地揭示了重構的過程,解釋了重構的原理和最佳實踐方式,並給出了何時以及何地應該開始挖掘代碼以求改善。書中給出了70多個可行的重構,每個重構都介紹了一種經過驗證的代碼變換手法的動機和技術。本書提出的重構準則將幫助你一次一小步地修改你的代碼,從而減少了開發過程中的風險。本書適合軟體開發人員、項目管理人員等閱讀,也可作為高等院校計算機及相關專業師生的參考讀物。

作者簡介

姓名:(美)福勒熊節
作者簡介:
作品:《重構:改善既有代碼的設計》姓名:(美)MartinFowler著;熊節譯著
作者簡介:
作品:《重構:改善既有代碼的設計》

目錄

第1章 重構,第一個案例1
1.1 起點1
1.2 重構的第一步7
1.3 分解並重組statement()8
1.4 運用多態取代與價格相關的條件邏輯34
1.5 結語52
第2章 重構原則53
2.1 何謂重構53
2.2 為何重構55
2.3 何時重構57
2.4 怎么對經理說60
2.5 重構的難題62
2.6 重構與設計66
2.7 重構與性能69
2.8 重構起源何處71
第3章 代碼的壞味道75
3.1 DuplicatedCode(重複代碼)76
3.2 LongMethod(過長函式)76
3.3 LargeClass(過大的類)78
3.4 LongParameterList(過長參數列)78
.3.5 DivergentChange(發散式變化)79
3.6 ShotgunSurgery(霰彈式修改)80
3.7 FeatureEnvy(依戀情結)80
3.8 DataClumps(數據泥團)81
3.9 PrimitiveObsession(基本類型偏執)81
3.10 SwitchStatements(switch驚悚現身)82
3.11 ParallelInheritanceHierarchies(平行繼承體系)83
3.12 LazyClass(冗贅類)83
3.13 Speculativegenerality(誇誇其談未來性)83
3.14 TemporaryField(令人迷惑的暫時欄位)84
3.15 MessageChains(過度耦合的訊息鏈)84
3.16 MiddleMan(中間人)85
3.17 inappropriateIntimacy(狎昵關係)85
3.18 AlternativeClasseswithDifferentInterfaces(異曲同工的類)85
3.19 IncompleteLibraryClass(不完美的庫類)86
3.20 DataClass(純稚的數據類)86
3.21 Refusedbequest(被拒絕的遺贈)87
3.22 Comments(過多的注釋)87
第4章 構築測試體系89
4.1 自測試代碼的價值89
4.2 JUnit測試框架91
4.3 添加更多測試97
第5章 重構列表103
5.1 重構的記錄格式103
5.2 尋找引用點105
5.3 這些重構手法有多成熟106
第6章 重新組織函式109
6.1 ExtractMethod(提煉函式)110
6.2 InlineMethod(內聯函式)117
6.3 InlineTemp(內聯臨時變數)119
6.4 ReplaceTempwithQuery(以查詢取代臨時變數)120
6.5 IntroduceExplainingVariable(引入解釋性變數)124
6.6 SplitTemporaryVariable(分解臨時變數)128
6.7 RemoveAssignmentstoParameters(移除對參數的賦值)131
6.8 ReplaceMethodwithMethodObject(以函式對象取代函式)135
6.9 SubstituteAlgorithm(替換算法)139
第7章 在對象之間搬移特性141
7.1 MoveMethod(搬移函式)142
7.2 MoveField(搬移欄位)146
7.3 ExtractClass(提煉類)149
7.4 InlineClass(將類內聯化)154
7.5 HideDelegate(隱藏“委託關係”)157
7.6 RemoveMiddleMan(移除中間人)160
7.7 IntroduceForeignMethod(引入外加函式)162
7.8 IntroduceLocalExtension(引入本地擴展)164
第8章 重新組織數據169
8.1 SelfencapsulateField(自封裝欄位)171
8.2 ReplaceDataValuewithObject(以對象取代數據值)175
8.3 ChangeValuetoReference(將值對象改為引用對象)179
8.4 ChangeReferencetoValue(將引用對象改為值對象)183
8.5 ReplaceArraywithObject(以對象取代數組)186
8.6 DuplicateObservedData(複製“被監視數據”)189
8.7 ChangeUnidirectionalAssociationtoBidirectional(將單向關聯改為雙向關聯)197
8.8 ChangeBidirectionalAssociationtoUnidirectional(將雙向關聯改為單向關聯)200
8.9 ReplaceMagicNumberwithSymbolicConstant(以字面常量取代魔法數)204
8.10 EncapsulateField(封裝欄位)206
8.11 EncapsulateCollection(封裝集合)208
8.12 ReplaceRecordwithDataClass(以數據類取代記錄)217
8.13 ReplaceTypeCodewithClass(以類取代類型碼)218
8.14 ReplaceTypeCodewithSubclasses(以子類取代類型碼)223
8.15 ReplaceTypeCodewithState/Strategy(以State/Strategy取代類型碼)227
8.16 ReplaceSubclasswithFields(以欄位取代子類)232
第9章 簡化條件表達式237
9.1 DecomposeConditional(分解條件表達式)238
9.2 consolidateConditionalExpression(合併條件表達式)240
9.3 ConsolidateDuplicateConditionalFragments(合併重複的條件片段)243
9.4 RemoveControlFlag(移除控制標記)245
9.5 ReplaceNestedConditionalwithGuardClauses(以衛語句取代嵌套條件表達式)250
9.6 ReplaceConditionalwithPolymorphism(以多態取代條件表達式)255
9.7 IntroduceNullObject(引入Null對象)260
9.8 IntroduceAssertion(引入斷言)267
第10章 簡化函式調用271
10.1 RenameMethod(函式改名)273
10.2 AddParameter(添加參數)275
10.3 RemoveParameter(移除參數)277
10.4 SeparateQueryfromModifier(將查詢函式和修改函式分離)279
10.5 ParameterizeMethod(令函式攜帶參數)283
10.6 ReplaceParameterwithExplicitMethods(以明確函式取代參數)285
10.7 PreserveWholeObject(保持對象完整)288
10.8 ReplaceParameterwithMethods(以函式取代參數)292
10.9 IntroduceParameterObject(引入參數對象)295
10.10 RemoveSettingMethod(移除設值函式)300
10.11 HideMethod(隱藏函式)303
10.12 ReplaceConstructorwithFactoryMethod(以工廠函式取代構造函式)304
10.13 EncapsulateDowncast(封裝向下轉型)308
10.14 ReplaceErrorCodewithException(以異常取代錯誤碼)310
10.15 ReplaceExceptionwithTest(以測試取代異常)315
第11章 處理概括關係319
11.1 PullUpField(欄位上移)320
11.2 PullUpMethod(函式上移)322
11.3 PullUpConstructorBody(構造函式本體上移)325
11.4 PushDownMethod(函式下移)328
11.5 PushDownField(欄位下移)329
11.6 ExtractSubclass(提煉子類)330
11.7 ExtractSuperclass(提煉超類)336
11.8 ExtractInterface(提煉接口)341
11.9 CollapseHierarchy(摺疊繼承體系)344
11.10 FormTemPlateMethod(塑造模板函式)345
11.11 ReplaceInheritancewithDelegation(以委託取代繼承)352
11.12 ReplaceDelegationwithInheritance(以繼承取代委託)355
第12章 大型重構359
12.1 TeaseApartInheritance(梳理並分解繼承體系)362
12.2 ConvertProceduralDesigntoObjects(將過程化設計轉化為對象設計)368
12.3 SeparateDomainfromPresentation(將領域和表述/顯示分離)370
12.4 ExtractHierarchy(提煉繼承體系)375
第13章 重構,復用與現實379
13.1 現實的檢驗380
13.2 為什麼開發者不願意重構他們的程式381
13.3 再論現實的檢驗394
13.4 重構的資源和參考資料394
13.5 從重構聯想到軟體復用和技術傳播395
13.6 小結397
13.7 參考文獻397
第14章 重構工具401
14.1 使用工具進行重構401
14.2 重構工具的技術標準403
14.3 重構工具的實用標準405
14.4 小結407
第15章 總結409
參考書目413
要點列表417
索引419

書摘

第1章 重構,第一個案例
我該從何說起呢?按照傳統做法,一開始介紹某個東西時,首先應該大致講講它的歷史、主要原理等等。可是每當有人在會場上介紹這些東西,總是誘發我的瞌睡蟲。我的思緒開始遊蕩,我的眼神開始迷離,直到主講人秀出實例,我才能夠提起精神。實例之所以可以拯救我於太虛之中,因為它讓我看見事情在真正進行。談原理,很容易流於泛泛,又很難說明如何實際套用。給出一個實例,就可以幫助我把事情認識清楚。

所以我決定從一個實例說起。在此過程中我將告訴你很多重構的道理,並且讓你對重構過程有一點感覺。然後我才能向你展開通常的原理介紹。

但是,面對這個介紹性實例,我遇到了一個大問題。如果我選擇一個大型程式,那么對程式自身的描述和對整個重構過程的描述就太複雜了,任何讀者都不忍卒讀(我試了一下,哪怕稍微複雜一點的例子都會超過100頁)。如果我選擇一個容易理解的小程式,又恐怕看不出重構的價值。

和任何立志要介紹“套用於真實世界中的有用技術”的人一樣,我陷入了一個十分典型的兩難困境。我只能帶引你看看如何在一個我所選擇的小程式中進行重構,然而坦白說,那個程式的規模根本不值得我們那么做。但是如果我給你看的代碼是大系統的一部分,重構技術很快就變得重要起來。所以請你一邊觀賞這個小例子,一邊想像它身處於一個大得多的系統。
……

盤點程式語言與程式設計書籍

程式語言(programming language),又稱程式設計語言(program design language,簡稱PDL),是一組用來定義電腦程式的語法規則。它是一種被標準化的交流技巧,用來向計算機發出指令。一種計算機語言讓程式設計師能夠準確地定義計算機所需要使用的數據,並精確地定義在不同情況下所應當採取的行動

相關詞條

相關搜尋

熱門詞條

聯絡我們