建構函數初始化
2006 年 2 月 7 日
建構函數初始化是一種方法,您可以在物件的建立方法中傳入物件所需的所有合作者。這是 SetterInitialization 的替代方案。
因此,要建立一個具有名字、姓氏和最愛酒吧清單的人,我們可能會看到類似以下的內容
# ruby mf = Person.new('martin', 'fowler', ['Turners Oyster Bar', 'Square and Compass'])
這樣做可以確保您始終擁有狀態良好的物件,隨時可以使用。這也是一種相當簡潔的方法,讓您可以在一行中啟動物件。如果您只想對物件執行一件事,您也可以在同一行中指定它或呼叫其方法,這表示您不需要變數。
在建構函數中宣告所有必要的合作者,可以清楚地說明需要哪些合作者,讓您更容易了解如何啟動類別。對於每個有效的強制合作者組合,您需要一個建構函數方法。通常提供包含常見的非強制合作者的建構函數也很方便。
此方法可以輕鬆看出不可變和可更新屬性的差異,因為不可變屬性沒有設定方法,它們只會在建構方法中初始化。
建構函數初始化是我的首選。有些情況很難用這種方式設定,我偶爾會偏好設定器初始化,但建構函數初始化通常是最佳選擇。
常見問題
如果新物件有許多不同的合法組合怎麼辦?人們常常擔心,如果您使用這種方法,將會有數不清的建構函數方法。大多數情況下,這不是問題 - 只有少數幾個。您在此處真正需要的只有強制合作者,而且它們的組合幾乎不會超過幾個。
如果建構函數中有許多合作者要提供怎麼辦?大量的建構參數,就像任何大型參數清單一樣,都是 CodeSmell。通常,當我看到這些時,我發現許多參數是 DataClump,應該替換為它們自己的物件。話雖如此,建構函數方法的參數多於其他方法並不少見 - 但它們是發現資料塊的好地方。
這如何與 ContextualValidation 相符?此處的背景是物件的基本用法 - 本質上是最低限度有用的狀態。這可能不適用於其他各種活動,但它應該足夠有效。