我們在我們的領域模型你會怎樣滑稽的長期進攻大的構造,如此之大,智能感知放棄試圖將其全部展示給你幾個對象......重構大型構造
提示一個類型有50左右的參數,主要是數值類型,幾種參考類型:
public class MyLegacyType
{
public MyLegacyType(int a1, int a2, int a3, ... int a50) // etc
{
}
}
我現在就說它,這種類型不能改變。類型本身邏輯上代表了一個實體,這恰好是財產沉重的。構造這種類型的調用者提供來自多個來源的大部分參數,儘管有些是默認的。也許有一種模式來爲施工提供來源而不是結果。
但是,可以改變的是如何創建類型。目前我們有部分代碼遭受:
- 該類型缺乏智能感知。
- 醜陋且無法讀取的代碼。
- 歸因於Connascence of Position的痛苦。
一個直接的答案是利用可選參數的默認值和命名參數來幫助合併。我們在其他類型的某種程度上這樣做,工作好。
但是,它感覺好像是完全重構的一半。
另一個顯而易見的解決方案是使用具有用於構造函數參數的屬性的容器類型來減少構造函數參數。這很好地整理了構造函數,並允許您在容器中嵌入默認值,但本質上會將問題轉移到另一種類型,並可能與可選/命名參數用法相同。
還有Fluent構造函數的概念......每個屬性(WithIntA
,WithIntB
)或容器類型(WithTheseInts(IntContainer c)
)的基礎上。就我個人而言,我喜歡從調用方來的這種方法,但是對於一個大型的方法來說,它會變得羅嗦,並且感覺好像我剛剛提出了一個問題而不是解決問題。
我的問題,如果有一個埋在這個混亂,是:是這些可行的重構策略的問題?請有一些相關的經驗,陷阱或批評有所迴應的任何答案。我傾向於流利的東西,因爲我認爲它看起來很酷,而且非常易讀,並且合併友好。
我感覺好像我錯過了構造函數重構的聖盃 - 所以我願意接受建議。當然,這也可能只是一個不幸的和不可避免的副作用,首先有這麼多屬性的類型......
我會用你的第二種方法(容器類型具有過去是構造函數參數的屬性)來選擇構造函數參數。流利的接口都不錯,但能有點混亂,如果你有鏈很多方法調用IMO –