簡體   English   中英

是否應該在構造函數簽名中列出可選參數?

[英]Should optional parameters be listed in a constructor signature?

考慮到最佳實踐,將可選參數添加到構造函數簽名的明智方法是什么? 您是否應該只列出核心參數並依賴於初始化程序的非可選屬性? 在我看來是最明智的方法!

特別是通過使用對象初始化程序分配屬性值的能力,構造函數的多個重載遠沒有以前有用。 過去,它們對於設置可變性以實現代碼緊湊性非常有用。

現在可以寫

MyClass my = new MyClass() { PropA = 1, PropB = 2 };

幾乎和

MyClass my = new MyClass(1, 2);

同時更具表現力。

但是,有時對象的性質決定了過載將為對象使用者提供有意義的契約。 例如,為接受長度和寬度的Rectangle類提供重載並不是沒有道理的(我不會在代碼審查中看到它)。 就個人而言,我仍然不會提供重載,因為對象初始化程序的語法更具表現力,避免了諸如“是Rectangle(int length,int width)還是Rectangle(int width,int length)?”之類的問題。 在閱讀代碼時(我知道,在編寫代碼時intellisense會有所幫助)。

我相信這是個好方法。 人們通常使用屬性作為可選參數。 但這使對象可變。 使用可選的構造函數參數/ ctor重載是使對象保持不變的好方法。

根據經驗,我只向構造函數添加創建有效的工作對象所需的參數。 隨着對象初始化程序語法的出現,客戶端可以更輕松地配置他想要的任何其他參數。

但是,我認為該規則應該有很多例外:很多時候,您可能希望提供一個重載,從而使開發人員更容易,更清楚地了解到他可以期望對某個對象進行更改的內容。

考慮使用子類而不是幾個構造函數。

原因:通常,兩個不同的構造函數表示需要兩種不同的行為。 不同的行為應該由不同的類來實現。

然后,該子類將具有一個名稱,該名稱指示它是基類的一種特殊版本,以及一個構造函數,該構造函數確保只能在有效狀態下創建此類對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM