我正在C#中創建一個類,最終它將成爲其他用戶可以使用的庫的一部分。 此類的用戶必須設置一些屬性,然後使用公共方法來檢索結果。用戶在不設置所有屬性的情況下調用方法時應該怎麼做?拋出異常並期望用戶捕捉它?尚未設置proprities的類
感謝
我正在C#中創建一個類,最終它將成爲其他用戶可以使用的庫的一部分。 此類的用戶必須設置一些屬性,然後使用公共方法來檢索結果。用戶在不設置所有屬性的情況下調用方法時應該怎麼做?拋出異常並期望用戶捕捉它?尚未設置proprities的類
感謝
雖然我不同意你設計屬性的設計,然後調用方法,但最好的選擇似乎是拋出異常,因爲它是庫。引發例外情況以通知發生了異常情況 - 您可以額外傳遞消息,但在調用給定的方法之前提及分配屬性。
謝謝。當我有大約10個屬性需要設置時,我還可以怎樣設計它? – koumides 2010-04-30 07:54:40
這可能是最好創建一個構造函數的參數,讓你構建一個對象實例,它是處於可用狀態。
+1我認爲這是更好的解決方案。否則,我會拋出。 – 2010-04-29 13:04:28
不幸的是我有大約10個需要設置的屬性。我不認爲向構造函數發送10個參數是個好主意。 – koumides 2010-04-29 13:57:05
@koumides - 這只是一個標誌,您可能需要打破課堂或將一些參數聚合到他們自己的課程中。 – 2010-04-30 13:10:40
如果你不能(或不應該)以已知的良好狀態啓動你的對象,那麼我會建議向調用者拋出某種異常。
一個好的設計使得很難做錯事。也許在這種情況下,API應該將所有輸入作爲參數傳遞給方法,然後可能是靜態的。
如果必須設置屬性,則將它們作爲構造函數的必需參數並隱藏默認的無參數構造函數。
如果不是所有的屬性都需要設置,那麼您將需要依靠日誌/異常來控制行爲。
問題是我有大約10個。 – koumides 2010-04-29 14:16:03
除了提到的所有其他選項,您可以將屬性設置爲默認值。然後,如果用戶不需要默認行爲,則必須將其設置爲不同的內容。但真的不知道你的代碼在做什麼,很難說什麼是最好的選擇。
這與MS'組件'模型一致,其中組件公開了配置操作的屬性,然後合適的方法啓動該操作。各種WinForms對話框組件就是一個很好的例子。這是避免缺少命名/可選參數的一種方法,因爲您可以提供合理的默認設置和易於閱讀的類配置,而不會造成混亂的重載構造函數。 – 2010-04-29 13:36:56
即使有像你這樣的10個屬性,如果它們是必需的,並且給它們默認值沒有意義,我會說它們全部放在構造函數中。
如果其中一些可以有合理的默認值,那麼你可以將它們從構造函數中刪除,並將它們設置爲默認值。
如果以上都不是可行的,例如對象可能需要在這些屬性的值已知之前構造,那麼我會看看是否有意義,可以將所需屬性作爲參數傳遞給方法(例如,它要麼沒有很多參數,要麼不可能被稱爲很多次,或者如果它真的在響應它自己的內部狀態)。
除上述所有情況外,應引發異常。你還提到「拋出異常並期待用戶捕捉它?」拋出異常的目的不應該是因爲你期望調用者捕獲它,你應該期望他們確保該屬性已被設置。抓住它應該是最後的手段,因爲他們無法合理確定財產是否確定,並且他們不關心您的方法是否因此而失敗。
你可以使用.NET 4嗎?在這種情況下,消費者可以使用命名參數,如果你想保持清晰。因此,與屬性,你將有:
new Class
{
Prop1 = 123,
Prop2 = 123,
...
};
並與命名參數:
new Class(
param1: 123,
param2: 123,
...
);
另外,如果你使用的引用類型,你會想要檢查的空任何一種方式。區別在於,使用構造函數參數只需檢查一次,而使用屬性時,每次調用方法時都必須檢查。
取決於您如何與該用戶進行交互。拋出異常,日誌消息,顯示對話框 - 這一切都取決於你與該用戶的交互。 – Nayan 2010-04-29 12:57:18
它是庫,所以選項如日誌消息,顯示對話框的氣味... – Andrey 2010-04-29 12:58:18
你應該拋出異常,用戶會注意到,一旦他調試;) – Stormenet 2010-04-30 13:21:56