重構(gòu)讀書筆記——代碼的壞味道

Duplicated Code(重復(fù)代碼)

常見問題

  • 同一個(gè)類的兩個(gè)函數(shù)含有相同的表達(dá)式
  • 兩個(gè)互為兄弟的子類內(nèi)含相同的表達(dá)式
  • 兩個(gè)毫不相關(guān)的類有相同或相似的代碼

常用的重構(gòu)方法:

  • Extract Method 提煉方法
  • Pull Up Method 字段上移
  • Extract Class 提煉類

Long Method (過長函數(shù))

常見問題

  • 在開發(fā)維護(hù)過程中,函數(shù)越來越長,邏輯越來越復(fù)雜,難以理解

常用的重構(gòu)方法:

  • Extract Method 提煉方法
  • Decompose Conditional 分解表達(dá)式

注:函數(shù)并不是越短越好,一個(gè)函數(shù)盡量只完成一個(gè)功能。

Large Class(過大的類)

常見問題

  • 單個(gè)類功能太多
  • 有大量的實(shí)例變量,和重復(fù)代碼

常用的重構(gòu)方法:

  • Extract Class 提煉類
  • Extract Subclass 提煉子類
  • Extract Interface 提煉接口

Long Parameter List (過長參數(shù)列表)

常見問題

  • 函數(shù)功能越來越大
  • 不停添加各種特殊操作

常用的重構(gòu)方法:

  • Replace Parameter With Method 以函數(shù)對(duì)象取代函數(shù)
  • Preserve Whole Object 保持對(duì)象完整
  • Introduce Parameter Object 引入?yún)?shù)對(duì)象

DivergentChange (發(fā)散式變化)

常見問題

  • 某個(gè)類因?yàn)椴煌蛟诓煌较蛏习l(fā)生變化,如修改某個(gè)功能,需要同時(shí)修改某幾個(gè)函數(shù)

常用重構(gòu)方法

  • Extract Class 提煉類

Shotgun Surgery (散彈式修改)

常見問題

  • 一種變化引起多個(gè)類修改

常用重構(gòu)方法

  • Move Method 移動(dòng)方法
  • Move Field 移動(dòng)字段
  • Inline Class 內(nèi)部類

Feature Envy (依戀情結(jié))

常見問題

  • 類函數(shù)對(duì)某個(gè)類的以來程度遠(yuǎn)大于當(dāng)前類

常用重構(gòu)方法

  • Extract Method 提煉方法
  • Move Method 移動(dòng)方法

Data Clumps(數(shù)據(jù)泥團(tuán))

常見問題

  • 數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)混亂,多個(gè)類中的某些字段總是同時(shí)出現(xiàn)

常用重構(gòu)方法

  • Extract Class 提煉類
  • Preserve Whole Object 保持對(duì)象完整
  • Introduce Parameter Object 引入?yún)?shù)對(duì)象

Primitive Obsession(基本類型偏執(zhí))

常見問題

  • 大量使用基本類型
  • 未對(duì)數(shù)據(jù)進(jìn)行有效的抽象
  • 未對(duì)總是同時(shí)出現(xiàn)的字段封裝

常用重構(gòu)方法

  • Replace Type Code with Class
  • Extract Class

Switch Statements

常見問題

  • 面向?qū)ο蟪绦驊?yīng)該少用Switch(或Case)
  • Switch散布在多個(gè)地方,修改會(huì)影響多個(gè)類

常用重構(gòu)方法

  • Replace Conditional with Polymorphism
  • Replace Parameter with Explicit Methods

Parallel Inheritance Hierarchies(平行繼承體系)

常見問題

  • 為某個(gè)類添加子類時(shí),必須為另一個(gè)類相應(yīng)的增加一個(gè)子類

常用重構(gòu)方法

  • Move Method
  • Move Field

Lazy Class(冗贅類)

常見問題

  • 類和函數(shù)含有冗余操作

常用重構(gòu)方法

  • Collapse Hierarchy
  • Inline Class

Speculative Generality(夸夸其談未來性)

常見問題

  • 過分強(qiáng)調(diào)擴(kuò)展性,使用代碼難以理解
  • 添加許多多余的參數(shù)

常用重構(gòu)方法

  • Collapse Hierarchy
  • Remove Parameter

Temporary Field (令人迷惑的臨時(shí)字段)

常見問題

  • 類中某些字段,只有在及其特殊的條件下才會(huì)使用

常用重構(gòu)方法

  • Extract Class

Message Chains(過度耦合的消息鏈)

常見問題

  • 多個(gè)類之間依賴大,a.x().y().z()....
  • 產(chǎn)生多個(gè)臨時(shí)變量

常用重構(gòu)方法

  • Hide Delegate

Middle Man

常見問題

  • 過度使用委托,某個(gè)類的大部分功能都在委托給其他類

常用重構(gòu)方法

  • Remove Middle Man
  • Inline Method
  • Replace Delegation With Inheritance

Inappropriate Intimacy (狎昵關(guān)系)

常見問題

  • 兩個(gè)類互相依賴度極高,類的內(nèi)部實(shí)現(xiàn)影響彼此

常用重構(gòu)方法

  • Move Method
  • Move Field
  • Replace Inheritance Delegation

Alternative Class with Different Interfaces(異曲同工類)

常見問題

  • 兩個(gè)類 、函數(shù)做著實(shí)現(xiàn)相同的功能

常用重構(gòu)方法

  • Extract Superclass
  • Move Method

Incomplete Library Class(不完美的庫類)

常見問題

  • 引用的庫設(shè)計(jì)不完善
  • 有許多特殊操作

常用重構(gòu)方法

  • Introduce Foreign Method
  • Introduce Local Extensions

Data Class (純稚數(shù)據(jù)類)

常見問題

  • 只包含數(shù)據(jù)和getter setter
  • 內(nèi)部字段的 處理分散在各個(gè)類中

常用重構(gòu)方法

  • Encapsulate Field
  • Encapsulate Collection
  • Remove Setting Method

Refused Bequest(被拒絕的饋贈(zèng))

常見問題

  • 子類繼承過多不需要功能

常用重構(gòu)方法

  • Push Down Method
  • Push Down Field

Comments(過多的注釋)

當(dāng)你感覺需要撰寫注釋時(shí),請(qǐng)先嘗試重構(gòu),試著讓所有注釋變得多余

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容