顯示具有 Refactoring 標籤的文章。 顯示所有文章
顯示具有 Refactoring 標籤的文章。 顯示所有文章

2006年11月30日 星期四

[重構]簡化函式呼叫

1.Rename Method : 取個更合適的函式名

2.Add Parameter : 增加參數

3.Remove Parameter : 減少參數

4.Separate Query from Modifier : 將會回傳與會修改物件內部狀態的函式分開

5.Parameterize Method : 讓函式帶參數

6.Replace Parameter with Explicit Method : 以明確函式取代參數

7.Preserve Whole Object : 保持物件的完整

8.Replace Parameter with Method : 以函式取代參數

9.Introduce Parameter Object : 使用參數物件

10.Remove Setting Method : 去除不希望改變值的field的設值函式

11.Hide Method : 把不被其它class使用的method設為private或移除

12.Replace Constructor with Factory Method : 以Create method取代建構式

13.Encapsulate Downcast : 封裝向下轉型

14.Replace Error Code with Exception : 以錯誤碼來表示某些錯誤(異常)

15.Replace Exception with Test : 以測試取代異常

2006年11月28日 星期二

[重構]條件式的重構

1.Decompose Conditional : 分解條件式

2.Consolidate Condition Expression : 合併條件式

3.Consolidate Duplicate Conditional Fragments : 合併重複的條件片段

4.Remove Control Flag : 移去控制用的變數

5.Replace Nested Conditional with Guard Clauses : 以衛述句取代巢狀條件式

6.Replace Conditional with Polymorphism : 以多型取代條件式

7.Introduce Null Object : 使用NULL物件

8.Introduce Assertion :  使用Assertion

2006年11月27日 星期一

[重構]物件內資料成員的重構

1.Self Encapsulate Field : 自我封裝欄位 (為field提供get/set moethod)

2.Replace Data Value with Object : 以物件取代資料

3.Change Value to Reference : 將實值物件改為參考物件

4.Change Reference to Value : 將參考物件改為實值物件

5.Replace Array with Object : 以物件取代陣列

6.Duplicate Observed Data : 將資料copy到domain object中,並以Observer pattern作同步控制

7.Change Unidirectionl Association to Bidirectionl : 將物件的單向關聯改為雙向關聯

8.Change Bidirectionl Association to Unidirectionl : 將物件的雙向關聯改為單向關聯

9.Replace Magic Number with Symbolic Constant : 以符號取代魔數

10.Encapsulate Field : 封裝欄位 (儘量不提供public field)

11.Encapsulate Collection : 封裝群集

12.Replace Recode with Data Class : 以資料類別取代記錄

13.Replace Type Code with Class : 以類別取代型別

14.Replace Type Code with Subclass :  以子類別取代型別

15.Replace Type Code with State/Strategy :  以State/Strategy取代型別

16.Replace Subclass with Field : 以欄位取代子類別

[重構]在物件之間的重構

1.Move Method : 將函式搬到它適合的位置
2.Move Field : 將資料搬到它適合的位置

3.Extract Class : 將一個功能太多的class,提練為多個class

4.Inline Class : 將功能過小的Class,合併為一個

5.Hide Delegate : 在server端建立client所需要的函式,用以隱藏delegation

6.Remove Middle Man : 移除過多的簡單 delegation

7.Introduce Foreign Method : 加入外來的函式

8.Introduce Local Extention : 加入區域性擴展

2006年11月21日 星期二

[重構]函式(method)的重構

1.Extract Method:把一段程式碼獨立出來,另外成為一個函式

2.Inline Method:將函式展開其它函式(合併)

3.Inline Temp:對於只用一次的暫存變數,把所有引用此變數的動作,替換成對它賦值的運算式本身

4.Replace Temp with Query:把暫存變數所存放的運算式結果,提煉成一獨立函式

5.Introdce Explaining Variable:把複雜的運算式的結果放進一暫存變數,並以變數名解釋其用途

6.Split Temporary Variable:不將一個暫存區域變數,用於多個功能

7.Remove Assignments to Parameters:不更改參數值(以一暫存變數複製之)

8.Replace Method with Method Object:將函式放入一物件,區域變數為其data field

9.Substitute Algorithm:將某個演算法替換成另一個更清晰的演算法

2006年11月17日 星期五

[重構]bad smells in code

If it strikes,change it!

以下是一些需要被重構的code,若你的程式碼出現在下列的某幾種現象時,請改善它

1.Duplicated Code : 重覆的程式碼
2.Long Method : 太長的函式
3.Large Class : 過大的類別
4.Long Parameter List : 太長的參數列
5.Divergent Change : 發散式變化 (一個class受多種變化的影響)
6.Shotgun Surgery : 霰彈式修改 (一種變化會引發多個class的修改)
7.Feature Envy : 依戀情結 (函式對於某個class的存取,高過於自己的host class)
8.Data Clumps : 資料泥團 (某些資料總是綁在一起並,一起出現在多個地方)
9.Primitive Obsession : 基本型別偏執 (將幾個俱相關的基本型別合併成一個小物件)
10.Switch Statement : (少用switch句型)
11.Parallel Inheritance Hierarchies : 平行繼承體系 (不同繼承體系中存在著相同的class)
12.Lazy Class : 冗員類別 (除去沒有必要的class)
13.Speculative Generality : 非必要地談未來性 (除去非必要的hook)
14.Temporary Field : 暫存欄位 (除去class中,暫存用的欄位)
15.Message Chains : 過度耦合的訊息鏈 (連續向不同的函式要求不同的物件)
16.Middle Man : 中間人 (除去一些不做實事的函式)
17.Inappropriate : 狎暱關係 (兩個class花太多時間去用對方的private成員)
18.Alternative Classes with Different Interfaces : 異曲同工的類別 (兩個不同函式卻做一樣的事)
19.Incomplete Library Class : 不完備的函式庫 (想修改library部分功能時)
20.Data Class : 純稚的資料類別 (封裝好data class)
21.Refused Bequest : 被拒絕的遺贈 (當subclass 不希望或不需要得到superclass的功能)
22.Comments : 過多的註解 (試著讓註解變得多餘)

當你感覺需要撰寫註解時,請先嘗試重構,試著所有註解都變成多餘的 :)

[重構]重構的時機

Don Robert所提出的準則: 事不過三,三則重構 (three strikes and you refactor)

這句話的意思是說,某件事第一次做時就直接去作,第二次做時也許會覺得很麻煩,第三次做的時候,就代表需要重構了.

其它重構的時機有

1.要加入新功能的時候

2.要修改bug的時候

3.在復審(review)程式碼的時候

而何時不該重構呢?就是你的code己經亂到幾乎要重寫的地步,那麼就不用浪貴那麼多的時間了. :)

2006年11月16日 星期四

Refactoring 重構

「任何一個傻瓜都能寫出計算機可以理解的程式碼,唯有寫出人類容易理解的程式碼,才是優秀的程式員.」

這是兩年前吸引我去閱讀Refactoring(重構)的一句話,就名詞定義上而言,重構是一種對軟體內部的調整,在不改變外在行為的原則下,提高程式碼的可讀性,以及降低成本,提昇效能.