Replace Constructors with Creation Methods

重構-向範式前進(Refactoring to Patterns) - Replace Constructors with Creation Methods 

覺得這個很重要,所以紀錄一下。

在物件導向軟體開發中,應該有很多時候需要建立某些物件,而這些物件又需要一些必要的參數透過建構式傳遞進去,各種不同的建構式在使用時容易讓人混淆,透過容易理解的方法名稱,取代複雜的建構式。

重構步驟

  1. 找出呼叫建構式的地方,先透過Extract Method,將原本呼叫的程式碼提取出來,做一個public static方法
  2. 將該方法透過Move Method,搬移到原本的目標類別內
  3. Client端就直接呼叫該類別的靜態方法產生所需物件
  4. 重複上述步驟將建構式方法都替換為creation method
  5. 將原本的建構式改為private,讓client端需要使用到物件的話,就都透過creation method取得instance

備註

  1. 如果creation method所需要的參數過多,可以考慮使用introduce Parameter Object。就是將參數包裝成一個物件,透過這個物件傳遞給creation method即可
  2. 如果有很多很多個建構式是比較常呼叫的,可以考慮只將常用的建構式替換為creation Method,而保留public的建構式。
  3. 如果有非常非常多的建構式,為了避免該類別因為這些creation method太多,而不再能夠強烈的表達出該類別的職責,可以考慮將creation method都拉出來做一個factory類別。這邊的factory指的是不歸屬任何繼承體系,就只是單純的用來產生一個instance回傳的工廠而已。

說人話版本

如果有個類別,他的建構式有很多的參數,而且返回一個instance(不一定是同一個),這個時候在client端去呼叫使用的時候,常常會有理解上的困難;將這些方法重新取個好理解的名字,接著把這些抽象出來的Creation Method塞回去原來的類別裡面,這樣子使用的時候,就可以直接去呼叫原本類別所提供的各種Creation Method。

可是如果因為這樣做了,那個類別裡面充斥著許許多多我們新作出來的Creation Method,造成原本類別的定義或是用法,沒有那麼清晰了,反而更容易讓我們混淆,那麼就是時候將這些Creation Method抓出來,弄一個獨立、單純的類別,來放這些Creation Method。